From ab7a5ed8de392582fe0f2be5064bdc73c61f66aa Mon Sep 17 00:00:00 2001 From: David Alvarez Date: Mon, 8 Jun 2026 13:28:41 +0200 Subject: [PATCH] fix: add memsize=64 to generated dosbox.conf and fix pre-existing backslash bug 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.). --- src/main/java/com/dostalgia/GameService.java | 36 ++++++++++++++--- .../java/com/dostalgia/UploadResource.java | 39 ++++++++++++++++--- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/dostalgia/GameService.java b/src/main/java/com/dostalgia/GameService.java index 201bb08..9b41360 100644 --- a/src/main/java/com/dostalgia/GameService.java +++ b/src/main/java/com/dostalgia/GameService.java @@ -230,12 +230,36 @@ public class GameService { String dir = parts[0]; String exe = parts[1]; StringBuilder sb = new StringBuilder(); - sb.append("[sdl]\nautolock=true\nusescancodes=true\noutput=surface\n\n"); - sb.append("[cpu]\ncore=auto\ncycles=auto\n\n"); - sb.append("[mixer]\nnosound=false\nrate=44100\n\n"); - sb.append("[sblaster]\nsbtype=sb16\nirq=7\ndma=1\nhdma=5\n\n"); - sb.append("[dos]\nxms=true\nems=true\numb=true\n\n"); - sb.append("[autoexec]\n@echo off\nmount c .\n"); + sb.append("[sdl]\n"); + sb.append("autolock=true\n"); + sb.append("usescancodes=true\n"); + sb.append("output=surface\n"); + sb.append("\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. // Deduplicate by parent directory — prefer data formats over descriptors. Set seenDirs = new java.util.HashSet<>(); diff --git a/src/main/java/com/dostalgia/UploadResource.java b/src/main/java/com/dostalgia/UploadResource.java index 1459577..85d8799 100644 --- a/src/main/java/com/dostalgia/UploadResource.java +++ b/src/main/java/com/dostalgia/UploadResource.java @@ -880,12 +880,36 @@ public class UploadResource { /** Build config for a CD-only game (no executables on the filesystem). */ private String buildCdOnlyDosboxConf(List cdImages) { StringBuilder sb = new StringBuilder(); - sb.append("[sdl]\nautolock=true\nusescancodes=true\noutput=surface\n\n"); - sb.append("[cpu]\ncore=auto\ncycles=auto\n\n"); - sb.append("[mixer]\nnosound=false\nrate=44100\n\n"); - sb.append("[sblaster]\nsbtype=sb16\nirq=7\ndma=1\nhdma=5\n\n"); - sb.append("[dos]\nxms=true\nems=true\numb=true\n\n"); - sb.append("[autoexec]\n@echo off\nmount c .\n"); + sb.append("[sdl]\n"); + sb.append("autolock=true\n"); + sb.append("usescancodes=true\n"); + sb.append("output=surface\n"); + sb.append("\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:, … // Resolve one image per directory with format priority (.cue > .iso > .ccd > .img > .bin) char driveLetter = 'D'; @@ -959,6 +983,9 @@ public class UploadResource { 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");