Skip to content

Commit

Permalink
Merge pull request #1371 from ebkr/develop
Browse files Browse the repository at this point in the history
Develop (3.1.49)
  • Loading branch information
ebkr authored Jun 18, 2024
2 parents f9b1edf + be05193 commit f91c88b
Show file tree
Hide file tree
Showing 88 changed files with 2,298 additions and 968 deletions.
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
### 3.1.49
#### Games added
- Gladio Mori
- Slipstream: Rogue Space
- Panicore
- Magicraft
- Another Crab's Treasure
- Bopl Battle
- Vertigo 2
- Against the Storm
- Lycans
- Castle Story
- Balatro

#### General fixes
- Better online mod filtering
- Filter local mod list by last updated date
- This will only apply to mods updated as of this release
- Smaller fixes / tweaks

#### BONEWORKS / BONELAB
- BONEWORKS and BONELAB now have "recommended" mod loader versions to aid the experience

#### Titanfall 2 / Northstar
- The Northstar mod loader package installs correctly again

### 3.1.48
- Games added:
- Content Warning
Expand Down
3 changes: 2 additions & 1 deletion docs/Adding a game.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
- **ExeName**
- An array of different executable names (for all platforms). For `StorePlatform` types such as `OTHER` and `STEAM_DIRECT` then the first found executable is used and called when the game is launched.
- **DataFolderName**
- Only relevant for Mono (C#) Unity games. Only used for the `Preloader Fix` in the manager settings.
- Required for Unreal games relying on unreal-shimloader.
- Relevant for Mono (C#) Unity games, which use it for the `Preloader Fix` in the manager settings.
- **TsUrl**
- The Thunderstore API endpoint for the listing.
- **ExclusionsUrl**
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "r2modman",
"version": "3.1.48",
"version": "3.1.49",
"description": "A simple and easy to use mod manager for several games using Thunderstore.",
"productName": "r2modman",
"author": "ebkr",
Expand Down Expand Up @@ -38,7 +38,7 @@
"bulma-steps": "^2.2.1",
"bulma-switch": "^2.0.0",
"core-js": "^3.6.5",
"dexie": "^3.0.3",
"dexie": "^3.2.7",
"dot-prop": "^5.2.0",
"electron-updater": "4.2.5",
"elliptic": "^6.5.4",
Expand Down
3 changes: 1 addition & 2 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import ZipProvider from './providers/generic/zip/ZipProvider';
import AdmZipProvider from './providers/generic/zip/AdmZipProvider';
import ManagerSettingsMigration from './r2mm/manager/ManagerSettingsMigration';
import BindLoaderImpl from './providers/components/loaders/bind_impls/BindLoaderImpl';
import GameManager from './model/game/GameManager';
import PlatformInterceptorProvider from './providers/generic/game/platform_interceptor/PlatformInterceptorProvider';
import PlatformInterceptorImpl from './providers/generic/game/platform_interceptor/PlatformInterceptorImpl';
import ProfileInstallerProvider from './providers/ror2/installing/ProfileInstallerProvider';
Expand All @@ -58,7 +57,7 @@ export default class App extends mixins(UtilityMixin) {
async created() {
// Load settings using the default game before the actual game is selected.
const settings: ManagerSettings = await this.$store.dispatch('setActiveGame', GameManager.defaultGame);
const settings: ManagerSettings = await this.$store.dispatch('resetActiveGame');
this.hookThunderstoreModListRefresh();
await this.checkCdnConnection();
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.48');
public static VERSION: VersionNumber = new VersionNumber('3.1.49');
public static IS_PORTABLE: boolean = false;
public static APP_NAME: string = "r2modman";
}
52 changes: 52 additions & 0 deletions src/assets/data/games.json
Original file line number Diff line number Diff line change
Expand Up @@ -2340,6 +2340,58 @@
"relativeFileExclusions": []
}
},
"risk-of-rain-returns": {
"label": "risk-of-rain-returns",
"meta": {
"displayName": "Risk of Rain Returns",
"iconUrl": "RiskOfRainReturns.png"
},
"distributions": [
{
"platform": "steam",
"identifier": "1337520"
}
],
"r2modman": {
"internalFolderName": "RiskofRainReturns",
"dataFolderName": "",
"settingsIdentifier": "RiskofRainReturns",
"packageIndex": "https://thunderstore.io/c/risk-of-rain-returns/api/v1/package/",
"exclusionsUrl": "https://raw.githubusercontent.com/ebkr/r2modmanPlus/master/modExclusions.md",
"steamFolderName": "Risk of Rain Returns",
"exeNames": [
"Risk of Rain Returns.exe"
],
"gameInstancetype": "game",
"gameSelectionDisplayMode": "visible",
"modLoaderPackages": [
{
"packageId": "ReturnOfModding-ReturnOfModding",
"rootFolder": "ReturnOfModdingPack",
"loader": "returnofmodding"
}
],
"installRules": [
{
"route": "ReturnOfModding/plugins",
"trackingMethod": "subdir",
"defaultFileExtensions": [
".lua"
],
"isDefaultLocation": true
},
{
"route": "ReturnOfModding/plugins_data",
"trackingMethod": "subdir"
},
{
"route": "ReturnOfModding/config",
"trackingMethod": "subdir"
}
],
"relativeFileExclusions": []
}
},
"rogue-genesia": {
"uuid": "02371030-eb56-4d5d-bed5-fa68446ff6ac",
"label": "rogue-genesia",
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/Balatro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/BoplBattle.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/CastleStory.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/GladioMori.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/Lycans.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/Magicraft.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/Panicore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/images/game_selection/Vertigo2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/components/config-components/ConfigEditLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<p class="subtitle is-italic is-bold is-6 is-marginless">
<template v-if="getCommentDisplay(line.comments).split('\n').length > 4">
<span class="pre selectable" v-if="!line.commentsExpanded">{{getCommentDisplayShort(line.comments)}}</span>
<span class="pre selectable" v-else="!line.commentsExpanded">{{getCommentDisplay(line.comments)}}</span>
<span class="pre selectable" v-else>{{getCommentDisplay(line.comments)}}</span>
<a @click="toggleEntryExpansion(key, variable)">
<span v-if="!line.commentsExpanded">Show more</span>
<span v-else>Show less</span>
Expand All @@ -38,7 +38,7 @@
</p>
<br/>
<div class='settings-input-container'>
<template v-if='line.hasRange()'>
<template v-if='line.hasRange'>
<input
type="range"
class="slider is-fullwidth is-circle is-small"
Expand Down
3 changes: 1 addition & 2 deletions src/components/config-components/ConfigSelectionLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@
import { Component, Vue, Watch } from 'vue-property-decorator';
import ConfigFile from '../../model/file/ConfigFile';
import Profile from '../../model/Profile';
import * as path from 'path';
import FileTree from '../../model/file/FileTree';
import R2Error from '../../model/errors/R2Error';
Expand Down Expand Up @@ -104,7 +103,7 @@ import ProfileModList from '../../r2mm/mods/ProfileModList';
async created() {
const fs = FsProvider.instance;
const configLocation = Profile.getActiveProfile().getPathOfProfile();
const configLocation = this.$store.getters['profile/activeProfile'].getPathOfProfile();
const tree = await FileTree.buildFromLocation(configLocation);
if (tree instanceof R2Error) {
return;
Expand Down
20 changes: 10 additions & 10 deletions src/components/importing/LocalFileImportModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,6 @@ export default class LocalFileImportModal extends Vue {
private resultingManifest = new ManifestV2();
private contextProfile: Profile | null = null;
@Watch("visible")
private visiblityChanged() {
this.fileToImport = null;
Expand Down Expand Up @@ -281,6 +278,13 @@ export default class LocalFileImportModal extends Vue {
return;
}
const profile: Profile|null = this.$store.state.profile.activeProfile;
if (profile === null) {
this.validationMessage = "Profile is not selected";
return;
}
this.resultingManifest.setName(`${this.modAuthor.trim()}-${this.modName.trim()}`);
this.resultingManifest.setDisplayName(this.modName.trim());
this.resultingManifest.setVersionNumber(new VersionNumber(`${this.modVersionMajor}.${this.modVersionMinor}.${this.modVersionPatch}`));
Expand All @@ -292,7 +296,7 @@ export default class LocalFileImportModal extends Vue {
this.$store.commit("error/handleError", R2Error.fromThrownValue(error));
return;
}
const updatedModListResult = await ProfileModList.getModList(this.contextProfile!);
const updatedModListResult = await ProfileModList.getModList(profile);
if (updatedModListResult instanceof R2Error) {
this.$store.commit("error/handleError", updatedModListResult);
return;
Expand All @@ -302,16 +306,12 @@ export default class LocalFileImportModal extends Vue {
});
if (this.fileToImport.endsWith(".zip")) {
LocalModInstallerProvider.instance.extractToCacheWithManifestData(this.contextProfile!, this.fileToImport, this.resultingManifest, installCallback);
LocalModInstallerProvider.instance.extractToCacheWithManifestData(profile, this.fileToImport, this.resultingManifest, installCallback);
} else {
LocalModInstallerProvider.instance.placeFileInCache(this.contextProfile!, this.fileToImport, this.resultingManifest, installCallback);
LocalModInstallerProvider.instance.placeFileInCache(profile, this.fileToImport, this.resultingManifest, installCallback);
}
}
created() {
this.contextProfile = Profile.getActiveProfile();
}
}
interface ImportFieldAttributes {
Expand Down
63 changes: 44 additions & 19 deletions src/components/mixins/SplashMixin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ import Vue from 'vue';
import Component from 'vue-class-component';
import ApiResponse from '../../model/api/ApiResponse';
import GameManager from '../../model/game/GameManager';
import R2Error from '../../model/errors/R2Error';
import RequestItem from '../../model/requests/RequestItem';
import ConnectionProvider from '../../providers/generic/connection/ConnectionProvider';
import ThunderstorePackages from '../../r2mm/data/ThunderstorePackages';
import ApiCacheUtils from '../../utils/ApiCacheUtils';
@Component
export default class SplashMixin extends Vue {
activeGame = GameManager.activeGame;
heroTitle = '';
heroType: string = 'is-info';
isOffline = false;
Expand All @@ -34,6 +31,10 @@ export default class SplashMixin extends Vue {
return this.requests.reduce((x, y) => x.merge(y));
}
resetRequestProgresses() {
this.requests.forEach((request) => request.setProgress(0));
}
// Get the list of game-specific packages to exclude.
async getExclusions() {
this.loadingText = 'Connecting to GitHub repository';
Expand All @@ -43,11 +44,12 @@ export default class SplashMixin extends Vue {
this.getRequestItem('ExclusionsList').setProgress(progress);
};
ThunderstorePackages.EXCLUSIONS = await ConnectionProvider.instance.getExclusions(showProgress);
await this.$store.dispatch('tsMods/updateExclusions', showProgress);
this.getRequestItem('ExclusionsList').setProgress(100);
}
// Get the list of Thunderstore mods from API.
// Get the list of Thunderstore mods from API or local cache.
async getThunderstoreMods() {
this.loadingText = 'Connecting to Thunderstore';
let response: ApiResponse|undefined = undefined;
Expand All @@ -58,34 +60,57 @@ export default class SplashMixin extends Vue {
};
try {
response = await ConnectionProvider.instance.getPackages(this.activeGame, showProgress, 3);
response = await ConnectionProvider.instance.getPackages(this.$store.state.activeGame, showProgress, 3);
} catch (e) {
this.isOffline = true;
this.heroTitle = 'Failed to get mods from Thunderstore';
this.loadingText = 'You may be offline or Thunderstore is unavailabe. Checking cache.';
console.error('SplashMixin failed to fetch mod list from API.', e);
} finally {
this.getRequestItem('ThunderstoreDownload').setProgress(100);
}
if (response) {
ApiCacheUtils.storeLastRequest(response.data);
this.loadingText = 'Storing the mod list into local cache';
try {
await this.$store.dispatch('tsMods/updatePersistentCache', response.data);
} catch (e) {
console.error('SplashMixin failed to cache mod list locally.', e);
}
this.loadingText = 'Processing the mod list';
} else {
const cachedResponse = await ApiCacheUtils.getLastRequest();
response = cachedResponse ? { data: cachedResponse.payload } : undefined;
this.loadingText = 'Processing the mod list from cache';
}
if (response) {
ThunderstorePackages.handlePackageApiResponse(response);
await this.$store.dispatch('updateThunderstoreModList', ThunderstorePackages.PACKAGES);
this.getRequestItem('CacheOperations').setProgress(50);
let isModListLoaded = false;
try {
await this.$store.dispatch('tsMods/updateMods');
isModListLoaded = true;
} catch (e) {
this.$store.commit(
'error/handleError',
R2Error.fromThrownValue(e, `${this.loadingText} failed`)
);
} finally {
this.getRequestItem('CacheOperations').setProgress(100);
}
// To proceed, the loading of the mod list should result in a non-empty list.
// Empty list is allowed if that's actually what the API returned.
if (
isModListLoaded &&
(this.$store.state.tsMods.mods.length || (response && !response.data.length))
) {
await this.moveToNextScreen();
} else {
this.heroTitle = 'Failed to get mods from Thunderstore and cache';
this.loadingText = 'You may be offline or Thunderstore is unavailabe. However, you may still use the manager offline.';
this.heroTitle = 'Failed to get the list of online mods';
this.loadingText = 'You may still use the manager offline, but some features might be unavailable.';
this.isOffline = true;
}
}
async continueOffline() {
ThunderstorePackages.PACKAGES = [];
await this.moveToNextScreen();
}
Expand Down
Loading

0 comments on commit f91c88b

Please sign in to comment.