Compare commits

...
Author SHA1 Message Date
Mike Klaas 46376960d9 WIP Et tu working-ish 2026-05-04 21:43:45 -07:00
9 changed files with 114 additions and 29 deletions
+21 -4
View File
@@ -13,6 +13,7 @@
#include "memory.h"
#include "proto.h"
#include "settings.h"
#include "sfall_config.h"
#include <algorithm>
#include <memory>
@@ -199,16 +200,32 @@ int artInit()
// SFALL: Modify player model settings.
char* jumpsuitMaleFileName = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male_default", &jumpsuitMaleFileName, gDefaultJumpsuitMaleFileName);
if (!configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "MaleDefaultModel", &jumpsuitMaleFileName, nullptr)
|| jumpsuitMaleFileName == nullptr
|| jumpsuitMaleFileName[0] == '\0') {
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male_default", &jumpsuitMaleFileName, gDefaultJumpsuitMaleFileName);
}
char* jumpsuitFemaleFileName = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_female_default", &jumpsuitFemaleFileName, gDefaultJumpsuitFemaleFileName);
if (!configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "FemaleDefaultModel", &jumpsuitFemaleFileName, nullptr)
|| jumpsuitFemaleFileName == nullptr
|| jumpsuitFemaleFileName[0] == '\0') {
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_female_default", &jumpsuitFemaleFileName, gDefaultJumpsuitFemaleFileName);
}
char* tribalMaleFileName = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male", &tribalMaleFileName, gDefaultTribalMaleFileName);
if (!configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "MaleStartModel", &tribalMaleFileName, nullptr)
|| tribalMaleFileName == nullptr
|| tribalMaleFileName[0] == '\0') {
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male", &tribalMaleFileName, gDefaultTribalMaleFileName);
}
char* tribalFemaleFileName = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_female", &tribalFemaleFileName, gDefaultTribalFemaleFileName);
if (!configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "FemaleStartModel", &tribalFemaleFileName, nullptr)
|| tribalFemaleFileName == nullptr
|| tribalFemaleFileName[0] == '\0') {
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_female", &tribalFemaleFileName, gDefaultTribalFemaleFileName);
}
char* critterFileNames = gArtListDescriptions[OBJ_TYPE_CRITTER].fileNames;
for (int critterIndex = 0; critterIndex < gArtListDescriptions[OBJ_TYPE_CRITTER].fileNamesLength; critterIndex++) {
+17 -1
View File
@@ -16,6 +16,7 @@
#include "palette.h"
#include "platform_compat.h"
#include "settings.h"
#include "sfall_config.h"
#include "svga.h"
#include "text_font.h"
#include "touch.h"
@@ -32,7 +33,7 @@ static char* gameMovieBuildSubtitlesFilePath(char* movieFilePath);
static const float flt_50352A = 0.032258064f;
// 0x518DA0
static const char* gMovieFileNames[MOVIE_COUNT] = {
static const char* gMovieDefaultFileNames[MOVIE_COUNT] = {
"iplogo.mve",
"intro.mve",
"elder.mve",
@@ -52,6 +53,8 @@ static const char* gMovieFileNames[MOVIE_COUNT] = {
"credits.mve",
};
static char gMovieFileNames[MOVIE_COUNT][65];
// 0x518DE4
static const char* gMoviePaletteFilePaths[MOVIE_COUNT] = {
nullptr,
@@ -98,6 +101,19 @@ int gameMoviesInit()
movieSetBuildSubtitleFilePathProc(gameMovieBuildSubtitlesFilePath);
for (int movie = 0; movie < MOVIE_COUNT; movie++) {
strcpy(gMovieFileNames[movie], gMovieDefaultFileNames[movie]);
char key[16];
snprintf(key, sizeof(key), "Movie%d", movie + 1);
char* movieFileName = nullptr;
if (configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, key, &movieFileName) && movieFileName[0] != '\0') {
strncpy(gMovieFileNames[movie], movieFileName, sizeof(gMovieFileNames[movie]) - 1);
gMovieFileNames[movie][sizeof(gMovieFileNames[movie]) - 1] = '\0';
}
}
memset(gGameMoviesSeen, 0, sizeof(gGameMoviesSeen));
gGameMovieIsPlaying = false;
+4 -1
View File
@@ -34,6 +34,7 @@
#include "scripts.h"
#include "settings.h"
#include "sfall_callbacks.h"
#include "sfall_config.h"
#include "sfall_global_scripts.h"
#include "svga.h"
#include "text_font.h"
@@ -137,7 +138,9 @@ int falloutMain(int argc, char** argv)
// SFALL: Override starting map.
char* mapName = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "map", &mapName, nullptr);
if (!configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "StartingMap", &mapName, nullptr) || mapName == nullptr || mapName[0] == '\0') {
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "map", &mapName, nullptr);
}
char* mapNameCopy = compat_strdup(mapName != nullptr ? mapName : _mainMap);
_main_load_new(mapNameCopy);
+18 -9
View File
@@ -13,6 +13,7 @@
#include "mouse.h"
#include "palette.h"
#include "preferences.h"
#include "sfall_config.h"
#include "svga.h"
#include "text_font.h"
#include "version.h"
@@ -38,6 +39,16 @@ typedef enum MainMenuButton {
static int main_menu_fatal_error();
static void main_menu_play_sound(const char* fileName);
static int mainMenuGetIntSetting(const char* contentKey, const char* sfallKey, int defaultValue)
{
int value = defaultValue;
if (configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, sfallKey, &value)) {
return value;
}
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, contentKey, &value);
return value;
}
// 0x5194F0
static int gMainMenuWindow = -1;
@@ -131,15 +142,14 @@ int mainMenuWindowInit()
// 0x010000 - change the color for version string only
// 0x020000 - underline text (only for the version string)
// 0x040000 - monospace font (only for the version string)
int fontSettings = _colorTable[21091], fontSettingsSFall = 0;
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "font_color", &fontSettingsSFall, 0);
int fontSettings = _colorTable[21091];
int fontSettingsSFall = mainMenuGetIntSetting("font_color", "MainMenuFontColour", 0);
if (fontSettingsSFall && !(fontSettingsSFall & 0x010000))
fontSettings = fontSettingsSFall & 0xFF;
// SFALL: Allow to move copyright text
int offsetX = 0, offsetY = 0;
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "credits_offset_x", &offsetX, 0);
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "credits_offset_y", &offsetY, 0);
int offsetX = mainMenuGetIntSetting("credits_offset_x", "MainMenuCreditsOffsetX", 0);
int offsetY = mainMenuGetIntSetting("credits_offset_y", "MainMenuCreditsOffsetY", 0);
// Copyright.
msg.num = 20;
@@ -187,8 +197,8 @@ int mainMenuWindowInit()
}
// SFALL: Allow to move menu buttons
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "offset_x", &offsetX, 0);
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "offset_y", &offsetY, 0);
offsetX = mainMenuGetIntSetting("offset_x", "MainMenuOffsetX", 0);
offsetY = mainMenuGetIntSetting("offset_y", "MainMenuOffsetY", 0);
for (int index = 0; index < MAIN_MENU_BUTTON_COUNT; index++) {
gMainMenuButtons[index] = buttonCreate(gMainMenuWindow,
@@ -216,8 +226,7 @@ int mainMenuWindowInit()
// SFALL: Allow to change font color of buttons
fontSettings = _colorTable[21091];
fontSettingsSFall = 0;
configGetInt(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "big_font_color", &fontSettingsSFall, 0);
fontSettingsSFall = mainMenuGetIntSetting("big_font_color", "MainMenuBigFontColour", 0);
if (fontSettingsSFall)
fontSettings = fontSettingsSFall & 0xFF;
+4 -1
View File
@@ -36,6 +36,7 @@
#include "random.h"
#include "scripts.h"
#include "settings.h"
#include "sfall_config.h"
#include "sfall_script_hooks.h"
#include "stat.h"
#include "svga.h"
@@ -869,7 +870,9 @@ static void _pip_init_()
// bypassed. CE implements only the latter approach, as it does not have any
// side effects.
int value = 0;
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "pipboy", &value, 0);
if (!configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "PipBoyAvailableAtGameStart", &value, 0)) {
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "pipboy", &value, 0);
}
pipboy_available_at_game_start = value == 1 || value == 2;
}
+10 -3
View File
@@ -33,6 +33,7 @@
#include "queue.h"
#include "scan_unimplemented.h"
#include "sfall_arrays.h"
#include "sfall_config.h"
#include "sfall_global_scripts.h"
#include "sfall_script_hooks.h"
#include "stat.h"
@@ -1517,9 +1518,15 @@ int scriptsInit()
messageListRepositorySetStandardMessageList(STANDARD_MESSAGE_LIST_SCRIPT, &gScrMessageList);
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "year", &gStartYear, 2241);
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "month", &gStartMonth, 6);
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "day", &gStartDay, 24);
if (!configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "StartYear", &gStartYear, 2241)) {
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "year", &gStartYear, 2241);
}
if (!configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "StartMonth", &gStartMonth, 6)) {
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "month", &gStartMonth, 6);
}
if (!configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "StartDay", &gStartDay, 24)) {
configGetInt(&gContentConfig, CONTENT_CONFIG_START_SECTION, "day", &gStartDay, 24);
}
configGetInt(&gContentConfig, CONTENT_CONFIG_MOVIES_SECTION, "artimer1", &gMovieTimerArtimer1, 90);
configGetInt(&gContentConfig, CONTENT_CONFIG_MOVIES_SECTION, "artimer2", &gMovieTimerArtimer2, 180);
+9 -1
View File
@@ -4,6 +4,7 @@
#include "display_monitor.h"
#include "interface.h"
#include "script_sound.h"
#include "sfall_config.h"
#include "sfall_script_hooks.h"
#include "worldmap.h"
@@ -45,7 +46,14 @@ void sfallOnAfterGameStarted()
{
// Disable Horrigan Patch
bool isDisableHorrigan = false;
configGetBool(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "disable_horrigan", &isDisableHorrigan);
int value = 0;
if (configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "DisableHorrigan", &value)) {
isDisableHorrigan = value != 0;
} else if (!configGetBool(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "disable_horrigan", &isDisableHorrigan)) {
int value = 0;
configGetInt(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "disable_horrigan", &value, 0);
isDisableHorrigan = value != 0;
}
if (isDisableHorrigan) {
gDidMeetFrankHorrigan = true;
+5 -1
View File
@@ -1,5 +1,6 @@
#include "version.h"
#include "content_config.h"
#include "sfall_config.h"
#include <stdio.h>
@@ -10,7 +11,10 @@ void versionGetVersion(char* dest, size_t size)
{
// SFALL: custom version string.
char* versionString = nullptr;
configGetString(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "version_string", &versionString, "");
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, "VersionString", &versionString, "");
if (!*versionString) {
configGetString(&gContentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, "version_string", &versionString, "");
}
if (!*versionString) {
versionString = nullptr;
}
+26 -8
View File
@@ -41,6 +41,7 @@
#include "random.h"
#include "scripts.h"
#include "settings.h"
#include "sfall_config.h"
#include "sfall_global_scripts.h"
#include "skill.h"
#include "stat.h"
@@ -852,6 +853,23 @@ static FrmImage _townFrmImage;
static bool wmFaded = false;
static int wmForceEncounterMapId = -1;
static unsigned int wmForceEncounterFlags = 0;
static int worldmapGetSfallIntSetting(const char* key, int defaultValue)
{
int value = defaultValue;
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, key, &value);
return value;
}
static int worldmapGetIntSetting(const char* contentKey, const char* sfallSection, const char* sfallKey, int defaultValue)
{
int value = defaultValue;
if (configGetInt(&gSfallConfig, sfallSection, sfallKey, &value)) {
return value;
}
configGetInt(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, contentKey, &value);
return value;
}
static int worldmapTrailMarkers;
static inline bool cityIsValid(int city)
@@ -900,8 +918,8 @@ int wmWorldMap_init()
wmWorldMapSaveTempData();
// SFALL
configGetBool(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "town_map_hotkeys_fix", &gTownMapHotkeysFix, true);
configGetInt(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "trail_markers", &worldmapTrailMarkers, 0);
gTownMapHotkeysFix = worldmapGetIntSetting("town_map_hotkeys_fix", SFALL_CONFIG_MISC_KEY, "TownMapHotkeysFix", 1) != 0;
worldmapTrailMarkers = worldmapGetIntSetting("trail_markers", "Interface", "WorldMapTravelMarkers", 0);
// CE: City size fids should be initialized during startup. They are used
// during |wmTeleportToArea| to calculate worldmap position when jumping
@@ -922,8 +940,8 @@ static int wmGenDataInit()
{
gDidMeetFrankHorrigan = false;
wmGenData.currentAreaId = -1;
wmGenData.worldPosX = 173;
wmGenData.worldPosY = 122;
wmGenData.worldPosX = worldmapGetSfallIntSetting("StartXPos", 173);
wmGenData.worldPosY = worldmapGetSfallIntSetting("StartYPos", 122);
wmGenData.currentSubtile = nullptr;
wmGenData.dword_672E18 = 0;
wmGenData.isWalking = false;
@@ -988,8 +1006,8 @@ static int wmGenDataReset()
wmGenData.encounterIconIsVisible = false;
mousePressed = false;
wmGenData.currentAreaId = -1;
wmGenData.worldPosX = 173;
wmGenData.worldPosY = 122;
wmGenData.worldPosX = worldmapGetSfallIntSetting("StartXPos", 173);
wmGenData.worldPosY = worldmapGetSfallIntSetting("StartYPos", 122);
wmGenData.walkDestinationX = -1;
wmGenData.walkDestinationY = -1;
wmGenData.encounterMapId = -1;
@@ -1079,8 +1097,8 @@ void wmWorldMap_exit()
// 0x4BCEF8
int wmWorldMap_reset()
{
wmWorldOffsetX = 0;
wmWorldOffsetY = 0;
wmWorldOffsetX = worldmapGetSfallIntSetting("ViewXPos", 0);
wmWorldOffsetY = worldmapGetSfallIntSetting("ViewYPos", 0);
// CE: Fix Pathfinder perk.
gGameTimeIncRemainder = 0.0;