Donate to KroModIx/KroModIx.Plugin.RenPyAssist
  • buymeacoffee.com/kroste

See the documentation for more details on donation links.

No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Lars Oste c2a4f19579
All checks were successful
CI / build (push) Successful in 47s
Die Forge heisst git.flexfamily.de
Lars am 28.10.2026: "ab jetzt git.flexfamily.de gehoeren die repos".
Grund, und das ist der eigentliche Punkt: **git.flexfamily.cloud ist in
Lars' Firmennetz gesperrt**, .de nicht. Beide Namen zeigen auf dieselbe
Instanz und haben ein Zertifikat -- vom Arbeitsplatz aus waere die Forge
unter dem alten Namen aber nicht erreichbar.

Umgestellt sind damit: ROOT_URL, DOMAIN und SSH_DOMAIN der Instanz, alle
Git-Remotes, die Workflows und jedes Programm, das dort etwas abholt.

Ohne den Grund wirkt das wie Geschmack, und der naechste, der eine
Adresse schreibt, nimmt wieder die falsche. Er steht im allgemeinen Skill
und in RUNNER.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-28 14:30:01 +01:00
.forgejo/workflows Die Forge heisst git.flexfamily.de 2026-10-28 14:30:01 +01:00
.github feat(v0.21.0): RAR/7z-Updates und Datei-Auswahl im Downloads-Ordner 2026-09-02 19:24:15 +02:00
docs docs: Screenshot + README auf v0.19.0 2026-09-01 22:14:21 +02:00
KroModIx.Plugin.RenPyAssist chore(v0.30.1): MinHostVersion auf 1.37.3 2026-10-18 21:08:50 +02:00
KroModIx.Plugin.RenPyAssist.Tests feat(v0.30.0): Windows-only-Builds laufen nativ 2026-10-18 21:00:55 +02:00
.editorconfig feat(v0.1.0): initial Ren'Py Assist plugin — f95zone-Integration + Sub-Path-Rotation 2026-08-11 09:31:15 +02:00
.gitignore feat(v0.1.0): initial Ren'Py Assist plugin — f95zone-Integration + Sub-Path-Rotation 2026-08-11 09:31:15 +02:00
CLAUDE.md fix(v0.24.0): alten Unterordner nicht loeschen, wenn er ein Verweis ist 2026-10-04 09:13:18 +02:00
Directory.Build.props feat(v0.1.0): initial Ren'Py Assist plugin — f95zone-Integration + Sub-Path-Rotation 2026-08-11 09:31:15 +02:00
Directory.Packages.props chore(v0.30.1): MinHostVersion auf 1.37.3 2026-10-18 21:08:50 +02:00
KroModIx.Plugin.RenPyAssist.slnx fix(v0.17.1): Update-Badge nur bei echt neuerer Thread-Version 2026-08-30 18:45:27 +02:00
LICENSE feat(v0.1.0): initial Ren'Py Assist plugin — f95zone-Integration + Sub-Path-Rotation 2026-08-11 09:31:15 +02:00
nuget.config Die Forge heisst git.flexfamily.de 2026-10-28 14:30:01 +01:00
README.md feat(v0.21.0): RAR/7z-Updates und Datei-Auswahl im Downloads-Ordner 2026-09-02 19:24:15 +02:00

KroModIx.Plugin.RenPyAssist

CI Release

Ren'Py Assist — ordnerbasierter Update-Manager für Ren'Py-Spiele mit direkter f95zone.to-Anbindung. Plugin für den KroModIx.

Voraussetzungen

Braucht den KroModIx-Host ab v1.27.0 — dort sitzen der gemeinsame Versions-Vergleich und der proxy-fähige HTTP-Handler für den f95zone-Login, gegen die dieses Plugin gebaut ist. Ältere Hosts laden das Plugin nicht.

Screenshot

Übersicht eines Ren'Py-Spiels mit Cover, Version und f95zone-Thread-Button

Neu in v0.21.0

  • RAR und 7z werden beim Update-Install entpackt, nicht mehr nur ZIP — f95zone-Releases kommen in allen dreien.
  • Die Datei-Auswahl öffnet direkt im Downloads-Ordner, wenn die automatische Suche nichts Passendes findet.

Neu in v0.20.0

  • Der gelbe Update-Badge ist klickbar. Ein Klick sucht im Downloads-Ordner nach der passenden Update-ZIP, zeigt dir Dateiname und erkannte Version zur Bestätigung und installiert sie. Findet er nichts — oder passt der Vorschlag nicht — öffnet sich die Datei-Auswahl. Der Weg über den Einstellungen-Tab entfällt damit für den Normalfall.
  • Der Button im Einstellungen-Tab nutzt denselben Ablauf, sucht also ebenfalls erst im Downloads-Ordner.

Neu in v0.19.0

  • Spielstände sind beim Update abgesichert — der alte Versions-Ordner wird erst gelöscht, wenn die Kopie der Saves gegengezählt wurde. Details unter Schutz für deine Spielstände.
  • Save-Editor legt eine .bak an, bevor er Pickle-Bytes patcht.
  • 🔗 Thread öffnen — ein Klick von der Übersicht (und aus den Einstellungen) in den verknüpften f95zone-Thread.
  • Update-Badge nur bei echt neuerer Thread-Version. Vorher zählte jede Abweichung als Update, auch wenn lokal die neuere Version lag (0.5 lokal gegen 0.4.5 im Thread).
  • DE+EN für alle User-facing Strings; Sprachwechsel im Host schaltet nach Kachel-Reselect live um.

Ziel

Nicht Steam-Spiele mit game/-Marker-Ordner: Ren'Py-Adult-Visual-Novels aus f95zone. Der User hat einen Root-Ordner mit vielen Container- Unterordnern; das Plugin

  • erkennt jeden Container mit game/ oder Version-Sub-Ordnern (MyGame-0.240-pc/game/) als Ren'Py-Spiel,
  • verknüpft jeden Container mit einem f95zone-Thread,
  • pollt die Threads periodisch auf neue Versionen und zeigt einen Update-Badge auf der Sidebar-Kachel,
  • installiert Update-ZIPs in einen neuen Sub-Ordner neben dem alten, kopiert die Save-Games aus game/saves/ automatisch mit, löscht den alten Sub-Ordner und archiviert die ZIP in archive/,
  • bietet einen RPA-Archive-Browser + Save-Editor mit Screenshot-Timeline (chronologische Thumbnail-Leiste, Klick selektiert den Save) und einen Inline-Video-Player (ffmpeg-MJPEG- Stream, kein LibVLC),
  • rendert animierte GIF-Cover in der Detail-View via Avalonia.Labs.Gif (Sidebar-Kachel bleibt Standbild),
  • führt eine KrosteMod-Pipeline aus, die aus dekompilierten .rpy- Dateien fertige Walkthrough-/Cheat-/Rename-Mods baut und ins game/ deployt — mit Choice-Auto-Expand (if-Conditions als Requirements im Walkthrough-Hint) und Konditional-Cheat-Markierung (🔓 für Store-Vars die Choices freischalten).

Aktivierung im Host

Host-Wizard „🎮 Ordner mit Spielen scannen": Klick auf 🎮 in der Sidebar → Ren'Py-Root wählen → Host scannt rekursiv nach game/-Marker → „N Ren'Py-Spiele gefunden. Importieren?" → pro Spiel entsteht eine eigene Sidebar-Kachel, RenPyAssist übernimmt jede über engine- basiertes Matching (target.engine = "renpy").

Kein Steam-Bezug nötig. Jede Kachel ist ein eigener Container-Ordner (mit game/-Marker oder Sub-Version-Ordnern), Plugin rendert für jede eine Detail-View mit Cover, Version, Thread-URL, Actions.

Braucht Host v1.10.3 oder neuer.

Tabs

Übersicht

  • Cover (aus f95zone via CoverCache, AVIF/GIF/WebP → PNG via ffmpeg- Thumbnail-Filter)
  • Titel + Genre-Tags + KI-übersetzte Beschreibung (System-Locale)
  • Lokale Version + Remote-Version + „zuletzt geprüft"

Archive

RPA-Browser für .rpa-Files im game/-Verzeichnis. Zeigt Index-Baum, Text-/Bild-/Video-Preview mit Inline-Playback (ffmpeg-MJPEG-Stream, 12 fps, kein Audio — zum Screening reicht das) oder externem Player. Einzelnes File oder ganzes Archiv extrahieren.

Saves

Ren'Py-Save-Editor (v0.4+): pickle-basierter Save-Reader mit Screenshot-Preview.

Mods (KrosteMod-Pipeline + Standalone-Decompiler)

Portiert aus RenPack. Plugin dekompiliert .rpyc in-process via Razorvine.Pickle-basiertem C#- Decompiler (kein Python, cross-platform, Ren'Py 6.99–8.x, deckt Screens/ ATL/Transform/LayeredImage ab). Analysiert die .rpy und deployt einen fertigen Mod ins game/-Verzeichnis mit Uninstall-Manifest.

Buttons im Mods-Tab:

  • ▶ Bauen — komplette KrosteMod-Pipeline für den gewählten Typ:
    • Walkthrough — Choice-Labels annotieren
    • Cheat — F11-Overlay mit Live-Editor für Store-Variablen
    • Rename — Character-Namen umbenennen (mit KI-Text-Rewrite falls konfiguriert)
    • Translate — KI-Batch-Übersetzung der Dialoge (via IHostServices.Ai)
  • 🔓 .rpyc dekompilieren (v0.13) — Standalone-Decompiler auf alle .rpyc im aktiven game/-Ordner, ohne KrosteMod-Build. Nutzt skipUpToDate=true (bereits vorhandene aktuelle .rpy werden übersprungen). Für User die Skripte lesen/modden wollen ohne einen der KrosteMod-Typen zu bauen.
  • 🗑 Deinstallieren — restauriert .rpyc-Backups aus dem Manifest.

Einstellungen (plugin-global + spiel-spezifisch)

Spiel-spezifisch: Thread-URL, ▶ Start, ⬆ Update installieren, 🔄 Prüfen, 📂 Ordner, ✏ Ordner umbenennen (Container-Rename via IHostServices.TryRenameManualGame, .renpyassist/-Metadaten wandern mit), 🖼 Sidebar-Ausschnitt wählen.

Plugin-global: Downloads-Watch-Ordner, Check-Intervall, f95zone-Login (User/Passwort → Session-Cookies verschlüsselt via Host-ISecretProtection / DPAPI / libsecret abgelegt; Passwort landet nie auf der Platte).

Update installieren

Wenn der f95zone-Thread eine neuere Version meldet, erscheint in der Übersicht der goldene Badge ↑ <Version>. Ein Klick darauf:

  1. durchsucht deinen Downloads-Ordner (der aus den Plugin-Einstellungen) nach einer passenden .zip,
  2. bewertet die Treffer nach Namensähnlichkeit und erkannter Version — die Version aus dem Thread zählt am stärksten, bereits installierte oder ältere Versionen fliegen raus,
  3. zeigt den besten Treffer mit Dateiname und Version zur Bestätigung,
  4. entpackt ihn in den Container, überträgt die Spielstände und setzt den aktiven Sub-Path auf die neue Version.

Ohne Treffer (oder wenn du den Vorschlag ablehnst) öffnet sich die Datei-Auswahl — direkt im Downloads-Ordner. Vorgeschlagen und entpackt werden .zip, .rar und .7z; die beiden Listen (Suche und Installer) hängen an einem gemeinsamen Test, damit nie ein Format vorgeschlagen wird, das der Installer nicht öffnen kann.

Sub-Path-Rotation

Referenz: RenPack (GamesRegistry.DetectRenpySubFolder). Ein Container kann direktes game/ haben (Legacy) oder mehrere Version-Sub-Ordner mit je eigenem game/saves/. Der Detektor priorisiert (1) direktes game/, dann (2/3) den Sub-Ordner mit der höchsten extrahierbaren Version. Bei Update wird RenPyGame.ActiveSubPath auf den neuen ZIP-Sub-Ordner umgeschrieben, Saves aus dem alten in den neuen kopiert, alter Sub-Ordner gelöscht, ZIP nach <container>/archive/ verschoben.

F95zone-Anbindung

  • Login: CSRF-Token-Handshake (/login/ → _xfToken extrahieren → POST /login/login), Session-Cookies (xf_user, xf_session) verschlüsselt gespeichert.
  • Thread-Metadata: Titel aus og:title, Version-Regex auf [vX.Y.Z], Cover aus dem ersten attachments.f95zone.to/YYYY/MM/…-Full-Size-Bild (ohne thumb/-Prefix), Description aus dem ersten Post-Body, Genre-Tags aus dem BB-Spoiler-Block.
  • Cover-Cache: SHA256(URL) als Dateiname, AVIF/WebP → PNG via SixLabors.ImageSharp, animierte GIFs → repräsentatives Frame via ffmpeg -vf thumbnail -frames:v 1 (statt starrer Frame 0, der bei Fade-In-Splash-Bildern oft weiß ist).
  • Robustheit: alle Methoden geben bei Fehler leere Liste / null zurück — kein Crash im Host wenn f95zone-Layout sich ändert.

Container-lokaler Metadaten-Store

Pro Container liegt in <container>/.renpyassist/:

  • game.json — komplette Metadaten (ThreadUrl, CoverUrl, Description, Genres, KI-Übersetzungen, ActiveSubPath, LocalVersion)
  • cover.img — Auto-Cover-Bild (PNG nach ffmpeg-Convert)
  • sidebar-cover.png — User-Custom-Ausschnitt (2:3-Portrait, hat Vorrang in der Sidebar)

Vorteil: wenn der User seine Sammlung auf einen anderen PC überträgt oder den Ordner umbenennt, kommt die Config automatisch mit.

Installation

Aus Release das ZIP entpacken nach:

  • Linux: ~/.config/KroModIx/plugins/kroste.renpyassist/
  • Windows: %APPDATA%\KroModIx\plugins\kroste.renpyassist\

Alternativ: 1-Klick-Install über die Install-Karte in der KroModIx-Sidebar.

ffmpeg wird für Video-Frame-Grab + Inline-Playback + AVIF/GIF-Cover- Convert gebraucht:

  • Fedora/Bazzite: sudo dnf install ffmpeg-free
  • Debian/Ubuntu: sudo apt install ffmpeg
  • Windows: winget install ffmpeg
  • macOS: brew install ffmpeg

Ohne ffmpeg funktioniert das Plugin — Cover werden dann per ImageSharp konvertiert (kein AVIF), Video-Preview zeigt Install-Hint, externer Player läuft weiter.

Erste Schritte

  1. Plugin über die Sidebar-Install-Karte installieren.
  2. In der Sidebar auf 🎮 (neben „➕ Spiel hinzufügen") klicken.
  3. Root-Ordner deiner Ren'Py-Sammlung wählen → 🔍 Scannen → Host meldet „Ren'Py: N Spiele gefunden" → Spiele importieren.
  4. Die Sidebar hat jetzt eine Kachel pro Ren'Py-Spiel. Anklicken → Detail-View mit den Tabs (Übersicht / Archive / Saves / Mods / Einstellungen).
  5. Optional: Einstellungen-Tab → f95zone-Login eintragen (für Cover- Downloads bei login-required Threads).
  6. Pro Spiel: f95zone-Thread-URL im Feld einfügen, 💾 klicken → Version- Poll + Cover-Download + Description-KI-Übersetzung laufen im Hintergrund.

Referenz

  • RenPack (github.com/Kroste/RenPack) — Original-Referenz für Sub-Path-Rotation, f95zone-Integration, KrosteMod-Pipeline, Media-Preview mit ffmpeg-MJPEG-Stream. Ren'Py Assist portiert die Kern-Logik in die KroModIx-Plugin-Architektur.
  • F95zone — f95zone.to (Forum + Attachment- Hosting).

Schutz für deine Spielstände

Ren'Py-Container sind zu groß für ZIP-Snapshots vor jeder Aktion — deshalb schützt das Plugin gezielt das, was unersetzlich ist:

  • Beim Update werden game/saves/ in die neue Version kopiert und die Kopie danach gegengezählt (Dateianzahl und Größe). Erst wenn das passt, wird der alte Versions-Ordner gelöscht. Klappt die Übernahme nicht, bleibt der alte Ordner stehen und du bekommst einen Dialog, der dir sagt, wo deine Spielstände liegen.
  • Im Save-Editor entsteht vor dem ersten Schreiben eine .bak-Kopie neben dem Save. Ein bereits vorhandenes Backup bleibt unangetastet — es ist der letzte unveränderte Stand. Lässt sich das Backup nicht anlegen, wird gar nicht erst geschrieben.

Lizenz

MIT — siehe LICENSE.


☕ buymeacoffee.com/kroste