Skip to content

Commit

Permalink
Merge pull request #956 from ebkr/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
ebkr authored Jan 23, 2023
2 parents 39b3f28 + b81ce2d commit b55ef7c
Show file tree
Hide file tree
Showing 16 changed files with 135 additions and 88 deletions.
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

0 comments on commit b55ef7c

Please sign in to comment.