Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
5b57e0c39b
|
|||
|
e36994be55
|
72
README.md
72
README.md
@@ -1,3 +1,73 @@
|
|||||||
# SeaLoader
|
# SeaLoader
|
||||||
|
|
||||||
A Modloader based off of the workshop
|
SeaLoader is a minimal, dark-themed helper app for Sea Power that fetches a scenario’s required Steam Workshop mods, resolves names, checks for transitive dependencies, and enables matching mods in your `usersettings.ini`. It also supports subscribing to missing mods, scanning the Steam Workshop folder for installed content, and self-updating.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Fetch required mods from a Workshop URL and resolve their names
|
||||||
|
- Recursive dependency expansion: also fetches each required mod’s own requirements
|
||||||
|
- Two-pane UI:
|
||||||
|
- Installed Mods (from Steam Workshop folder) with status: Enabled, Disabled, or Disabled (Not in INI)
|
||||||
|
- Scenario Required Mods with Installed/Missing status
|
||||||
|
- Enable Matching Mods: writes to `[LoadOrder]` and appends missing workshop IDs as new `ModNDirectory=<id>,True`
|
||||||
|
- Subscribe Missing Mods: opens Steam deep links per mod; step-by-step flow with remaining count
|
||||||
|
- Refresh: reload Installed Mods and re-fetch Required Mods (if URL provided)
|
||||||
|
- Guided flashing to lead the user through steps (URL → Fetch → Subscribe/Refresh → Enable)
|
||||||
|
- Game Path persistence: remembers the Steam game path next to `usersettings.ini`
|
||||||
|
- Version display and update check (Gitea API + RSS fallback), with clickable link
|
||||||
|
- Auto-update install (EXE only): download zip, replace EXE safely, relaunch
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
- Windows 10+
|
||||||
|
- Python 3.10+ (for running from source) or the packaged EXE
|
||||||
|
- Steam client installed and logged in (for Subscribe Missing Mods)
|
||||||
|
|
||||||
|
## Run from source
|
||||||
|
```bash
|
||||||
|
python -m pip install -r requirements.txt
|
||||||
|
python sealoader_gui.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
1. Game Path: Click Browse and select your Sea Power install folder (e.g., `.../steamapps/common/Sea Power`).
|
||||||
|
- If previously saved, SeaLoader loads it automatically on start.
|
||||||
|
2. Paste a Workshop URL and click Fetch Required Mods.
|
||||||
|
- The right list shows all required Workshop IDs and names, including transitive dependencies.
|
||||||
|
3. If some are Missing:
|
||||||
|
- Click Subscribe Missing Mods. A per-mod dialog will open; it shows how many remain.
|
||||||
|
- After subscribing, click Refresh to reload Installed Mods and re-fetch required.
|
||||||
|
4. Click Enable Matching Mods to enable all installed required mods.
|
||||||
|
- A backup `usersettings.ini.bak` is created.
|
||||||
|
|
||||||
|
Statuses in Installed Mods:
|
||||||
|
- Enabled: Present in INI and enabled
|
||||||
|
- Disabled: Present in INI but disabled
|
||||||
|
- Disabled (Not in INI): Found in workshop folder but no INI entry yet (Enable adds it)
|
||||||
|
|
||||||
|
## Self-update
|
||||||
|
- SeaLoader shows current and latest versions in the footer.
|
||||||
|
- If a newer version exists, a modal dialog appears with options:
|
||||||
|
- Download: opens the release page
|
||||||
|
- Auto-Install (EXE only): downloads `SeaLoader_Windows_x64.zip`, replaces `SeaLoader.exe`, and relaunches
|
||||||
|
- Latest version is discovered via Gitea API with RSS fallback: `releases.rss`.
|
||||||
|
|
||||||
|
## Build (Gitea Actions)
|
||||||
|
- Workflow: `.gitea/workflows/release.yml`
|
||||||
|
- On release: stamps `sealoader_version.py` with the tag, bundles PNGs, and builds onefile EXE via PyInstaller
|
||||||
|
- Uploads `SeaLoader_Windows_x64.zip` as the release asset
|
||||||
|
- Runner: Windows; steps use `powershell`
|
||||||
|
|
||||||
|
## Files
|
||||||
|
- `sealoader_gui.py`: GUI application
|
||||||
|
- `steam_required_ids.py`: Workshop scraping, ID resolution, recursive expansion
|
||||||
|
- `sealoader_version.py`: version stamp used by the update checker
|
||||||
|
- `requirements.txt`: dependencies (requests, beautifulsoup4)
|
||||||
|
- `.gitea/workflows/release.yml`: release build pipeline
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
- Footer icons not visible in EXE: ensure `SeaLoader.png` and `hrsys.png` are present at build; the workflow includes them via `--add-data`.
|
||||||
|
- Update checker says unavailable: RSS fallback is in place; ensure `SEALOADER_GITEA` and `SEALOADER_REPO` env vars are correct if using a mirror.
|
||||||
|
- Subscribe Missing Mods not opening Steam: ensure Steam client is running and you’re signed in.
|
||||||
|
- INI not updated: verify `usersettings.ini` path and that `[LoadOrder]` exists. SeaLoader will append new entries if needed.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
Created by HudsonRiggs.Systems.
|
||||||
@@ -13,7 +13,7 @@ from typing import Dict, List, Tuple
|
|||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from tkinter import messagebox, ttk, filedialog
|
from tkinter import messagebox, ttk, filedialog
|
||||||
|
|
||||||
from steam_required_ids import extract_required_item_ids, resolve_workshop_names, expand_required_ids_recursive
|
from steam_required_ids import extract_required_item_ids, resolve_workshop_names
|
||||||
from sealoader_version import __version__
|
from sealoader_version import __version__
|
||||||
|
|
||||||
|
|
||||||
@@ -452,7 +452,7 @@ class SeaLoaderApp(tk.Tk):
|
|||||||
def task():
|
def task():
|
||||||
try:
|
try:
|
||||||
base_ids = extract_required_item_ids(url)
|
base_ids = extract_required_item_ids(url)
|
||||||
ids = expand_required_ids_recursive(base_ids)
|
ids = base_ids
|
||||||
# Reuse installed cache to reduce API calls
|
# Reuse installed cache to reduce API calls
|
||||||
names_map = {i: self.installed_names_map[i] for i in ids if i in self.installed_names_map}
|
names_map = {i: self.installed_names_map[i] for i in ids if i in self.installed_names_map}
|
||||||
ids_to_lookup = [i for i in ids if i not in names_map]
|
ids_to_lookup = [i for i in ids if i not in names_map]
|
||||||
|
|||||||
Reference in New Issue
Block a user