Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Develop #956

Merged
merged 17 commits into from
Jan 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
os: windows-latest
platform: win
- kind: mac
os: macos-latest
os: macos-11
platform: osx
steps:
- uses: actions/checkout@v3
Expand Down
37 changes: 37 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
### 3.1.36
- Temporary workaround to force Proton on Linux systems
- Place a `.forceproton` file in the game directory whilst a solution is in development
- The blank screen on game selection has another potential fix
- BONELAB can now be used on copies from the Oculus Store
- ULTRAKILL support added
- `dotnet` files will no longer appear in the config editor for BepInEx 6 BE builds.

### 3.1.35
- Improved online search performance
- Config names wrap if too long
- Deprecated mods are hidden by default in the online section
- Deprecated mods can be made visible in the filters modal within the online section
- Potential fix for blank game selection screen
- Added support for .npc files in Hard Bullet
- Internal refactoring

### 3.1.34
- Profile exports changed to use Thunderstore provided host
- Significantly improved search performance in the online tab
- Game selection server tab modified to reduce user mis-clicks

### 3.1.33
- Added games:
- Ravenfield
- Aloft
- Cult of the Lamb
- Chrono Ark (64 bit)
- BONELAB
- Trombone Champ
- Rogue : Genesia
- Across the Obelisk
- Xbox Game Pass support
- Thanks to starfi5h
- Other improvements thanks to the Thunderstore team:
- Game can now be changed without an app restart
- Internal refactors and improvements
54 changes: 13 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,15 @@
|---|---|---|---|---|---|---|

## Features
- Support for Risk of Rain 2, Dyson Sphere Program, Valheim, GTFO, Outward, TaleSpire, H3VR, ROUNDS, Mechanica, Muck, BONEWORKS,
Lethal League Blaze, Timberborn, Totally Accurate Battle Simulator, Nickelodeon All-Star Brawl, Inscryption, Starsand, and more.
- A clean user interface designed to make modding as simple as possible.
- Safer mod installation allowing you to play the game through Steam normally.
- Mod profiles to switch between different sets of mods quickly and easily.
- Export profiles to easily share both your mods and configs with friends.
- Download and install mods directly from the manager.
- View and update any outdated mods.
- Edit configs directly from the manager.
- Manager auto-updates.
- Support for Risk of Rain 2, Dyson Sphere Program, Valheim, GTFO, BONEWORKS, and more
- A clean user interface designed to make modding as simple as possible
- Safer mod installation allowing you to play the game through Steam normally
- Mod profiles to switch between different sets of mods quickly and easily
- Export profiles to easily share both your mods and configs with friends
- Download and install mods directly from the manager
- View and update any outdated mods
- Edit configs directly from the manager
- Auto-updates
- And more!

## What is a mod manager?
Expand Down Expand Up @@ -47,6 +46,10 @@ You can choose to update, enable/disable or even uninstall mods with a simple cl

_Problems with Linux builds should be reported in the [r2modman discord](https://discord.gg/jE2zWHY)._

##### Note
- Temporary workaround to force Proton on Linux systems
- Place a `.forceproton` file in the game directory whilst a solution is in development

### Updating
r2modman will automatically download any available updates whilst you use it.

Expand All @@ -68,37 +71,6 @@ From small features such as always-expanded cards, all the way to larger feature

The only thing you have to consider when suggesting a feature is the impact it will have on users who don't have a lot of experience with computers.

## Changelog
### 3.1.35
- Improved online search performance
- Config names wrap if too long
- Deprecated mods are hidden by default in the online section
- Deprecated mods can be made visible in the filters modal within the online section
- Potential fix for blank game selection screen
- Added support for .npc files in Hard Bullet
- Internal refactoring

### 3.1.34
- Profile exports changed to use Thunderstore provided host
- Significantly improved search performance in the online tab
- Game selection server tab modified to reduce user mis-clicks

### 3.1.33
- Added games:
- Ravenfield
- Aloft
- Cult of the Lamb
- Chrono Ark (64 bit)
- BONELAB
- Trombone Champ
- Rogue : Genesia
- Across the Obelisk
- Xbox Game Pass support
- Thanks to starfi5h
- Other improvements thanks to the Thunderstore team:
- Game can now be changed without an app restart
- Internal refactors and improvements

## Screenshots

Game selection
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "r2modman",
"version": "3.1.35",
"version": "3.1.36",
"description": "A simple and easy to use mod manager for several games using Thunderstore.",
"productName": "r2modman",
"author": "ebkr",
Expand Down
2 changes: 1 addition & 1 deletion src/_managerinf/ManagerInformation.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import VersionNumber from '../model/VersionNumber';

export default class ManagerInformation {
public static VERSION: VersionNumber = new VersionNumber('3.1.35');
public static VERSION: VersionNumber = new VersionNumber('3.1.36');
public static IS_PORTABLE: boolean = false;
public static APP_NAME: string = "r2modman";
}
Binary file added src/assets/images/game_selection/ULTRAKILL.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions src/components/config-components/ConfigSelectionLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ import LinkProvider from '../../providers/components/LinkProvider';
if (tree instanceof R2Error) {
return;
}
tree.removeDirectories("dotnet");
tree.navigateAndPerform(plugins => {
plugins.getDirectories().forEach(value => {
plugins.navigateAndPerform(sub => {
Expand Down
2 changes: 1 addition & 1 deletion src/components/navigation/NavigationMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ export default class NavigationMenu extends Vue {

<style lang="scss" scoped>

.menu-list::v-deep a a {
.menu-list a a {
padding: 0;
}

Expand Down
8 changes: 7 additions & 1 deletion src/model/game/GameManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ export default class GameManager {
new Game("BONELAB", "BONELAB", "BONELAB",
"BONELAB", ["BONELAB_Steam_Windows64.exe"], "BONELAB_Steam_Windows64",
"https://thunderstore.io/c/bonelab/api/v1/package/", "https://raw.githubusercontent.com/ebkr/r2modmanPlus/master/modExclusions.md",
[new StorePlatformMetadata(StorePlatform.STEAM, "1592190")], "BONELAB.jpg",
[new StorePlatformMetadata(StorePlatform.STEAM, "1592190"), new StorePlatformMetadata(StorePlatform.OCULUS_STORE)], "BONELAB.jpg",
GameSelectionDisplayMode.VISIBLE, GameInstanceType.GAME, PackageLoader.MELON_LOADER, ["BL"]),

new Game("Trombone Champ", "TromboneChamp", "TromboneChamp",
Expand All @@ -334,6 +334,12 @@ export default class GameManager {
"https://thunderstore.io/c/across-the-obelisk/api/v1/package/", "https://raw.githubusercontent.com/ebkr/r2modmanPlus/master/modExclusions.md",
[new StorePlatformMetadata(StorePlatform.STEAM, "1385380")], "AcrossTheObelisk.jpg",
GameSelectionDisplayMode.VISIBLE, GameInstanceType.GAME, PackageLoader.BEPINEX, ["ato", "ao"]),

new Game("ULTRAKILL", "ULTRAKILL", "ULTRAKILL",
"ULTRAKILL", ["ULTRAKILL.exe"], "ULTRAKILL_Data",
"https://thunderstore.io/c/ultrakill/api/v1/package/", "https://raw.githubusercontent.com/ebkr/r2modmanPlus/master/modExclusions.md",
[new StorePlatformMetadata(StorePlatform.STEAM, "1229490")], "ULTRAKILL.jpg",
GameSelectionDisplayMode.VISIBLE, GameInstanceType.GAME, PackageLoader.BEPINEX, ["uk"]),
];

static get activeGame(): Game {
Expand Down
78 changes: 43 additions & 35 deletions src/pages/GameSelectionScreen.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,7 @@
<div class="column is-full">
<div class="sticky-top is-shadowless background-bg z-top">
<div class="container">
<nav class="level mb-2" v-if="viewMode === 'Card'">
<div class="level-item">
<div class="card-header-title">
<div class="input-group input-group--flex margin-right">
<input id="local-search" v-model='filterText' class="input margin-right" type="text" placeholder="Search for a game"/>
</div>
</div>
</div>
<div>
<i class="button fas fa-list" @click="toggleViewMode"></i>
</div>
</nav>
<nav class="level mb-2" v-else-if="viewMode === 'List'">
<nav class="level mb-2" v-if="viewMode === 'List'">
<div class="level-item">
<div class="card-header-title">
<div class="input-group input-group--flex margin-right">
Expand All @@ -71,6 +59,18 @@
<i class="button fas fa-th-large" @click="toggleViewMode"></i>
</div>
</nav>
<nav class="level mb-2" v-else>
<div class="level-item">
<div class="card-header-title">
<div class="input-group input-group--flex margin-right">
<input id="local-search" v-model='filterText' class="input margin-right" type="text" placeholder="Search for a game"/>
</div>
</div>
</div>
<div>
<i class="button fas fa-list" @click="toggleViewMode"></i>
</div>
</nav>
<div class="level">
<div class="level-item">
<div class="tabs">
Expand All @@ -88,7 +88,26 @@
<div class="container">
<article class="media">
<div class="media-content">
<div class="content pad--sides" v-if="viewMode === 'Card'">
<div class="content" v-if="viewMode === 'List'">
<div v-for="(game, index) of filteredGameList" :key="`${index}-${game.displayName}-${selectedGame === game}-${isFavourited(game)}`">
<a @click="selectedGame = game">
<div class="border-at-bottom cursor-pointer">
<div class="card is-shadowless">
<p
:class="['card-header-title', {'has-text-info':selectedGame === game}]"
>
<a :id="`${game.settingsIdentifier}-star`" href="#" class="margin-right" @click.prevent="toggleFavourite(game)">
<i class="fas fa-star text-warning" v-if="favourites.includes(game.settingsIdentifier)"></i>
<i class="far fa-star" v-else></i>
</a>
{{ game.displayName }}
</p>
</div>
</div>
</a>
</div>
</div>
<div class="content pad--sides" v-else>
<div class="game-cards-container">
<div v-for="(game, index) of filteredGameList" :key="`${index}-${game.displayName}-${selectedGame === game}-${isFavourited(game)}`" class="inline-block margin-right margin-bottom">

Expand Down Expand Up @@ -134,25 +153,6 @@
</div>
</div>

<div class="content" v-if="viewMode === 'List'">
<div v-for="(game, index) of filteredGameList" :key="`${index}-${game.displayName}-${selectedGame === game}-${isFavourited(game)}`">
<a @click="selectedGame = game">
<div class="border-at-bottom cursor-pointer">
<div class="card is-shadowless">
<p
:class="['card-header-title', {'has-text-info':selectedGame === game}]"
>
<a :id="`${game.settingsIdentifier}-star`" href="#" class="margin-right" @click.prevent="toggleFavourite(game)">
<i class="fas fa-star text-warning" v-if="favourites.includes(game.settingsIdentifier)"></i>
<i class="far fa-star" v-else></i>
</a>
{{ game.displayName }}
</p>
</div>
</div>
</a>
</div>
</div>
</div>
</article>
</div>
Expand Down Expand Up @@ -327,10 +327,18 @@ export default class GameSelectionScreen extends Vue {

this.settings = await ManagerSettings.getSingleton(GameManager.unsetGame());
const globalSettings = this.settings.getContext().global;
this.viewMode = globalSettings.gameSelectionViewMode;
this.favourites = globalSettings.favouriteGames || [];
this.selectedGame = GameManager.findByFolderName(globalSettings.lastSelectedGame) || null;

switch(globalSettings.gameSelectionViewMode) {
case GameSelectionViewMode.LIST:
case GameSelectionViewMode.CARD:
this.viewMode = globalSettings.gameSelectionViewMode;
break;
default:
this.viewMode = GameSelectionViewMode.CARD;
}

// Skip game selection view if valid default game & platform are set.
const {defaultGame, defaultPlatform} = ManagerUtils.getDefaults(this.settings);

Expand All @@ -342,7 +350,7 @@ export default class GameSelectionScreen extends Vue {
}

toggleViewMode() {
if (this.viewMode === "List") {
if (this.viewMode === GameSelectionViewMode.LIST) {
this.viewMode = GameSelectionViewMode.CARD;
} else {
this.viewMode = GameSelectionViewMode.LIST;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import InstallRules_HardBullet from '../default_installation_rules/game_rules/In
import InstallRules_BackpackHero from '../default_installation_rules/game_rules/InstallRules_BackpackHero';
import InstallRules_BONELAB from '../default_installation_rules/game_rules/InstallRules_BONELAB';
import { buildBepInExRules } from '../default_installation_rules/game_rules/InstallRules_BepInex';
import * as path from 'path';

export default class InstallationRuleApplicator {

Expand Down Expand Up @@ -65,7 +66,12 @@ export default class InstallationRuleApplicator {
buildBepInExRules("TromboneChamp"),
buildBepInExRules("RogueGenesia"),
buildBepInExRules("AcrossTheObelisk"),
buildBepInExRules("ULTRAKILL", [{
route: path.join("BepInEx", "UMM Mods"),
defaultFileExtensions: [],
trackingMethod: "SUBDIR",
subRoutes: []
}]),
]
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import type { CoreRuleType } from '../../InstallationRules';
import * as path from 'path';
import { GAME_NAME } from '../../profile_installers/ModLoaderVariantRecord';
import { RuleSubtype } from "../../InstallationRules";

export function buildBepInExRules(gameName: GAME_NAME): CoreRuleType {
export function buildBepInExRules(gameName: GAME_NAME, extraRules?: RuleSubtype[]): CoreRuleType {
return {
gameName: gameName,
rules: [
Expand Down Expand Up @@ -36,7 +37,8 @@ export function buildBepInExRules(gameName: GAME_NAME): CoreRuleType {
defaultFileExtensions: [],
trackingMethod: "NONE",
subRoutes: []
}
]
},
...(extraRules ? extraRules : []),
],
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ const VARIANTS = {
TromboneChamp: [new ModLoaderPackageMapping("BepInEx-BepInExPack_TromboneChamp", "BepInExPack_TromboneChamp", PackageLoader.BEPINEX)],
RogueGenesia: [new ModLoaderPackageMapping("BepInEx-BepInExPack_RogueGenesia", "BepInExPack_RogueGenesia", PackageLoader.BEPINEX)],
AcrossTheObelisk: [new ModLoaderPackageMapping("BepInEx-BepInExPack_AcrossTheObelisk", "BepInExPack_AcrossTheObelisk", PackageLoader.BEPINEX)],
ULTRAKILL: [new ModLoaderPackageMapping("BepInEx-BepInExPack", "BepInExPack", PackageLoader.BEPINEX)],
};
// Exported separately from the definition in order to preserve the key names in the type definition.
// Otherwise this would become [key: string] and we couldn't use the game names for type hinting elsewhere.
Expand Down
2 changes: 1 addition & 1 deletion src/r2mm/manager/SettingsDexieStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export default class SettingsDexieStore extends Dexie {

// Add all games to store. Borked v2-3 locally
// Increment per game or change to settings.
this.version(51).stores(store);
this.version(52).stores(store);

this.activeGame = game;
this.global = this.table("value");
Expand Down
Loading