diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9165c4332..ac97b2d43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: Build +name: Test on: [push] diff --git a/CHANGELOG.md b/CHANGELOG.md index ea9a00c71..d38353624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,37 @@ +### 3.2.15 + +#### UI Changes + +- Includes a bottom bar which allows for: + - Faster game changing + - Faster profile switching + - Easier access to profile exporting +- The "Start" action is now more distinguishable +- Navbar sections are clearer + +#### Games added + +- Astroneer +- Deadly Delivery +- Granny: Chapter Two +- Soulcalibur VI +- A Gentleman's Dispute +- Super Battle Golf +- Cursed Words +- Ducks Can Drive +- Gorilla Tag +- Jump Scare Mansion +- Pit of Goblin +- Very Very Valet +- Cryo +- Crawlspace +- Big Ambitions + +#### Fixes + +- Actions on the profile selection screen are properly aligned +- Several fixes for mod installation behaviours + ### 3.2.14 #### Games added - Carrier Deck diff --git a/package.json b/package.json index 10fcbf7d8..ffb31a17e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "r2modman", - "version": "3.2.14", + "version": "3.2.15", "description": "A simple and easy to use mod manager for many games using Thunderstore.", "productName": "r2modman", "author": "ebkr", @@ -91,7 +91,6 @@ "electron-builder": "26.0.12", "electron-debug": "^3.0.1", "electron-devtools-installer": "^3.0.0", - "electron-installer-flatpak": "^0.8.0", "electron-packager": "14.1.1", "identity-obj-proxy": "^3.0.0", "mock-require": "^3.0.3", @@ -107,6 +106,9 @@ "vue": "^3.5.16", "wallaby-vue-compiler": "^1.0.3" }, + "optionalDependencies": { + "electron-installer-flatpak": "^0.8.0" + }, "engines": { "node": "^20.19.0 || >=22.12.0", "npm": ">= 10.0.0", diff --git a/public/images/game_selection/a-gentlemens-dispute.webp b/public/images/game_selection/a-gentlemens-dispute.webp new file mode 100644 index 000000000..316ab4083 Binary files /dev/null and b/public/images/game_selection/a-gentlemens-dispute.webp differ diff --git a/public/images/game_selection/astroneer.webp b/public/images/game_selection/astroneer.webp new file mode 100644 index 000000000..c078ff8c6 Binary files /dev/null and b/public/images/game_selection/astroneer.webp differ diff --git a/public/images/game_selection/big-ambitions.webp b/public/images/game_selection/big-ambitions.webp new file mode 100644 index 000000000..1dd5dbb22 Binary files /dev/null and b/public/images/game_selection/big-ambitions.webp differ diff --git a/public/images/game_selection/crawlspace.webp b/public/images/game_selection/crawlspace.webp new file mode 100644 index 000000000..ecdd5da13 Binary files /dev/null and b/public/images/game_selection/crawlspace.webp differ diff --git a/public/images/game_selection/cryo.webp b/public/images/game_selection/cryo.webp new file mode 100644 index 000000000..eafac0a4f Binary files /dev/null and b/public/images/game_selection/cryo.webp differ diff --git a/public/images/game_selection/cursed-words.webp b/public/images/game_selection/cursed-words.webp new file mode 100644 index 000000000..76a912666 Binary files /dev/null and b/public/images/game_selection/cursed-words.webp differ diff --git a/public/images/game_selection/deadly-delivery.webp b/public/images/game_selection/deadly-delivery.webp new file mode 100644 index 000000000..8ae996240 Binary files /dev/null and b/public/images/game_selection/deadly-delivery.webp differ diff --git a/public/images/game_selection/ducks-can-drive.webp b/public/images/game_selection/ducks-can-drive.webp new file mode 100644 index 000000000..118b5b631 Binary files /dev/null and b/public/images/game_selection/ducks-can-drive.webp differ diff --git a/public/images/game_selection/gorilla-tag.webp b/public/images/game_selection/gorilla-tag.webp new file mode 100644 index 000000000..bad35eb72 Binary files /dev/null and b/public/images/game_selection/gorilla-tag.webp differ diff --git a/public/images/game_selection/granny-chapter-two.webp b/public/images/game_selection/granny-chapter-two.webp new file mode 100644 index 000000000..a2186f41b Binary files /dev/null and b/public/images/game_selection/granny-chapter-two.webp differ diff --git a/public/images/game_selection/jump-scare-mansion.webp b/public/images/game_selection/jump-scare-mansion.webp new file mode 100644 index 000000000..158239748 Binary files /dev/null and b/public/images/game_selection/jump-scare-mansion.webp differ diff --git a/public/images/game_selection/pit-of-goblin.webp b/public/images/game_selection/pit-of-goblin.webp new file mode 100644 index 000000000..c643ca98f Binary files /dev/null and b/public/images/game_selection/pit-of-goblin.webp differ diff --git a/public/images/game_selection/soulcalibur-vi.webp b/public/images/game_selection/soulcalibur-vi.webp new file mode 100644 index 000000000..165395c85 Binary files /dev/null and b/public/images/game_selection/soulcalibur-vi.webp differ diff --git a/public/images/game_selection/super-battle-golf.webp b/public/images/game_selection/super-battle-golf.webp new file mode 100644 index 000000000..aca9906cb Binary files /dev/null and b/public/images/game_selection/super-battle-golf.webp differ diff --git a/public/images/game_selection/very-very-valet.webp b/public/images/game_selection/very-very-valet.webp new file mode 100644 index 000000000..2614656f5 Binary files /dev/null and b/public/images/game_selection/very-very-valet.webp differ diff --git a/quasar.config.ts b/quasar.config.ts index af9caf341..886cf8f0d 100644 --- a/quasar.config.ts +++ b/quasar.config.ts @@ -2,7 +2,6 @@ // https://v2.quasar.dev/quasar-cli-vite/quasar-config-file import { defineConfig } from '#q-app/wrappers'; -import { nodePolyfills } from 'vite-plugin-node-polyfills'; export default defineConfig((ctx) => { @@ -66,11 +65,16 @@ export default defineConfig((ctx) => { // env: {}, // rawDefine: {} // ignorePublicFolder: true, - minify: 'esbuild', polyfillModulePreload: true, // distDir - // extendViteConf (viteConf) {}, + cssMinify: 'esbuild', + minify: 'esbuild', + + extendViteConf (viteConf) { + // Force Vite to use esbuild for CSS, overriding any defaults + viteConf.build!.cssMinify = 'esbuild'; + }, viteVuePluginOptions: { template: { compilerOptions: { diff --git a/src/App.vue b/src/App.vue index 407578702..d5049e349 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,8 +1,14 @@ @@ -52,6 +58,7 @@ import { NodeFsImplementation } from './providers/node/fs/NodeFsImplementation'; import { useRouter } from 'vue-router'; import { ProtocolProviderImplementation } from './providers/generic/protocol/ProtocolProviderImplementation'; import { provideProtocolImplementation } from './providers/generic/protocol/ProtocolProvider'; +import BreadcrumbNavigator from 'components/breadcrumbs/BreadcrumbNavigator.vue'; const store = baseStore; const router = useRouter(); @@ -156,3 +163,39 @@ main { grid-template-rows: 100vh; } + + diff --git a/src/_managerinf/ManagerInformation.ts b/src/_managerinf/ManagerInformation.ts index c2137c3b0..e1932049b 100644 --- a/src/_managerinf/ManagerInformation.ts +++ b/src/_managerinf/ManagerInformation.ts @@ -1,7 +1,7 @@ import VersionNumber from '../model/VersionNumber'; export default class ManagerInformation { - public static VERSION: VersionNumber = new VersionNumber('3.2.14'); + public static VERSION: VersionNumber = new VersionNumber('3.2.15'); public static IS_PORTABLE: boolean = false; public static APP_NAME: string = "r2modman"; } diff --git a/src/assets/data/ecosystem.json b/src/assets/data/ecosystem.json index 401d0a248..de94c7414 100644 --- a/src/assets/data/ecosystem.json +++ b/src/assets/data/ecosystem.json @@ -1626,7 +1626,7 @@ ] } }, - "wikiUrl": "https://atlyss.wiki.gg/wiki/ATLYSS_Wiki", + "wikiUrl": "https://github.com/AtlyssModding/ATLYSS-Modding-Resources", "discordUrl": "https://discord.gg/hQceRJ7pEW", "autolistPackageIds": [ "BepInEx-BepInExPack" @@ -2606,7 +2606,7 @@ ] } }, - "discordUrl": "https://discord.gg/TmBBV2qRuq" + "discordUrl": "https://discord.gg/freesoulbrc" } }, "bonelab": { @@ -8034,6 +8034,9 @@ }, "tweaks-and-quality-of-life": { "label": "Tweaks & Quality Of Life" + }, + "ai-generated": { + "label": "AI Generated" } }, "sections": { @@ -10313,7 +10316,29 @@ "幻兽帕鲁" ], "packageLoader": "shimloader", - "installRules": [], + "installRules": [ + { + "route": "shimloader/mod", + "isDefaultLocation": true, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/pak", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/cfg", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], "relativeFileExclusions": null } ], @@ -10395,7 +10420,29 @@ "恐慌核心" ], "packageLoader": "shimloader", - "installRules": [], + "installRules": [ + { + "route": "shimloader/mod", + "isDefaultLocation": true, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/pak", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/cfg", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], "relativeFileExclusions": null } ], @@ -12067,6 +12114,9 @@ }, "server-side": { "label": "Server-side" + }, + "mod-jam-1": { + "label": "Mod Jam 1 - Void" } }, "sections": { @@ -15497,12 +15547,18 @@ "tools": { "label": "Tools" }, + "cheats": { + "label": "Cheats" + }, "misc": { "label": "Misc" }, "0-62-branch": { "label": "0.62 Branch" }, + "0-66-branch": { + "label": "0.66 Branch" + }, "manual-dependencies": { "label": "Requires Manual Dependencies" } @@ -15512,7 +15568,8 @@ "name": "Main Branch", "excludeCategories": [ "modpacks", - "0-62-branch" + "0-62-branch", + "0-66-branch" ] }, "main-modpacks": { @@ -15521,7 +15578,8 @@ "modpacks" ], "excludeCategories": [ - "0-62-branch" + "0-62-branch", + "0-66-branch" ] }, "0-62": { @@ -15539,6 +15597,22 @@ "modpacks", "0-62-branch" ] + }, + "0-66": { + "name": "0.66 Branch", + "requireCategories": [ + "0-66-branch" + ], + "excludeCategories": [ + "modpacks" + ] + }, + "0-66-modpacks": { + "name": "0.66 Branch Modpacks", + "requireCategories": [ + "modpacks", + "0-66-branch" + ] } }, "wikiUrl": "https://tcg-card-shop-simulator.notion.site/3f8c9de6b54c47a9b80329b40bdd3c2c?v=04938d1088de49e5a55734d498f081ef", @@ -17190,7 +17264,29 @@ "虚空之声" ], "packageLoader": "shimloader", - "installRules": [], + "installRules": [ + { + "route": "shimloader/mod", + "isDefaultLocation": true, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/pak", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/cfg", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], "relativeFileExclusions": null } ], @@ -18685,12 +18781,12 @@ }, "r2modman": null }, - "aeruta": { - "uuid": "70e4bc07-8642-44f1-a0a5-575eac59bd60", - "label": "aeruta", + "a-gentlemens-dispute": { + "uuid": "ffe89e5e-c199-48d0-9ff5-48f0ad04c700", + "label": "a-gentlemens-dispute", "meta": { - "displayName": "Aeruta", - "iconUrl": "aeruta.webp" + "displayName": "A Gentlemen's Dispute", + "iconUrl": "a-gentlemens-dispute.webp" }, "distributions": [], "r2modman": [ @@ -18699,25 +18795,27 @@ "distributions": [ { "platform": "steam", - "identifier": "2286780" + "identifier": "2820700" } ], - "steamFolderName": "Aeruta", - "dataFolderName": "Aeruta_Data", + "steamFolderName": "A Gentlemen's Dispute", + "dataFolderName": "A Gentlemen's Dispute_Data", "exeNames": [ - "Aeruta.exe" + "A Gentlemen's Dispute.exe", + "AGentlemensDispute.app" ], "packageLoader": "bepinex", "meta": { - "displayName": "Aeruta", - "iconUrl": "aeruta.webp" + "displayName": "A Gentlemen's Dispute", + "iconUrl": "a-gentlemens-dispute.webp" }, - "settingsIdentifier": "Aeruta", - "internalFolderName": "Aeruta", - "packageIndex": "https://thunderstore.io/c/aeruta/api/v1/package-listing-index/", + "settingsIdentifier": "AgentlemensDispute", + "internalFolderName": "AgentlemensDispute", + "packageIndex": "https://thunderstore.io/c/a-gentlemens-dispute/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "亚路塔:狐狸狐途的面包冒险" + "AGD", + "礼帽大乱斗" ], "installRules": [ { @@ -18764,7 +18862,7 @@ } ], "thunderstore": { - "displayName": "Aeruta", + "displayName": "A Gentlemen's Dispute", "categories": { "mods": { "label": "Mods" @@ -18799,15 +18897,18 @@ ] } }, - "autolistPackageIds": [] + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Polite mayhem awaits! Hurl traps, swing bats, and detonate all in sight as you vie to be the last gentleman standing. Refined chaos for up to 8 players - anything goes, so long as it's done with class!" } }, - "an-unfinished-game": { - "uuid": "dc4ff876-263d-4e67-9dd9-9fb42203e6c3", - "label": "an-unfinished-game", + "aeruta": { + "uuid": "70e4bc07-8642-44f1-a0a5-575eac59bd60", + "label": "aeruta", "meta": { - "displayName": "An Unfinished Game", - "iconUrl": "an-unfinished-game.webp" + "displayName": "Aeruta", + "iconUrl": "aeruta.webp" }, "distributions": [], "r2modman": [ @@ -18816,30 +18917,72 @@ "distributions": [ { "platform": "steam", - "identifier": "2919990" + "identifier": "2286780" } ], - "steamFolderName": "An Unfinished Game", - "dataFolderName": "UnfinishedGame_Data", + "steamFolderName": "Aeruta", + "dataFolderName": "Aeruta_Data", "exeNames": [ - "UnfinishedGame.exe" + "Aeruta.exe" ], - "packageLoader": "recursive-melonloader", + "packageLoader": "bepinex", "meta": { - "displayName": "An Unfinished Game", - "iconUrl": "an-unfinished-game.webp" + "displayName": "Aeruta", + "iconUrl": "aeruta.webp" }, - "settingsIdentifier": "AnUnfinishedGame", - "internalFolderName": "AnUnfinishedGame", - "packageIndex": "https://thunderstore.io/c/an-unfinished-game/api/v1/package-listing-index/", + "settingsIdentifier": "Aeruta", + "internalFolderName": "Aeruta", + "packageIndex": "https://thunderstore.io/c/aeruta/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], - "installRules": [], + "additionalSearchStrings": [ + "亚路塔:狐狸狐途的面包冒险" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], "relativeFileExclusions": null } ], "thunderstore": { - "displayName": "An Unfinished Game", + "displayName": "Aeruta", "categories": { "mods": { "label": "Mods" @@ -18874,61 +19017,15 @@ ] } }, - "autolistPackageIds": [ - "LavaGang-MelonLoader" - ] - } - }, - "astroneer": { - "uuid": "43c1b6fb-f9a5-4d25-847f-c3eda4f2bf5a", - "label": "astroneer", - "meta": { - "displayName": "Astroneer", - "iconUrl": null - }, - "distributions": [], - "thunderstore": { - "displayName": "Astroneer", - "categories": { - "mods": { - "label": "Mods" - }, - "modpacks": { - "label": "Modpacks" - }, - "clientside": { - "label": "Client-side" - }, - "serverside": { - "label": "Server-side" - } - }, - "sections": { - "mods": { - "name": "Mods", - "excludeCategories": [ - "modpacks" - ] - }, - "modpacks": { - "name": "Modpacks", - "requireCategories": [ - "modpacks" - ] - } - }, - "wikiUrl": "https://astroneermodding.readthedocs.io/en/latest/", - "discordUrl": "https://discord.gg/astroneer-modding-774729322674126858", "autolistPackageIds": [] - }, - "r2modman": null + } }, - "baby-steps": { - "uuid": "02ecb2ec-5bd1-402c-ab52-b87b3abc5d90", - "label": "baby-steps", + "an-unfinished-game": { + "uuid": "dc4ff876-263d-4e67-9dd9-9fb42203e6c3", + "label": "an-unfinished-game", "meta": { - "displayName": "Baby Steps", - "iconUrl": "baby-steps.webp" + "displayName": "An Unfinished Game", + "iconUrl": "an-unfinished-game.webp" }, "distributions": [], "r2modman": [ @@ -18937,32 +19034,214 @@ "distributions": [ { "platform": "steam", - "identifier": "1281040" + "identifier": "2919990" } ], - "steamFolderName": "Baby Steps", - "dataFolderName": "BabySteps_Data", + "steamFolderName": "An Unfinished Game", + "dataFolderName": "UnfinishedGame_Data", "exeNames": [ - "BabySteps.exe" + "UnfinishedGame.exe" ], "packageLoader": "recursive-melonloader", "meta": { - "displayName": "Baby Steps", - "iconUrl": "baby-steps.webp" + "displayName": "An Unfinished Game", + "iconUrl": "an-unfinished-game.webp" }, - "settingsIdentifier": "BabySteps", - "internalFolderName": "BabySteps", - "packageIndex": "https://thunderstore.io/c/baby-steps/api/v1/package-listing-index/", - "gameSelectionDisplayMode": "hidden", - "additionalSearchStrings": [ - "一步一脚印" - ], + "settingsIdentifier": "AnUnfinishedGame", + "internalFolderName": "AnUnfinishedGame", + "packageIndex": "https://thunderstore.io/c/an-unfinished-game/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], "installRules": [], "relativeFileExclusions": null } ], "thunderstore": { - "displayName": "Baby Steps", + "displayName": "An Unfinished Game", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ] + } + }, + "astroneer": { + "uuid": "43c1b6fb-f9a5-4d25-847f-c3eda4f2bf5a", + "label": "astroneer", + "meta": { + "displayName": "Astroneer", + "iconUrl": null + }, + "distributions": [ + { + "platform": "steam", + "identifier": "361420" + } + ], + "r2modman": [ + { + "meta": { + "displayName": "Astroneer", + "iconUrl": "astroneer.webp" + }, + "internalFolderName": "Astroneer", + "dataFolderName": "Astro", + "distributions": [ + { + "platform": "steam", + "identifier": "361420" + } + ], + "settingsIdentifier": "Astroneer", + "packageIndex": "https://thunderstore.io/c/astroneer/api/v1/package-listing-index/", + "steamFolderName": "ASTRONEER", + "exeNames": [ + "Astro.exe" + ], + "gameInstanceType": "game", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "异星探险家", + "异星旅人" + ], + "packageLoader": "shimloader", + "installRules": [ + { + "route": "shimloader/mod", + "isDefaultLocation": true, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/pak", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".pak" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/cfg", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Astroneer", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "clientside": { + "label": "Client-side" + }, + "serverside": { + "label": "Server-side" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://astroneermodding.readthedocs.io/en/latest/", + "discordUrl": "https://discord.gg/astroneer-modding-774729322674126858", + "autolistPackageIds": [ + "Thunderstore-unreal_shimloader" + ] + } + }, + "baby-steps": { + "uuid": "02ecb2ec-5bd1-402c-ab52-b87b3abc5d90", + "label": "baby-steps", + "meta": { + "displayName": "Baby Steps", + "iconUrl": "baby-steps.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "1281040" + } + ], + "steamFolderName": "Baby Steps", + "dataFolderName": "BabySteps_Data", + "exeNames": [ + "BabySteps.exe" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Baby Steps", + "iconUrl": "baby-steps.webp" + }, + "settingsIdentifier": "BabySteps", + "internalFolderName": "BabySteps", + "packageIndex": "https://thunderstore.io/c/baby-steps/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "一步一脚印" + ], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Baby Steps", "categories": { "mods": { "label": "Mods" @@ -19189,10 +19468,10 @@ "distributions": [ { "platform": "steam", - "identifier": "3821880" + "identifier": "4231580" } ], - "steamFolderName": "BeetleBall Playtest", + "steamFolderName": "Beetleball Demo", "dataFolderName": "Beetleball_Data", "exeNames": [ "Beetleball.exe" @@ -19213,6 +19492,7 @@ ], "thunderstore": { "displayName": "Beetleball", + "shortDescription": "Score goals with dungballs in Beetleball, the Greatest Online Multiplayer Class-based Dung Beetle Soccer Game TO EVER EXIST", "categories": { "mods": { "label": "Mods" @@ -19453,6 +19733,86 @@ ] } }, + "big-ambitions": { + "uuid": "2c4ef1aa-08bb-4ed8-9b74-4a23b390915c", + "label": "big-ambitions", + "meta": { + "displayName": "Big Ambitions", + "iconUrl": "big-ambitions.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "1331550" + } + ], + "steamFolderName": "Big Ambitions", + "dataFolderName": "Big Ambitions_Data", + "exeNames": [ + "Big Ambitions.exe", + "Big Ambitions.app" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Big Ambitions", + "iconUrl": "big-ambitions.webp" + }, + "settingsIdentifier": "BigAmbitions", + "internalFolderName": "BigAmbitions", + "packageIndex": "https://thunderstore.io/c/big-ambitions/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Big Ambitions", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/hovgaardgames", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "Big Ambitions is a revolutionary role-playing business sim. Go from nothing to the biggest entrepreneur in New York by opening small businesses or slowly building huge corporations any way you like." + } + }, "broforce": { "uuid": "dcebc888-06d8-436f-b7e7-ed08713f68bd", "label": "broforce", @@ -19590,7 +19950,9 @@ "internalFolderName": "CarrierDeck", "packageIndex": "https://thunderstore.io/c/carrier-deck/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], + "additionalSearchStrings": [ + "甲板指挥官" + ], "installRules": [ { "route": "BepInEx/plugins", @@ -20238,6 +20600,7 @@ ], "thunderstore": { "displayName": "Crawlspace 2", + "discordUrl": "https://discord.gg/BDZ6NjegeR", "categories": { "mods": { "label": "Mods" @@ -20277,12 +20640,12 @@ ] } }, - "crime-simulator": { - "uuid": "ae24513f-4737-4dfd-8fbd-6879ffdd88d2", - "label": "crime-simulator", + "crawlspace": { + "uuid": "52f15796-8648-4247-8a84-9ef16ea2103c", + "label": "crawlspace", "meta": { - "displayName": "Crime Simulator", - "iconUrl": "crime-simulator.webp" + "displayName": "Crawlspace", + "iconUrl": "crawlspace.webp" }, "distributions": [], "r2modman": [ @@ -20291,26 +20654,24 @@ "distributions": [ { "platform": "steam", - "identifier": "2737070" + "identifier": "1787860" } ], - "steamFolderName": "Crime Simulator", - "dataFolderName": "Crime Simulator_Data", + "steamFolderName": "Crawlspace", + "dataFolderName": "Crawlspace_Data", "exeNames": [ - "Crime Simulator.exe" + "Crawlspace.exe" ], "packageLoader": "bepinex", "meta": { - "displayName": "Crime Simulator", - "iconUrl": "crime-simulator.webp" + "displayName": "Crawlspace", + "iconUrl": "crawlspace.webp" }, - "settingsIdentifier": "CrimeSimulator", - "internalFolderName": "CrimeSimulator", - "packageIndex": "https://thunderstore.io/c/crime-simulator/api/v1/package-listing-index/", + "settingsIdentifier": "Crawlspace", + "internalFolderName": "Crawlspace", + "packageIndex": "https://thunderstore.io/c/crawlspace/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [ - "犯罪模拟器" - ], + "additionalSearchStrings": [], "installRules": [ { "route": "BepInEx/plugins", @@ -20356,7 +20717,8 @@ } ], "thunderstore": { - "displayName": "Crime Simulator", + "displayName": "Crawlspace", + "discordUrl": "https://discord.gg/BDZ6NjegeR", "categories": { "mods": { "label": "Mods" @@ -20393,15 +20755,16 @@ }, "autolistPackageIds": [ "BepInEx-BepInExPack" - ] + ], + "shortDescription": "You saw an Ad about someone needing help with an odd job, retrieving his daughters missing dolls. Sounding like easy cash, you leave a message telling him you are interested. but as the nights progress, you realize why nobody else wanted to take this job." } }, - "darkwater": { - "uuid": "fde8a66c-d967-4505-adf3-5d9fe27bcc58", - "label": "darkwater", + "crime-simulator": { + "uuid": "ae24513f-4737-4dfd-8fbd-6879ffdd88d2", + "label": "crime-simulator", "meta": { - "displayName": "Darkwater", - "iconUrl": "darkwater.webp" + "displayName": "Crime Simulator", + "iconUrl": "crime-simulator.webp" }, "distributions": [], "r2modman": [ @@ -20410,26 +20773,302 @@ "distributions": [ { "platform": "steam", - "identifier": "619540" + "identifier": "2737070" } ], - "steamFolderName": "Darkwater", - "dataFolderName": "Darkwater_Data", + "steamFolderName": "Crime Simulator", + "dataFolderName": "Crime Simulator_Data", "exeNames": [ - "Darkwater.exe" + "Crime Simulator.exe" ], "packageLoader": "bepinex", "meta": { - "displayName": "Darkwater", - "iconUrl": "darkwater.webp" + "displayName": "Crime Simulator", + "iconUrl": "crime-simulator.webp" }, - "settingsIdentifier": "Darkwater", - "internalFolderName": "Darkwater", - "packageIndex": "https://thunderstore.io/c/darkwater/api/v1/package-listing-index/", + "settingsIdentifier": "CrimeSimulator", + "internalFolderName": "CrimeSimulator", + "packageIndex": "https://thunderstore.io/c/crime-simulator/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "dw", - "黑水" + "犯罪模拟器" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Crime Simulator", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] + } + }, + "cryo": { + "uuid": "000d475a-d3d2-45e3-9059-2994929441a8", + "label": "cryo", + "meta": { + "displayName": "CRYO", + "iconUrl": "cryo.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "2564910" + } + ], + "steamFolderName": "CRYO", + "dataFolderName": "Cryo_Data", + "exeNames": [ + "Cryo.exe" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "CRYO", + "iconUrl": "cryo.webp" + }, + "settingsIdentifier": "Cryo", + "internalFolderName": "Cryo", + "packageIndex": "https://thunderstore.io/c/cryo/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "CRYO", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "CRYO is a multiplayer co-op survival horror for 1-4 players. You have been deployed by your company to various locations around the Antarctic due to communication issues. What awaits you in these dark, remote regions is far more sinister than a technical fault..." + } + }, + "cursed-words": { + "uuid": "4363e08e-0e9d-4578-a8ab-9c28ce866280", + "label": "cursed-words", + "meta": { + "displayName": "Cursed Words", + "iconUrl": "cursed-words.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "4264890" + } + ], + "steamFolderName": "Cursed Words Demo", + "dataFolderName": "Cursed Words_Data", + "exeNames": [ + "Cursed Words.exe" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Cursed Words", + "iconUrl": "cursed-words.webp" + }, + "settingsIdentifier": "CursedWords", + "internalFolderName": "CursedWords", + "packageIndex": "https://thunderstore.io/c/cursed-words/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Cursed Words", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.com/invite/7vqFuNCE8v", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "Starts as Boggle, ends as Schrodinger - Cursed Words is a roguelike adventure about writing words... for a while, until words become NUM83R5, or chess pieces, or the infinite void." + } + }, + "darkwater": { + "uuid": "fde8a66c-d967-4505-adf3-5d9fe27bcc58", + "label": "darkwater", + "meta": { + "displayName": "Darkwater", + "iconUrl": "darkwater.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "619540" + } + ], + "steamFolderName": "Darkwater", + "dataFolderName": "Darkwater_Data", + "exeNames": [ + "Darkwater.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Darkwater", + "iconUrl": "darkwater.webp" + }, + "settingsIdentifier": "Darkwater", + "internalFolderName": "Darkwater", + "packageIndex": "https://thunderstore.io/c/darkwater/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "dw", + "黑水" ], "installRules": [ { @@ -20516,6 +21155,125 @@ ] } }, + "deadly-delivery": { + "uuid": "1fd29521-6a2d-4206-abc8-bc2f3a61ac83", + "label": "deadly-delivery", + "meta": { + "displayName": "Deadly Delivery", + "iconUrl": "deadly-delivery.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "3743090" + } + ], + "steamFolderName": "Deadly Delivery", + "dataFolderName": "Deadly Delivery_Data", + "exeNames": [ + "Deadly Delivery.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Deadly Delivery", + "iconUrl": "deadly-delivery.webp" + }, + "settingsIdentifier": "DeadlyDelivery", + "internalFolderName": "DeadlyDelivery", + "packageIndex": "https://thunderstore.io/c/deadly-delivery/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Deadly Delivery", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.com/invite/vxaFQr9jqC", + "autolistPackageIds": [ + "BepInEx-BepInExPack_IL2CPP" + ], + "shortDescription": "An online VR co-op horror game about delivering parcels into haunted mines. Avoid monsters, drop off packages, and pray you reach the quota! Team up with up to 3 other delivery goblins, survive your shift and pay back your student loans." + } + }, "dicey-dungeons": { "uuid": "6332d5c4-1a74-4826-abb3-f18b212f26fd", "label": "dicey-dungeons", @@ -20559,70 +21317,152 @@ "modpacks" ] } - } + } + }, + "r2modman": null + }, + "dinosaur-planet-recompiled": { + "uuid": "7d372a07-edb8-4267-b791-bd8a9b2c9381", + "label": "dinosaur-planet-recompiled", + "meta": { + "displayName": "Dinosaur Planet: Recompiled", + "iconUrl": "dinosaur-planet-recompiled.webp" + }, + "distributions": [], + "r2modman": null, + "thunderstore": { + "displayName": "Dinosaur Planet: Recompiled", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://github.com/DinosaurPlanetRecomp/dino-recomp?tab=readme-ov-file#creating-mods", + "discordUrl": "https://discord.gg/SUrA4aV7UW", + "autolistPackageIds": [] + } + }, + "dread-hunger": { + "uuid": "8b1ef87d-8ca8-4204-9cf3-7b7bc8262e37", + "label": "dread-hunger", + "meta": { + "displayName": "Dread Hunger", + "iconUrl": null + }, + "distributions": [], + "thunderstore": { + "displayName": "Dread Hunger", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://dread-hunger.fandom.com/wiki/Dread_Hunger_Wiki", + "discordUrl": "https://discord.gg/unofficial-dread-hunger-1175075973532762152", + "autolistPackageIds": [ + "Thunderstore-unreal_shimloader" + ] }, "r2modman": null }, - "dinosaur-planet-recompiled": { - "uuid": "7d372a07-edb8-4267-b791-bd8a9b2c9381", - "label": "dinosaur-planet-recompiled", + "ducks-can-drive": { + "uuid": "5bbaccc5-d8fe-4fab-877d-7dec9db01630", + "label": "ducks-can-drive", "meta": { - "displayName": "Dinosaur Planet: Recompiled", - "iconUrl": "dinosaur-planet-recompiled.webp" + "displayName": "Ducks Can Drive", + "iconUrl": "ducks-can-drive.webp" }, "distributions": [], - "r2modman": null, - "thunderstore": { - "displayName": "Dinosaur Planet: Recompiled", - "categories": { - "mods": { - "label": "Mods" - }, - "modpacks": { - "label": "Modpacks" - }, - "tools": { - "label": "Tools" - }, - "libraries": { - "label": "Libraries" - }, - "misc": { - "label": "Misc" - }, - "audio": { - "label": "Audio" - } - }, - "sections": { - "mods": { - "name": "Mods", - "excludeCategories": [ - "modpacks" - ] + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "2472840" + } + ], + "steamFolderName": "Ducks Can Drive", + "dataFolderName": "Ducks Can Drive_Data", + "exeNames": [ + "Ducks Can Drive.exe", + "DuckDrive.x86_64", + "Ducks Can Drive.app" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Ducks Can Drive", + "iconUrl": "ducks-can-drive.webp" }, - "modpacks": { - "name": "Modpacks", - "requireCategories": [ - "modpacks" - ] - } - }, - "wikiUrl": "https://github.com/DinosaurPlanetRecomp/dino-recomp?tab=readme-ov-file#creating-mods", - "discordUrl": "https://discord.gg/SUrA4aV7UW", - "autolistPackageIds": [] - } - }, - "dread-hunger": { - "uuid": "8b1ef87d-8ca8-4204-9cf3-7b7bc8262e37", - "label": "dread-hunger", - "meta": { - "displayName": "Dread Hunger", - "iconUrl": null - }, - "distributions": [], + "settingsIdentifier": "DucksCanDrive", + "internalFolderName": "DucksCanDrive", + "packageIndex": "https://thunderstore.io/c/ducks-can-drive/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [], + "installRules": [], + "relativeFileExclusions": null + } + ], "thunderstore": { - "displayName": "Dread Hunger", + "displayName": "Ducks Can Drive", "categories": { "mods": { "label": "Mods" @@ -20657,13 +21497,11 @@ ] } }, - "wikiUrl": "https://dread-hunger.fandom.com/wiki/Dread_Hunger_Wiki", - "discordUrl": "https://discord.gg/unofficial-dread-hunger-1175075973532762152", "autolistPackageIds": [ - "Thunderstore-unreal_shimloader" - ] - }, - "r2modman": null + "LavaGang-MelonLoader" + ], + "shortDescription": "Ducks like to race, even in their own cars! Earn money by delivering food to fellow ducks in the city, then use this money to upgrade your vehicle. The better the vehicle, the better chance you have to win the race at the end of the day!" + } }, "easy-delivery-co": { "uuid": "3f5f3de7-0056-48d1-b5fe-55bb4f395874", @@ -20864,7 +21702,9 @@ "internalFolderName": "FactoryPlanner", "packageIndex": "https://thunderstore.io/c/factory-planner/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], + "additionalSearchStrings": [ + "卡牌工厂" + ], "installRules": [ { "route": "BepInEx/plugins", @@ -21446,6 +22286,207 @@ ] } }, + "gorilla-tag": { + "uuid": "f82a5eb3-c8b7-49af-99d8-a812ab87f8fc", + "label": "gorilla-tag", + "meta": { + "displayName": "Gorilla Tag", + "iconUrl": "gorilla-tag.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "1533390" + } + ], + "steamFolderName": "Gorilla Tag", + "dataFolderName": "Gorilla Tag_Data", + "exeNames": [ + "Gorilla Tag.exe" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Gorilla Tag", + "iconUrl": "gorilla-tag.webp" + }, + "settingsIdentifier": "GorillaTag", + "internalFolderName": "GorillaTag", + "packageIndex": "https://thunderstore.io/c/gorilla-tag/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "GT" + ], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Gorilla Tag", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/5rTmMjtECf", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "Run, jump, and climb using only your hands. Play tag or infection with people online. Run away from the infected players, or outmaneuver the survivors to catch them. Embrace your inner ape." + } + }, + "granny-chapter-two": { + "uuid": "e0c90bc6-675a-4ae7-a60e-57696d4a2205", + "label": "granny-chapter-two", + "meta": { + "displayName": "Granny: Chapter Two", + "iconUrl": "granny-chapter-two.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "1205040" + } + ], + "steamFolderName": "Granny Chapter Two", + "dataFolderName": "Granny Chapter Two_Data", + "exeNames": [ + "Granny Chapter Two.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Granny: Chapter Two", + "iconUrl": "granny-chapter-two.webp" + }, + "settingsIdentifier": "GrannyChapterTwo", + "internalFolderName": "GrannyChapterTwo", + "packageIndex": "https://thunderstore.io/c/granny-chapter-two/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "恐怖奶奶2" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Granny: Chapter Two", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack_IL2CPP" + ], + "shortDescription": "You have to escape Granny and Grandpa...You have five days..." + } + }, "grey-hack": { "uuid": "40ea6b48-e390-42f9-9454-d49ade3212eb", "label": "grey-hack", @@ -22020,6 +23061,128 @@ "autolistPackageIds": [] } }, + "jump-scare-mansion": { + "uuid": "bd792010-c61e-454a-bf51-b3c28243e14f", + "label": "jump-scare-mansion", + "meta": { + "displayName": "Spooky's Jump Scare Mansion: HD Renovation", + "iconUrl": "jump-scare-mansion.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "577690" + } + ], + "steamFolderName": "Spooky's Jump Scare Mansion HD Renovation", + "dataFolderName": "SpookyUnity_Data", + "exeNames": [ + "SpookyUnity.exe", + "SpookyUnity.app" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Spooky's Jump Scare Mansion: HD Renovation", + "iconUrl": "jump-scare-mansion.webp" + }, + "settingsIdentifier": "SpookysJumpScareMansionHdRenovation", + "internalFolderName": "SpookysJumpScareMansionHdRenovation", + "packageIndex": "https://thunderstore.io/c/jump-scare-mansion/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "SJSM", + "Spookys" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Spooky's Jump Scare Mansion: HD Renovation", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Can you survive 1000 rooms of cute terror? Or will you break once the cuteness starts to fade off and you're running for your life from the unspeakable hideous beings that shake and writhe in bowels of this house? They wait for you, they wait and hunger for meeting you." + } + }, "jump-space": { "uuid": "0749aeb4-0675-405a-b247-c4180035066b", "label": "jump-space", @@ -22550,123 +23713,243 @@ ] } }, - "discordUrl": "https://discord.com/invite/C5Qkk53", - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] - } - }, - "lost-skies-ic": { - "uuid": "76651ab2-90fc-4aa1-bb3f-677dcf924c2c", - "label": "lost-skies-ic", - "meta": { - "displayName": "Lost Skies Island Creator", - "iconUrl": "lost-skies-island-creator.webp" - }, - "distributions": [ - { - "platform": "steam", - "identifier": "2102670" - } - ], - "r2modman": [ - { - "gameInstanceType": "game", - "distributions": [ - { - "platform": "steam", - "identifier": "2102670" - } - ], - "steamFolderName": "Lost Skies Island Creator", - "dataFolderName": "IslandCreator_Data", - "exeNames": [ - "IslandCreator.exe" - ], - "packageLoader": "bepinex", - "meta": { - "displayName": "Lost Skies Island Creator", - "iconUrl": "lost-skies-island-creator.webp" - }, - "settingsIdentifier": "LostSkiesIslandCreator", - "internalFolderName": "LostSkiesIslandCreator", - "packageIndex": "https://thunderstore.io/c/lost-skies-ic/api/v1/package-listing-index/", - "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [ - "lsic", - "失落的天空:岛屿创造者" - ], - "installRules": [ - { - "route": "BepInEx/plugins", - "isDefaultLocation": true, - "defaultFileExtensions": [ - ".dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/core", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/patchers", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/monomod", - "isDefaultLocation": false, - "defaultFileExtensions": [ - ".mm.dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/config", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "none", - "subRoutes": [] - } - ], - "relativeFileExclusions": null - } - ], - "thunderstore": { - "displayName": "Lost Skies Island Creator", - "categories": { - "mods": { - "label": "Mods" - }, - "fixes": { - "label": "Fixes" - }, - "misc": { - "label": "Misc" - } - }, - "sections": {}, - "wikiUrl": "https://lostskies.wiki.gg/", - "discordUrl": "https://discord.com/invite/QWtTAnbvqz", + "discordUrl": "https://discord.com/invite/C5Qkk53", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] + } + }, + "lost-skies-ic": { + "uuid": "76651ab2-90fc-4aa1-bb3f-677dcf924c2c", + "label": "lost-skies-ic", + "meta": { + "displayName": "Lost Skies Island Creator", + "iconUrl": "lost-skies-island-creator.webp" + }, + "distributions": [ + { + "platform": "steam", + "identifier": "2102670" + } + ], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "2102670" + } + ], + "steamFolderName": "Lost Skies Island Creator", + "dataFolderName": "IslandCreator_Data", + "exeNames": [ + "IslandCreator.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Lost Skies Island Creator", + "iconUrl": "lost-skies-island-creator.webp" + }, + "settingsIdentifier": "LostSkiesIslandCreator", + "internalFolderName": "LostSkiesIslandCreator", + "packageIndex": "https://thunderstore.io/c/lost-skies-ic/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "lsic", + "失落的天空:岛屿创造者" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Lost Skies Island Creator", + "categories": { + "mods": { + "label": "Mods" + }, + "fixes": { + "label": "Fixes" + }, + "misc": { + "label": "Misc" + } + }, + "sections": {}, + "wikiUrl": "https://lostskies.wiki.gg/", + "discordUrl": "https://discord.com/invite/QWtTAnbvqz", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] + } + }, + "mage-arena": { + "uuid": "8952eb1d-3b5f-4f97-816a-617d183c206a", + "label": "mage-arena", + "meta": { + "displayName": "Mage Arena", + "iconUrl": "mage-arena.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "3716600" + } + ], + "steamFolderName": "Mage Arena", + "dataFolderName": "MageArena_Data", + "exeNames": [ + "MageArena.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Mage Arena", + "iconUrl": "mage-arena.webp" + }, + "settingsIdentifier": "MageArena", + "internalFolderName": "MageArena", + "packageIndex": "https://thunderstore.io/c/mage-arena/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "法师竞技场" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Mage Arena", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/YXY5XZHG8R", "autolistPackageIds": [ "BepInEx-BepInExPack" ] } }, - "mage-arena": { - "uuid": "8952eb1d-3b5f-4f97-816a-617d183c206a", - "label": "mage-arena", + "malteses-fluffy-onsen": { + "uuid": "5ebb5fe3-e1fc-43e7-9598-063b0e3733f3", + "label": "malteses-fluffy-onsen", "meta": { - "displayName": "Mage Arena", - "iconUrl": "mage-arena.webp" + "displayName": "Maltese's Fluffy Onsen", + "iconUrl": "malteses-fluffy-onsen.webp" }, "distributions": [], "r2modman": [ @@ -22675,25 +23958,26 @@ "distributions": [ { "platform": "steam", - "identifier": "3716600" + "identifier": "3404470" } ], - "steamFolderName": "Mage Arena", - "dataFolderName": "MageArena_Data", + "steamFolderName": "Animal Spa", + "dataFolderName": "AnimalSpa_Data", "exeNames": [ - "MageArena.exe" + "AnimalSpa.exe" ], "packageLoader": "bepinex", "meta": { - "displayName": "Mage Arena", - "iconUrl": "mage-arena.webp" + "displayName": "Maltese's Fluffy Onsen", + "iconUrl": "malteses-fluffy-onsen.webp" }, - "settingsIdentifier": "MageArena", - "internalFolderName": "MageArena", - "packageIndex": "https://thunderstore.io/c/mage-arena/api/v1/package-listing-index/", + "settingsIdentifier": "MaltesesFluffyOnsen", + "internalFolderName": "MaltesesFluffyOnsen", + "packageIndex": "https://thunderstore.io/c/malteses-fluffy-onsen/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "法师竞技场" + "mfo", + "线条小狗:动物温泉" ], "installRules": [ { @@ -22740,7 +24024,7 @@ } ], "thunderstore": { - "displayName": "Mage Arena", + "displayName": "Maltese's Fluffy Onsen", "categories": { "mods": { "label": "Mods" @@ -22775,18 +24059,18 @@ ] } }, - "discordUrl": "https://discord.gg/YXY5XZHG8R", + "wikiUrl": "https://gldym.github.io/posts/Animal-Spa-En/", "autolistPackageIds": [ "BepInEx-BepInExPack" ] } }, - "malteses-fluffy-onsen": { - "uuid": "5ebb5fe3-e1fc-43e7-9598-063b0e3733f3", - "label": "malteses-fluffy-onsen", + "megabonk": { + "uuid": "861f9f61-8f2d-4d32-bf15-c2fdd1b5e0f5", + "label": "megabonk", "meta": { - "displayName": "Maltese's Fluffy Onsen", - "iconUrl": "malteses-fluffy-onsen.webp" + "displayName": "Megabonk", + "iconUrl": "megabonk.webp" }, "distributions": [], "r2modman": [ @@ -22795,26 +24079,26 @@ "distributions": [ { "platform": "steam", - "identifier": "3404470" + "identifier": "3405340" } ], - "steamFolderName": "Animal Spa", - "dataFolderName": "AnimalSpa_Data", + "steamFolderName": "Megabonk", + "dataFolderName": "Megabonk_Data", "exeNames": [ - "AnimalSpa.exe" + "Megabonk.exe", + "Megabonk.x86_64" ], "packageLoader": "bepinex", "meta": { - "displayName": "Maltese's Fluffy Onsen", - "iconUrl": "malteses-fluffy-onsen.webp" + "displayName": "Megabonk", + "iconUrl": "megabonk.webp" }, - "settingsIdentifier": "MaltesesFluffyOnsen", - "internalFolderName": "MaltesesFluffyOnsen", - "packageIndex": "https://thunderstore.io/c/malteses-fluffy-onsen/api/v1/package-listing-index/", + "settingsIdentifier": "Megabonk", + "internalFolderName": "Megabonk", + "packageIndex": "https://thunderstore.io/c/megabonk/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "mfo", - "线条小狗:动物温泉" + "梅加邦克" ], "installRules": [ { @@ -22861,7 +24145,7 @@ } ], "thunderstore": { - "displayName": "Maltese's Fluffy Onsen", + "displayName": "Megabonk", "categories": { "mods": { "label": "Mods" @@ -22896,93 +24180,23 @@ ] } }, - "wikiUrl": "https://gldym.github.io/posts/Animal-Spa-En/", + "discordUrl": "https://discord.gg/9VCRuEYTcq", "autolistPackageIds": [ - "BepInEx-BepInExPack" + "BepInEx-BepInExPack_IL2CPP" ] } }, - "megabonk": { - "uuid": "861f9f61-8f2d-4d32-bf15-c2fdd1b5e0f5", - "label": "megabonk", + "mewgenics": { + "uuid": "5f9befbe-f606-4498-a1c1-f4dabcd8d5c2", + "label": "mewgenics", "meta": { - "displayName": "Megabonk", - "iconUrl": "megabonk.webp" + "displayName": "Mewgenics", + "iconUrl": "mewgenics.webp" }, "distributions": [], - "r2modman": [ - { - "gameInstanceType": "game", - "distributions": [ - { - "platform": "steam", - "identifier": "3405340" - } - ], - "steamFolderName": "Megabonk", - "dataFolderName": "Megabonk_Data", - "exeNames": [ - "Megabonk.exe", - "Megabonk.x86_64" - ], - "packageLoader": "bepinex", - "meta": { - "displayName": "Megabonk", - "iconUrl": "megabonk.webp" - }, - "settingsIdentifier": "Megabonk", - "internalFolderName": "Megabonk", - "packageIndex": "https://thunderstore.io/c/megabonk/api/v1/package-listing-index/", - "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [ - "梅加邦克" - ], - "installRules": [ - { - "route": "BepInEx/plugins", - "isDefaultLocation": true, - "defaultFileExtensions": [ - ".dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/core", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/patchers", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/monomod", - "isDefaultLocation": false, - "defaultFileExtensions": [ - ".mm.dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/config", - "isDefaultLocation": false, - "defaultFileExtensions": [], - "trackingMethod": "none", - "subRoutes": [] - } - ], - "relativeFileExclusions": null - } - ], + "r2modman": null, "thunderstore": { - "displayName": "Megabonk", + "displayName": "Mewgenics", "categories": { "mods": { "label": "Mods" @@ -23017,10 +24231,7 @@ ] } }, - "discordUrl": "https://discord.gg/9VCRuEYTcq", - "autolistPackageIds": [ - "BepInEx-BepInExPack_IL2CPP" - ] + "shortDescription": "Build the ultimate cat army through tactical breeding and send them into deep, challenging turn-based adventures. Draft abilities, collect items, and manipulate genetics across generations in this roguelike tactics game from the creators of The Binding of Isaac and The End is Nigh." } }, "mimesis": { @@ -23718,7 +24929,8 @@ "steamFolderName": "On-Together/On-Together", "dataFolderName": "On-Together_Data", "exeNames": [ - "On-Together.exe" + "On-Together.exe", + "OnTogether.exe" ], "packageLoader": "bepinex", "meta": { @@ -23729,7 +24941,9 @@ "internalFolderName": "OnTogetherVirtualCoWorking", "packageIndex": "https://thunderstore.io/c/on-together/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], + "additionalSearchStrings": [ + "随时在一起:云自习" + ], "installRules": [ { "route": "BepInEx/plugins", @@ -24256,6 +25470,56 @@ ] } }, + "paradiddle": { + "uuid": "7bdd9e41-0144-4fa0-9727-580134489cfb", + "label": "paradiddle", + "meta": { + "displayName": "Paradiddle", + "iconUrl": "paradiddle.webp" + }, + "distributions": [], + "r2modman": null, + "thunderstore": { + "displayName": "Paradiddle", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/paradiddle", + "wikiUrl": "https://github.com/kasapoli/ParadiddleWorkshop", + "shortDescription": "So much more than a VR drum kit. Learn to drum step by step, flex your skills with the built-in rhythm game, and build your own custom kit from a library of 60+ percussive instruments without the limitations of money or physical space. Fun, intuitive drumming for pros and newcomers alike!" + } + }, "patapon-1-2-replay": { "uuid": "d6dfad59-d6df-4398-b5d8-84dbbbace85f", "label": "patapon-1-2-replay", @@ -24559,6 +25823,87 @@ ] } }, + "pit-of-goblin": { + "uuid": "642cb413-e757-4276-a329-5b7539e527e1", + "label": "pit-of-goblin", + "meta": { + "displayName": "Pit of Goblin", + "iconUrl": "pit-of-goblin.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "3253530" + } + ], + "steamFolderName": "Pit of Goblin", + "dataFolderName": "Pit of Goblin_Data", + "exeNames": [ + "Pit of Goblin.exe" + ], + "packageLoader": "recursive-melonloader", + "meta": { + "displayName": "Pit of Goblin", + "iconUrl": "pit-of-goblin.webp" + }, + "settingsIdentifier": "PitOfGoblin", + "internalFolderName": "PitOfGoblin", + "packageIndex": "https://thunderstore.io/c/pit-of-goblin/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "POG", + "PoG" + ], + "installRules": [], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Pit of Goblin", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "In this online horror co-op, you play as a scrappy goblin, scavenging dungeons, dodging traps, and fleeing monsters to feed the Goblin King-Queen. Team up with goblin pals, or go rogue, as you dive deep and cause chaos! Fail to feed them, and you might be the next meal!" + } + }, "project-arrhythmia": { "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "label": "project-arrhythmia", @@ -24591,7 +25936,8 @@ "packageIndex": "https://thunderstore.io/c/project-arrhythmia/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "PA" + "PA", + "心律失常" ], "installRules": [ { @@ -25094,7 +26440,165 @@ } ], "thunderstore": { - "displayName": "Resonite", + "displayName": "Resonite", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + }, + "assetimporting": { + "label": "Asset Importing" + }, + "bugworkaround": { + "label": "Bug Workaround" + }, + "contextmenu": { + "label": "Context Menu" + }, + "controls": { + "label": "Controls" + }, + "dashboard": { + "label": "Dashboard" + }, + "hardwareintegration": { + "label": "Hardware Integration" + }, + "inspectors": { + "label": "Inspectors" + }, + "memes": { + "label": "Memes" + }, + "optimization": { + "label": "Optimization" + }, + "protoflux": { + "label": "Protoflux" + }, + "technicaltweaks": { + "label": "Technical Tweaks" + }, + "visualtweaks": { + "label": "Visual Tweaks" + }, + "wizards": { + "label": "Wizards" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/vCDJK9xyvm", + "wikiUrl": "https://modding.resonite.net", + "autolistPackageIds": [] + } + }, + "return-from-core": { + "uuid": "24c83122-c208-4384-906f-fd99b3194a65", + "label": "return-from-core", + "meta": { + "displayName": "Return From Core", + "iconUrl": "return-from-core.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "2171630" + } + ], + "steamFolderName": "Return From Core/Return From Core", + "dataFolderName": "Return From Core_Data", + "exeNames": [ + "Return From Core.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Return From Core", + "iconUrl": "return-from-core.webp" + }, + "settingsIdentifier": "ReturnFromCore", + "internalFolderName": "ReturnFromCore", + "packageIndex": "https://thunderstore.io/c/return-from-core/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "地心归途" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Return From Core", "categories": { "mods": { "label": "Mods" @@ -25113,45 +26617,6 @@ }, "audio": { "label": "Audio" - }, - "assetimporting": { - "label": "Asset Importing" - }, - "bugworkaround": { - "label": "Bug Workaround" - }, - "contextmenu": { - "label": "Context Menu" - }, - "controls": { - "label": "Controls" - }, - "dashboard": { - "label": "Dashboard" - }, - "hardwareintegration": { - "label": "Hardware Integration" - }, - "inspectors": { - "label": "Inspectors" - }, - "memes": { - "label": "Memes" - }, - "optimization": { - "label": "Optimization" - }, - "protoflux": { - "label": "Protoflux" - }, - "technicaltweaks": { - "label": "Technical Tweaks" - }, - "visualtweaks": { - "label": "Visual Tweaks" - }, - "wizards": { - "label": "Wizards" } }, "sections": { @@ -25168,17 +26633,17 @@ ] } }, - "discordUrl": "https://discord.gg/vCDJK9xyvm", - "wikiUrl": "https://modding.resonite.net", - "autolistPackageIds": [] + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] } }, - "return-from-core": { - "uuid": "24c83122-c208-4384-906f-fd99b3194a65", - "label": "return-from-core", + "rv-there-yet": { + "uuid": "81310141-47b7-4a76-9142-f5a42d1c7811", + "label": "rv-there-yet", "meta": { - "displayName": "Return From Core", - "iconUrl": "return-from-core.webp" + "displayName": "RV There Yet?", + "iconUrl": "rv-there-yet.webp" }, "distributions": [], "r2modman": [ @@ -25187,61 +26652,43 @@ "distributions": [ { "platform": "steam", - "identifier": "2171630" + "identifier": "3949040" } ], - "steamFolderName": "Return From Core/Return From Core", - "dataFolderName": "Return From Core_Data", + "steamFolderName": "Ride", + "dataFolderName": "Ride", "exeNames": [ - "Return From Core.exe" + "Ride.exe" ], - "packageLoader": "bepinex", + "packageLoader": "shimloader", "meta": { - "displayName": "Return From Core", - "iconUrl": "return-from-core.webp" + "displayName": "RV There Yet?", + "iconUrl": "rv-there-yet.webp" }, - "settingsIdentifier": "ReturnFromCore", - "internalFolderName": "ReturnFromCore", - "packageIndex": "https://thunderstore.io/c/return-from-core/api/v1/package-listing-index/", + "settingsIdentifier": "RvThereYet", + "internalFolderName": "RvThereYet", + "packageIndex": "https://thunderstore.io/c/rv-there-yet/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", "additionalSearchStrings": [ - "地心归途" + "我们到了吗?" ], "installRules": [ { - "route": "BepInEx/plugins", + "route": "shimloader/mod", "isDefaultLocation": true, - "defaultFileExtensions": [ - ".dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/core", - "isDefaultLocation": false, "defaultFileExtensions": [], "trackingMethod": "subdir", "subRoutes": [] }, { - "route": "BepInEx/patchers", + "route": "shimloader/pak", "isDefaultLocation": false, "defaultFileExtensions": [], "trackingMethod": "subdir", "subRoutes": [] }, { - "route": "BepInEx/monomod", - "isDefaultLocation": false, - "defaultFileExtensions": [ - ".mm.dll" - ], - "trackingMethod": "subdir", - "subRoutes": [] - }, - { - "route": "BepInEx/config", + "route": "shimloader/cfg", "isDefaultLocation": false, "defaultFileExtensions": [], "trackingMethod": "none", @@ -25251,83 +26698,6 @@ "relativeFileExclusions": null } ], - "thunderstore": { - "displayName": "Return From Core", - "categories": { - "mods": { - "label": "Mods" - }, - "modpacks": { - "label": "Modpacks" - }, - "tools": { - "label": "Tools" - }, - "libraries": { - "label": "Libraries" - }, - "misc": { - "label": "Misc" - }, - "audio": { - "label": "Audio" - } - }, - "sections": { - "mods": { - "name": "Mods", - "excludeCategories": [ - "modpacks" - ] - }, - "modpacks": { - "name": "Modpacks", - "requireCategories": [ - "modpacks" - ] - } - }, - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] - } - }, - "rv-there-yet": { - "uuid": "81310141-47b7-4a76-9142-f5a42d1c7811", - "label": "rv-there-yet", - "meta": { - "displayName": "RV There Yet?", - "iconUrl": "rv-there-yet.webp" - }, - "distributions": [], - "r2modman": [ - { - "gameInstanceType": "game", - "distributions": [ - { - "platform": "steam", - "identifier": "3949040" - } - ], - "steamFolderName": "Ride", - "dataFolderName": "Ride", - "exeNames": [ - "Ride.exe" - ], - "packageLoader": "shimloader", - "meta": { - "displayName": "RV There Yet?", - "iconUrl": "rv-there-yet.webp" - }, - "settingsIdentifier": "RvThereYet", - "internalFolderName": "RvThereYet", - "packageIndex": "https://thunderstore.io/c/rv-there-yet/api/v1/package-listing-index/", - "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], - "installRules": [], - "relativeFileExclusions": null - } - ], "thunderstore": { "displayName": "RV There Yet?", "categories": { @@ -25733,10 +27103,118 @@ ] } }, - "discordUrl": "https://discord.gg/CtD5hvkHAB", + "discordUrl": "https://discord.gg/CtD5hvkHAB", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] + } + }, + "soulcalibur-vi": { + "uuid": "cc86a7a4-1f50-4c49-bbd6-d2eb960fb894", + "label": "soulcalibur-vi", + "meta": { + "displayName": "SOULCALIBUR VI", + "iconUrl": "soulcalibur-vi.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "544750" + } + ], + "steamFolderName": "SoulcaliburVI", + "dataFolderName": "SoulcaliburVI", + "exeNames": [ + "SoulcaliburVI.exe" + ], + "packageLoader": "shimloader", + "meta": { + "displayName": "SOULCALIBUR VI", + "iconUrl": "soulcalibur-vi.webp" + }, + "settingsIdentifier": "SoulcaliburVi", + "internalFolderName": "SoulcaliburVi", + "packageIndex": "https://thunderstore.io/c/soulcalibur-vi/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "SC6", + "SCVI", + "Soul Calibur", + "灵魂能力6", + "刀魂6", + "剑魂6" + ], + "installRules": [ + { + "route": "shimloader/mod", + "isDefaultLocation": true, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/pak", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "shimloader/cfg", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "SOULCALIBUR VI", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/jsJ7XpP", "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "Thunderstore-unreal_shimloader" + ], + "shortDescription": "Bring more than your fists to the fight! Featuring all-new battle mechanics and characters, SOULCALIBUR VI marks a new era of the historic franchise. Welcome back to the stage of history!" } }, "spaghetti-kart": { @@ -25917,7 +27395,9 @@ "internalFolderName": "StolenRealm", "packageIndex": "https://thunderstore.io/c/stolen-realm/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], + "additionalSearchStrings": [ + "失落王国" + ], "installRules": [ { "route": "BepInEx/plugins", @@ -26004,6 +27484,149 @@ "shortDescription": "Stolen Realm is a simultaneous turn-based tactical dungeon crawling looter with action RPG elements where you control up to 6 heroes, solo or through online co-op, venturing forth in adventures set in a high-fantasy, low-poly world." } }, + "super-battle-golf": { + "uuid": "ff4d426c-8315-4e7c-b942-ce9d60dc2082", + "label": "super-battle-golf", + "meta": { + "displayName": "Super Battle Golf", + "iconUrl": "super-battle-golf.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "4069520" + } + ], + "steamFolderName": "Super Battle Golf", + "dataFolderName": "Super Battle Golf_Data", + "exeNames": [ + "Super Battle Golf.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Super Battle Golf", + "iconUrl": "super-battle-golf.webp" + }, + "settingsIdentifier": "SuperBattleGolf", + "internalFolderName": "SuperBattleGolf", + "packageIndex": "https://thunderstore.io/c/super-battle-golf/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "SBG", + "超级高尔夫大乱斗" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Super Battle Golf", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + }, + "items": { + "label": "Items" + }, + "qol": { + "label": "Quality of Life" + }, + "cosmetics": { + "label": "Cosmetics" + }, + "courses": { + "label": "Courses" + }, + "clientside": { + "label": "Client-Side" + }, + "hostonly": { + "label": "Host-Only" + }, + "allclients": { + "label": "All Clients Required" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/CCcvS2JDjH", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "An online 1-8 player golf game where everyone plays at the same time. Swing, shoot, sabotage, and finish first by any means necessary in a free-for-all rush to the hole." + } + }, "super-fantasy-kingdom": { "uuid": "fe0fa301-b037-4cbc-84e1-300a44bd3eb0", "label": "super-fantasy-kingdom", @@ -26253,7 +27876,9 @@ "internalFolderName": "TheFarmerWasReplaced", "packageIndex": "https://thunderstore.io/c/the-farmer-was-replaced/api/v1/package-listing-index/", "gameSelectionDisplayMode": "visible", - "additionalSearchStrings": [], + "additionalSearchStrings": [ + "编程农场" + ], "installRules": [ { "route": "BepInEx/plugins", @@ -26538,6 +28163,126 @@ ] } }, + "very-very-valet": { + "uuid": "f5e40d47-b6b6-46a0-b8e1-cefcd851e796", + "label": "very-very-valet", + "meta": { + "displayName": "Very Very Valet", + "iconUrl": "very-very-valet.webp" + }, + "distributions": [], + "r2modman": [ + { + "gameInstanceType": "game", + "distributions": [ + { + "platform": "steam", + "identifier": "1448840" + } + ], + "steamFolderName": "Very Very Valet/windows", + "dataFolderName": "VeryVeryValet_Release_Data", + "exeNames": [ + "VeryVeryValet_Release.exe" + ], + "packageLoader": "bepinex", + "meta": { + "displayName": "Very Very Valet", + "iconUrl": "very-very-valet.webp" + }, + "settingsIdentifier": "VeryVeryValet", + "internalFolderName": "VeryVeryValet", + "packageIndex": "https://thunderstore.io/c/very-very-valet/api/v1/package-listing-index/", + "gameSelectionDisplayMode": "visible", + "additionalSearchStrings": [ + "VVV" + ], + "installRules": [ + { + "route": "BepInEx/plugins", + "isDefaultLocation": true, + "defaultFileExtensions": [ + ".dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/core", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/patchers", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/monomod", + "isDefaultLocation": false, + "defaultFileExtensions": [ + ".mm.dll" + ], + "trackingMethod": "subdir", + "subRoutes": [] + }, + { + "route": "BepInEx/config", + "isDefaultLocation": false, + "defaultFileExtensions": [], + "trackingMethod": "none", + "subRoutes": [] + } + ], + "relativeFileExclusions": null + } + ], + "thunderstore": { + "displayName": "Very Very Valet", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Your next chaotic couch co-op party game is here! Drive, boost, and crash like wild with friends in this parking palooza" + } + }, "vigil": { "uuid": "af2cd83f-99c0-4fa7-a319-e8022b0aea78", "label": "vigil", @@ -26876,6 +28621,30 @@ }, "audio": { "label": "Audio" + }, + "client": { + "label": "Client Side" + }, + "all": { + "label": "All Clients" + }, + "host": { + "label": "Host Only" + }, + "wands": { + "label": "Wands" + }, + "robes": { + "label": "Robes" + }, + "items": { + "label": "Items" + }, + "qol": { + "label": "Quality Of Life" + }, + "contracts": { + "label": "Contracts" } }, "sections": { @@ -26894,7 +28663,8 @@ }, "autolistPackageIds": [ "BepInEx-BepInExPack" - ] + ], + "discordUrl": "https://discord.gg/kzKBmD8HrB" } }, "zelda-64-recompiled": { @@ -27391,7 +29161,7 @@ ] } }, - "wikiUrl": "https://atlyss.wiki.gg/wiki/ATLYSS_Wiki", + "wikiUrl": "https://github.com/AtlyssModding/ATLYSS-Modding-Resources", "discordUrl": "https://discord.gg/hQceRJ7pEW", "autolistPackageIds": [ "BepInEx-BepInExPack" @@ -27702,7 +29472,7 @@ ] } }, - "discordUrl": "https://discord.gg/TmBBV2qRuq" + "discordUrl": "https://discord.gg/freesoulbrc" }, "bopl-battle": { "displayName": "Bopl Battle", @@ -29177,6 +30947,9 @@ }, "tweaks-and-quality-of-life": { "label": "Tweaks & Quality Of Life" + }, + "ai-generated": { + "label": "AI Generated" } }, "sections": { @@ -30338,6 +32111,9 @@ }, "server-side": { "label": "Server-side" + }, + "mod-jam-1": { + "label": "Mod Jam 1 - Void" } }, "sections": { @@ -31205,12 +32981,18 @@ "tools": { "label": "Tools" }, + "cheats": { + "label": "Cheats" + }, "misc": { "label": "Misc" }, "0-62-branch": { "label": "0.62 Branch" }, + "0-66-branch": { + "label": "0.66 Branch" + }, "manual-dependencies": { "label": "Requires Manual Dependencies" } @@ -31220,7 +33002,8 @@ "name": "Main Branch", "excludeCategories": [ "modpacks", - "0-62-branch" + "0-62-branch", + "0-66-branch" ] }, "main-modpacks": { @@ -31229,7 +33012,8 @@ "modpacks" ], "excludeCategories": [ - "0-62-branch" + "0-62-branch", + "0-66-branch" ] }, "0-62": { @@ -31247,6 +33031,22 @@ "modpacks", "0-62-branch" ] + }, + "0-66": { + "name": "0.66 Branch", + "requireCategories": [ + "0-66-branch" + ], + "excludeCategories": [ + "modpacks" + ] + }, + "0-66-modpacks": { + "name": "0.66 Branch Modpacks", + "requireCategories": [ + "modpacks", + "0-66-branch" + ] } }, "wikiUrl": "https://tcg-card-shop-simulator.notion.site/3f8c9de6b54c47a9b80329b40bdd3c2c?v=04938d1088de49e5a55734d498f081ef", @@ -32001,10 +33801,391 @@ ] } }, - "discordUrl": "https://discord.com/invite/galvanicgames" + "discordUrl": "https://discord.com/invite/galvanicgames" + }, + "wrestling-empire": { + "displayName": "Wrestling Empire", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "audio": { + "label": "Audio" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "arenas": { + "label": "Arenas" + }, + "characters": { + "label": "Characters" + }, + "costumes": { + "label": "Costumes" + }, + "furniture": { + "label": "Furniture" + }, + "moves": { + "label": "Moves" + }, + "overrides": { + "label": "Overrides" + }, + "textures": { + "label": "Textures" + }, + "themes": { + "label": "Themes" + }, + "weapons": { + "label": "Weapons" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/mH56AhUwPR" + }, + "zort": { + "displayName": "Zort", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://zort.fandom.com/wiki/Zort_Wiki", + "discordUrl": "https://discord.gg/gmPEXpPvay", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] + }, + "107zxz-inscryption-multiplayer": { + "displayName": "Inscryption Multiplayer", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.com/invite/wXS2FpJpCt" + }, + "2-ship-2-harkinian": { + "displayName": "2 Ship 2 Harkinian", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://gamebanana.com/games/20371", + "discordUrl": "https://discord.com/invite/shipofharkinian", + "autolistPackageIds": [] + }, + "a-gentlemens-dispute": { + "displayName": "A Gentlemen's Dispute", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Polite mayhem awaits! Hurl traps, swing bats, and detonate all in sight as you vie to be the last gentleman standing. Refined chaos for up to 8 players - anything goes, so long as it's done with class!" + }, + "aeruta": { + "displayName": "Aeruta", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [] + }, + "an-unfinished-game": { + "displayName": "An Unfinished Game", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ] + }, + "astroneer": { + "displayName": "Astroneer", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "clientside": { + "label": "Client-side" + }, + "serverside": { + "label": "Server-side" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "wikiUrl": "https://astroneermodding.readthedocs.io/en/latest/", + "discordUrl": "https://discord.gg/astroneer-modding-774729322674126858", + "autolistPackageIds": [ + "Thunderstore-unreal_shimloader" + ] + }, + "baby-steps": { + "displayName": "Baby Steps", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/YvjKGjkn2B", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ] }, - "wrestling-empire": { - "displayName": "Wrestling Empire", + "bad-north": { + "displayName": "Bad North", "categories": { "mods": { "label": "Mods" @@ -32012,9 +34193,6 @@ "modpacks": { "label": "Modpacks" }, - "audio": { - "label": "Audio" - }, "tools": { "label": "Tools" }, @@ -32024,32 +34202,8 @@ "misc": { "label": "Misc" }, - "arenas": { - "label": "Arenas" - }, - "characters": { - "label": "Characters" - }, - "costumes": { - "label": "Costumes" - }, - "furniture": { - "label": "Furniture" - }, - "moves": { - "label": "Moves" - }, - "overrides": { - "label": "Overrides" - }, - "textures": { - "label": "Textures" - }, - "themes": { - "label": "Themes" - }, - "weapons": { - "label": "Weapons" + "audio": { + "label": "Audio" } }, "sections": { @@ -32066,10 +34220,14 @@ ] } }, - "discordUrl": "https://discord.gg/mH56AhUwPR" + "wikiUrl": "https://bad-north.fandom.com/wiki/Bad_North_Wiki", + "discordUrl": "https://discord.gg/bNeqTNB23c", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "zort": { - "displayName": "Zort", + "banjo-recompiled": { + "displayName": "Banjo: Recompiled", "categories": { "mods": { "label": "Mods" @@ -32104,14 +34262,12 @@ ] } }, - "wikiUrl": "https://zort.fandom.com/wiki/Zort_Wiki", - "discordUrl": "https://discord.gg/gmPEXpPvay", - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "wikiUrl": "https://hackmd.io/fMDiGEJ9TBSjomuZZOgzNg", + "discordUrl": "https://discord.gg/AWZThJ4dPf" }, - "107zxz-inscryption-multiplayer": { - "displayName": "Inscryption Multiplayer", + "beetleball": { + "displayName": "Beetleball", + "shortDescription": "Score goals with dungballs in Beetleball, the Greatest Online Multiplayer Class-based Dung Beetle Soccer Game TO EVER EXIST", "categories": { "mods": { "label": "Mods" @@ -32146,10 +34302,12 @@ ] } }, - "discordUrl": "https://discord.com/invite/wXS2FpJpCt" + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ] }, - "2-ship-2-harkinian": { - "displayName": "2 Ship 2 Harkinian", + "bendy-and-the-ink-machine": { + "displayName": "Bendy and the Ink Machine", "categories": { "mods": { "label": "Mods" @@ -32184,12 +34342,12 @@ ] } }, - "wikiUrl": "https://gamebanana.com/games/20371", - "discordUrl": "https://discord.com/invite/shipofharkinian", - "autolistPackageIds": [] + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "aeruta": { - "displayName": "Aeruta", + "beton-brutal": { + "displayName": "BETON BRUTAL", "categories": { "mods": { "label": "Mods" @@ -32224,10 +34382,13 @@ ] } }, - "autolistPackageIds": [] + "discordUrl": "https://discord.com/invite/DqKwJyugGv", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ] }, - "an-unfinished-game": { - "displayName": "An Unfinished Game", + "big-ambitions": { + "displayName": "Big Ambitions", "categories": { "mods": { "label": "Mods" @@ -32262,12 +34423,14 @@ ] } }, + "discordUrl": "https://discord.gg/hovgaardgames", "autolistPackageIds": [ "LavaGang-MelonLoader" - ] + ], + "shortDescription": "Big Ambitions is a revolutionary role-playing business sim. Go from nothing to the biggest entrepreneur in New York by opening small businesses or slowly building huge corporations any way you like." }, - "astroneer": { - "displayName": "Astroneer", + "broforce": { + "displayName": "Broforce", "categories": { "mods": { "label": "Mods" @@ -32275,11 +34438,20 @@ "modpacks": { "label": "Modpacks" }, - "clientside": { - "label": "Client-side" + "bros": { + "label": "Bros" }, - "serverside": { - "label": "Server-side" + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" } }, "sections": { @@ -32296,12 +34468,12 @@ ] } }, - "wikiUrl": "https://astroneermodding.readthedocs.io/en/latest/", - "discordUrl": "https://discord.gg/astroneer-modding-774729322674126858", + "wikiUrl": "https://github.com/alexneargarder/BroforceMods/wiki", + "discordUrl": "https://discord.com/invite/freelives", "autolistPackageIds": [] }, - "baby-steps": { - "displayName": "Baby Steps", + "carrier-deck": { + "displayName": "Carrier Deck", "categories": { "mods": { "label": "Mods" @@ -32336,13 +34508,13 @@ ] } }, - "discordUrl": "https://discord.gg/YvjKGjkn2B", "autolistPackageIds": [ - "LavaGang-MelonLoader" - ] + "BepInEx-BepInExPack" + ], + "shortDescription": "Carrier Deck is a fast paced time management game where you play as the Air Boss on board the CVN-76 in the midst of active war." }, - "bad-north": { - "displayName": "Bad North", + "chill-with-you": { + "displayName": "Chill with You : Lo-Fi Story", "categories": { "mods": { "label": "Mods" @@ -32377,14 +34549,12 @@ ] } }, - "wikiUrl": "https://bad-north.fandom.com/wiki/Bad_North_Wiki", - "discordUrl": "https://discord.gg/bNeqTNB23c", "autolistPackageIds": [ "BepInEx-BepInExPack" ] }, - "banjo-recompiled": { - "displayName": "Banjo: Recompiled", + "clover-pit": { + "displayName": "CloverPit", "categories": { "mods": { "label": "Mods" @@ -32403,6 +34573,33 @@ }, "audio": { "label": "Audio" + }, + "charms": { + "label": "Charms" + }, + "symbols": { + "label": "Symbols" + }, + "patterns": { + "label": "Patterns" + }, + "modifiers": { + "label": "Modifiers" + }, + "localization": { + "label": "Localization" + }, + "phone-options": { + "label": "Phone Options" + }, + "memory-packs": { + "label": "Memory Packs" + }, + "gameplay": { + "label": "Gameplay" + }, + "tweaks": { + "label": "Tweaks" } }, "sections": { @@ -32419,29 +34616,52 @@ ] } }, - "wikiUrl": "https://hackmd.io/fMDiGEJ9TBSjomuZZOgzNg", - "discordUrl": "https://discord.gg/AWZThJ4dPf" + "discordUrl": " https://discord.gg/zTAZ9erd5g", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "beetleball": { - "displayName": "Beetleball", + "cobalt-core": { + "displayName": "Cobalt Core", "categories": { "mods": { "label": "Mods" }, + "tools": { + "label": "Tools" + }, "modpacks": { "label": "Modpacks" }, - "tools": { - "label": "Tools" + "artifacts": { + "label": "Artifacts" + }, + "cards": { + "label": "Cards" + }, + "characters": { + "label": "Characters" + }, + "ships": { + "label": "Ships" + }, + "enemies": { + "label": "Enemies" + }, + "events": { + "label": "Events" + }, + "gameplay-mechanics": { + "label": "Gameplay mechanics" }, "libraries": { "label": "Libraries" }, - "misc": { - "label": "Misc" - }, "audio": { "label": "Audio" + }, + "misc": { + "label": "Misc" } }, "sections": { @@ -32458,12 +34678,10 @@ ] } }, - "autolistPackageIds": [ - "LavaGang-MelonLoader" - ] + "discordUrl": "https://discord.gg/m8jhYA4TvV" }, - "bendy-and-the-ink-machine": { - "displayName": "Bendy and the Ink Machine", + "crab-game": { + "displayName": "Crab Game", "categories": { "mods": { "label": "Mods" @@ -32471,8 +34689,29 @@ "modpacks": { "label": "Modpacks" }, - "tools": { - "label": "Tools" + "host-only": { + "label": "Host Only" + }, + "client-side": { + "label": "Client Side" + }, + "all-clients": { + "label": "All Clients" + }, + "asset-replacements": { + "label": "Asset Replacements" + }, + "tweaks-and-quality-of-life": { + "label": "Tweaks & Quality Of Life" + }, + "bug-fixes": { + "label": "Bug Fixes" + }, + "commands": { + "label": "Commands" + }, + "game-modes": { + "label": "Game Modes" }, "libraries": { "label": "Libraries" @@ -32482,6 +34721,9 @@ }, "audio": { "label": "Audio" + }, + "tools": { + "label": "Tools" } }, "sections": { @@ -32498,12 +34740,11 @@ ] } }, - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "discordUrl": "https://discord.gg/jBGMZqndT3" }, - "beton-brutal": { - "displayName": "BETON BRUTAL", + "crawlspace-2": { + "displayName": "Crawlspace 2", + "discordUrl": "https://discord.gg/BDZ6NjegeR", "categories": { "mods": { "label": "Mods" @@ -32538,13 +34779,13 @@ ] } }, - "discordUrl": "https://discord.com/invite/DqKwJyugGv", "autolistPackageIds": [ - "LavaGang-MelonLoader" + "BepInEx-BepInExPack" ] }, - "broforce": { - "displayName": "Broforce", + "crawlspace": { + "displayName": "Crawlspace", + "discordUrl": "https://discord.gg/BDZ6NjegeR", "categories": { "mods": { "label": "Mods" @@ -32552,9 +34793,6 @@ "modpacks": { "label": "Modpacks" }, - "bros": { - "label": "Bros" - }, "tools": { "label": "Tools" }, @@ -32582,12 +34820,13 @@ ] } }, - "wikiUrl": "https://github.com/alexneargarder/BroforceMods/wiki", - "discordUrl": "https://discord.com/invite/freelives", - "autolistPackageIds": [] + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "You saw an Ad about someone needing help with an odd job, retrieving his daughters missing dolls. Sounding like easy cash, you leave a message telling him you are interested. but as the nights progress, you realize why nobody else wanted to take this job." }, - "carrier-deck": { - "displayName": "Carrier Deck", + "crime-simulator": { + "displayName": "Crime Simulator", "categories": { "mods": { "label": "Mods" @@ -32624,11 +34863,10 @@ }, "autolistPackageIds": [ "BepInEx-BepInExPack" - ], - "shortDescription": "Carrier Deck is a fast paced time management game where you play as the Air Boss on board the CVN-76 in the midst of active war." + ] }, - "chill-with-you": { - "displayName": "Chill with You : Lo-Fi Story", + "cryo": { + "displayName": "CRYO", "categories": { "mods": { "label": "Mods" @@ -32664,11 +34902,12 @@ } }, "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "LavaGang-MelonLoader" + ], + "shortDescription": "CRYO is a multiplayer co-op survival horror for 1-4 players. You have been deployed by your company to various locations around the Antarctic due to communication issues. What awaits you in these dark, remote regions is far more sinister than a technical fault..." }, - "clover-pit": { - "displayName": "CloverPit", + "cursed-words": { + "displayName": "Cursed Words", "categories": { "mods": { "label": "Mods" @@ -32687,33 +34926,6 @@ }, "audio": { "label": "Audio" - }, - "charms": { - "label": "Charms" - }, - "symbols": { - "label": "Symbols" - }, - "patterns": { - "label": "Patterns" - }, - "modifiers": { - "label": "Modifiers" - }, - "localization": { - "label": "Localization" - }, - "phone-options": { - "label": "Phone Options" - }, - "memory-packs": { - "label": "Memory Packs" - }, - "gameplay": { - "label": "Gameplay" - }, - "tweaks": { - "label": "Tweaks" } }, "sections": { @@ -32730,52 +34942,32 @@ ] } }, - "discordUrl": " https://discord.gg/zTAZ9erd5g", + "discordUrl": "https://discord.com/invite/7vqFuNCE8v", "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "LavaGang-MelonLoader" + ], + "shortDescription": "Starts as Boggle, ends as Schrodinger - Cursed Words is a roguelike adventure about writing words... for a while, until words become NUM83R5, or chess pieces, or the infinite void." }, - "cobalt-core": { - "displayName": "Cobalt Core", + "darkwater": { + "displayName": "Darkwater", "categories": { "mods": { "label": "Mods" }, - "tools": { - "label": "Tools" - }, "modpacks": { "label": "Modpacks" }, - "artifacts": { - "label": "Artifacts" - }, - "cards": { - "label": "Cards" - }, - "characters": { - "label": "Characters" - }, - "ships": { - "label": "Ships" - }, - "enemies": { - "label": "Enemies" - }, - "events": { - "label": "Events" - }, - "gameplay-mechanics": { - "label": "Gameplay mechanics" + "tools": { + "label": "Tools" }, "libraries": { "label": "Libraries" }, - "audio": { - "label": "Audio" - }, "misc": { "label": "Misc" + }, + "audio": { + "label": "Audio" } }, "sections": { @@ -32792,10 +34984,12 @@ ] } }, - "discordUrl": "https://discord.gg/m8jhYA4TvV" + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "crab-game": { - "displayName": "Crab Game", + "deadly-delivery": { + "displayName": "Deadly Delivery", "categories": { "mods": { "label": "Mods" @@ -32803,29 +34997,8 @@ "modpacks": { "label": "Modpacks" }, - "host-only": { - "label": "Host Only" - }, - "client-side": { - "label": "Client Side" - }, - "all-clients": { - "label": "All Clients" - }, - "asset-replacements": { - "label": "Asset Replacements" - }, - "tweaks-and-quality-of-life": { - "label": "Tweaks & Quality Of Life" - }, - "bug-fixes": { - "label": "Bug Fixes" - }, - "commands": { - "label": "Commands" - }, - "game-modes": { - "label": "Game Modes" + "tools": { + "label": "Tools" }, "libraries": { "label": "Libraries" @@ -32835,9 +35008,6 @@ }, "audio": { "label": "Audio" - }, - "tools": { - "label": "Tools" } }, "sections": { @@ -32854,10 +35024,14 @@ ] } }, - "discordUrl": "https://discord.gg/jBGMZqndT3" + "discordUrl": "https://discord.com/invite/vxaFQr9jqC", + "autolistPackageIds": [ + "BepInEx-BepInExPack_IL2CPP" + ], + "shortDescription": "An online VR co-op horror game about delivering parcels into haunted mines. Avoid monsters, drop off packages, and pray you reach the quota! Team up with up to 3 other delivery goblins, survive your shift and pay back your student loans." }, - "crawlspace-2": { - "displayName": "Crawlspace 2", + "dicey-dungeons": { + "displayName": "Dicey Dungeons", "categories": { "mods": { "label": "Mods" @@ -32891,13 +35065,10 @@ "modpacks" ] } - }, - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + } }, - "crime-simulator": { - "displayName": "Crime Simulator", + "dinosaur-planet-recompiled": { + "displayName": "Dinosaur Planet: Recompiled", "categories": { "mods": { "label": "Mods" @@ -32932,12 +35103,12 @@ ] } }, - "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "wikiUrl": "https://github.com/DinosaurPlanetRecomp/dino-recomp?tab=readme-ov-file#creating-mods", + "discordUrl": "https://discord.gg/SUrA4aV7UW", + "autolistPackageIds": [] }, - "darkwater": { - "displayName": "Darkwater", + "dread-hunger": { + "displayName": "Dread Hunger", "categories": { "mods": { "label": "Mods" @@ -32972,12 +35143,14 @@ ] } }, + "wikiUrl": "https://dread-hunger.fandom.com/wiki/Dread_Hunger_Wiki", + "discordUrl": "https://discord.gg/unofficial-dread-hunger-1175075973532762152", "autolistPackageIds": [ - "BepInEx-BepInExPack" + "Thunderstore-unreal_shimloader" ] }, - "dicey-dungeons": { - "displayName": "Dicey Dungeons", + "ducks-can-drive": { + "displayName": "Ducks Can Drive", "categories": { "mods": { "label": "Mods" @@ -33011,10 +35184,14 @@ "modpacks" ] } - } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "Ducks like to race, even in their own cars! Earn money by delivering food to fellow ducks in the city, then use this money to upgrade your vehicle. The better the vehicle, the better chance you have to win the race at the end of the day!" }, - "dinosaur-planet-recompiled": { - "displayName": "Dinosaur Planet: Recompiled", + "easy-delivery-co": { + "displayName": "Easy Delivery Co", "categories": { "mods": { "label": "Mods" @@ -33049,12 +35226,13 @@ ] } }, - "wikiUrl": "https://github.com/DinosaurPlanetRecomp/dino-recomp?tab=readme-ov-file#creating-mods", - "discordUrl": "https://discord.gg/SUrA4aV7UW", - "autolistPackageIds": [] + "discordUrl": "https://discord.com/invite/TDkZWmrET3", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "dread-hunger": { - "displayName": "Dread Hunger", + "endless-space-2": { + "displayName": "Endless Space 2", "categories": { "mods": { "label": "Mods" @@ -33089,14 +35267,10 @@ ] } }, - "wikiUrl": "https://dread-hunger.fandom.com/wiki/Dread_Hunger_Wiki", - "discordUrl": "https://discord.gg/unofficial-dread-hunger-1175075973532762152", - "autolistPackageIds": [ - "Thunderstore-unreal_shimloader" - ] + "discordUrl": "https://discord.gg/KZRVjVEe5v" }, - "easy-delivery-co": { - "displayName": "Easy Delivery Co", + "factory-planner": { + "displayName": "Factory Planner", "categories": { "mods": { "label": "Mods" @@ -33131,13 +35305,12 @@ ] } }, - "discordUrl": "https://discord.com/invite/TDkZWmrET3", "autolistPackageIds": [ - "BepInEx-BepInExPack" + "BepInEx-BepInExPack_IL2CPP" ] }, - "endless-space-2": { - "displayName": "Endless Space 2", + "five-nights-at-freddys-into-the-pit": { + "displayName": "Five Nights at Freddy's: Into the Pit", "categories": { "mods": { "label": "Mods" @@ -33172,10 +35345,13 @@ ] } }, - "discordUrl": "https://discord.gg/KZRVjVEe5v" + "discordUrl": "https://discord.gg/technical-fnaf-664239645441261588", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ] }, - "factory-planner": { - "displayName": "Factory Planner", + "football-manager-26": { + "displayName": "Football Manager 26", "categories": { "mods": { "label": "Mods" @@ -33210,12 +35386,10 @@ ] } }, - "autolistPackageIds": [ - "BepInEx-BepInExPack_IL2CPP" - ] + "autolistPackageIds": [] }, - "five-nights-at-freddys-into-the-pit": { - "displayName": "Five Nights at Freddy's: Into the Pit", + "forsaken-frontiers": { + "displayName": "Forsaken Frontiers", "categories": { "mods": { "label": "Mods" @@ -33250,13 +35424,12 @@ ] } }, - "discordUrl": "https://discord.gg/technical-fnaf-664239645441261588", "autolistPackageIds": [ - "BepInEx-BepInExPack" + "LavaGang-MelonLoader" ] }, - "football-manager-26": { - "displayName": "Football Manager 26", + "gear-blocks": { + "displayName": "GearBlocks", "categories": { "mods": { "label": "Mods" @@ -33290,11 +35463,10 @@ "modpacks" ] } - }, - "autolistPackageIds": [] + } }, - "forsaken-frontiers": { - "displayName": "Forsaken Frontiers", + "goblin-buster": { + "displayName": "Goblin Buster: Incremental Tower Defense", "categories": { "mods": { "label": "Mods" @@ -33330,11 +35502,11 @@ } }, "autolistPackageIds": [ - "LavaGang-MelonLoader" + "BepInEx-BepInExPack" ] }, - "gear-blocks": { - "displayName": "GearBlocks", + "gorilla-tag": { + "displayName": "Gorilla Tag", "categories": { "mods": { "label": "Mods" @@ -33368,10 +35540,15 @@ "modpacks" ] } - } + }, + "discordUrl": "https://discord.gg/5rTmMjtECf", + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "Run, jump, and climb using only your hands. Play tag or infection with people online. Run away from the infected players, or outmaneuver the survivors to catch them. Embrace your inner ape." }, - "goblin-buster": { - "displayName": "Goblin Buster: Incremental Tower Defense", + "granny-chapter-two": { + "displayName": "Granny: Chapter Two", "categories": { "mods": { "label": "Mods" @@ -33407,8 +35584,9 @@ } }, "autolistPackageIds": [ - "BepInEx-BepInExPack" - ] + "BepInEx-BepInExPack_IL2CPP" + ], + "shortDescription": "You have to escape Granny and Grandpa...You have five days..." }, "grey-hack": { "displayName": "Grey Hack", @@ -33714,6 +35892,47 @@ "discordUrl": "https://discord.gg/hytalemodding", "autolistPackageIds": [] }, + "jump-scare-mansion": { + "displayName": "Spooky's Jump Scare Mansion: HD Renovation", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Can you survive 1000 rooms of cute terror? Or will you break once the cuteness starts to fade off and you're running for your life from the unspeakable hideous beings that shake and writhe in bowels of this house? They wait for you, they wait and hunger for meeting you." + }, "jump-space": { "displayName": "Jump Space", "categories": { @@ -34097,6 +36316,44 @@ "BepInEx-BepInExPack_IL2CPP" ] }, + "mewgenics": { + "displayName": "Mewgenics", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "shortDescription": "Build the ultimate cat army through tactical breeding and send them into deep, challenging turn-based adventures. Draft abilities, collect items, and manipulate genetics across generations in this roguelike tactics game from the creators of The Binding of Isaac and The End is Nigh." + }, "mimesis": { "displayName": "Mimesis", "discordUrl": "https://discord.gg/FjPTPRMRn", @@ -34602,6 +36859,46 @@ "BepInEx-BepInExPack_IL2CPP" ] }, + "paradiddle": { + "displayName": "Paradiddle", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/paradiddle", + "wikiUrl": "https://github.com/kasapoli/ParadiddleWorkshop", + "shortDescription": "So much more than a VR drum kit. Learn to drum step by step, flex your skills with the built-in rhythm game, and build your own custom kit from a library of 60+ percussive instruments without the limitations of money or physical space. Fun, intuitive drumming for pros and newcomers alike!" + }, "patapon-1-2-replay": { "displayName": "PATAPON 1+2 REPLAY", "categories": { @@ -34738,6 +37035,47 @@ "BepInEx-BepInExPack" ] }, + "pit-of-goblin": { + "displayName": "Pit of Goblin", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "LavaGang-MelonLoader" + ], + "shortDescription": "In this online horror co-op, you play as a scrappy goblin, scavenging dungeons, dodging traps, and fleeing monsters to feed the Goblin King-Queen. Team up with goblin pals, or go rogue, as you dive deep and cause chaos! Fail to feed them, and you might be the next meal!" + }, "project-arrhythmia": { "displayName": "Project Arrhythmia", "categories": { @@ -35285,6 +37623,48 @@ "BepInEx-BepInExPack" ] }, + "soulcalibur-vi": { + "displayName": "SOULCALIBUR VI", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/jsJ7XpP", + "autolistPackageIds": [ + "Thunderstore-unreal_shimloader" + ], + "shortDescription": "Bring more than your fists to the fight! Featuring all-new battle mechanics and characters, SOULCALIBUR VI marks a new era of the historic franchise. Welcome back to the stage of history!" + }, "spaghetti-kart": { "displayName": "Spaghetti Kart", "categories": { @@ -35443,6 +37823,69 @@ ], "shortDescription": "Stolen Realm is a simultaneous turn-based tactical dungeon crawling looter with action RPG elements where you control up to 6 heroes, solo or through online co-op, venturing forth in adventures set in a high-fantasy, low-poly world." }, + "super-battle-golf": { + "displayName": "Super Battle Golf", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + }, + "items": { + "label": "Items" + }, + "qol": { + "label": "Quality of Life" + }, + "cosmetics": { + "label": "Cosmetics" + }, + "courses": { + "label": "Courses" + }, + "clientside": { + "label": "Client-Side" + }, + "hostonly": { + "label": "Host-Only" + }, + "allclients": { + "label": "All Clients Required" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "discordUrl": "https://discord.gg/CCcvS2JDjH", + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "An online 1-8 player golf game where everyone plays at the same time. Swing, shoot, sabotage, and finish first by any means necessary in a free-for-all rush to the hole." + }, "super-fantasy-kingdom": { "displayName": "Super Fantasy Kingdom", "categories": { @@ -35685,6 +38128,47 @@ "LavaGang-MelonLoader" ] }, + "very-very-valet": { + "displayName": "Very Very Valet", + "categories": { + "mods": { + "label": "Mods" + }, + "modpacks": { + "label": "Modpacks" + }, + "tools": { + "label": "Tools" + }, + "libraries": { + "label": "Libraries" + }, + "misc": { + "label": "Misc" + }, + "audio": { + "label": "Audio" + } + }, + "sections": { + "mods": { + "name": "Mods", + "excludeCategories": [ + "modpacks" + ] + }, + "modpacks": { + "name": "Modpacks", + "requireCategories": [ + "modpacks" + ] + } + }, + "autolistPackageIds": [ + "BepInEx-BepInExPack" + ], + "shortDescription": "Your next chaotic couch co-op party game is here! Drive, boost, and crash like wild with friends in this parking palooza" + }, "vigil": { "displayName": "Vigil", "categories": { @@ -35823,6 +38307,30 @@ }, "audio": { "label": "Audio" + }, + "client": { + "label": "Client Side" + }, + "all": { + "label": "All Clients" + }, + "host": { + "label": "Host Only" + }, + "wands": { + "label": "Wands" + }, + "robes": { + "label": "Robes" + }, + "items": { + "label": "Items" + }, + "qol": { + "label": "Quality Of Life" + }, + "contracts": { + "label": "Contracts" } }, "sections": { @@ -35841,7 +38349,8 @@ }, "autolistPackageIds": [ "BepInEx-BepInExPack" - ] + ], + "discordUrl": "https://discord.gg/kzKBmD8HrB" }, "zelda-64-recompiled": { "displayName": "Zelda 64: Recompiled", diff --git a/src/components/all.ts b/src/components/all.ts index bb4668cf9..e18ee9920 100644 --- a/src/components/all.ts +++ b/src/components/all.ts @@ -1,15 +1,17 @@ -import Hero from './v2/Hero.vue'; -import Progress from './Progress.vue'; -import ExpandableCard from './ExpandableCard.vue'; -import ModalCard from './ModalCard.vue'; -import DeferredInput from './DeferredInput.vue'; -import ExternalLink from './v2/ExternalLink.vue'; - -export { - Hero, - Progress, - ExpandableCard, - ModalCard, - DeferredInput, - ExternalLink, -} +import Hero from './v2/Hero.vue'; +import Progress from './Progress.vue'; +import ExpandableCard from './ExpandableCard.vue'; +import ModalCard from './ModalCard.vue'; +import DeferredInput from './DeferredInput.vue'; +import ExternalLink from './v2/ExternalLink.vue'; +import ActivityDropdown from './v2/ActivityDropdown.vue'; + +export { + Hero, + Progress, + ExpandableCard, + ModalCard, + DeferredInput, + ExternalLink, + ActivityDropdown, +} diff --git a/src/components/breadcrumbs/Breadcrumb.ts b/src/components/breadcrumbs/Breadcrumb.ts new file mode 100644 index 000000000..8a105a2bd --- /dev/null +++ b/src/components/breadcrumbs/Breadcrumb.ts @@ -0,0 +1,5 @@ +export type Breadcrumb = { + name: () => string; + path: string; + isActive?: boolean; +} diff --git a/src/components/breadcrumbs/BreadcrumbNavigator.vue b/src/components/breadcrumbs/BreadcrumbNavigator.vue new file mode 100644 index 000000000..94eddde57 --- /dev/null +++ b/src/components/breadcrumbs/BreadcrumbNavigator.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/config-components/ConfigSelectionLayout.vue b/src/components/config-components/ConfigSelectionLayout.vue index 49f7c5897..54527bdd8 100644 --- a/src/components/config-components/ConfigSelectionLayout.vue +++ b/src/components/config-components/ConfigSelectionLayout.vue @@ -196,10 +196,11 @@ function openConfig(file: ConfigFile) { + + + + + diff --git a/src/components/navigation/NavigationMenu.vue b/src/components/navigation/NavigationMenu.vue index f540e9720..b68205c63 100644 --- a/src/components/navigation/NavigationMenu.vue +++ b/src/components/navigation/NavigationMenu.vue @@ -1,75 +1,93 @@ @@ -91,10 +109,13 @@ import { getStore } from '../../providers/generic/store/StoreProvider'; import { State } from '../../store'; import VueRouter, { useRouter } from 'vue-router'; import ProtocolProvider from '../../providers/generic/protocol/ProtocolProvider'; +import ActivityDropdown from '../v2/ActivityDropdown.vue'; const store = getStore(); const router = useRouter(); +const selectedMode = ref(LaunchMode.MODDED); + const activeGame = computed(() => store.state.activeGame); const profile = computed(() => store.getters['profile/activeProfile']); const localModCount = computed(() => store.state.profile.modList.length); @@ -110,10 +131,6 @@ function getTagLinkClasses(routeNames: string[]) { return router && router.currentRoute.value && routeNames.includes(router.currentRoute.value.name as string || "") ? [...base, "is-link"] : [...base, "is-inactive-link"]; } -function openProfileManagementModal() { - store.commit("openProfileManagementModal"); -} - async function launchGame(mode: LaunchMode) { try { await setGameDirIfUnset(activeGame.value); @@ -135,6 +152,67 @@ async function launchGame(mode: LaunchMode) { diff --git a/src/components/v2/ActivityDropdown.vue b/src/components/v2/ActivityDropdown.vue new file mode 100644 index 000000000..cc29bc576 --- /dev/null +++ b/src/components/v2/ActivityDropdown.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/v2/OnlinePreviewPanel.vue b/src/components/v2/OnlinePreviewPanel.vue index 48929caed..e4726a453 100644 --- a/src/components/v2/OnlinePreviewPanel.vue +++ b/src/components/v2/OnlinePreviewPanel.vue @@ -1,336 +1,336 @@ - - - - - + + + + + diff --git a/src/components/views/InstalledModView.vue b/src/components/views/InstalledModView.vue index 228371209..d079de42d 100644 --- a/src/components/views/InstalledModView.vue +++ b/src/components/views/InstalledModView.vue @@ -58,6 +58,7 @@ const numberOfModsWithUpdates = computed(() => store.getters['profile/mo display: flex; flex: 1; width: 100%; + margin-bottom: 1rem; } #no-mods-installed-info { diff --git a/src/css/custom.scss b/src/css/custom.scss index 352f80a32..f89fb5f7f 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -42,6 +42,13 @@ select { color: $menu-item-active-color; } +.menu-label { + color: var(--menu-label-color, #7a7a7a); + font-weight: 600; + font-size: 0.75rem; + letter-spacing: 0.08em; +} + .pagination-link.is-current { background-color: $pagination-current-background-color; border-color: $pagination-current-border-color !important; @@ -514,3 +521,7 @@ code { } } } + +.v-popper__popper { + z-index: 100 !important; +} diff --git a/src/css/scheme/dark.scss b/src/css/scheme/dark.scss index 80595f01c..b27f08205 100644 --- a/src/css/scheme/dark.scss +++ b/src/css/scheme/dark.scss @@ -33,6 +33,7 @@ --text-strong: #{$night-e}; --hr-background-color: #{$night-2}; + --nav-hr-background-color: #2e3a4c; --code-background: #{$night-2}; @@ -44,7 +45,12 @@ --menu-item-color: #{$night-b}; --menu-item-hover-background-color: #{$night-2}; --menu-item-hover-color: #{$night-d}; - --menu-label-color: #{$night-9}; + --menu-item-active-background-color: rgba(85, 150, 255, 0.12); + --menu-label-color: #{$night-b}; + + --nav-active-color: rgba(0, 9, 25, 0.34); + --nav-active-secondary-color: rgba(105, 109, 119, 0.34); + --nav-active-text-color: #ffffff; --tabs-link-color: #{$night-b}; --tabs-link-hover-color: #{$night-d}; diff --git a/src/css/scheme/light.scss b/src/css/scheme/light.scss index 20458536f..679a1290b 100644 --- a/src/css/scheme/light.scss +++ b/src/css/scheme/light.scss @@ -1,5 +1,10 @@ :root { --preview-panel-background-color: #f6f6f6; + --menu-item-active-background-color: rgba(50, 115, 220, 0.2); + --menu-label-color: #666666; + --nav-hr-background-color: #ededed; + --nav-active-color: rgba(132, 152, 184, 0.2); + --nav-active-text-color: #000000; } // custom vars diff --git a/src/css/v2/components/_menu.scss b/src/css/v2/components/_menu.scss index 96b619b79..8557fbbe6 100644 --- a/src/css/v2/components/_menu.scss +++ b/src/css/v2/components/_menu.scss @@ -12,11 +12,13 @@ } a { - border-radius: 2px; + border-radius: 6px; color: var(--v2-inactive-menu-item-color); display: block; - padding: 0.5em 0.75em; + padding: 0.55em 0.75em; border: 0; + position: relative; + overflow: hidden; &:hover { background-color: var(--menu-item-hover-background-color,#e9eaed); @@ -24,8 +26,10 @@ } &.is-active { - background-color: #485fc7; - color: var(--v2-active-menu-item-color) !important; + background-color: var(--nav-active-color); + color: var(--text) !important; + + } } } diff --git a/src/installers/InstallRuleInstaller.ts b/src/installers/InstallRulePluginInstaller.ts similarity index 79% rename from src/installers/InstallRuleInstaller.ts rename to src/installers/InstallRulePluginInstaller.ts index e904137dc..d423c89f9 100644 --- a/src/installers/InstallRuleInstaller.ts +++ b/src/installers/InstallRulePluginInstaller.ts @@ -3,7 +3,7 @@ import { ImmutableProfile } from "../model/Profile"; import FsProvider from "../providers/generic/file/FsProvider"; import path from "../providers/node/path/path"; import ManifestV2 from "../model/ManifestV2"; -import R2Error from "../model/errors/R2Error"; +import R2Error, { throwForR2Error } from "../model/errors/R2Error"; import FileTree from "../model/file/FileTree"; import InstallationRules, { CoreRuleType, ManagedRule, RuleSubtype } from "../r2mm/installing/InstallationRules"; import FileUtils from "../utils/FileUtils"; @@ -13,6 +13,7 @@ import ConflictManagementProvider from "../providers/generic/installing/Conflict import PathResolver from "../r2mm/manager/PathResolver"; import ZipProvider from "../providers/generic/zip/ZipProvider"; import { TrackingMethod } from "../model/schema/ThunderstoreSchema"; +import ModMode from "../model/enums/ModMode"; type InstallRuleArgs = { profile: ImmutableProfile, @@ -256,7 +257,58 @@ async function installState(args: InstallRuleArgs) { await addToStateFile(mod, fileRelocations, profile); } -export class InstallRuleInstaller implements PackageInstaller { +// Enables or disables a mod installed with InstallRulePluginInstaller using SUBDIR/SUBDIR_NO_FLATTEN tracking methods. +export async function applyModeSubDirs(mod: ManifestV2, profile: ImmutableProfile, mode: number, rule: CoreRuleType): Promise { + const subDirPaths = InstallationRules.getAllManagedPaths(rule.rules) + .filter(value => [TrackingMethod.SUBDIR, TrackingMethod.SUBDIR_NO_FLATTEN].includes(value.trackingMethod)); + + for (const dir of subDirPaths) { + if (await FsProvider.instance.exists(profile.joinToProfilePath(dir.route))) { + const dirContents = await FsProvider.instance.readdir(profile.joinToProfilePath(dir.route)); + for (const namespacedDir of dirContents) { + if (namespacedDir === mod.getName()) { + const tree = await FileTree.buildFromLocation(profile.joinToProfilePath(dir.route, namespacedDir)); + if (tree instanceof R2Error) { + return tree; + } + for (const value of tree.getRecursiveFiles()) { + if (mode === ModMode.DISABLED && mod.isEnabled() && !value.toLowerCase().endsWith(".old")) { + await FsProvider.instance.rename(value, `${value}.old`); + } else if (mode === ModMode.ENABLED && !mod.isEnabled() && value.toLowerCase().endsWith(".old")) { + await FsProvider.instance.rename(value, value.substring(0, value.length - ('.old').length)); + } + } + } + } + } + } +} + +// Enables or disables a mod installed with InstallRulePluginInstaller using STATE tracking method. +export async function applyModeState(mod: ManifestV2, profile: ImmutableProfile, mode: number): Promise { + try { + const modStateFilePath = profile.joinToProfilePath("_state", `${mod.getName()}-state.yml`); + if (await FsProvider.instance.exists(modStateFilePath)) { + const fileContents = (await FsProvider.instance.readFile(modStateFilePath)).toString(); + const tracker: ModFileTracker = yaml.parse(fileContents); + for (const [key, value] of tracker.files) { + if (await ConflictManagementProvider.instance.isFileActive(mod, profile, value)) { + const filePath = profile.joinToProfilePath(value); + if (await FsProvider.instance.exists(filePath)) { + await FsProvider.instance.unlink(filePath); + } + if (mode === ModMode.ENABLED) { + await FsProvider.instance.copyFile(key, filePath); + } + } + } + } + } catch (e) { + return R2Error.fromThrownValue(e, `Error installing mod: ${mod.getName()}`); + } +} + +export class InstallRulePluginInstaller implements PackageInstaller { public readonly rule: CoreRuleType; constructor(rules: CoreRuleType) { @@ -269,23 +321,11 @@ export class InstallRuleInstaller implements PackageInstaller { */ async install(args: InstallArgs) { const { mod, profile, packagePath } = args; - const files: FileTree | R2Error = await FileTree.buildFromLocation(packagePath); - if (files instanceof R2Error) { - throw files; - } - const result = await this.resolveBepInExTree( - profile, - packagePath, - path.basename(packagePath), - mod, - files, - ); - if (result instanceof Error) { - throw result; - } + const fileTree = throwForR2Error(await FileTree.buildFromLocation(packagePath)) + await this.resolveFileTreeInstall(profile, packagePath, path.basename(packagePath), mod, fileTree); } - async resolveBepInExTree(profile: ImmutableProfile, location: string, folderName: string, mod: ManifestV2, tree: FileTree): Promise { + private async resolveFileTreeInstall(profile: ImmutableProfile, location: string, folderName: string, mod: ManifestV2, tree: FileTree) { const installationIntent = await buildInstallForRuleSubtype(this.rule, location, folderName, mod, tree); for (let [rule, files] of installationIntent.entries()) { const managedRule = InstallationRules.getManagedRuleForSubtype(this.rule, rule); @@ -304,6 +344,5 @@ export class InstallRuleInstaller implements PackageInstaller { case TrackingMethod.PACKAGE_ZIP: await installPackageZip(profile, managedRule, files, mod); break; } } - return Promise.resolve(undefined); } } diff --git a/src/installers/LovelyInstaller.ts b/src/installers/LovelyInstaller.ts index 60af441a8..a78d3db45 100644 --- a/src/installers/LovelyInstaller.ts +++ b/src/installers/LovelyInstaller.ts @@ -1,5 +1,5 @@ import { InstallArgs, PackageInstaller } from "./PackageInstaller"; -import { addToStateFile } from "./InstallRuleInstaller"; +import { addToStateFile } from "./InstallRulePluginInstaller"; import FsProvider from "../providers/generic/file/FsProvider"; import FileUtils from "../utils/FileUtils"; import FileTree from "../model/file/FileTree"; diff --git a/src/installers/NoOpInstaller.ts b/src/installers/NoOpInstaller.ts new file mode 100644 index 000000000..5de30a344 --- /dev/null +++ b/src/installers/NoOpInstaller.ts @@ -0,0 +1,13 @@ +import { InstallArgs, PackageInstaller } from './PackageInstaller'; + +/** + * Doesn't do anything. Provides compatible API for games that + * don't use package loaders, but do depend on profile directories. + * In practice this never gets called as ModLoaderVariantRecord + * naturally doesn't ever refer this, but it's required for type + * safety and its existence simplifies the code. + */ +export class NoOpInstaller implements PackageInstaller { + async install(args: InstallArgs): Promise {} + async uninstall(args: InstallArgs): Promise {} +} diff --git a/src/installers/RecursiveMelonLoaderInstaller.ts b/src/installers/RecursiveMelonLoaderInstaller.ts index 7e4f8e234..8bdeec33f 100644 --- a/src/installers/RecursiveMelonLoaderInstaller.ts +++ b/src/installers/RecursiveMelonLoaderInstaller.ts @@ -113,8 +113,8 @@ export class RecursiveMelonLoaderPluginInstaller implements PackageInstaller { async uninstall(args: InstallArgs): Promise { try { - FileUtils.recursiveRemoveDirectoryIfExists(this.getModsPath(args)); - FileUtils.recursiveRemoveDirectoryIfExists(this.getUserDataPath(args)); + await FileUtils.recursiveRemoveDirectoryIfExists(this.getModsPath(args)); + await FileUtils.recursiveRemoveDirectoryIfExists(this.getUserDataPath(args)); } catch (e) { this.throwActionError(e, 'uninstall'); } diff --git a/src/installers/ReturnOfModdingInstaller.ts b/src/installers/ReturnOfModdingInstaller.ts index 46d785199..d25aa5a06 100644 --- a/src/installers/ReturnOfModdingInstaller.ts +++ b/src/installers/ReturnOfModdingInstaller.ts @@ -1,5 +1,5 @@ import path from "../providers/node/path/path"; -import { InstallRuleInstaller } from "./InstallRuleInstaller"; +import { InstallRulePluginInstaller } from "./InstallRulePluginInstaller"; import { InstallArgs, PackageInstaller } from "./PackageInstaller"; import FileWriteError from "../model/errors/FileWriteError"; import { PackageLoader } from "../model/schema/ThunderstoreSchema"; @@ -70,7 +70,7 @@ export class ReturnOfModdingPluginInstaller implements PackageInstaller { _DATA = "plugins_data"; _CONFIG = "config" - readonly installer = () => new InstallRuleInstaller({ + readonly installer = () => new InstallRulePluginInstaller({ gameName: "none" as any, // This isn't actually used for actual installation but needs some value rules: [ { diff --git a/src/installers/ShimloaderInstaller.ts b/src/installers/ShimloaderInstaller.ts index f9f8d3aaf..10ec475b0 100644 --- a/src/installers/ShimloaderInstaller.ts +++ b/src/installers/ShimloaderInstaller.ts @@ -4,8 +4,6 @@ import FsProvider from "../providers/generic/file/FsProvider"; import FileTree from "../model/file/FileTree"; import FileUtils from "../utils/FileUtils"; import R2Error from "../model/errors/R2Error"; -import { InstallRuleInstaller } from "./InstallRuleInstaller"; -import { TrackingMethod } from "../model/schema/ThunderstoreSchema"; export class ShimloaderInstaller implements PackageInstaller { /** @@ -55,35 +53,3 @@ export class ShimloaderInstaller implements PackageInstaller { } } } - -export class ShimloaderPluginInstaller implements PackageInstaller { - readonly installer = () => new InstallRuleInstaller({ - gameName: "none" as any, // This isn't acutally used for actual installation but needs some value - rules: [ - { - route: path.join("shimloader", "mod"), - isDefaultLocation: true, - defaultFileExtensions: [], - trackingMethod: TrackingMethod.SUBDIR, - subRoutes: [], - }, - { - route: path.join("shimloader", "pak"), - defaultFileExtensions: [], - trackingMethod: TrackingMethod.SUBDIR, - subRoutes: [], - }, - { - route: path.join("shimloader", "cfg"), - defaultFileExtensions: [], - trackingMethod: TrackingMethod.NONE, - subRoutes: [], - } - ], - relativeFileExclusions: null - }); - - async install(args: InstallArgs) { - await this.installer().install(args); - } -} diff --git a/src/installers/registry.ts b/src/installers/registry.ts index 1bbf57f7e..82f0c8b18 100644 --- a/src/installers/registry.ts +++ b/src/installers/registry.ts @@ -1,8 +1,9 @@ import { BepInExInstaller } from './BepInExInstaller'; import { GodotMLInstaller } from './GodotMLInstaller'; import { MelonLoaderInstaller } from './MelonLoaderInstaller'; +import { NoOpInstaller } from './NoOpInstaller'; import { PackageInstaller } from './PackageInstaller'; -import { ShimloaderInstaller, ShimloaderPluginInstaller } from './ShimloaderInstaller'; +import { ShimloaderInstaller } from './ShimloaderInstaller'; import { LovelyInstaller, LovelyPluginInstaller } from './LovelyInstaller'; import { NorthstarInstaller } from './NorthstarInstaller'; import { ReturnOfModdingInstaller, ReturnOfModdingPluginInstaller } from './ReturnOfModdingInstaller'; @@ -17,36 +18,34 @@ import { PackageLoader } from '../model/schema/ThunderstoreSchema'; /** * Package loader installer registry */ -type LoaderInstallers = Exclude; -const PackageLoaderInstallers: Record = { +export const PackageLoaderInstallers: Record = { [PackageLoader.BEPINEX]: new BepInExInstaller(), [PackageLoader.BEPISLOADER]: new BepisLoaderInstaller(), [PackageLoader.GDWEAVE]: new GDWeaveInstaller(), [PackageLoader.GODOTML]: new GodotMLInstaller(), [PackageLoader.LOVELY]: new LovelyInstaller(), [PackageLoader.MELONLOADER]: new MelonLoaderInstaller(), + [PackageLoader.NONE]: new NoOpInstaller(), [PackageLoader.NORTHSTAR]: new NorthstarInstaller(), [PackageLoader.RECURSIVE_MELONLOADER]: new RecursiveMelonLoaderInstaller(), [PackageLoader.RETURN_OF_MODDING]: new ReturnOfModdingInstaller(), + [PackageLoader.RIVET]: new RivetInstaller(), [PackageLoader.SHIMLOADER]: new ShimloaderInstaller(), [PackageLoader.UMM]: new UMMInstaller(), - [PackageLoader.RIVET]: new RivetInstaller(), }; -export function getPackageLoaderInstaller(loader: PackageLoader): PackageInstaller|null { - if (loader === PackageLoader.NONE) { - return null; - } - - return PackageLoaderInstallers[loader]; -} - - /** * Plugin installer registry */ -type InstallRuleInstallers = PackageLoader.BEPINEX | PackageLoader.BEPISLOADER | PackageLoader.GODOTML | PackageLoader.MELONLOADER | PackageLoader.NORTHSTAR | PackageLoader.UMM; +type InstallRuleInstallers = + | PackageLoader.BEPINEX + | PackageLoader.BEPISLOADER + | PackageLoader.GODOTML + | PackageLoader.MELONLOADER + | PackageLoader.NORTHSTAR + | PackageLoader.SHIMLOADER + | PackageLoader.UMM; type PluginInstallers = Exclude; const PluginInstallers: Record = { @@ -55,7 +54,6 @@ const PluginInstallers: Record = { [PackageLoader.NONE]: new DirectCopyInstaller(), [PackageLoader.RECURSIVE_MELONLOADER]: new RecursiveMelonLoaderPluginInstaller(), [PackageLoader.RETURN_OF_MODDING]: new ReturnOfModdingPluginInstaller(), - [PackageLoader.SHIMLOADER]: new ShimloaderPluginInstaller(), [PackageLoader.RIVET]: new RivetPluginInstaller(), }; @@ -66,6 +64,7 @@ function isPluginInstaller(loader: PackageLoader): loader is PluginInstallers { loader === PackageLoader.GODOTML || loader === PackageLoader.MELONLOADER || loader === PackageLoader.NORTHSTAR || + loader === PackageLoader.SHIMLOADER || loader === PackageLoader.UMM ); } diff --git a/src/model/game/Game.ts b/src/model/game/Game.ts index b63e9ec91..7122f578e 100644 --- a/src/model/game/Game.ts +++ b/src/model/game/Game.ts @@ -11,6 +11,7 @@ export default class Game { private readonly _exeName: string[]; private readonly _dataFolderName: string; private readonly _thunderstoreUrl: string; + private readonly _thunderstoreIdentifier: string; private readonly _storePlatformMetadata: StorePlatformMetadata[]; private readonly _gameImage: string; private readonly _displayMode: GameSelectionDisplayMode; @@ -21,10 +22,22 @@ export default class Game { private _activePlatform: StorePlatformMetadata; - constructor(displayName: string, internalFolderName: string, settingsIdentifier: string, - steamFolderName: string, exeName: string[], dataFolderName: string, - tsUrl: string, platforms: StorePlatformMetadata[], gameImage: string, - displayMode: GameSelectionDisplayMode, instanceType: GameInstanceType, packageLoader: PackageLoader, additionalSearchStrings?: string[]) { + constructor( + displayName: string, + internalFolderName: string, + settingsIdentifier: string, + steamFolderName: string, + exeName: string[], + dataFolderName: string, + tsUrl: string, + tsIdentifier: string, + platforms: StorePlatformMetadata[], + gameImage: string, + displayMode: GameSelectionDisplayMode, + instanceType: GameInstanceType, + packageLoader: PackageLoader, + additionalSearchStrings?: string[], + ) { this._displayName = displayName; this._internalFolderName = internalFolderName; @@ -33,6 +46,7 @@ export default class Game { this._exeName = exeName; this._dataFolderName = dataFolderName; this._thunderstoreUrl = tsUrl; + this._thunderstoreIdentifier = tsIdentifier; this._storePlatformMetadata = platforms; this._activePlatform = platforms[0]; this._gameImage = gameImage; @@ -70,6 +84,10 @@ export default class Game { return this._thunderstoreUrl; } + get thunderstoreIdentifier(): string { + return this._thunderstoreIdentifier; + } + get storePlatformMetadata(): StorePlatformMetadata[] { return this._storePlatformMetadata; } diff --git a/src/model/game/GameManager.ts b/src/model/game/GameManager.ts index c1a0be77f..757eef973 100644 --- a/src/model/game/GameManager.ts +++ b/src/model/game/GameManager.ts @@ -23,7 +23,7 @@ export default class GameManager { } static get gameList(): Game[] { - return EcosystemSchema.supportedGames.map((game) => new Game( + return EcosystemSchema.supportedGames.map(([identifier, game]) => new Game( game.meta.displayName, game.internalFolderName, game.settingsIdentifier, @@ -31,6 +31,7 @@ export default class GameManager { game.exeNames, game.dataFolderName, game.packageIndex, + identifier, game.distributions.map( (x) => new StorePlatformMetadata(x.platform, x.identifier || undefined) ), diff --git a/src/model/schema/ThunderstoreSchema.ts b/src/model/schema/ThunderstoreSchema.ts index 5c32a9da8..2af174ad1 100644 --- a/src/model/schema/ThunderstoreSchema.ts +++ b/src/model/schema/ThunderstoreSchema.ts @@ -2,7 +2,7 @@ import Ajv from "ajv"; import addFormats from "ajv-formats"; import ecosystem from "../../assets/data/ecosystem.json"; -import { ThunderstoreEcosystem } from "../../assets/data/ecosystemTypes"; +import { R2Modman, ThunderstoreEcosystem } from "../../assets/data/ecosystemTypes"; import jsonSchema from "../../assets/data/ecosystemJsonSchema.json"; import R2Error from "../errors/R2Error"; @@ -43,14 +43,17 @@ export class EcosystemSchema { } /** - * Get a list of r2modman entries i.e. games supported by the mod manager. + * Get a list of [identifier, r2modman] entries i.e. games supported by the mod manager. */ static get supportedGames() { - return Object.values(this.ecosystem.games).flatMap( - (game) => game.r2modman - ).filter( - (r2modman): r2modman is NonNullable => r2modman != null - ); + const result: [string, R2Modman][] = [] + for (const [identifier, game] of Object.entries(this.ecosystem.games)) { + if (game.r2modman == null) continue; + for (const entry of game.r2modman) { + result.push([identifier, entry]); + } + } + return result; } static get modloaderPackages() { diff --git a/src/pages/ConfigEditor.vue b/src/pages/ConfigEditor.vue index de9c367ba..1cc1ac9d3 100644 --- a/src/pages/ConfigEditor.vue +++ b/src/pages/ConfigEditor.vue @@ -1,4 +1,5 @@