Compare commits

..
Author SHA1 Message Date
github-actions[bot] 139fc3c440 chore: auto-format with clang-format 2026-04-20 20:41:03 +00:00
phobos2077 90ca28a13c Mod config patching system 2026-04-20 22:30:31 +02:00
Vlad Kandgithub-actions[bot] fbae40e9a8 Move content-related ddraw.ini settings into new DB config, introduce ce.dat (#387)
* Add basic content config structure

* Moved non-file related settings from ddraw.ini to game.cfg

* Various fixes from self review

* Moved remaining worldmap settings to game.cfg

* Migrate character and text related settings

* Update docs

* chore: auto-format with clang-format

* Add hard-coded foce_base.dat to have reliable location to load CE-provided content from

* Move game.cfg to new base mod

* Automatic migration from ddraw.ini

* chore: auto-format with clang-format

* Removed option to disable cities limit fix

* Minor review comment fixes

* Migrate to /data instead of CE dat

* Migrate to local game#patch.cfg and skip fields with default values

- This was if some mod modifies/overwrites game.cfg later, only fields that user cares about will be loaded from user's override, and said mod is less likely to break

* Fix potential issue when "master_patches" is an absolute path and move recursive mkdir into a helper function

* Refactor code and fix some edge cases: data folder not exists when migrating, ddraw.ini doesn't exist

* Rename face_base.dat -> ce.dat

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-20 20:23:13 +00:00
Mike Klaas 4070d29fcb set/remove_script and HOOK_STDPROCEDURE{_END} (#392)
* `set/remove_script` and `HOOK_STDPROCEDURE{_END}`

These were implemented together as I thought HOOK_STDPROCEDURE would be useful for testing set_script.
2026-04-20 19:56:08 +00:00
Mike Klaas dcba8882bf Commandline .dat file viewer (#373) 2026-04-19 15:29:18 -07:00
Mike Klaas 62c2621fef Implement HOOK_ONDEATH (#384)
* Implement HOOK_ONDEATH

Test both combat death and script-triggered death

* move hp and DEAD flag above hook call
2026-04-19 14:24:51 -07:00
Vlad Kandgithub-actions[bot] 5188ebd4f4 Simplify settings registry with macros (#386)
* Simplify settings registry with macros

* chore: auto-format with clang-format

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-04-17 22:44:23 +02:00
81 changed files with 1716 additions and 12782 deletions
+1
View File
@@ -10,6 +10,7 @@
*.userosscache
*.sln.docstates
.DS_Store
.local-tools/
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
+24 -12
View File
@@ -62,6 +62,8 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
"src/combat.h"
"src/config.cc"
"src/config.h"
"src/content_config.cc"
"src/content_config.h"
"src/credits.cc"
"src/credits.h"
"src/critter.cc"
@@ -98,12 +100,6 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
"src/file_find.h"
"src/file_utils.cc"
"src/file_utils.h"
"src/fo1db/fo1_assoc.cc"
"src/fo1db/fo1_assoc.h"
"src/fo1db/fo1_db.cc"
"src/fo1db/fo1_db.h"
"src/fo1db/fo1_lzss.cc"
"src/fo1db/fo1_lzss.h"
"src/font_manager.cc"
"src/font_manager.h"
"src/game_config.cc"
@@ -120,8 +116,6 @@ target_sources(${EXECUTABLE_NAME} PUBLIC
"src/game_movie.h"
"src/game_sound.cc"
"src/game_sound.h"
"src/game_variant.cc"
"src/game_variant.h"
"src/game_vars.h"
"src/game.cc"
"src/game.h"
@@ -330,10 +324,6 @@ if(WIN32)
)
endif()
if(MSVC)
target_compile_options(${EXECUTABLE_NAME} PRIVATE /EHsc)
endif()
if(WIN32)
target_link_libraries(${EXECUTABLE_NAME}
winmm
@@ -458,6 +448,28 @@ target_include_directories(${EXECUTABLE_NAME} PRIVATE ${ZLIB_INCLUDE_DIRS})
target_link_libraries(${EXECUTABLE_NAME} ${SDL2_LIBRARIES})
target_include_directories(${EXECUTABLE_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
add_executable(fallout2-dat
"tools/dat_tool.cc"
"src/dfile.cc"
"src/platform_compat.cc"
)
if(APPLE)
set_target_properties(fallout2-dat PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
)
endif()
target_link_libraries(fallout2-dat
fpattern_windows::fpattern_windows
${ZLIB_LIBRARIES}
${SDL2_LIBRARIES}
)
target_include_directories(fallout2-dat PRIVATE "src")
target_include_directories(fallout2-dat PRIVATE ${ZLIB_INCLUDE_DIRS})
target_include_directories(fallout2-dat PRIVATE ${SDL2_INCLUDE_DIRS})
if(APPLE)
if(IOS)
install(TARGETS ${EXECUTABLE_NAME} DESTINATION "Payload")
-3
View File
@@ -119,9 +119,6 @@
"base"
],
"generator": "Xcode",
"cacheVariables": {
"CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY": ""
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
+20
View File
@@ -2,6 +2,26 @@
This file is currently a shell to be filled in over time. For now, it only captures project-specific maintenance notes that are easy to miss.
## `.dat` CLI Tool
There is a small command-line archive tool in this repo for inspecting Fallout `.dat` files using the same reader implementation as the game.
Build it with `make TARGET=fallout2-dat`.
The executable is written to your selected `BUILD_DIR`, so the default path is `out/build/local-debug-arm64/fallout2-dat` on this macOS setup, but other platforms or custom build directories will differ.
The current tool is read-only. Available commands:
1. `./<BUILD_DIR>/fallout2-dat <archive.dat> list [pattern]`
2. `./<BUILD_DIR>/fallout2-dat <archive.dat> info [pattern]`
3. `./<BUILD_DIR>/fallout2-dat <archive.dat> extract [--lower] <output-dir> [pattern]`
4. `./<BUILD_DIR>/fallout2-dat <archive.dat> cat <entry>`
Use `--lower` with `extract` when you want every extracted file and directory name forced to lowercase.
For example, from `/Applications/Fallout2Codex` you can run:
`/Users/klaas/game/fallout2-ce/out/build/local-debug-arm64/fallout2-dat master.dat extract --lower /tmp/fallout2-dat-lower data\\*`
## Updating SDL
SDL is pinned for native builds in `third_party/sdl2/CMakeLists.txt`. Right now, Android also relies on checked-in Java bindings in `os/android/app/src/main/java/org/libsdl/app`, and those bindings must match the SDL version fetched by CMake.
+10 -6
View File
@@ -4,9 +4,13 @@ This document tracks Fallout 2 CE compatibility with sfall. This is for modders
For now, this covers opcodes/metarules, and hooks. In the future, it will include other ways of modifying the engine (like ini files), and other Sfall-specific behaviour.
## Settings (ddraw.ini → fallout2.cfg)
## Settings (ddraw.ini → fallout2.cfg / game.cfg)
Some settings previously read from `ddraw.ini` have been moved into `fallout2.cfg`. The table below maps each setting to its new location. `HiResMode` had no effect in CE and has been removed.
Settings previously read from `ddraw.ini` have been moved into standard CE config files.
Most settings that control game behavior (premade characters, extra message files, combat tweaks, worldmap, etc.) have been moved into [`<DAT>/config/game.cfg`](files/ce.dat/config/game.cfg), which is a content-mod config file intended to be overridden by mods. See that file for the full list with descriptions.
The following settings were moved into [`fallout2.cfg`](files/fallout2.cfg) instead:
| ddraw.ini section | ddraw.ini key | fallout2.cfg section | fallout2.cfg key |
| --- | --- | --- | --- |
@@ -66,7 +70,7 @@ See [`https://sfall-team.github.io/sfall/`](https://sfall-team.github.io/sfall/)
| Interface / Cursor | get/set_cursor_mode | âś… | - |
| Locks | lock_is_jammed<br>unjam_lock<br>set_unjam_locks_time | not implemented | - |
| INI settings | get_ini_setting<br>get_ini_string<br>get_ini_section<br>get_ini_sections<br>get_ini_config<br>get_ini_config_db<br>set_ini_setting | âś… except get_ini_config, get_ini_config_db | `modified_ini` is intentionally omitted as deprecated. |
| Objects and scripts | set_self<br>set_dude_obj<br>real_dude_obj<br>remove_script<br>get/set_script<br>obj_is_carrying_obj<br>loot_obj<br>dialog_obj<br>obj_under_cursor<br>get/set_object_data<br>get/set_flags<br>set_unique_id<br>set_scr_name<br>obj_is_openable<br>get/set_proto_data<br>get_object_ai_data | implemented: set_self, get_script, obj_is_carrying_obj, loot_obj, dialog_obj, obj_under_cursor, get_object_data, get_flags, set_flags, obj_is_openable, get_proto_data, set_proto_data | - |
| Objects and scripts | set_self<br>set_dude_obj<br>real_dude_obj<br>remove_script<br>get/set_script<br>obj_is_carrying_obj<br>loot_obj<br>dialog_obj<br>obj_under_cursor<br>get/set_object_data<br>get/set_flags<br>set_unique_id<br>set_scr_name<br>obj_is_openable<br>get/set_proto_data<br>get_object_ai_data | implemented: set_self, get/set/remove_script, obj_is_carrying_obj, loot_obj, dialog_obj, obj_under_cursor, get_object_data, get_flags, set_flags, obj_is_openable, get_proto_data, set_proto_data | - |
| Other / Game management | set_movie_path<br>stop/resume_game<br>mark_movie_played<br>game_loaded<br>get_game_mode<br>get_uptime<br>signal_close_game | implemented: game_loaded, get_game_mode, get_uptime, signal_close_game | - |
| Gameplay tweaks | set_pickpocket_max<br>set_hit_chance_max<br>set_xp_mod<br>set_critter_hit_chance_mod<br>set_base_hit_chance_mod<br>set_hp_per_level_mod<br>get_unspent_ap_bonus<br>gdialog_get_barter_mod<br>set_unspent_ap_bonus<br>get/set_unspent_ap_perk_bonus<br>set_inven_ap_cost<br>set_base_pickpocket_mod<br>set_critter_pickpocket_mod<br>get_inven_ap_cost<br>set_drugs_data<br>get_kill_counter<br>mod_kill_counter<br>set_pipboy_available | implemented: gdialog_get_barter_mod | - |
| NPCs | inc_npc_level<br>get_npc_level<br>npc_engine_level_up | not implemented | - |
@@ -82,7 +86,7 @@ See [`https://sfall-team.github.io/sfall/`](https://sfall-team.github.io/sfall/)
| DeathAnim1 | `HOOK_DEATHANIM1` | đźš« | Use DEATHANIM2 instead |
| DeathAnim2 | `HOOK_DEATHANIM2` | âś… | - |
| CombatDamage | `HOOK_COMBATDAMAGE` | âś… | - |
| OnDeath | `HOOK_ONDEATH` | đźš« | - |
| OnDeath | `HOOK_ONDEATH` | âś… | - |
| FindTarget | `HOOK_FINDTARGET` | đźš« | (maybe) |
| UseObjOn | `HOOK_USEOBJON` | âś… | - |
| UseObj | `HOOK_USEOBJ` | âś… | CE notes an sfall-matching inconsistency around return code `2` behavior between interface contexts. |
@@ -100,8 +104,8 @@ See [`https://sfall-team.github.io/sfall/`](https://sfall-team.github.io/sfall/)
| InvenWield | `HOOK_INVENWIELD` | đźš« | - |
| AdjustFID | `HOOK_ADJUSTFID` | đźš« | - |
| CombatTurn | `HOOK_COMBATTURN` | âś… | - |
| StdProcedure | `HOOK_STDPROCEDURE` | đźš« | Et tu |
| StdProcedureEnd | `HOOK_STDPROCEDURE_END` | đźš« | - |
| StdProcedure | `HOOK_STDPROCEDURE` | âś… | - |
| StdProcedureEnd | `HOOK_STDPROCEDURE_END` | âś… | - |
| CarTravel | `HOOK_CARTRAVEL` | đźš« | - |
| SetGlobalVar | `HOOK_SETGLOBALVAR` | đźš« | - |
| RestTimer | `HOOK_RESTTIMER` | đźš« | Et tu |
+128
View File
@@ -0,0 +1,128 @@
;
; Game general config
;
; Fallout 2
;
[start]
; Starting year, month, day. Month and day are 0-indexed (0 = January, 0 = first day of month).
year=2241
month=6
day=24
; To start a new game somewhere other than artemple.map, set this to the map file name.
map=
; Starting (tribal) and default (jumpsuit) player models. Can also be changed in-game via script.
model_male=hmwarr
model_male_default=hmjmps
model_female=hfprim
model_female_default=hfjmps
; Set to 1 if you want the pipboy to be available at the start of the game.
; Set to 2 to make the pipboy available by only skipping the vault suit movie check.
pipboy=0
[karma]
; FRM numbers for karma icons on the character screen. Number of points entries should be 1 less than number of frms entries.
; Example: frms=47,48,49 points=-100,100
frms=
points=
[items]
; Proto IDs for healing items.
stimpak=40
super_stimpak=144
healing_powder=273
[dialog]
; Set to 1 to prevent using 0 to escape from dialogue at any time.
no_exit_hotkey=1
; Set to 1 to allow using '^' in dialog msg files to specify gender-based alternative text.
; Text must be enclosed in angle brackets, e.g. <MaleText^FemaleText>.
gender_words=0
[main_menu]
; Custom version string shown on the main menu. Supports up to two %d placeholders for the game version numbers.
; Example: FALLOUT II v1.02d
version_string=
; Font color for the version string and copyright text. Last byte picks the color (default 0x3C).
; First byte flags: 1 - version string only, 2 - underline, 4 - monospace font.
; Example: 0x000055
font_color=0
; Font color for the main menu button text.
big_font_color=0
; Pixel offset for main menu buttons.
offset_x=0
offset_y=0
; Pixel offset for the copyright text line.
credits_offset_x=0
credits_offset_y=0
[movies]
; Number of days after game start when each Hakunin dream sequence becomes available.
artimer1=90
artimer2=180
artimer3=270
artimer4=360
[combat]
; Damage formula used to calculate combat damage.
; 0 - Fallout default, 1 - Glovz's Damage Fix, 2 - Glovz's Damage Fix with Damage Multiplier tweak, 5 - Haenlomal's Yet Another Ammo Mod
; Don't change this unless another mod explicitly requires it.
damage_formula=0
; Set to 1 to fix the bug that caused bonus HtH damage to not be applied correctly.
bonus_hth_damage_fix=1
; Set to 1 to remove the time limits that prevent critical hits/misses in the first few days of the game.
remove_critical_time_limits=0
; Set to 1 to allow science and repair to be used on the player, or 2 for all critters (rather than only brahmin/robots).
science_on_critters=0
; Set to 1 to enable modified burst bullet distribution (spray mod).
burst_enabled=0
; Ratio of bullets going to the center group vs. left/right in burst attacks. Multiplier is capped at divisor.
burst_center_mult=1
burst_center_div=3
; Ratio of center-group bullets that target the primary target directly. Multiplier is capped at divisor.
burst_target_mult=1
burst_target_div=2
[explosions]
; Set to 1 to make explosions and projectiles emit light.
emit_light=0
; Dynamite damage range. Max is capped at 9999; min is capped at max.
dynamite_max=50
dynamite_min=30
; Plastic explosive damage range. Max is capped at 9999; min is capped at max.
plastic_explosive_max=80
plastic_explosive_min=40
[skilldex]
; FRM numbers for Skilldex skill cursors. Default is 293 for all skills.
lockpick=293
steal=293
traps=293
first_aid=293
doctor=293
science=293
repair=293
[worldmap]
; Set to 1 to prevent using number keys to enter unvisited areas on a town map.
town_map_hotkeys_fix=1
; Set to 1 to show travel markers on the world map, or 2 to show only when sneaking.
trail_markers=0
; Set to 1 to skip the encounter with Frank Horrigan.
disable_horrigan=0
; City reputation overrides. Syntax: city_id:global_id pairs separated by commas.
; Example: 0:5001,2:5003,3:5004
city_reputation_list=
[characters]
; Custom premade characters for the character selection screen.
; premade_paths is a comma-separated list of file names (max 11 chars each) in the premade\ folder, without extension.
; premade_fids is a comma-separated list of FRM numbers for the character portrait, matching the order of premade_paths.
; Example: premade_paths=combat,diplomat,stealth premade_fids=201,203,202
premade_paths=
premade_fids=
[text]
; Comma-separated list of extra game message file names (without .msg extension) to load from the game\ folder.
; Use 'filename:number' syntax to assign explicit IDs. Access via message_str_game script function.
extra_msg_file_list=
-127
View File
@@ -6,19 +6,6 @@
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Misc]
;Uncomment these lines to change the timers of how many days after the game starts Hakunin dream sequences will occur
;MovieTimer_artimer1=5000
;MovieTimer_artimer2=5000
;MovieTimer_artimer3=5000
;MovieTimer_artimer4=5000
;To start a new game somewhere other than artemple.map, uncomment the next line and set it to the map you want to load
;StartingMap=V13ent.map
;To change the 'FALLOUT II v1.02d' version string on the main menu, uncomment the next line
;You can use up to 2 %d's in this if you want to include Fallout's version number somewhere
;VersionString=FALLOUT II v1.02d
;To use a config file other than fallout2.cfg, uncomment the next line and add the name of your new file
;ConfigFile=
@@ -26,40 +13,6 @@
;If you want to load multiple patch files (up to 1000) at once, you can include a %d in the file name (sprintf syntax)
;PatchFile=patch%03d.dat
;Set to 1 to allow using the caret character '^' in dialog msg files to specify alternative text in dialogue based on the player's gender
;The text must be enclosed in angle brackets (example: <MaleText^FemaleText>)
;DialogGenderWords=0
;To change the default and starting player models, uncomment the next four lines.
;The default models can also be changed in-game via script
;MaleStartModel=hmjmps
;MaleDefaultModel=hmjmps
;FemaleStartModel=hfjmps
;FemaleDefaultModel=hfjmps
;To change the starting year, month or day, uncomment the next 3 lines
;Both StartMonth and StartDay are 0-indexed (i.e. 0 is January or the first day of a month)
;StartYear=2241
;StartMonth=01
;StartDay=01
;Set to 1 if you want the pipboy to be available at the start of the game
;Set to 2 to make the pipboy available by only skipping the vault suit movie check
;PipBoyAvailableAtGameStart=1
;Choose the damage formula used to calculate combat damage.
;Don't set this to anything other than 0 unless another mod you're using explicitly tells you to!
;0 - Fallout default
;1 - Glovz's Damage Fix
;2 - Glovz's Damage Fix with Damage Multiplier tweak
;5 - Haenlomal's Yet Another Ammo Mod
;DamageFormula=0
;Prevents you from using 0 to escape from dialogue at any time.
;DialogueFix=1
;Prevents you from using number keys to enter unvisited areas on a town map
TownMapHotkeysFix=1
;Set to 1 to use a CriticalOverrides.ini file to override the default critical table
;Set to 2 to use the default critical with bug fixes (doesn't require an ini)
@@ -67,86 +20,9 @@ TownMapHotkeysFix=1
;If the ExtraKillTypes option is enabled, this should be set to 3, with containing entries for any new types
;Must be non-zero to use the edit/get/reset_critical script functions
;OverrideCriticalTable=2
;Change the Skilldex cursor FRM numbers
;Default is 293 for all skills
Lockpick=293
Steal=293
Traps=293
FirstAid=293
Doctor=293
Science=293
Repair=293
;Uncomment these lines to control the premade characters offered when starting a new game
;Multiple options should be separated by commas, and there must be the same number of entries in both lines
;Each name in PremadePaths is limited to 11 characters
;PremadePaths=combat,diplomat,stealth
;PremadeFIDs=201,203,202
;Use this line to modify the list of cities and their associated global variables used for city reputations
;Syntax is 'city id:global id', with each city/global pair separated by a comma.
;CityRepsList=0:5001,2:5003,3:5004,4:5005,5:5006,6:5007,7:5008,8:5009,10:5011,11:5012,60:1640
;Set to 1 to add additional pages of save slots !!! can be implemented !!!
;ExtraSaveSlots=1
;These lines allow you to control the karma FRMs displayed on the character screen
;Number of KarmaPoints should be 1 less than number of KarmaFRMs
;KarmaFRMs=47,48,49
;KarmaPoints=-100,100
;Set to 1 to allow science and repair to be used on the player, or 2 for all critters. (Rather than only brahmin/robots)
ScienceOnCritters=0
;Set to 1 to fix the bug that caused bonus HtH damage to not be applied correctly.
BonusHtHDamageFix=1
;Set to 1 to remove the limits that stop the game from rolling critical successes/failures in the first few days of game time
RemoveCriticalTimelimits=0
;Change the colour of the font used on the main menu for the Fallout/sfall version string and copyright text
;It's the last byte ('3C' by default) that picks the colour used. The first byte supplies additional flags for this option
;1 - change the colour for the version string only
;2 - underline text for the version string
;4 - use monospace font for the version string
;MainMenuFontColour=0x000055
;Change the colour of the font used on the main menu for the button text
;MainMenuBigFontColour=0x3C
;Uncomment the next four lines to move the main menu buttons and credit text (the 'Copyright(c)' line on the main menu)
;MainMenuOffsetX=392
;MainMenuOffsetY=26
;MainMenuCreditsOffsetX=0
;MainMenuCreditsOffsetY=0
;These options modify the bullet distribution of burst attacks
;All the bullets are divided into three groups: center, left, and right
;These groups will then travel along three parallel tracks, trying to hit targets on the way
;CenterMult/Div set the ratio of how many bullets go to the center group, and the remaining are divided equally to the left and right sides
;TargetMult/Div set the ratio of how many bullets in the center group will attack the primary target directly
;Multiplier values are capped at divisor values
;ComputeSpray_CenterMult=1
;ComputeSpray_CenterDiv=3
;ComputeSpray_TargetMult=1
;ComputeSpray_TargetDiv=2
;Set to 1 to make explosions and projectiles emit light
;ExplosionsEmitLight=1
;Uncomment these lines to change explosives damage. DmgMax can be set to 9999 at max, and DmgMin is capped at DmgMax
;Dynamite_DmgMax=50
;Dynamite_DmgMin=30
;PlasticExplosive_DmgMax=80
;PlasticExplosive_DmgMin=40
;To add additional game msg files, uncomment the next line and set a comma delimited list of filenames without .msg extension
;By default, the files will have consecutive numbers assigned beginning with 0
;You can use the syntax 'filename:number' to manually assign numbers to specific msg files, with each pair separated by a comma
;If a file after the specified pair does not have a number assigned, it will have the next consecutive number from the last pair
;You need to use the message_str_game script function to get messages from the files
;ExtraGameMsgFileList=
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; Configuration ini files
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -165,9 +41,6 @@ RemoveCriticalTimelimits=0
;See the Unarmed.ini in the modders pack for an example file
;UnarmedFile=sfall\Unarmed.ini
;To change some engine parameters for the game mechanics, uncomment the next line
;TweaksFile=sfall\Tweaks.ini
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Scripts]
File diff suppressed because it is too large Load Diff
-61
View File
@@ -1,61 +0,0 @@
#
# enddeath.txt
#
# format of each line is:
#
# gvar, value, worldAreaKnown, worldAreaNotKnown, minLevel, %, narrator file
#
# Where:
#
# gvar is the GVAR_* number for the variable controlling the slide.
#
# value is the value that the gvar must be >= to for this slide
# to be shown
#
# worldAreaKnown is the # of a worldmap area that has to be known
# in order to get this one as an option
#
# worldAreaNotKnown is the # of a worldmap area that has to be *not*
# known in order to get this one as an option
#
# minLevel is the minimum player level in order to get this one as
# an option
#
# % is the % chance of a given line to occur
#
# narrator file is the base filename (no path path or extension) used
# for the narrator voice-over and subtitles. Maximum of 8 characters.
#
#####
# Generic Deaths
#####
-1, 0, -1, -1, 0, 20, NAR_3
-1, 0, -1, -1, 0, 20, NAR_4
-1, 0, -1, -1, 0, 20, NAR_5
-1, 0, -1, -1, 0, 20, NAR_6
-1, 0, 8, -1, 0, 20, NAR_8
#####
# Specific Deaths
#####
-1, 0, -1, 0, 200, 0, nar_dth3
-1, 0, -1, 0, 200, 0, nar_dth4
-1, 0, -1, 0, 200, 0, nar_dth5
-1, 0, -1, 0, 200, 0, nar_dth6
-1, 0, -1, 0, 200, 0, nar_dth7
-1, 0, -1, 0, 200, 0, nar_dth8
-1, 0, -1, 0, 200, 0, nar_dth9
# Special Radiation Death
491, 999, 3, -1, 150, 0, NAR_7
#####
# Joke Deaths
#####
-1, 0, -1, -1, 10, 1, nar_jdd1
-1, 0, -1, -1, 10, 1, nar_jdd3
-1, 0, -1, -1, 10, 1, nar_jdd4
-1, 0, -1, -1, 10, 1, nar_jdd5
-1, 0, -1, -1, 10, 1, nar_jdd6
File diff suppressed because it is too large Load Diff
-104
View File
@@ -1,104 +0,0 @@
;
; Party Member valid option data
;
;
; Warning: Adding a party member here means you must also add it to party.h!
;
;
; Note: Party Member level-up float messages are found in game\misc.msg!
;
[Party Member 0] ; Player -- Not actually used!
party_member_pid=16777216
area_attack_mode=always, sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=no_pref, melee, melee_over_ranged, ranged_over_melee, ranged, unarmed, unarmed_over_thrown, random
chem_use=clean, stims_when_hurt_little, stims_when_hurt_lots, sometimes, anytime, always
distance=stay_close, charge, snipe, on_your_own, stay
run_away_mode=none, coward, finger_hurts, bleeding, not_feeling_good, tourniquet, never
disposition=none, custom, coward, defensive, aggressive, berserk
level_minimum=0
level_up_every=0
level_pids=-1
[Party Member 1] ; pMIan_PID
party_member_pid=16777292
area_attack_mode=always, sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=no_pref, melee, ranged_over_melee, ranged
chem_use=clean, stims_when_hurt_little, stims_when_hurt_lots, sometimes, anytime
distance=stay_close, charge, snipe, on_your_own, stay
run_away_mode=none, not_feeling_good, tourniquet, never
disposition=none, custom, defensive, aggressive, berserk
level_minimum=3
level_up_every=3
level_pids=16777530,16777531,16777532,16777533
[Party Member 2] ; pMDog_PID
party_member_pid=16777338
area_attack_mode=
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=unarmed
chem_use=clean
distance=stay_close, charge, on_your_own, stay
run_away_mode=none, not_feeling_good, tourniquet, never
disposition=none, custom, aggressive, berserk
level_minimum=4
level_up_every=3
level_pids=16777542,16777543,16777544,16777545
[Party Member 3] ; pMTycho_PID
party_member_pid=16777426
area_attack_mode=always, sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=no_pref, ranged_over_melee, ranged, unarmed
chem_use=clean, stims_when_hurt_little, stims_when_hurt_lots, sometimes, anytime
distance=stay_close, charge, snipe, on_your_own, stay
run_away_mode=none, not_feeling_good, tourniquet, never
disposition=none, custom, defensive, aggressive, berserk
level_minimum=4
level_up_every=3
level_pids=16777534,16777535,16777536,16777537
[Party Member 4] ; pMKatja_PID
party_member_pid=16777518
area_attack_mode=sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, weakest, whomever, closest
best_weapon=no_pref, melee, melee_over_ranged, ranged_over_melee, ranged, unarmed
chem_use=stims_when_hurt_little, stims_when_hurt_lots
distance=stay_close, charge, on_your_own, stay
run_away_mode=none, coward, finger_hurts, bleeding, not_feeling_good
disposition=none, custom, defensive, aggressive, coward
level_minimum=4
level_up_every=2
level_pids=16777538,16777539,16777540,16777541
[Party Member 5] ; pMTandi_PID
party_member_pid=16777279
area_attack_mode=always, sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=no_pref, melee, melee_over_ranged, ranged_over_melee, ranged, unarmed
chem_use=clean, stims_when_hurt_little, stims_when_hurt_lots, sometimes, anytime, always
distance=stay_close, charge, snipe, on_your_own, stay
run_away_mode=none, coward, finger_hurts, bleeding, not_feeling_good, tourniquet, never
disposition=none, custom, coward, defensive, aggressive, berserk
level_minimum=0
level_up_every=0
level_pids=-1
[Party Member 6] ; pMMrHandyC_PID
party_member_pid=16777529
area_attack_mode=always, sometimes, be_sure, be_careful, be_absolutely_sure
attack_who=whomever_attacking_me, strongest, weakest, whomever, closest
best_weapon=no_pref, melee, melee_over_ranged, ranged_over_melee, ranged, unarmed
chem_use=clean
distance=stay_close, charge, snipe, on_your_own, stay
run_away_mode=none, coward, finger_hurts, bleeding, not_feeling_good, tourniquet, never
disposition=none, custom, coward, defensive, aggressive, berserk
level_minimum=0
level_up_every=0
level_pids=-1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-402
View File
@@ -1,402 +0,0 @@
;
; Fallout team quotes
;
; The fonts used to display this file are the reverse of the
; credits.txt file. In other words, the font used to display
; titles in credits.txt (the lines with the '@') is the font
; used to display these quotes. Putting an '@' at the start of
; a line in this file will use the font used to display the
; names in the credits.txt file (currently 104).
;
; Max line length with the current font (103) is about 63.
; Anything longer than that won't be displayed, as it won't fit
; on the screen.
;
; All lines are automatically centered on the display.
;
; See top of credits.txt for additional info.
;
@Quotes from the Fallout team:
(Press ESC if you don't want to see some raw language)
I asked for anatomically correct, but not naked!
- Tim C.
I appreciate the fact that ?? is only speaking to us when spoken to.
- Leonard
So now that you are past the learning curve,
you can blow up people much faster, right?
- Tim C.
So how fast can _you_ draw a bunny?
- JT
I didn't do it yet today because I was waiting for Leonard's head.
- Scott C.
Did you see Steven Spielberg go by?
- Tim C.
No, I was taking a piss.
- Mark Harrison
Blueberry muffins are one of Man's crowning achievements.
- JT
Out of my way. I'm a fucking genius.
- Jason
Dismemberment is just inherently funny.
- JT
I had a wooden one, but Spence broke it.
- Jesse
You can say penis, but you can't say cocksucker.
- Leonard
It's fun to make fun of people who are stupid.
- JT
Crap is the hardest stuff to make.
- Michael
No, I haven't shot anyone today.
- JT
But 15 _is_ an even number!
- Leonard
But 15 isn't divisible by 2.
- Tim.
You know what I mean. I meant 15 is prime.
- Leonard
I'll be going on to death at the end of the day.
- Michael
I'm tired of looking at that peanut.
- Tim C.
I only wash my nose. It's the only thing that gets dirty.
- Fred
I'm going to jiujitsu his ass.
- Leonard
I'll have to remember or else I'll forget.
- Jesse
You never know what wacky things I'm going to do with my hand.
- Tim C.
Sorry I'm late, but Mary needed marbles and I had lost mine.
- Chris T.
It's fun hitting other people's balls.
- Tim C.
I'm going to kill this game.
- Mark Morgan
Do you want help putting on your bikini?
- Fred to Tim C.
I like to get them in the butt.
- Tim C.
I need more peasants!
- Fred
If I hadn't had sex, I would have called Tom or Jesse.
- Scotty
Did you know you can talk to people who don't have heads?
- Jesse
We'll have a little bowl hair-cut kid so you
can't tell if it's a boy or a girl when you're killing it.
- Leonard
It's just a flag!
- Scotty
I'll tell them to give me more exploding peasants.
- Fred
Do you need help changing his pants?
- Leonard
I was getting home and getting ready to get some,
and I remembered it was a holiday.
- Scotty
I'd rather drink a bottle of urine than THAT!
- Scotty
Rusty wants any body he can have.
- Gus
Nick's are worn and falling apart and orange.
- Jesse
I never let work interfere with my cooking.
- Tim C.
I don't want you to stop making them,
because it's the only time I get any.
- Scotty
I vote for Hate.
- Jason
That reminds me of Toxic Avenger, the unrated version.
- Scotty
You know, we should lock down sex.
- Chris T.
How do I kill people? I need some dead bodies.
- Robert H.
Don't quote me on that.
- Leonard
I had a weird dream involving Scotty,
and I don't even want to remember it.
- Jesse
What?!
- Scotty
I don't know what we're going to do about it.
I guess we're going to have to start cutting heads.
- Tim C.
Well, that's true and that's untrue.
- Gus
But I like being a woman!
- Scotty
I'm used to playing with myself.
- Scotty
That's the essence of art -- making it all work together.
- Leonard
Did I tell you I broke my thingy?
- Dave
I want more randomness in my randomology.
- Robert H.
I can't finish the AI without drugs.
- Tim C.
Please do not make fun of my poop.
- Tim C.
I know how to tell males from females now.
- Tim C.
Excuse me, my butt did that.
- Jesse
I'm going to kick you in the butt.
- Robert H. to Tim C.
Because it's soft as a baby's behind.
- Jesse.
How do you know?
- Scotty
I can do Troy. I used to be his monkey.
- Chris T.
I had one once, but I pumped it too hard and I broke it.
- Scotty
I stripped and wiped.
- Scotty
Why can't I be a lesbian?
- Shanna
I wonder what that thing hanging there is.
- Shanna
I need more intelligence.
- Nick
At the same time, I want to make sure that
I don't have dead people stand up.
- Tim C.
I'd model dust, if I could.
- Jason
I'm on top now.
- Evan
I do a good cow.
- Greg B.
If he's on top of me, I'm gonna be pissed!
- Shanna
If I was a girl, I'd do him.
- Evan
You won't be here when I get off.
- Mike Krueger
Well, I was playing with it last night but I
couldn't get anything to come out!
- Mike Krueger
Stop shaking my monkey!
- Matt Murakami
I like people who say poop.
- Savina
It's not unstable, it's just buggy.
There's a difference.
- Chris J.
Instead of sexual urges, they get
sucking blood urges.
- Scotty
I like little boys who wear skirts.
- Mike Krueger
His iguana-stick is way too long.
- Leonard
Fallout is "By Americans, For Americans" and
the rest of the world can just get stuffed.
- Scotty
All the Brotherhood do it. They know how.
- Nick
I'm going to teach you to script,
that'll be torture.
- Nick
His little thing looks better anyway.
- Evan
He TOLD me to touch it!
- Nick
I'm really scared of the people on the Internet.
They're all dumb. Except for that one guy.
- Scotty
I haven't touched it for two months.
- Nick
Well, you better start touching it.
- Evan
You can never be paranoid enough.
- Scotty
You should be 14-18 when you blow the Master.
- Jess
Oh, wait a minute, talk to Jesse.
Jesse usually has lots of drugs.
- Scotty
I burnt my part, for one thing.
- Mark H.
I'm usually a lot happier about the
game when I'm not playing it.
- Scotty
You gotta take it easy, this is my first time.
- Dave Hendee
It's really quick to get it up.
- Mark H.
I can find the hole without looking now.
- Ed H.
I've actually had it both ways, but I'm not sure why...
- Dan S.
I can touch it everywhere and it seems to work.
- Scotty
OK, I was sleeping with Ian...
- Gus
What is the sound of one man working on another?
- Dan S.
I hate being fucked.
- Gus
I think our game has a high potential
for being very violent.
- Jason A.
I'm not going to be beaten by cheesecake.
- Tim C.
I have new respect for crowbars.
(pause)
Well, at least it isn't about sex.
- Scotty
That thing is a little too
big to stick right there.
- Matt G.
I'm not going to do the cows.
- Dan S.
The cows are glad to hear that.
- Robert H.
But I love faggot pizza.
- Scotty
It won't crash any more. In theory.
- Mark H.
I wasn't wearing anything
the first time I won the game.
- Tim C.
@FIN
@@ -0,0 +1,59 @@
#include "sfall.h"
#include "test_utils.h"
#define TEST_SCRIPT_INDEX (2)
// Depends on Test0.int, which provides a controllable object script helper.
// Put the compiled helper at mods/test_script_override/scripts/Test0.int,
// and add "test_script_override" to mod_order.txt. The helper must live there
// (and not scripts/) because patch000.dat already contains a stock Test0.int and
// scripts/ load before it.
// Without Test0, these 2 tests will fail:
// - "set_script normal hp"
// - "set_script no map_enter hp"
variable testScriptObj := 0;
procedure create_test_object begin
if (testScriptObj != 0) then return;
testScriptObj := create_object_sid(obj_pid(dude_obj), tile_num_in_direction(tile_num(dude_obj), has_trait(TRAIT_OBJECT, dude_obj, OBJECT_CUR_ROT), 3), elevation(dude_obj), -1);
end
procedure stdprocedure_hook begin
if (get_sfall_arg_at(0) != 15) then return;
if (get_sfall_arg_at(3)) then begin
set_sfall_global("T0HAFTR1", 1);
end else begin
set_sfall_global("T0HBEFO1", 1);
end
end
procedure exercise_set_script(variable scriptId, variable expectedHp, variable expectedBeforeHook, variable expectedAfterHook, variable desc) begin
set_sfall_global("T0MAPEN1", 0);
set_sfall_global("T0HBEFO1", 0);
set_sfall_global("T0HAFTR1", 0);
set_script(testScriptObj, scriptId);
call assertEquals(desc + " get_script", get_script(testScriptObj), TEST_SCRIPT_INDEX);
call assertEquals(desc + " map_enter global", get_sfall_global_int("T0MAPEN1"), expectedHp);
call assertEquals(desc + " stdprocedure hook before", get_sfall_global_int("T0HBEFO1"), expectedBeforeHook);
call assertEquals(desc + " stdprocedure hook after", get_sfall_global_int("T0HAFTR1"), expectedAfterHook);
remove_script(testScriptObj);
call assertEquals(desc + " remove_script clears get_script", get_script(testScriptObj), 0);
end
procedure start begin
if (not game_loaded) then return;
display_msg("Testing set_script/remove_script/get_script...");
register_hook_proc(HOOK_STDPROCEDURE, stdprocedure_hook);
register_hook_proc(HOOK_STDPROCEDURE_END, stdprocedure_hook);
call create_test_object;
call exercise_set_script(TEST_SCRIPT_INDEX, 22, 1, 1, "set_script normal");
call exercise_set_script(TEST_SCRIPT_INDEX bwor 0x80000000, 11, 0, 0, "set_script no map_enter");
destroy_object(testScriptObj);
testScriptObj := 0;
call report_test_results("script_manipulation");
end
+52
View File
@@ -0,0 +1,52 @@
#include "sfall.h"
#include "dik.h"
#include "define_lite.h"
#define TEST_KEY (DIK_J)
procedure ondeath_handler begin
variable
dead_critter := get_sfall_arg_at(0),
critter_name := "<null>",
critter_pid := -1;
if (dead_critter) then begin
critter_name := obj_name(dead_critter);
critter_pid := obj_pid(dead_critter);
end
display_msg(string_format2("ondeath critter=%s pid=%d", critter_name, critter_pid));
end
procedure keypress_handler begin
variable
pressed := get_sfall_arg_at(0),
key := get_sfall_arg_at(1),
target;
if (not pressed) then return;
if (key != TEST_KEY) then return;
target := obj_under_cursor(true, false);
if (target == 0) then begin
display_msg("ondeath test: no critter under cursor");
return;
end
if (target == dude_obj) then begin
display_msg("ondeath test: refusing to kill dude");
return;
end
display_msg(string_format1("ondeath test: killing %s", obj_name(target)));
critter_dmg(target, 9999, DMG_BYPASS_ARMOR);
end
procedure start begin
if (not game_loaded) then return;
display_msg("ondeath manual test ready: hover a critter and press J");
register_hook_proc(HOOK_KEYPRESS, keypress_handler);
register_hook_proc(HOOK_ONDEATH, ondeath_handler);
end
+2 -2
View File
@@ -9,6 +9,7 @@
#include "combat.h"
#include "combat_ai.h"
#include "config.h"
#include "content_config.h"
#include "critter.h"
#include "debug.h"
#include "display_monitor.h"
@@ -28,7 +29,6 @@
#include "random.h"
#include "scripts.h"
#include "settings.h"
#include "sfall_config.h"
#include "sfall_script_hooks.h"
#include "skill.h"
#include "stat.h"
@@ -1410,7 +1410,7 @@ int actionUseSkill(Object* user, Object* target, int skill)
// SFALL: Science on critters patch.
if (1) {
int targetType = SCIENCE_REPAIR_TARGET_TYPE_DEFAULT;
configGetInt(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_SCIENCE_REPAIR_TARGET_TYPE_KEY, &targetType);
configGetInt(&gContentConfig, CONTENT_CONFIG_COMBAT_SECTION, "science_on_critters", &targetType, SCIENCE_REPAIR_TARGET_TYPE_DEFAULT);
if (targetType == SCIENCE_REPAIR_TARGET_TYPE_DUDE) {
if (target == gDude) {
break;
+5 -25
View File
@@ -6,15 +6,14 @@
#include <string.h>
#include "animation.h"
#include "content_config.h"
#include "debug.h"
#include "draw.h"
#include "game.h"
#include "game_variant.h"
#include "memory.h"
#include "object.h"
#include "proto.h"
#include "settings.h"
#include "sfall_config.h"
namespace fallout {
@@ -191,28 +190,16 @@ int artInit()
// SFALL: Modify player model settings.
char* jumpsuitMaleFileName = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_DUDE_NATIVE_LOOK_JUMPSUIT_MALE_KEY, &jumpsuitMaleFileName);
if (jumpsuitMaleFileName == nullptr || jumpsuitMaleFileName[0] == '\0') {
jumpsuitMaleFileName = gDefaultJumpsuitMaleFileName;
}
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male_default", &jumpsuitMaleFileName, gDefaultJumpsuitMaleFileName);
char* jumpsuitFemaleFileName = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_DUDE_NATIVE_LOOK_JUMPSUIT_FEMALE_KEY, &jumpsuitFemaleFileName);
if (jumpsuitFemaleFileName == nullptr || jumpsuitFemaleFileName[0] == '\0') {
jumpsuitFemaleFileName = gDefaultJumpsuitFemaleFileName;
}
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_female_default", &jumpsuitFemaleFileName, gDefaultJumpsuitFemaleFileName);
char* tribalMaleFileName = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_DUDE_NATIVE_LOOK_TRIBAL_MALE_KEY, &tribalMaleFileName);
if (tribalMaleFileName == nullptr || tribalMaleFileName[0] == '\0') {
tribalMaleFileName = gDefaultTribalMaleFileName;
}
configGetString(&gContentConfig, CONTENT_CONFIG_START_SECTION, "model_male", &tribalMaleFileName, gDefaultTribalMaleFileName);
char* tribalFemaleFileName = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_DUDE_NATIVE_LOOK_TRIBAL_FEMALE_KEY, &tribalFemaleFileName);
if (tribalFemaleFileName == nullptr || tribalFemaleFileName[0] == '\0') {
tribalFemaleFileName = gDefaultTribalFemaleFileName;
}
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++) {
@@ -232,13 +219,6 @@ int artInit()
critterFileNames += 13;
}
// FO1 does not have a tribal look; use jumpsuit as the default player art.
if (gameVariantIsFallout1() && _art_vault_guy_num == 0) {
_art_vault_guy_num = _art_vault_person_nums[DUDE_NATIVE_LOOK_JUMPSUIT][GENDER_MALE];
_art_vault_person_nums[DUDE_NATIVE_LOOK_TRIBAL][GENDER_MALE] = _art_vault_person_nums[DUDE_NATIVE_LOOK_JUMPSUIT][GENDER_MALE];
_art_vault_person_nums[DUDE_NATIVE_LOOK_TRIBAL][GENDER_FEMALE] = _art_vault_person_nums[DUDE_NATIVE_LOOK_JUMPSUIT][GENDER_FEMALE];
}
for (int critterIndex = 0; critterIndex < gArtListDescriptions[OBJ_TYPE_CRITTER].fileNamesLength; critterIndex++) {
if (!fileReadString(string, sizeof(string), stream)) {
break;
+8 -19
View File
@@ -11,6 +11,7 @@
#include "art.h"
#include "color.h"
#include "combat.h"
#include "content_config.h"
#include "critter.h"
#include "cycle.h"
#include "db.h"
@@ -37,7 +38,6 @@
#include "platform_compat.h"
#include "proto.h"
#include "scripts.h"
#include "sfall_config.h"
#include "skill.h"
#include "stat.h"
#include "svga.h"
@@ -6988,7 +6988,7 @@ static int karmaInit()
File* stream = fileOpen("data\\karmavar.txt", "rt");
if (stream == nullptr) {
return 0;
return -1;
}
char string[256];
@@ -7087,7 +7087,7 @@ static int genericReputationInit()
File* stream = fileOpen("data\\genrep.txt", "rt");
if (stream == nullptr) {
return 0;
return -1;
}
char string[256];
@@ -7167,22 +7167,14 @@ static int genericReputationCompare(const void* a1, const void* a2)
static void customKarmaFolderInit()
{
char* karmaFrms = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_KARMA_FRMS_KEY, &karmaFrms);
if (karmaFrms != nullptr && karmaFrms[0] == '\0') {
karmaFrms = nullptr;
}
if (karmaFrms == nullptr) {
configGetString(&gContentConfig, CONTENT_CONFIG_KARMA_SECTION, "frms", &karmaFrms, "");
if (!*karmaFrms) {
return;
}
char* karmaPoints = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_KARMA_POINTS_KEY, &karmaPoints);
if (karmaPoints != nullptr && karmaPoints[0] == '\0') {
karmaPoints = nullptr;
}
if (karmaPoints == nullptr) {
configGetString(&gContentConfig, CONTENT_CONFIG_KARMA_SECTION, "points", &karmaPoints, "");
if (!*karmaPoints) {
return;
}
@@ -7256,10 +7248,7 @@ static int customKarmaFolderGetFrmId()
static void customTownReputationInit()
{
char* reputationList = nullptr;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_CITY_REPUTATION_LIST_KEY, &reputationList);
if (reputationList != nullptr && *reputationList == '\0') {
reputationList = nullptr;
}
configGetString(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "city_reputation_list", &reputationList, nullptr);
char* curr = reputationList;
while (curr != nullptr) {
+3 -14
View File
@@ -9,6 +9,7 @@
#include "art.h"
#include "character_editor.h"
#include "color.h"
#include "content_config.h"
#include "critter.h"
#include "db.h"
#include "debug.h"
@@ -26,7 +27,6 @@
#include "preferences.h"
#include "proto.h"
#include "settings.h"
#include "sfall_config.h"
#include "skill.h"
#include "stat.h"
#include "svga.h"
@@ -610,8 +610,6 @@ static bool characterSelectorWindowRenderFace()
// 0x4A7EA8
static bool characterSelectorWindowRenderStats()
{
static char emptyString[] = "";
char* str;
char text[260];
int length;
@@ -830,9 +828,6 @@ static bool characterSelectorWindowRenderStats()
y += vh;
str = skillGetName(skills[index]);
if (str == nullptr) {
str = emptyString;
}
strcpy(text, str);
length = fontGetStringWidth(text);
@@ -905,16 +900,10 @@ static bool characterSelectorWindowFatalError(bool result)
void premadeCharactersInit()
{
char* fileNamesString;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_PREMADE_CHARACTERS_FILE_NAMES_KEY, &fileNamesString);
if (fileNamesString != nullptr && *fileNamesString == '\0') {
fileNamesString = nullptr;
}
configGetString(&gContentConfig, CONTENT_CONFIG_CHARACTERS_SECTION, "premade_paths", &fileNamesString, nullptr);
char* faceFidsString;
configGetString(&gSfallConfig, SFALL_CONFIG_MISC_KEY, SFALL_CONFIG_PREMADE_CHARACTERS_FACE_FIDS_KEY, &faceFidsString);
if (faceFidsString != nullptr && *faceFidsString == '\0') {
faceFidsString = nullptr;
}
configGetString(&gContentConfig, CONTENT_CONFIG_CHARACTERS_SECTION, "premade_fids", &faceFidsString, nullptr);
if (fileNamesString != nullptr && faceFidsString != nullptr) {
int fileNamesLength = 0;

Some files were not shown because too many files have changed in this diff Show More