├── .deepsource.toml ├── .eslintrc.json ├── .github ├── dependabot.yml ├── tag-changelog-config.js └── workflows │ ├── artifact.yml │ ├── codeql-analysis.yml │ ├── pr.yml │ ├── pr_comment.yml │ └── release.yml ├── .gitignore ├── .prettierrc ├── COPYING ├── COPYING.LESSER ├── For Build ├── Mods │ ├── Managed by SMF, do not touch │ └── Realistic AI │ │ ├── content-extreme │ │ └── chunk0 │ │ │ └── Realistic AI Extreme.repository.json │ │ ├── content-manhunt │ │ └── chunk0 │ │ │ └── Realistic AI Manhunt.repository.json │ │ ├── content-normal │ │ └── chunk0 │ │ │ └── Realistic AI Normal.repository.json │ │ └── manifest.json ├── Third-Party │ ├── ResourceLib_HM2.dll │ ├── ResourceLib_HM2016.dll │ ├── ResourceLib_HM3.dll │ ├── ResourceLib_HMA.dll │ ├── ResourceTool.exe │ ├── assimp.dll │ ├── hash_list.hmla │ └── quickentity_ffi.dll ├── cleanMicrosoftThumbs.dat ├── cleanPackageDefinition.txt ├── cleanThumbs.dat └── config.json ├── Mod Manager ├── .gitignore ├── .npmrc ├── .prettierrc ├── .vscode │ ├── extensions.json │ └── settings.json ├── build.config.json ├── buildResources │ └── icon.ico ├── globals.d.ts ├── jsconfig.json ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── src │ ├── app.css │ ├── app.html │ ├── electron.cjs │ ├── global.d.ts │ ├── lib │ │ ├── ExpandableTile.svelte │ │ ├── KeyValueEditor.svelte │ │ ├── ListEditor.svelte │ │ ├── LocalisationEditor.svelte │ │ ├── Mod.svelte │ │ ├── ModManifestInterface.svelte │ │ ├── SortableList.svelte │ │ ├── TextInputModal.svelte │ │ ├── contract-schema.json │ │ ├── entity-patch-schema.json │ │ ├── entity-schema.json │ │ ├── json-patch-schema.json │ │ ├── manifest-schema.json │ │ ├── repository-schema.json │ │ ├── unlockables-schema.json │ │ └── utils.ts │ ├── preload.cjs │ └── routes │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ ├── authoring │ │ ├── +page.svelte │ │ └── [mod] │ │ │ ├── +page.svelte │ │ │ ├── manifest │ │ │ └── +page.svelte │ │ │ └── options │ │ │ └── [option] │ │ │ └── +page.svelte │ │ ├── docs │ │ └── [page] │ │ │ └── +page.svelte │ │ ├── info │ │ └── +page.svelte │ │ ├── modList │ │ └── +page.svelte │ │ └── settings │ │ └── +page.svelte ├── static │ └── shiki │ │ ├── languages │ │ ├── abap.tmLanguage.json │ │ ├── actionscript-3.tmLanguage.json │ │ ├── ada.tmLanguage.json │ │ ├── apache.tmLanguage.json │ │ ├── apex.tmLanguage.json │ │ ├── apl.tmLanguage.json │ │ ├── applescript.tmLanguage.json │ │ ├── asm.tmLanguage.json │ │ ├── astro.tmLanguage.json │ │ ├── awk.tmLanguage.json │ │ ├── ballerina.tmLanguage.json │ │ ├── bat.tmLanguage.json │ │ ├── berry.tmLanguage.json │ │ ├── bibtex.tmLanguage.json │ │ ├── bicep.tmLanguage.json │ │ ├── blade.tmLanguage.json │ │ ├── c.tmLanguage.json │ │ ├── cadence.tmLanguage.json │ │ ├── clarity.tmLanguage.json │ │ ├── clojure.tmLanguage.json │ │ ├── cmake.tmLanguage.json │ │ ├── cobol.tmLanguage.json │ │ ├── codeql.tmLanguage.json │ │ ├── coffee.tmLanguage.json │ │ ├── cpp-macro.tmLanguage.json │ │ ├── cpp.tmLanguage.json │ │ ├── crystal.tmLanguage.json │ │ ├── csharp.tmLanguage.json │ │ ├── css.tmLanguage.json │ │ ├── cue.tmLanguage.json │ │ ├── d.tmLanguage.json │ │ ├── dart.tmLanguage.json │ │ ├── diff.tmLanguage.json │ │ ├── docker.tmLanguage.json │ │ ├── dream-maker.tmLanguage.json │ │ ├── elixir.tmLanguage.json │ │ ├── elm.tmLanguage.json │ │ ├── erb.tmLanguage.json │ │ ├── erlang.tmLanguage.json │ │ ├── fish.tmLanguage.json │ │ ├── fsharp.tmLanguage.json │ │ ├── gherkin.tmLanguage.json │ │ ├── git-commit.tmLanguage.json │ │ ├── git-rebase.tmLanguage.json │ │ ├── glsl.tmLanguage.json │ │ ├── gnuplot.tmLanguage.json │ │ ├── go.tmLanguage.json │ │ ├── graphql.tmLanguage.json │ │ ├── groovy.tmLanguage.json │ │ ├── hack.tmLanguage.json │ │ ├── haml.tmLanguage.json │ │ ├── handlebars.tmLanguage.json │ │ ├── haskell.tmLanguage.json │ │ ├── hcl.tmLanguage.json │ │ ├── hlsl.tmLanguage.json │ │ ├── html.tmLanguage.json │ │ ├── ini.tmLanguage.json │ │ ├── java.tmLanguage.json │ │ ├── javascript.tmLanguage.json │ │ ├── jinja-html.tmLanguage.json │ │ ├── jinja.tmLanguage.json │ │ ├── json.tmLanguage.json │ │ ├── jsonc.tmLanguage.json │ │ ├── jsonnet.tmLanguage.json │ │ ├── jssm.tmLanguage.json │ │ ├── jsx.tmLanguage.json │ │ ├── julia.tmLanguage.json │ │ ├── kotlin.tmLanguage.json │ │ ├── latex.tmLanguage.json │ │ ├── less.tmLanguage.json │ │ ├── liquid.tmLanguage.json │ │ ├── lisp.tmLanguage.json │ │ ├── logo.tmLanguage.json │ │ ├── lua.tmLanguage.json │ │ ├── make.tmLanguage.json │ │ ├── markdown.tmLanguage.json │ │ ├── marko.tmLanguage.json │ │ ├── matlab.tmLanguage.json │ │ ├── mdx.tmLanguage.json │ │ ├── mermaid.tmLanguage.json │ │ ├── nginx.tmLanguage.json │ │ ├── nim.tmLanguage.json │ │ ├── nix.tmLanguage.json │ │ ├── objective-c.tmLanguage.json │ │ ├── objective-cpp.tmLanguage.json │ │ ├── ocaml.tmLanguage.json │ │ ├── pascal.tmLanguage.json │ │ ├── perl.tmLanguage.json │ │ ├── php-html.tmLanguage.json │ │ ├── php.tmLanguage.json │ │ ├── plsql.tmLanguage.json │ │ ├── postcss.tmLanguage.json │ │ ├── powershell.tmLanguage.json │ │ ├── prisma.tmLanguage.json │ │ ├── prolog.tmLanguage.json │ │ ├── pug.tmLanguage.json │ │ ├── puppet.tmLanguage.json │ │ ├── purescript.tmLanguage.json │ │ ├── python.tmLanguage.json │ │ ├── r.tmLanguage.json │ │ ├── raku.tmLanguage.json │ │ ├── razor.tmLanguage.json │ │ ├── rel.tmLanguage.json │ │ ├── riscv.tmLanguage.json │ │ ├── rst.tmLanguage.json │ │ ├── ruby.tmLanguage.json │ │ ├── rust.tmLanguage.json │ │ ├── sas.tmLanguage.json │ │ ├── sass.tmLanguage.json │ │ ├── scala.tmLanguage.json │ │ ├── scheme.tmLanguage.json │ │ ├── scss.tmLanguage.json │ │ ├── shaderlab.tmLanguage.json │ │ ├── shellscript.tmLanguage.json │ │ ├── smalltalk.tmLanguage.json │ │ ├── solidity.tmLanguage.json │ │ ├── sparql.tmLanguage.json │ │ ├── sql.tmLanguage.json │ │ ├── ssh-config.tmLanguage.json │ │ ├── stata.tmLanguage.json │ │ ├── stylus.tmLanguage.json │ │ ├── svelte.tmLanguage.json │ │ ├── swift.tmLanguage.json │ │ ├── system-verilog.tmLanguage.json │ │ ├── tasl.tmLanguage.json │ │ ├── tcl.tmLanguage.json │ │ ├── tex.tmLanguage.json │ │ ├── toml.tmLanguage.json │ │ ├── tsx.tmLanguage.json │ │ ├── turtle.tmLanguage.json │ │ ├── twig.tmLanguage.json │ │ ├── typescript.tmLanguage.json │ │ ├── vb.tmLanguage.json │ │ ├── verilog.tmLanguage.json │ │ ├── vhdl.tmLanguage.json │ │ ├── viml.tmLanguage.json │ │ ├── vue-html.tmLanguage.json │ │ ├── vue.tmLanguage.json │ │ ├── wasm.tmLanguage.json │ │ ├── wenyan.tmLanguage.json │ │ ├── xml.tmLanguage.json │ │ ├── xsl.tmLanguage.json │ │ ├── yaml.tmLanguage.json │ │ └── zenscript.tmLanguage.json │ │ ├── samples │ │ ├── Marko.sample │ │ ├── abap.sample │ │ ├── actionscript-3.sample │ │ ├── ada.sample │ │ ├── apex.sample │ │ ├── applescript.sample │ │ ├── asm.sample │ │ ├── astro.sample │ │ ├── awk.sample │ │ ├── ballerina.sample │ │ ├── bat.sample │ │ ├── berry.sample │ │ ├── bicep.sample │ │ ├── blade.sample │ │ ├── c.sample │ │ ├── cadence.sample │ │ ├── clarity.sample │ │ ├── clojure.sample │ │ ├── cmake.sample │ │ ├── cobol.sample │ │ ├── codeql.sample │ │ ├── coffee.sample │ │ ├── cpp.sample │ │ ├── crystal.sample │ │ ├── csharp.sample │ │ ├── css.sample │ │ ├── cue.sample │ │ ├── d.sample │ │ ├── dart.sample │ │ ├── diff.sample │ │ ├── dm.sample │ │ ├── docker.sample │ │ ├── elixir.sample │ │ ├── elm.sample │ │ ├── erb.sample │ │ ├── erlang.sample │ │ ├── fish.sample │ │ ├── fsharp.sample │ │ ├── fsl.sample │ │ ├── glsl.sample │ │ ├── go.sample │ │ ├── html.sample │ │ ├── java.sample │ │ ├── javascript.sample │ │ ├── jssm.sample │ │ ├── liquid.sample │ │ ├── prisma.sample │ │ ├── python.sample │ │ ├── rel.sample │ │ ├── ruby.sample │ │ ├── sparql.sample │ │ ├── stata.sample │ │ ├── tasl.sample │ │ ├── tsx.sample │ │ ├── turtle.sample │ │ └── zenscript.sample │ │ └── themes │ │ ├── css-variables.json │ │ ├── dark-plus.json │ │ ├── dracula-soft.json │ │ ├── dracula.json │ │ ├── github-dark-dimmed.json │ │ ├── github-dark.json │ │ ├── github-light.json │ │ ├── hc_light.json │ │ ├── light-plus.json │ │ ├── material-darker.json │ │ ├── material-default.json │ │ ├── material-lighter.json │ │ ├── material-ocean.json │ │ ├── material-palenight.json │ │ ├── min-dark.json │ │ ├── min-light.json │ │ ├── monokai.json │ │ ├── nord.json │ │ ├── one-dark-pro.json │ │ ├── poimandres.json │ │ ├── rose-pine-dawn.json │ │ ├── rose-pine-moon.json │ │ ├── rose-pine.json │ │ ├── slack-dark.json │ │ ├── slack-ochin.json │ │ ├── solarized-dark.json │ │ ├── solarized-light.json │ │ ├── vitesse-dark.json │ │ └── vitesse-light.json ├── svelte.config.js ├── tailwind.config.cjs ├── tsconfig.json └── vite.config.js ├── README.md ├── Third-Party ├── 7z-LICENSE ├── 7z.dll ├── 7z.exe ├── HMLanguageTools.exe ├── HMTextureTools.exe ├── OREStool.exe ├── TonyTools-LICENSE ├── baseGameEntities.txt ├── baseGameSoundbanks.txt ├── h6xtea.exe ├── quickentity-3.exe ├── quickentity-rs.exe ├── xdelta3-LICENSE └── xdelta3.exe ├── cleanPackageDefinition.txt ├── cleanThumbs.dat ├── config.json ├── docs ├── Command Line Arguments.md ├── Config.md ├── Folder Structure.md ├── Index.md ├── Making a Mod.md ├── Manifest.md ├── Mod Manager.md ├── Mod Updates.md ├── RPKG Mods.md ├── Scripts.md └── Special File Types.md ├── package-lock.json ├── package.json ├── piscina ├── .taprc ├── dist │ ├── esm-wrapper.mjs │ ├── package.json │ └── src │ │ ├── common.d.ts │ │ ├── common.js │ │ ├── common.js.map │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.js.map │ │ ├── worker.d.ts │ │ ├── worker.js │ │ └── worker.js.map └── package.json ├── rome.json ├── rust ├── .gitignore ├── .npmignore ├── .yarn │ └── releases │ │ └── yarn-3.6.0.cjs ├── .yarnrc.yml ├── Cargo.toml ├── build.rs ├── package.json ├── rustfmt.toml ├── src │ └── lib.rs └── yarn.lock ├── src ├── core-singleton.ts ├── core.ts ├── crc32.js ├── deploy.ts ├── difference.ts ├── discover.ts ├── main.ts ├── patchWorker.ts ├── quickentity-3.ts ├── quickentity-rs.ts ├── quickentity.js ├── quickentity1136.js ├── quickentity20.js ├── rpkg.ts ├── three-onlymath.min.js ├── types.ts ├── typescript.ts └── utils.ts └── tsconfig.json /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | exclude_patterns = [ 4 | "Mod Manager/src/torchlight/**", 5 | "src/quickentity1136.js", 6 | "src/quickentity20.js" 7 | ] 8 | 9 | [[analyzers]] 10 | name = "javascript" 11 | enabled = true -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2021": true, 4 | "node": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/recommended" 9 | ], 10 | "parser": "@typescript-eslint/parser", 11 | "parserOptions": { 12 | "ecmaVersion": "latest", 13 | "sourceType": "module", 14 | "project": [ 15 | "./tsconfig.json" 16 | ] 17 | }, 18 | "plugins": [ 19 | "@typescript-eslint" 20 | ], 21 | "rules": { 22 | "semi": [ 23 | "error", 24 | "never" 25 | ], 26 | "comma-dangle": [ 27 | "error", 28 | "never" 29 | ], 30 | "prefer-const": "error", 31 | "no-mixed-spaces-and-tabs": "off", 32 | "no-empty": "off", 33 | "no-empty-function": "off", 34 | "@typescript-eslint/no-empty-function": "off", 35 | "@typescript-eslint/no-non-null-assertion": "off", 36 | "@typescript-eslint/no-floating-promises": "error", 37 | "@typescript-eslint/no-misused-promises": "error" 38 | } 39 | } -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | commit-message: 13 | prefix: "chore(depends):" 14 | 15 | - package-ecosystem: "npm" # See documentation for possible values 16 | directory: "/Mod Manager/" # Location of package manifests 17 | schedule: 18 | interval: "daily" 19 | commit-message: 20 | prefix: "chore(depends):" 21 | -------------------------------------------------------------------------------- /.github/tag-changelog-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | types: [ 3 | { types: ["feat", "feature"], label: "New Features" }, 4 | { types: ["fix", "bugfix"], label: "Bug Fixes" }, 5 | { types: ["improvements", "enhancement"], label: "Improvements" }, 6 | { types: ["perf"], label: "Performance Improvements" }, 7 | { types: ["build", "ci"], label: "Build System" }, 8 | { types: ["refactor"], label: "Refactors" }, 9 | { types: ["doc", "docs"], label: "Documentation Changes" }, 10 | { types: ["test", "tests"], label: "Tests" }, 11 | { types: ["style"], label: "Code Style Changes" }, 12 | { types: ["chore"], label: "Chores" }, 13 | { types: ["other"], label: "Other Changes" } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.github/workflows/artifact.yml: -------------------------------------------------------------------------------- 1 | name: Create Artifact 2 | 3 | on: 4 | push 5 | 6 | jobs: 7 | build: 8 | runs-on: windows-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v4 12 | with: 13 | fetch-depth: 0 14 | 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 18 18 | 19 | - uses: actions-rs/toolchain@v1 20 | with: 21 | toolchain: stable 22 | target: x86_64-pc-windows-msvc 23 | default: true 24 | 25 | - name: Cache 26 | id: cache 27 | uses: actions/cache@v4 28 | with: 29 | path: node_modules 30 | key: buildCachev25 31 | 32 | - name: Cache 33 | id: cache2 34 | uses: actions/cache@v4 35 | with: 36 | path: Mod Manager/node_modules 37 | key: buildCache2v20 38 | 39 | - name: Install dependencies 40 | if: steps.cache.outputs.cache-hit != 'true' 41 | run: | 42 | npm install 43 | 44 | - name: Prep 45 | run: | 46 | npm install -g pkg typescript @napi-rs/cli 47 | 48 | - name: Build Rust code 49 | run: | 50 | cd rust 51 | yarn 52 | yarn build 53 | cd ../ 54 | copy ./rust/index.d.ts ./src/smf-rust.d.ts 55 | copy ./rust/rust.win32-x64-msvc.node ./src/smf-rust.node 56 | 57 | - name: Build EXE 58 | env: 59 | NODE_OPTIONS: "--max-old-space-size=4096" 60 | run: | 61 | New-Item -ItemType Directory -Force -Path ./node_modules/piscina 62 | robocopy ./piscina ./node_modules/piscina /E /is /it; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 63 | tsc 64 | copy ./src/smf-rust.node ./compiled/smf-rust.node 65 | pkg package.json --targets node18-win-x64 --output Deploy.exe --compress Brotli 66 | 67 | - name: Install GUI dependencies 68 | if: steps.cache2.outputs.cache-hit != 'true' 69 | run: | 70 | cd "Mod Manager" 71 | npm install 72 | cd ../ 73 | 74 | - name: Build GUI 75 | run: | 76 | cd "Mod Manager" 77 | npm run build 78 | cd ../ 79 | 80 | - name: Ready for zip 81 | run: | 82 | New-Item -ItemType Directory dist 83 | New-Item -ItemType Directory dist/Third-Party 84 | New-Item -ItemType Directory dist/Info 85 | New-Item -ItemType Directory dist/API 86 | New-Item -ItemType Directory "dist/Mod Manager" 87 | robocopy ./Third-Party ./dist/Third-Party /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 88 | robocopy "./For Build" ./dist /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 89 | robocopy ./docs ./dist/Info /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 90 | robocopy ./compiled ./dist/API /E *.d.ts; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 91 | robocopy ".\Mod Manager\dist\win-unpacked" "./dist/Mod Manager" /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 92 | copy Deploy.exe dist 93 | New-Item -Path dist -Name "Mod Manager.cmd" -ItemType "file" -Value "@echo off`ncd `"Mod Manager`"`nstart `"`" `"Mod Manager.exe`"" 94 | 95 | - name: Zip 96 | uses: TheDoctor0/zip-release@4fb9e4ff72847dd3d1c111cf63834e353ed7cb3d 97 | with: 98 | filename: Release.zip 99 | directory: dist 100 | 101 | - uses: actions/upload-artifact@v4 102 | with: 103 | name: Output 104 | path: dist/Release.zip 105 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '21 15 * * 4' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v2 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v2 71 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: PR Build 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | build: 8 | runs-on: windows-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v4 12 | with: 13 | fetch-depth: 0 14 | 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 18 18 | 19 | - uses: actions-rs/toolchain@v1 20 | with: 21 | toolchain: stable 22 | target: x86_64-pc-windows-msvc 23 | default: true 24 | 25 | - name: Cache 26 | id: cache 27 | uses: actions/cache@v4 28 | with: 29 | path: node_modules 30 | key: buildCachev25 31 | 32 | - name: Cache 33 | id: cache2 34 | uses: actions/cache@v4 35 | with: 36 | path: Mod Manager/node_modules 37 | key: buildCache2v20 38 | 39 | - name: Install dependencies 40 | if: steps.cache.outputs.cache-hit != 'true' 41 | run: | 42 | npm install 43 | 44 | - name: Prep 45 | run: | 46 | npm install -g pkg typescript @napi-rs/cli 47 | 48 | - name: Build Rust code 49 | run: | 50 | cd rust 51 | yarn 52 | yarn build 53 | cd ../ 54 | copy ./rust/index.d.ts ./src/smf-rust.d.ts 55 | copy ./rust/rust.win32-x64-msvc.node ./src/smf-rust.node 56 | 57 | - name: Build EXE 58 | env: 59 | NODE_OPTIONS: "--max-old-space-size=4096" 60 | run: | 61 | New-Item -ItemType Directory -Force -Path ./node_modules/piscina 62 | robocopy ./piscina ./node_modules/piscina /COPYALL /E /is /it; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 63 | tsc 64 | copy ./src/smf-rust.node ./compiled/smf-rust.node 65 | pkg package.json --targets node18-win-x64 --output Deploy.exe --compress Brotli 66 | 67 | - name: Download RPKG 68 | uses: aochmann/actions-download-artifact@5709392f11b5937bd316e52687ad87f7deced5f5 69 | with: 70 | repo: glacier-modding/RPKG-Tool 71 | name: rpkg-cli 72 | latest: true 73 | path: './Third-Party' 74 | 75 | - name: Download ResourceTool 76 | uses: aochmann/actions-download-artifact@5709392f11b5937bd316e52687ad87f7deced5f5 77 | with: 78 | repo: OrfeasZ/ZHMTools 79 | name: ResourceTool-win-x64 80 | latest: true 81 | path: './Third-Party' 82 | 83 | - name: Install GUI dependencies 84 | if: steps.cache2.outputs.cache-hit != 'true' 85 | run: | 86 | cd "Mod Manager" 87 | npm install 88 | cd ../ 89 | 90 | - name: Build GUI 91 | run: | 92 | cd "Mod Manager" 93 | npm run build 94 | cd ../ 95 | 96 | - name: Ready for zip 97 | run: | 98 | New-Item -ItemType Directory dist 99 | New-Item -ItemType Directory dist/Third-Party 100 | New-Item -ItemType Directory dist/Info 101 | New-Item -ItemType Directory dist/API 102 | New-Item -ItemType Directory "dist/Mod Manager" 103 | robocopy ./Third-Party ./dist/Third-Party /COPYALL /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 104 | robocopy "./For Build" ./dist /COPYALL /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 105 | robocopy ./docs ./dist/Info /COPYALL /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 106 | robocopy ./compiled ./dist/API /COPYALL /E *.d.ts; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 107 | robocopy ".\Mod Manager\dist\win-unpacked" "./dist/Mod Manager" /COPYALL /E; if ($lastexitcode -lt 8) { $global:LASTEXITCODE = $null } 108 | copy Deploy.exe dist 109 | New-Item -Path dist -Name "Mod Manager.cmd" -ItemType "file" -Value "@echo off`ncd `"Mod Manager`"`nstart `"`" `"Mod Manager.exe`"" 110 | 111 | - uses: actions/upload-artifact@v4 112 | with: 113 | name: Output 114 | path: dist 115 | -------------------------------------------------------------------------------- /.github/workflows/pr_comment.yml: -------------------------------------------------------------------------------- 1 | name: Comment on pull request 2 | on: 3 | workflow_run: 4 | workflows: ['PR Build'] 5 | types: [completed] 6 | jobs: 7 | pr_comment: 8 | if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/github-script@v3 12 | with: 13 | # This snippet is public-domain, taken from 14 | # https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml 15 | script: | 16 | const {owner, repo} = context.repo; 17 | const run_id = ${{github.event.workflow_run.id}}; 18 | const pull_head_sha = '${{github.event.workflow_run.head_sha}}'; 19 | const pull_user_id = ${{github.event.sender.id}}; 20 | const issue_number = await (async () => { 21 | const pulls = await github.pulls.list({owner, repo}); 22 | for await (const {data} of github.paginate.iterator(pulls)) { 23 | for (const pull of data) { 24 | if (pull.head.sha === pull_head_sha && pull.user.id === pull_user_id) { 25 | return pull.number; 26 | } 27 | } 28 | } 29 | })(); 30 | if (issue_number) { 31 | core.info(`Using pull request ${issue_number}`); 32 | } else { 33 | return core.error(`No matching pull request found`); 34 | } 35 | const {data: {artifacts}} = await github.actions.listWorkflowRunArtifacts({owner, repo, run_id}); 36 | if (!artifacts.length) { 37 | return core.error(`No artifacts found`); 38 | } 39 | let body = `Download the artifacts for this pull request:\n`; 40 | for (const art of artifacts) { 41 | body += `\n* [${art.name}.zip](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip?h=6ea9fd5ddf66c9e4adbcbe858e65b9de8ce44998)`; 42 | } 43 | const {data: comments} = await github.issues.listComments({repo, owner, issue_number}); 44 | const existing_comment = comments.find((c) => c.user.login === 'github-actions[bot]'); 45 | if (existing_comment) { 46 | core.info(`Updating comment ${existing_comment.id}`); 47 | await github.issues.updateComment({repo, owner, comment_id: existing_comment.id, body}); 48 | } else { 49 | core.info(`Creating a comment`); 50 | await github.issues.createComment({repo, owner, issue_number, body}); 51 | } 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | hash_list.txt 3 | rpkg-cli.exe 4 | Deploy.exe 5 | Third-Party/ResourceLib_HM2.dll 6 | Third-Party/ResourceLib_HM2.pdb 7 | Third-Party/ResourceLib_HM2016.dll 8 | Third-Party/ResourceLib_HM2016.pdb 9 | Third-Party/ResourceLib_HM3.dll 10 | Third-Party/ResourceLib_HM3.pdb 11 | Third-Party/ResourceTool.exe 12 | Third-Party/ResourceTool.pdb 13 | compiled 14 | /Mods 15 | config.json 16 | rust/npm/win32-x64-msvc/package.json 17 | rust/npm/win32-x64-msvc/README.md 18 | rust/index.d.ts 19 | rust/index.js 20 | src/smf-rust.node 21 | src/smf-rust.d.ts 22 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "htmlWhitespaceSensitivity": "ignore", 3 | "trailingComma": "none", 4 | "requirePragma": false, 5 | "bracketSpacing": true, 6 | "singleQuote": false, 7 | "printWidth": 200, 8 | "useTabs": true, 9 | "tabWidth": 4, 10 | "semi": false 11 | } -------------------------------------------------------------------------------- /For Build/Mods/Managed by SMF, do not touch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Mods/Managed by SMF, do not touch -------------------------------------------------------------------------------- /For Build/Mods/Realistic AI/content-manhunt/chunk0/Realistic AI Manhunt.repository.json: -------------------------------------------------------------------------------- 1 | { 2 | "f045ad91-9a20-4c78-9be2-39f69cc695ad": { 3 | "Value": 7, 4 | "Toggle": true 5 | }, 6 | "e0cff39f-aaef-406c-ab2a-a0d812923c11": { 7 | "Value": 12 8 | }, 9 | "d317ac83-34a0-48cd-9c48-1ee92e6dd6e5": { 10 | "Value": 7, 11 | "Toggle": true 12 | }, 13 | "b616cda4-6aa9-4277-b8ac-ac86c9116270": { 14 | "Value": 40 15 | }, 16 | "a8319f65-09fe-46be-a914-b98039c4d831": { 17 | "Value": 400 18 | }, 19 | "92488ee1-9f97-42d5-a5f6-8c4d30dffdf9": { 20 | "Value": 0.2 21 | }, 22 | "8206fa1c-601c-44e2-b455-8b0e296f9e3d": { 23 | "Value": 3, 24 | "Toggle": true 25 | }, 26 | "7864c92c-e246-4fd6-b540-316fddac2e82": { 27 | "Value": 0.4 28 | }, 29 | "6fe10af7-e60e-4924-bd78-c1c596dc84d9": { 30 | "Value": 2.5 31 | }, 32 | "6a26d2b3-5363-461d-a699-d38b44ba48b4": { 33 | "Value": 3 34 | }, 35 | "6a1e6009-3013-46bd-ada1-1b4b471920dc": { 36 | "Value": 0.2 37 | }, 38 | "63fc82a9-5d7c-4b05-ae6c-a60b36648afe": { 39 | "Value": 5 40 | }, 41 | "57f89493-0364-46e9-a1e8-9897c1474f8f": { 42 | "Value": 3 43 | }, 44 | "4aee33d7-8a05-4df8-96ac-15bfa97e160c": { 45 | "Value": 425 46 | }, 47 | "455a46f9-7b81-453d-9a38-cd45308e37c8": { 48 | "Value": 7, 49 | "Toggle": true 50 | }, 51 | "432c4282-8792-4982-b35f-eb7660c9c834": { 52 | "Value": 3, 53 | "Toggle": true 54 | }, 55 | "1bde01b1-d873-4d67-9af8-4461c3a1fee8": { 56 | "Value": 40 57 | }, 58 | "17d26f17-4e58-483e-9923-4118559a1a83": { 59 | "Value": 600 60 | }, 61 | "168fead8-6ef5-4a21-95d9-99758c611571": { 62 | "Value": 3, 63 | "Toggle": true 64 | }, 65 | "116463d8-bf8a-4abe-98e8-1666c207f0c8": { 66 | "Value": 999, 67 | "Count": 999 68 | }, 69 | "1094dd4e-c277-4bd1-a637-8c8b428c9add": { 70 | "Value": 3, 71 | "Toggle": true 72 | }, 73 | "0cf3b48b-8d9c-4aaa-9984-b386bfdea1ab": { 74 | "Value": 3 75 | }, 76 | "047cb532-1791-4a28-a9da-6aa7cfcfc178": { 77 | "Value": 0.25 78 | } 79 | } -------------------------------------------------------------------------------- /For Build/Mods/Realistic AI/content-normal/chunk0/Realistic AI Normal.repository.json: -------------------------------------------------------------------------------- 1 | { 2 | "fc471a2e-198d-4c35-97d9-54b8bbce927e": { 3 | "Value": 0.15 4 | }, 5 | "f045ad91-9a20-4c78-9be2-39f69cc695ad": { 6 | "Value": 7, 7 | "Toggle": true 8 | }, 9 | "e0cff39f-aaef-406c-ab2a-a0d812923c11": { 10 | "Value": 12 11 | }, 12 | "d317ac83-34a0-48cd-9c48-1ee92e6dd6e5": { 13 | "Value": 7, 14 | "Toggle": true 15 | }, 16 | "b616cda4-6aa9-4277-b8ac-ac86c9116270": { 17 | "Value": 40 18 | }, 19 | "a8319f65-09fe-46be-a914-b98039c4d831": { 20 | "Value": 125 21 | }, 22 | "92488ee1-9f97-42d5-a5f6-8c4d30dffdf9": { 23 | "Value": 0.2 24 | }, 25 | "8206fa1c-601c-44e2-b455-8b0e296f9e3d": { 26 | "Value": 3, 27 | "Toggle": true 28 | }, 29 | "7864c92c-e246-4fd6-b540-316fddac2e82": { 30 | "Value": 0.4 31 | }, 32 | "6fe10af7-e60e-4924-bd78-c1c596dc84d9": { 33 | "Value": 2.5 34 | }, 35 | "6a26d2b3-5363-461d-a699-d38b44ba48b4": { 36 | "Value": 3 37 | }, 38 | "6a1e6009-3013-46bd-ada1-1b4b471920dc": { 39 | "Value": 0.2 40 | }, 41 | "63fc82a9-5d7c-4b05-ae6c-a60b36648afe": { 42 | "Value": 5 43 | }, 44 | "57f89493-0364-46e9-a1e8-9897c1474f8f": { 45 | "Value": 3 46 | }, 47 | "4aee33d7-8a05-4df8-96ac-15bfa97e160c": { 48 | "Value": 150 49 | }, 50 | "455a46f9-7b81-453d-9a38-cd45308e37c8": { 51 | "Value": 7, 52 | "Toggle": true 53 | }, 54 | "432c4282-8792-4982-b35f-eb7660c9c834": { 55 | "Value": 3, 56 | "Toggle": true 57 | }, 58 | "1bde01b1-d873-4d67-9af8-4461c3a1fee8": { 59 | "Value": 40 60 | }, 61 | "17d26f17-4e58-483e-9923-4118559a1a83": { 62 | "Value": 180 63 | }, 64 | "168fead8-6ef5-4a21-95d9-99758c611571": { 65 | "Value": 3, 66 | "Toggle": true 67 | }, 68 | "1094dd4e-c277-4bd1-a637-8c8b428c9add": { 69 | "Value": 3, 70 | "Toggle": true 71 | }, 72 | "0cf3b48b-8d9c-4aaa-9984-b386bfdea1ab": { 73 | "Value": 3 74 | }, 75 | "047cb532-1791-4a28-a9da-6aa7cfcfc178": { 76 | "Value": 0.25 77 | } 78 | } -------------------------------------------------------------------------------- /For Build/Mods/Realistic AI/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.1", 3 | "id": "Atampy26.RealisticAI", 4 | "name": "Realistic AI", 5 | "description": "Makes the AI smarter, more realistic and more attentive in Master mode.", 6 | "authors": ["Atampy26"], 7 | "frameworkVersion": "2.33.26", 8 | "updateCheck": "https://hitman-resources.netlify.app/framework/updates/Realistic AI.json", 9 | "options": [ 10 | { 11 | "group": "Edition", 12 | "name": "Normal", 13 | "tooltip": "The base version of Realistic AI; more realistic than vanilla.", 14 | "enabledByDefault": true, 15 | "type": "select", 16 | "contentFolders": ["content-normal"] 17 | }, 18 | { 19 | "group": "Edition", 20 | "name": "Manhunt", 21 | "tooltip": "Guards now set up Manhunts, in which a large area of the map is searched, centred at your last known position.", 22 | "type": "select", 23 | "contentFolders": ["content-manhunt"] 24 | }, 25 | { 26 | "group": "Edition", 27 | "name": "Extreme", 28 | "tooltip": "Increases everything to ridiculous levels, past the point of realism. Everyone now has precognition and knows exactly what you're doing.", 29 | "type": "select", 30 | "contentFolders": ["content-extreme"] 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /For Build/Third-Party/ResourceLib_HM2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/ResourceLib_HM2.dll -------------------------------------------------------------------------------- /For Build/Third-Party/ResourceLib_HM2016.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/ResourceLib_HM2016.dll -------------------------------------------------------------------------------- /For Build/Third-Party/ResourceLib_HM3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/ResourceLib_HM3.dll -------------------------------------------------------------------------------- /For Build/Third-Party/ResourceLib_HMA.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/ResourceLib_HMA.dll -------------------------------------------------------------------------------- /For Build/Third-Party/ResourceTool.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/ResourceTool.exe -------------------------------------------------------------------------------- /For Build/Third-Party/assimp.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/assimp.dll -------------------------------------------------------------------------------- /For Build/Third-Party/hash_list.hmla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/hash_list.hmla -------------------------------------------------------------------------------- /For Build/Third-Party/quickentity_ffi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/Third-Party/quickentity_ffi.dll -------------------------------------------------------------------------------- /For Build/cleanMicrosoftThumbs.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/cleanMicrosoftThumbs.dat -------------------------------------------------------------------------------- /For Build/cleanPackageDefinition.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/cleanPackageDefinition.txt -------------------------------------------------------------------------------- /For Build/cleanThumbs.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/For Build/cleanThumbs.dat -------------------------------------------------------------------------------- /For Build/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimePath": "..\\Runtime", 3 | "retailPath": "..\\Retail", 4 | "skipIntro": false, 5 | "outputToSeparateDirectory": false, 6 | "loadOrder": [], 7 | "modOptions": {}, 8 | "outputConfigToAppDataOnDeploy": true, 9 | "knownMods": [] 10 | } -------------------------------------------------------------------------------- /Mod Manager/.gitignore: -------------------------------------------------------------------------------- 1 | types/env.d.ts 2 | yarn-error.log 3 | pnpm-lock.yaml 4 | node_modules/ 5 | .svelte-kit/ 6 | .DS_Store 7 | .svelte/ 8 | *.local 9 | build/ 10 | dist/ -------------------------------------------------------------------------------- /Mod Manager/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict = true 2 | -------------------------------------------------------------------------------- /Mod Manager/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "svelteSortOrder": "scripts-markup-styles", 3 | "htmlWhitespaceSensitivity": "ignore", 4 | "trailingComma": "none", 5 | "requirePragma": false, 6 | "bracketSpacing": true, 7 | "singleQuote": false, 8 | "printWidth": 200, 9 | "useTabs": true, 10 | "tabWidth": 4, 11 | "semi": false 12 | } -------------------------------------------------------------------------------- /Mod Manager/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["svelte.svelte-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /Mod Manager/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[svelte]": { 3 | "editor.formatOnSave": true, 4 | "editor.defaultFormatter": "svelte.svelte-vscode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Mod Manager/build.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "appId": "com.atampy26.simple-mod-framework.mod-manager", 3 | "compression": "maximum", 4 | "productName": "Mod Manager", 5 | "directories": { 6 | "output": "dist", 7 | "buildResources": "buildResources" 8 | }, 9 | "files": [ 10 | "src/electron.cjs", 11 | "src/preload.cjs", 12 | "src/torchlight/**/*", 13 | { 14 | "from": "build", 15 | "to": "" 16 | } 17 | ], 18 | "protocols": [ 19 | { 20 | "name": "Simple Mod Framework", 21 | "schemes": ["simple-mod-framework"] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /Mod Manager/buildResources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atampy25/simple-mod-framework/6c4bdabfa8bb17323c8c6ccb61c0f2e4b78c7214/Mod Manager/buildResources/icon.ico -------------------------------------------------------------------------------- /Mod Manager/globals.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /Mod Manager/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "$lib": ["src/lib"], 6 | "$lib/*": ["src/lib/*"], 7 | "/~/*": ["src/*"] 8 | } 9 | }, 10 | "exclude": ["node_modules", "build", "dist"] 11 | } 12 | -------------------------------------------------------------------------------- /Mod Manager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ModManager", 3 | "version": "1.0.0", 4 | "author": "Atampy26", 5 | "private": true, 6 | "description": "Mod manager for the Simple Mod Framework.", 7 | "main": "src/electron.cjs", 8 | "type": "module", 9 | "scripts": { 10 | "dev": "cross-env NODE_ENV=dev npm run dev:all", 11 | "dev:all": "concurrently -n=svelte,electron -c='#ff3e00',blue \"npm run dev:svelte\" \"npm run dev:electron\"", 12 | "dev:svelte": "vite dev", 13 | "dev:electron": "electron src/electron.cjs", 14 | "build": "cross-env NODE_ENV=production npm run build:svelte && npm run build:electron", 15 | "build:svelte": "vite build", 16 | "build:electron": "electron-builder -w --dir --config build.config.json", 17 | "start": "vite start" 18 | }, 19 | "engines": { 20 | "npm": ">=7", 21 | "pnpm": "use npm - https://github.com/FractalHQ/sveltekit-electron/issues/12#issuecomment-1068399385", 22 | "yarn": "use npm - https://github.com/FractalHQ/sveltekit-electron/issues/12#issuecomment-1068399385" 23 | }, 24 | "browserslist": [ 25 | "Chrome 89" 26 | ], 27 | "dependencies": { 28 | "@electron/remote": "^2.0.8", 29 | "@fortawesome/free-regular-svg-icons": "^6.1.2", 30 | "@fortawesome/free-solid-svg-icons": "^6.1.2", 31 | "adm-zip": "^0.5.9", 32 | "ajv": "^8.11.0", 33 | "ansi-to-html": "^0.7.2", 34 | "autoprefixer": "^10.4.8", 35 | "axios": "^0.27.2", 36 | "carbon-components-svelte": "^0.67.8", 37 | "carbon-icons-svelte": "^11.2.0", 38 | "chalk": "^4.1.2", 39 | "electron-context-menu": "^2.5.2", 40 | "electron-reloader": "^1.2.3", 41 | "electron-serve": "^1.1.0", 42 | "electron-window-state": "^5.0.3", 43 | "filtrex": "^3.0.0", 44 | "fs-extra": "^10.1.0", 45 | "hash-wasm": "^4.9.0", 46 | "json5": "^2.2.2", 47 | "klaw-sync": "^6.0.0", 48 | "lodash.chunk": "^4.2.0", 49 | "lodash.get": "^4.4.2", 50 | "lodash.isequal": "^4.5.0", 51 | "lodash.memoize": "^4.1.2", 52 | "lodash.mergewith": "^4.6.2", 53 | "marked": "^4.0.18", 54 | "md5": "^2.3.0", 55 | "postcss": "^8.4.16", 56 | "rehype-stringify": "^9.0.3", 57 | "sanitize-html": "^2.7.3", 58 | "semver": "^7.3.7", 59 | "shiki": "^0.11.1", 60 | "svelte-fa": "^2.4.0", 61 | "svelte-tippy": "^1.3.2", 62 | "tailwindcss": "^3.1.8", 63 | "tippy.js": "^6.3.7", 64 | "unified": "^10.1.2", 65 | "uuid": "^8.3.2" 66 | }, 67 | "devDependencies": { 68 | "@sveltejs/adapter-static": "1.0.0-next.50", 69 | "@sveltejs/kit": "^1.25.1", 70 | "@types/adm-zip": "^0.5.0", 71 | "@types/electron-window-state": "^2.0.34", 72 | "@types/lodash.isequal": "^4.5.6", 73 | "@types/lodash.memoize": "^4.1.7", 74 | "@types/lodash.mergewith": "^4.6.7", 75 | "@types/marked": "^4.0.3", 76 | "@types/sanitize-html": "^2.6.2", 77 | "@types/uuid": "^8.3.4", 78 | "@typescript-eslint/eslint-plugin": "^5.33.0", 79 | "@typescript-eslint/parser": "^5.33.0", 80 | "concurrently": "^7.3.0", 81 | "cross-env": "^7.0.3", 82 | "dotenv": "^8.6.0", 83 | "electron": "^26.2.4", 84 | "electron-builder": "^23.3.3", 85 | "electron-connect": "^0.6.3", 86 | "electron-packager": "^15.4.0", 87 | "electron-updater": "^4.6.5", 88 | "eslint": "^8.21.0", 89 | "eslint-plugin-svelte": "^2.33.2", 90 | "npm-run-all": "^4.1.5", 91 | "prettier": "^3.0.3", 92 | "prettier-eslint": "^15.0.1", 93 | "prettier-plugin-svelte": "^3.0.3", 94 | "sass": "^1.54.4", 95 | "svelte": "^4.2.1", 96 | "svelte-check": "^3.5.2", 97 | "svelte-preprocess": "^5.0.4", 98 | "typescript": "^4.7.4", 99 | "vite": "^4.4.9" 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /Mod Manager/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | tailwindcss: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Mod Manager/src/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | code.h { 6 | @apply bg-neutral-800 text-orange-200 rounded-sm text-sm; 7 | font-family: "Fira Code", "IBM Plex Mono", "Menlo", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Courier, monospace !important; 8 | padding: 0.1rem 0.2rem !important; 9 | } -------------------------------------------------------------------------------- /Mod Manager/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | Simple Mod Framework 11 | %sveltekit.head% 12 | 13 | 14 | 15 |
%sveltekit.body%
16 | 17 | 18 | -------------------------------------------------------------------------------- /Mod Manager/src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | import type fs from "fs-extra" 6 | import type originalFs from "original-fs" 7 | import type klaw from "klaw-sync" 8 | import type path from "path" 9 | import type buffer from "buffer" 10 | import type electron from "electron" 11 | import type sanitizeHtml from "sanitize-html" 12 | import type child_process from "child_process" 13 | 14 | declare global { 15 | interface Window { 16 | ipc: any 17 | fs: typeof fs 18 | isFile: (path: string) => boolean 19 | originalFs: typeof originalFs 20 | path: typeof path 21 | klaw: typeof klaw 22 | Buffer: typeof buffer 23 | openExternalLink: typeof electron["shell"]["openExternal"] 24 | sanitizeHtml: typeof sanitizeHtml 25 | child_process: typeof child_process 26 | nodeVersion: string 27 | electronVersion: string 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Mod Manager/src/lib/ExpandableTile.svelte: -------------------------------------------------------------------------------- 1 | 28 | 29 |
30 | 31 |
32 |
{ 35 | open = !open 36 | clicked = true 37 | }} 38 | > 39 |
40 | 41 |
42 |
43 | 44 |
45 |
46 | {#if !open} 47 |
48 | 49 |
50 | {/if} 51 | {#if open} 52 |
53 |
54 | 55 |
56 | {/if} 57 |
58 |
59 |
60 | 61 | 90 | -------------------------------------------------------------------------------- /Mod Manager/src/lib/KeyValueEditor.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {#each Object.entries(data) as [key, value], index (key)} 34 | 35 | 38 | 64 | 65 | {/each} 66 | 67 |
KeyValue
36 | {key} 37 | 39 |
40 | {value} 41 |
63 |
68 |
69 |
70 | 79 |
80 | 81 | { 88 | if (newKeyInputModal.value && newKeyInputModal.value.length) { 89 | dispatch("define", { 90 | key: newKeyInputModal.value, 91 | value: "UI_PLACEHOLDER_VALUE" 92 | }) 93 | } 94 | }} 95 | /> 96 | 97 | { 105 | if (newValueInputModal.value && newValueInputModal.value.length) { 106 | dispatch("define", { 107 | key: valueToEdit, 108 | value: newValueInputModal.value 109 | }) 110 | } 111 | }} 112 | /> 113 | -------------------------------------------------------------------------------- /Mod Manager/src/lib/ListEditor.svelte: -------------------------------------------------------------------------------- 1 | 20 | 21 |
22 | 23 | 24 | {#each data as value, index (value)} 25 | 26 | 52 | 53 | {/each} 54 | {#if data.length == 0} 55 | 56 | 61 | 62 | {/if} 63 | 64 |
27 |
28 | {value} 29 |
51 |
57 |
58 | No entries 59 |
60 |
65 |
66 |
67 | 77 |
78 | 79 | { 86 | if (newValueInputModal.value && newValueInputModal.value.length) { 87 | dispatch("define", { 88 | original: valueToEdit, 89 | new: newValueInputModal.value 90 | }) 91 | } 92 | }} 93 | /> 94 | -------------------------------------------------------------------------------- /Mod Manager/src/lib/SortableList.svelte: -------------------------------------------------------------------------------- 1 | 68 | 69 | {#if list && list.length} 70 |
    71 | {#each list as item, index (getKey(item))} 72 |
  • 85 | 86 |

    {getKey(item)}

    87 |
    88 |
  • 89 | {/each} 90 |
91 | {/if} 92 | 93 | 106 | -------------------------------------------------------------------------------- /Mod Manager/src/lib/TextInputModal.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | 18 | { 23 | modalInput.value = modalInitialText 24 | modalInput.focus() 25 | }} 26 | on:close 27 | > 28 | {#if multiline} 29 |