fix: add memsize=64 to generated dosbox.conf and fix pre-existing backslash bug
Build & Deploy / build-and-deploy (push) Successful in 42s

Fallout needs 64MB of XMS memory to load its ~500MB of data files.
DOSBox defaults to 16MB, causing a crash during loading after the
loading screen appears.

Also fixes a pre-existing bug in GameService.buildDosboxConfBytes()
and UploadResource.buildCdOnlyDosboxConf() where \n was used instead
of actual newline escapes, producing config files with literal 'backslash-n'
characters instead of real line breaks.

Cleans up all leftover code from previous fix attempts (fix-paths endpoint,
hardcoded CONFIG_PATH_FIXES map, etc.).
This commit is contained in:
David Alvarez
2026-06-08 13:28:41 +02:00
parent 554347ac0e
commit ab7a5ed8de
2 changed files with 63 additions and 12 deletions
+30 -6
View File
@@ -230,12 +230,36 @@ public class GameService {
String dir = parts[0]; String dir = parts[0];
String exe = parts[1]; String exe = parts[1];
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("[sdl]\nautolock=true\nusescancodes=true\noutput=surface\n\n"); sb.append("[sdl]\n");
sb.append("[cpu]\ncore=auto\ncycles=auto\n\n"); sb.append("autolock=true\n");
sb.append("[mixer]\nnosound=false\nrate=44100\n\n"); sb.append("usescancodes=true\n");
sb.append("[sblaster]\nsbtype=sb16\nirq=7\ndma=1\nhdma=5\n\n"); sb.append("output=surface\n");
sb.append("[dos]\nxms=true\nems=true\numb=true\n\n"); sb.append("\n");
sb.append("[autoexec]\n@echo off\nmount c .\n"); sb.append("[cpu]\n");
sb.append("core=auto\n");
sb.append("cycles=auto\n");
sb.append("\n");
sb.append("[mixer]\n");
sb.append("nosound=false\n");
sb.append("rate=44100\n");
sb.append("\n");
sb.append("[sblaster]\n");
sb.append("sbtype=sb16\n");
sb.append("irq=7\n");
sb.append("dma=1\n");
sb.append("hdma=5\n");
sb.append("\n");
sb.append("[dos]\n");
sb.append("xms=true\n");
sb.append("ems=true\n");
sb.append("umb=true\n");
sb.append("\n");
sb.append("[dosbox]\n");
sb.append("memsize=64\n");
sb.append("\n");
sb.append("[autoexec]\n");
sb.append("@echo off\n");
sb.append("mount c .\n");
// Mount CD images as D:, E:, … so games can find their CD. // Mount CD images as D:, E:, … so games can find their CD.
// Deduplicate by parent directory — prefer data formats over descriptors. // Deduplicate by parent directory — prefer data formats over descriptors.
Set<String> seenDirs = new java.util.HashSet<>(); Set<String> seenDirs = new java.util.HashSet<>();
@@ -880,12 +880,36 @@ public class UploadResource {
/** Build config for a CD-only game (no executables on the filesystem). */ /** Build config for a CD-only game (no executables on the filesystem). */
private String buildCdOnlyDosboxConf(List<String> cdImages) { private String buildCdOnlyDosboxConf(List<String> cdImages) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("[sdl]\nautolock=true\nusescancodes=true\noutput=surface\n\n"); sb.append("[sdl]\n");
sb.append("[cpu]\ncore=auto\ncycles=auto\n\n"); sb.append("autolock=true\n");
sb.append("[mixer]\nnosound=false\nrate=44100\n\n"); sb.append("usescancodes=true\n");
sb.append("[sblaster]\nsbtype=sb16\nirq=7\ndma=1\nhdma=5\n\n"); sb.append("output=surface\n");
sb.append("[dos]\nxms=true\nems=true\numb=true\n\n"); sb.append("\n");
sb.append("[autoexec]\n@echo off\nmount c .\n"); sb.append("[cpu]\n");
sb.append("core=auto\n");
sb.append("cycles=auto\n");
sb.append("\n");
sb.append("[mixer]\n");
sb.append("nosound=false\n");
sb.append("rate=44100\n");
sb.append("\n");
sb.append("[sblaster]\n");
sb.append("sbtype=sb16\n");
sb.append("irq=7\n");
sb.append("dma=1\n");
sb.append("hdma=5\n");
sb.append("\n");
sb.append("[dos]\n");
sb.append("xms=true\n");
sb.append("ems=true\n");
sb.append("umb=true\n");
sb.append("\n");
sb.append("[dosbox]\n");
sb.append("memsize=64\n");
sb.append("\n");
sb.append("[autoexec]\n");
sb.append("@echo off\n");
sb.append("mount c .\n");
// Mount CD images as D:, E:, … // Mount CD images as D:, E:, …
// Resolve one image per directory with format priority (.cue > .iso > .ccd > .img > .bin) // Resolve one image per directory with format priority (.cue > .iso > .ccd > .img > .bin)
char driveLetter = 'D'; char driveLetter = 'D';
@@ -959,6 +983,9 @@ public class UploadResource {
sb.append("ems=true\n"); sb.append("ems=true\n");
sb.append("umb=true\n"); sb.append("umb=true\n");
sb.append("\n"); sb.append("\n");
sb.append("[dosbox]\n");
sb.append("memsize=64\n");
sb.append("\n");
sb.append("[autoexec]\n"); sb.append("[autoexec]\n");
sb.append("@echo off\n"); sb.append("@echo off\n");
sb.append("mount c .\n"); sb.append("mount c .\n");