Merge branch '3.8-maintenance'

This commit is contained in:
NovaRain
2016-11-10 09:14:49 +08:00
45 changed files with 1944 additions and 714 deletions
+9 -3
View File
@@ -1,5 +1,5 @@
;sfall configuration settings
;v3.7.4
;v3.8
[Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
@@ -345,7 +345,7 @@ CorpseLineOfFireFix=0
;Set a number of milliseconds to idle each input loop
;Set to -1 to disable
;Set to 0 to idle only if other processes are waiting for processor time
;Set to 1 (or some higher number if needed) to prevent 100% cpu use
;Set to 1 (or some higher number if needed, the maximum is 127) to prevent 100% cpu use
ProcessorIdle=-1
;Set to 1 if using the hero appearance mod
@@ -472,6 +472,12 @@ EncounterTableSize=0
;Set to 1 to disable the pipboy alarm button
DisablePipboyAlarm=0
;Uncomment the next four lines to move the main menu buttons and credit text (the 'Copyright(c)' line on the main menu)
;MainMenuOffsetX=0
;MainMenuOffsetY=0
;MainMenuCreditsOffsetX=0
;MainMenuCreditsOffsetY=0
;Prevents you from using super stims on a critter who is at full health.
SuperStimExploitFix=0
@@ -483,7 +489,7 @@ QuickPocketsApCostReduction=2
ObjCanSeeObj_ShootThru_Fix=0
;Set to 1 to enable the balanced bullet distribution formula for burst attacks
ComputeSprayMod=1
ComputeSprayMod=0
;These options modify the bullet distribution of burst attacks if ComputeSprayMod is 1
;All the bullets are divided into three groups: central, left and right
+1 -1
View File
@@ -6,7 +6,7 @@ This folder contains documentation about sfall scripting extensions.
dik.h - DX scancodes constants for use with key_pressed function and HOOK_KEYPRESS
sfall function notes.txt - incomplete reference for new opcodes
sfall function list.txt - list of all sfall opcodes (w/o descriptions)
sfall opcode list.txt - list of all sfall opcodes (w/o descriptions)
hookscripts.txt - detailed manual for using hook scripts to modify engine behavior
arrays.txt - manual for sfall arrays
+9
View File
@@ -187,3 +187,12 @@
#define party_member_list_critters party_member_list(0)
#define party_member_list_all party_member_list(1)
#define spatial_radius(obj) sfall_func1("spatial_radius", obj)
#define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type)
#define intface_redraw sfall_func0("intface_redraw")
#define intface_hide sfall_func0("intface_hide")
#define intface_show sfall_func0("intface_show")
#define intface_is_hidden sfall_func0("intface_is_hidden")
#define exec_map_update_scripts sfall_func0("exec_map_update_scripts")
+66 -14
View File
@@ -77,6 +77,22 @@ force_aimed_shots and disable_aimed_shots allow overriding the normal rules rega
get/set_critter_skill_points will get/set the number of additional points a critter has in a skill, on top of whatever they have from their stats and other bonuses. Note that skill points are part of the proto, so calling set_skill_points on a critter will affect all critters that share the same proto.
------------------------------
------ TYPES REFERENCE -------
------------------------------
> Data types mentioned in this document:
void - means opcode does not return any value
any - any type
int - integer number
float - floating point number
string - string (text) value
object - pointer to game object (actually an integer)
array - array ID to be used with array-related functions (actually an integer)
----------------------------------------------
------ FUNCTION REFERENCE (incomplete) -------
----------------------------------------------
@@ -129,15 +145,15 @@ get/set_critter_skill_points will get/set the number of additional points a crit
- adjusts how fast time passes while you're on the world map. It takes a single float as an argument, where 1 is the normal speed.
- This function works in addition to the WorldMapTimeMod setting in ddraw.ini and the pathfinder perk, rather than overriding it, so calling set_map_time_multi(0.5) when the player has 2 levels of pathfinder would result in time passing at 25% the normal speed on the world map.
> void remove_script(objptr)
> void remove_script(object)
- accepts a pointer to an object and will remove the script from that object.
> void set_script(objptr, int scriptid)
> void set_script(object, int scriptid)
- accepts a pointer to an object and scriptID, and applies the given script to an object (scriptID accept the same values as create_object_sid from sfall 3.6)
- If used on an object that is already scripted, it will remove the existing script first; you cannot have multiple scripts attached to a single object. Calling set_script on self_obj will have all sorts of wacky side effects, and should be avoided.
- if you add 0x80000000 to the sid when calling set_script, map_enter_p_proc will be SKIPPED. The start proc will always be run.
> int get_script(objptr)
> int get_script(object)
- accepts a pointer to an object and returns it's scriptID (line number in scripts.lst), or -1 if the object is unscripted.
> void set_self(int obj)
@@ -159,9 +175,9 @@ get/set_critter_skill_points will get/set the number of additional points a crit
- It is not saved into the save game, so needs to be called once per reload.
- Be careful not to let the player obtain a perk when no perks are available to pick, or the game may crash.
> ObjectPtr get_last_target(objptr)
> object get_last_target(object)
- will return the last critter to be deliberately attacked
> ObjectPtr get_last_attacker(objptr)
> object get_last_attacker(object)
- will return the last critter to deliberately launch an attack against the argument critter.
- If a critter has not launched/recieved an attack, it will return 0. This is only stored for the duration of combat, and outside of combat both functions will always return 0.
@@ -170,7 +186,7 @@ get/set_critter_skill_points will get/set the number of additional points a crit
- "max" will replace 95% success chance cap (so you can set 100% maximum chance, for instance)
- "mod" will add this much percent to each success chance. for example if your chance is 50% and "mod" is 20, you will get 70% actual success rate
> void set_critter_pickpocket_mod(CritterPtr, int max, int mod)
> void set_critter_pickpocket_mod(object, int max, int mod)
- the same as above, but applies only to specific critter
> void reg_anim_combat_check
@@ -222,17 +238,17 @@ Some utility/math functions are available:
> string substr(string, start, length)
- cuts a substring from a string starting at "start" up to "length" characters. If start is negative - it indicates starting position from the end of the string (for example substr("test", -2, 2) will return last 2 charactes: "st"). If length is negative - it means so many characters will be omitted from the end of string (example: substr("test", 0, -2) will return string without last 2 characters: "te")
> int strlen(char* string)
> int strlen(string string)
- returns string length
> string sprintf(char* format, any value)
> string sprintf(string format, any value)
- formats given value using standart syntax of C printf function (google "printf" for format details). However it is limited to formatting only 1 value.
- can be used to get character by ASCII code ("%c")
> int typeof(any value)
- returns type of the given value: VALTYPE_INT, VALTYPE_FLOAT or VALTYPE_STR.
> int charcode(char* string)
> int charcode(string string)
- returns ASCII code for the first character in given string
> ^ operator (exponentiation)
@@ -286,12 +302,12 @@ Some utility/math functions are available:
> int tile_light(int elevation, int tileNum)
- returns light intensity at the given tile in range from 0 to 65535
> ObjectPtr obj_blocking_line(ObjectPtr objFrom, int tileTo, int blockingType)
> object obj_blocking_line(object objFrom, int tileTo, int blockingType)
- returns first object which blocks direct linear path from objFrom to tileTo using selected blocking function (see BLOCKING_TYPE_* constants in sfall.h)
- if path is clear (no blocker was encountered by selected function) - returns 0
- objFrom is always excluded from calculations, but is required to be a valid object
> ObjectPtr obj_blocking_tile(int tileNum, int elevation, int blockingType)
> object obj_blocking_tile(int tileNum, int elevation, int blockingType)
- returns first object blocking given tile using given blocking function or 0 if tile is clear
> array tile_get_objs(int tileNum, int elevation)
@@ -301,22 +317,58 @@ Some utility/math functions are available:
> array party_member_list(int includeHidden)
- returns array of all current party members (0 - only critter-type, alive and visible will be returned, 1 - all object, including Trunk, etc.)
> array path_find_to(ObjectPtr objFrom, int tileTo, int blockingType)
> array path_find_to(object objFrom, int tileTo, int blockingType)
- returns the shortest path to a given tile using given blocking function as an array of tile directions (0..5) to move on each step
- array length equals to a number of steps
- empty array means that specified target cannot be reached
> ObjectPtr create_spatial(int scriptID, int tile, int elevation, int radius)
> object create_spatial(int scriptID, int tile, int elevation, int radius)
- creates new spatial script with given SID, at given tile, and radius
> int art_exists(int artFID)
- checks if given artFID exists in the game
- useful when you want to check if critter can use specific weapon: art_exists((artFid bwand 0xffff0fff) bwor (weaponAnim * 0x1000))
> int obj_is_carrying_obj(ObjectPtr invenObj, ObjectPtr itemObj)
> int obj_is_carrying_obj(object invenObj, object itemObj)
- returns number of itemObj inside invenObj's inventory, note that both arguments are object pointers
- useful when dealing with different stacks of same item (obj_is_carrying_obj_pid just returns total for all stacks of the same PID)
> any sfall_funcX(string funcName, ...)
- these opcodes allows to use additional scripting functions, that do not require new opcode
- first argument is always function name (string)
- there are 7 versions of this opcode for different number of additional arguments (for convenience)
- opcodes have return value, but it is not neccessary to use it
------------------------------------
------ sfall_funcX functions -------
------------------------------------
> array sfall_func0("get_metarule_table")
- returns names of all currently available scripting functions (via sfall_funcX)
> int sfall_func1("spatial_radius", object object)
- return radius of spatial script, associated with given dummy-object (returned by create_spatial)
> object sfall_func2("critter_inven_obj2", object invenObj, int type)
- works just like vanilla critter_inven_obj, but correctly reports item in player's inactive hand slot
> void sfall_func0("intface_redraw")
- redraws main game interface
- useful after direct changes to current player weapons or stats to reflect changes
> void sfall_func0("intface_hide")
- hides main interface
> void sfall_func0("intface_show")
- shows main interface
> int sfall_func0("intface_is_hidden")
- returns 1 if interface is currently hidden, 0 otherwise
> void sfall_func0("exec_map_update_scripts")
- executes map_update_p_proc for all objects on map and global/hook scripts as well
------------------------
------ MORE INFO -------
------------------------
@@ -2,12 +2,12 @@
*0x8156 - int read_byte(int address)
*0x8157 - int read_short(int address)
*0x8158 - int read_int(int address)
*0x8159 - char* read_string(int address)
*0x8159 - string read_string(int address)
*0x81cf - void write_byte(int address, int value)
*0x81d0 - void write_short(int address, int value)
*0x81d1 - void write_int(int address, int value)
*0x821b - void write_string(int address, char* value)
*0x821b - void write_string(int address, string value)
*0x81d2 - void call_offset_v0(int address)
*0x81d3 - void call_offset_v1(int address, int arg1)
@@ -25,10 +25,10 @@
0x815c - int get_pc_base_stat(int StatID)
0x815d - int get_pc_extra_stat(int StatID)
0x815e - void set_critter_base_stat(CritterPtr, int StatID, int value)
0x815f - void set_critter_extra_stat(CritterPtr, int StatID, int value)
0x8160 - int get_critter_base_stat(CritterPtr, int StatID)
0x8161 - int get_critter_extra_stat(CritterPtr, int StatID)
0x815e - void set_critter_base_stat(object, int StatID, int value)
0x815f - void set_critter_extra_stat(object, int StatID, int value)
0x8160 - int get_critter_base_stat(object, int StatID)
0x8161 - int get_critter_extra_stat(object, int StatID)
0x8242 - void set_critter_skill_points(int critter, int skill, int value)
0x8243 - int get_critter_skill_points(int critter, int skill)
0x8244 - void set_available_skill_points(int value)
@@ -55,18 +55,18 @@
0x8164 - bool game_loaded()
0x8165 - bool graphics_funcs_available()
0x8166 - int load_shader(char* path)
0x8166 - int load_shader(string path)
0x8167 - void free_shader(int ID)
0x8168 - void activate_shader(int ID)
0x8169 - void deactivate_shader(int ID)
0x816d - void set_shader_int(int ID, char* param, int value)
0x816e - void set_shader_float(int ID, char* param, float value)
0x816f - void set_shader_vector(int ID, char* param, float f1, float f2, float f3, float f4)
0x816d - void set_shader_int(int ID, string param, int value)
0x816e - void set_shader_float(int ID, string param, float value)
0x816f - void set_shader_vector(int ID, string param, float f1, float f2, float f3, float f4)
0x81ad - int get_shader_version()
0x81ae - void set_shader_mode(int mode)
0x81b0 - void force_graphics_refresh(bool enabled)
0x81b1 - int get_shader_texture(int ID, int texture)
0x81b2 - void set_shader_texture(int ID, char* param, int texID)
0x81b2 - void set_shader_texture(int ID, string param, int texID)
0x816a - void set_global_script_repeat(int frames)
0x819b - void set_global_script_type(int type)
@@ -82,9 +82,9 @@
0x8173 - int get_world_map_x_pos()
0x8174 - int get_world_map_y_pos()
0x8175 - void set_dm_model(char* name)
0x8176 - void set_df_model(char* name)
0x8177 - void set_movie_path(char* filename, int movieid)
0x8175 - void set_dm_model(string name)
0x8176 - void set_df_model(string name)
0x8177 - void set_movie_path(string filename, int movieid)
0x8178 - void set_perk_image(int perkID, int value)
0x8179 - void set_perk_ranks(int perkID, int value)
@@ -103,8 +103,8 @@
0x8196 - void set_perk_int(int perkID, int value)
0x8187 - void set_perk_agl(int perkID, int value)
0x8188 - void set_perk_lck(int perkID, int value)
0x8189 - void set_perk_name(int perkID, char* value)
0x818a - void set_perk_desc(int perkID, char* value)
0x8189 - void set_perk_name(int perkID, string value)
0x818a - void set_perk_desc(int perkID, string value)
0x8247 - void set_perk_freq(int value)
0x818b - void set_pipboy_available(int available)
@@ -116,18 +116,18 @@
0x818f - void set_perk_owed(int value)
0x8190 - int get_perk_available(int perk)
0x8191 - int get_critter_current_ap(CritterPtr)
0x8192 - void set_critter_current_ap(CritterPtr, int ap)
0x8191 - int get_critter_current_ap(object critter)
0x8192 - void set_critter_current_ap(object critter, int ap)
0x8193 - int active_hand()
0x8194 - void toggle_active_hand()
0x8195 - void set_weapon_knockback(WeaponPtr, int type, float value)
0x8196 - void set_target_knockback(CritterPtr, int type, float value)
0x8197 - void set_attacker_knockback(CritterPtr, int type, float value)
0x8198 - void remove_weapon_knockback(WeaponPtr)
0x8199 - void remove_target_knockback(CritterPtr)
0x819a - void remove_attacker_knockback(CritterPtr)
0x8195 - void set_weapon_knockback(object weapon, int type, float value)
0x8196 - void set_target_knockback(object critter, int type, float value)
0x8197 - void set_attacker_knockback(object critter, int type, float value)
0x8198 - void remove_weapon_knockback(object weapon)
0x8199 - void remove_target_knockback(object critter)
0x819a - void remove_attacker_knockback(object critter)
0x819d - void set_sfall_global(string/int varname, int/float value)
0x819e - int get_sfall_global_int(string/int varname)
@@ -152,26 +152,26 @@
0x81aa - void set_xp_mod(int percentage)
0x81ab - void set_perk_level_mod(int levels)
0x81c5 - void set_critter_hit_chance_mod(CritterPtr, int max, int mod)
0x81c5 - void set_critter_hit_chance_mod(object, int max, int mod)
0x81c6 - void set_base_hit_chance_mod(int max, int mod)
0x81c7 - void set_critter_skill_mod(CritterPtr, int max)
0x81c7 - void set_critter_skill_mod(object, int max)
0x81c8 - void set_base_skill_mod(int max)
0x81c9 - void set_critter_pickpocket_mod(CritterPtr, int max, int mod)
0x81c9 - void set_critter_pickpocket_mod(object, int max, int mod)
0x81ca - void set_base_pickpocket_mod(int max, int mod)
0x81a3 - int eax_available()
0x81a4 - void set_eax_environment(int environment)
0x81a5 - void inc_npc_level(char* npc)
0x8241 - int get_npc_level(char* npc)
0x81a5 - void inc_npc_level(string npc)
0x8241 - int get_npc_level(string npc)
0x81a6 - int get_viewport_x()
0x81a7 - int get_viewport_y()
0x81a8 - void set_viewport_x(int view_x)
0x81a9 - void set_viewport_y(int view_y)
0x81ac - int get_ini_setting(char* setting)
0x81eb - char* get_ini_string(char* setting)
0x81ac - int get_ini_setting(string setting)
0x81eb - string get_ini_string(string setting)
0x81af - int get_game_mode()
@@ -179,14 +179,14 @@
0x81b6 - void set_car_current_town(int town)
0x81bb - void set_fake_perk(char* name, int level, int image, char* desc)
0x81bc - void set_fake_trait(char* name, int active, int image, char* desc)
0x81bd - void set_selectable_perk(char* name, int active, int image, char* desc)
0x81be - void set_perkbox_title(char* title)
0x81bb - void set_fake_perk(string name, int level, int image, string desc)
0x81bc - void set_fake_trait(string name, int active, int image, string desc)
0x81bd - void set_selectable_perk(string name, int active, int image, string desc)
0x81be - void set_perkbox_title(string title)
0x81bf - void hide_real_perks()
0x81c0 - void show_real_perks()
0x81c1 - int has_fake_perk(char* name)
0x81c2 - int has_fake_trait(char* name)
0x81c1 - int has_fake_perk(string name)
0x81c2 - int has_fake_trait(string name)
0x81c3 - void perk_add_mode(int type)
0x81c4 - void clear_selectable_perks()
0x8225 - void remove_trait(int traitID)
@@ -231,11 +231,11 @@
0x8266 - int ceil(float)
0x8267 - int round(float)
0x81f2 - void set_palette(char* path)
0x81f2 - void set_palette(string path)
0x81f3 - void remove_script(objptr)
0x81f4 - void set_script(objptr, int scriptid)
0x81f5 - int get_script(objptr)
0x81f3 - void remove_script(object)
0x81f4 - void set_script(object, int scriptid)
0x81f5 - int get_script(object)
0x81f6 - int nb_create_char()
@@ -258,10 +258,10 @@
0x8202 - void fs_seek(int id, int pos)
0x8203 - void fs_resize(int id, int size)
0x8204 - int get_proto_data(objptr, int offset)
0x8205 - void set_proto_data(objptr, int offset, int value)
0x8204 - int get_proto_data(object, int offset)
0x8205 - void set_proto_data(object, int offset, int value)
0x8206 - void set_self(objptr)
0x8206 - void set_self(object)
0x8207 - void register_hook(int hook)
0x820d - int list_begin(int type)
@@ -277,19 +277,19 @@
0x8214 - void set_hero_race(int style)
0x8215 - void set_hero_style(int style)
0x8216 - void set_critter_burst_disable(objptr critter, int disable)
0x8216 - void set_critter_burst_disable(object critter, int disable)
0x8217 - int get_weapon_ammo_pid(objptr weapon)
0x8218 - void set_weapon_ammo_pid(objptr weapon, int pid)
0x8219 - int get_weapon_ammo_count(objptr weapon)
0x821a - void set_weapon_ammo_count(objptr weapon, int count)
0x8217 - int get_weapon_ammo_pid(object weapon)
0x8218 - void set_weapon_ammo_pid(object weapon, int pid)
0x8219 - int get_weapon_ammo_count(object weapon)
0x821a - void set_weapon_ammo_count(object weapon, int count)
0x8220 - int get_screen_width()
0x8221 - int get_screen_height()
0x8222 - void stop_game()
0x8223 - void resume_game()
0x8224 - void create_message_window(char* message)
0x8224 - void create_message_window(string message)
0x8226 - int get_light_level()
@@ -297,16 +297,16 @@
0x8228 - int get_attack_type
0x822b - int play_sfall_sound(char* file, int loop)
0x822b - int play_sfall_sound(string file, int loop)
0x822c - void stop_sfall_sound(int ptr)
0x8235 - array string_split(char* string, char* split)
0x8237 - int atoi(char* string)
0x8238 - float atof(char* string)
0x824e - char* substr(char* string, int start, int length)
0x824f - int strlen(char* string)
0x8250 - char* sprintf(char* format, any value)
0x8251 - int charcode(char* string)
0x8235 - array string_split(string string, string split)
0x8237 - int atoi(string string)
0x8238 - float atof(string string)
0x824e - string substr(string string, int start, int length)
0x824f - int strlen(string string)
0x8250 - string sprintf(string format, any value)
0x8251 - int charcode(string string)
0x8253 - int typeof(any value)
0x823a - int get_tile_fid(int tile)
@@ -318,35 +318,45 @@
0x8240 - void mark_movie_played(int id)
0x8248 - objptr get_last_target(objptr critter)
0x8249 - objptr get_last_attacker(objptr critter)
0x8248 - object get_last_target(object critter)
0x8249 - object get_last_attacker(object critter)
0x824b - int tile_under_cursor
0x824c - int gdialog_get_barter_mod
0x824d - void set_inven_ap_cost
0x825c - void reg_anim_combat_check(int enable)
0x825a - void reg_anim_destroy(objptr object)
0x825b - void reg_anim_animate_and_hide(objptr object, int animID, int delay)
0x825d - void reg_anim_light(objptr object, int radius, int delay)
0x825e - void reg_anim_change_fid(objptr object, int FID, int delay)
0x825f - void reg_anim_take_out(objptr object, int holdFrameID, int delay)
0x8260 - void reg_anim_turn_towards(objptr object, int tile/targetObj, int delay)
0x825a - void reg_anim_destroy(object object)
0x825b - void reg_anim_animate_and_hide(object object, int animID, int delay)
0x825d - void reg_anim_light(object object, int radius, int delay)
0x825e - void reg_anim_change_fid(object object, int FID, int delay)
0x825f - void reg_anim_take_out(object object, int holdFrameID, int delay)
0x8260 - void reg_anim_turn_towards(object object, int tile/targetObj, int delay)
0x8261 - int metarule2_explosions(objptr object)
0x8261 - int metarule2_explosions(object object)
0x8262 - void register_hook_proc(int hook, procedure proc)
0x8266 - char* message_str_game(int fileId, int messageId)
0x8267 - int sneak_success
0x8268 - int tile_light(int elevation, int tileNum)
0x8269 - ObjectPtr obj_blocking_line(ObjectPtr objFrom, int tileTo, int blockingType)
0x826a - ObjectPtr obj_blocking_tile(int tileNum, int elevation, int blockingType)
0x826b - array tile_get_objs(int tileNum, int elevation)
0x826c - array party_member_list(int includeHidden)
0x826d - array path_find_to(ObjectPtr objFrom, int tileTo, int blockingType)
0x826e - ObjectPtr create_spatial(int scriptID, int tile, int elevation, int radius)
0x826f - int art_exists(int artFID)
0x8270 - int obj_is_carrying_obj(ObjectPtr invenObj, ObjectPtr itemObj)
0x826b - string message_str_game(int fileId, int messageId)
0x826c - int sneak_success
0x826d - int tile_light(int elevation, int tileNum)
0x826e - object obj_blocking_line(object objFrom, int tileTo, int blockingType)
0x826f - object obj_blocking_tile(int tileNum, int elevation, int blockingType)
0x8270 - array tile_get_objs(int tileNum, int elevation)
0x8271 - array party_member_list(int includeHidden)
0x8272 - array path_find_to(object objFrom, int tileTo, int blockingType)
0x8273 - object create_spatial(int scriptID, int tile, int elevation, int radius)
0x8274 - int art_exists(int artFID)
0x8275 - int obj_is_carrying_obj(object invenObj, object itemObj)
0x8276 - any sfall_func0(string funcName)
0x8277 - any sfall_func1(string funcName, arg1)
0x8278 - any sfall_func2(string funcName, arg1, arg2)
0x8279 - any sfall_func3(string funcName, arg1, arg2, arg3)
0x827a - any sfall_func4(string funcName, arg1, arg2, arg3, arg4)
0x827b - any sfall_func5(string funcName, arg1, arg2, arg3, arg4, arg5)
0x827c - any sfall_func6(string funcName, arg1, arg2, arg3, arg4, arg5, arg6)
* These functions require AllowUnsafeScripting to be enabled in ddraw.ini
+18 -1
View File
@@ -311,9 +311,26 @@ void DESetArray(int id, const DWORD* types, const void* data) {
/*
Array manipulation functions for script operators
TODO: move somewhere else
*/
const char* _stdcall GetSfallTypeName(DWORD dataType) {
switch (dataType) {
case DATATYPE_NONE:
return "(none)";
case DATATYPE_STR:
return "string";
case DATATYPE_FLOAT:
return "float";
case DATATYPE_INT:
return "integer";
default:
return "(unknown)";
}
}
DWORD _stdcall getSfallTypeByScriptType(DWORD varType) {
varType&=0xffff;
varType &= 0xffff;
switch (varType) {
case VAR_TYPE_STR:
case VAR_TYPE_STR2:
+5 -1
View File
@@ -4,7 +4,7 @@
#include <unordered_map>
#include <set>
#define ARRAY_MAX_STRING (1024) // maximum length of string to be stored as array key or value
#define ARRAY_MAX_STRING (255) // maximum length of string to be stored as array key or value
#define ARRAY_MAX_SIZE (100000) // maximum number of array elements,
// so total maximum memory/disk footprint of one array is: 16 + (ARRAY_MAX_STRING + 8) * ARRAY_MAX_SIZE
@@ -16,6 +16,7 @@
extern char get_all_arrays_special_key[];
// TODO: rewrite
class sArrayElement
{
public:
@@ -79,6 +80,8 @@ typedef std::tr1::unordered_map<sArrayElement, DWORD, sArrayElement_HashFunc, sA
/**
This class represents sfall array
It can be both list (normal array) and map (associative)
TODO: rewrite for better interface (especially associate arrays)
*/
class sArrayVar
{
@@ -139,6 +142,7 @@ void GetArrays(int* arrays);
void DEGetArray(int id, DWORD* types, void* data);
void DESetArray(int id, const DWORD* types, const void* data);
const char* _stdcall GetSfallTypeName(DWORD dataType);
DWORD _stdcall getSfallTypeByScriptType(DWORD varType);
DWORD _stdcall getScriptTypeBySfallType(DWORD dataType);
// creates new normal (persistent) array. len == -1 specifies associative array (map)
+56
View File
@@ -789,6 +789,56 @@ end:
}
}
static void __declspec(naked) db_get_file_list_hack() {
__asm {
push edi
push edx
xchg edi, eax // edi = *filename
mov eax, [eax+4] // file_lists.filenames
lea esi, [eax+edx]
cld
push es
push ds
pop es
xor ecx, ecx
dec ecx
mov edx, ecx
mov ebx, ecx
xor eax, eax // searching for end of line
repne scasb
not ecx
dec ecx
xchg ebx, ecx // ebx = filename length
lea edi, [esp+0x200+4*6]
repne scasb
not ecx
xchg edx, ecx // edx = extension length +1 for "end of line"
mov edi, [esi]
repne scasb
not ecx // ecx = buffer line length +1 for "end of line"
pop es
lea eax, [ebx+edx] // eax = new line length
cmp eax, ecx // new line length <= buffer line length?
jbe end // Yes
mov edx, [esi]
xchg edx, eax
call nrealloc_ // eax = mem, edx = size
test eax, eax
jnz skip
push 0x50B2F0 // "Error: Ran out of memory!"
call debug_printf_
add esp, 4
jmp end
skip:
mov [esi], eax
end:
xchg esi, eax
pop edx
pop edi
retn
}
}
void BugsInit()
{
@@ -1019,4 +1069,10 @@ void BugsInit()
MakeCall(0x4C5A41, &wmTeleportToArea_hack, true);
dlogr(" Done", DL_INIT);
//}
//if (GetPrivateProfileIntA("Misc", "PrintToFileFix", 0, ini)) {
dlog("Applying print to file fix.", DL_INIT);
MakeCall(0x4C67D4, &db_get_file_list_hack, false);
dlogr(" Done", DL_INIT);
//}
}
+1 -1
View File
@@ -69,7 +69,7 @@ divEnd2:
void ComputeSprayModInit() {
if (GetPrivateProfileIntA("Misc", "ComputeSprayMod", 1, ini)) {
if (GetPrivateProfileIntA("Misc", "ComputeSprayMod", 0, ini)) {
dlog("Applying ComputeSpray changes.", DL_INIT);
compute_spray_center_mult = GetPrivateProfileIntA("Misc", "ComputeSpray_CenterMult", 1, ini);
compute_spray_center_div = GetPrivateProfileIntA("Misc", "ComputeSpray_CenterDiv", 3, ini);
+44
View File
@@ -0,0 +1,44 @@
/*
* sfall
* Copyright (C) 2008-2016 The sfall team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <cstddef>
// https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr
const // It is a const object...
class nullptr_t {
public:
template<class T>
inline operator T*() const // convertible to any type of null non-member pointer...
{ return 0; }
template<class C, class T>
inline operator T C::*() const // or any type of null member pointer...
{ return 0; }
private:
void operator&() const; // Can't take address of nullptr
} nullptr = {};
// http://stackoverflow.com/questions/33026118/c-stdbeginc-for-vs-2008
template<typename T, std::size_t N>
T* std_begin(T (&a)[N]) { return a; }
template<typename T, std::size_t N>
T* std_end(T (&a)[N]) { return a + N; }
-1
View File
@@ -141,7 +141,6 @@ static void __declspec(naked) CreditsNextLineHook_Bottom() {
test eax, eax; // if any extra lines left, return 1 (from function), 0 otherwise
popad;
jnz morelines;
theend:
mov eax, 0x0;
retn;
morelines:
+2 -1
View File
@@ -16,9 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <vector>
#include "main.h"
#include <vector>
#include "Arrays.h"
#include "DebugEditor.h"
#include "FalloutEngine.h"
+346 -25
View File
@@ -18,16 +18,189 @@
#include "main.h"
#include "Logging.h"
#include "Define.h"
#include "FalloutEngine.h"
#include "Logging.h"
// global variables
TGameObj** obj_dude_ptr = (TGameObj**)(0x6610B8);
TGameObj** inven_dude_ptr = (TGameObj**)(0x519058);
DWORD* activeUIHand_ptr = (DWORD*)(0x518F78); // 0 - left, 1 - right
DWORD* dude_traits = (DWORD*)(0x66BE40); // 2 of them
DWORD* itemCurrentItem = (DWORD*)(0x518F78);
DWORD* itemButtonItems = (DWORD*)(0x5970F8);
long* ptr_pc_traits = reinterpret_cast<long*>(_pc_trait); // 2 of them
DWORD* ptr_aiInfoList = reinterpret_cast<DWORD*>(_aiInfoList);
DWORD* ptr_ambient_light = reinterpret_cast<DWORD*>(_ambient_light);
DWORD* ptr_art = reinterpret_cast<DWORD*>(_art);
DWORD* ptr_art_name = reinterpret_cast<DWORD*>(_art_name);
DWORD* ptr_art_vault_guy_num = reinterpret_cast<DWORD*>(_art_vault_guy_num);
DWORD* ptr_art_vault_person_nums = reinterpret_cast<DWORD*>(_art_vault_person_nums);
DWORD* ptr_bckgnd = reinterpret_cast<DWORD*>(_bckgnd);
DWORD* ptr_black_palette = reinterpret_cast<DWORD*>(_black_palette);
DWORD* ptr_bottom_line = reinterpret_cast<DWORD*>(_bottom_line);
DWORD* ptr_btable = reinterpret_cast<DWORD*>(_btable);
DWORD* ptr_btncnt = reinterpret_cast<DWORD*>(_btncnt);
DWORD* ptr_CarCurrArea = reinterpret_cast<DWORD*>(_CarCurrArea);
DWORD* ptr_cmap = reinterpret_cast<DWORD*>(_cmap);
DWORD* ptr_colorTable = reinterpret_cast<DWORD*>(_colorTable);
DWORD* ptr_combat_free_move = reinterpret_cast<DWORD*>(_combat_free_move);
DWORD* ptr_combat_list = reinterpret_cast<DWORD*>(_combat_list);
DWORD* ptr_combat_state = reinterpret_cast<DWORD*>(_combat_state);
DWORD* ptr_combat_turn_running = reinterpret_cast<DWORD*>(_combat_turn_running);
DWORD* ptr_combatNumTurns = reinterpret_cast<DWORD*>(_combatNumTurns);
DWORD* ptr_crit_succ_eff = reinterpret_cast<DWORD*>(_crit_succ_eff);
DWORD* ptr_critter_db_handle = reinterpret_cast<DWORD*>(_critter_db_handle);
DWORD* ptr_critterClearObj = reinterpret_cast<DWORD*>(_critterClearObj);
DWORD* ptr_crnt_func = reinterpret_cast<DWORD*>(_crnt_func);
DWORD* ptr_curr_font_num = reinterpret_cast<DWORD*>(_curr_font_num);
DWORD* ptr_curr_pc_stat = reinterpret_cast<DWORD*>(_curr_pc_stat);
DWORD* ptr_curr_stack = reinterpret_cast<DWORD*>(_curr_stack);
DWORD* ptr_cursor_line = reinterpret_cast<DWORD*>(_cursor_line);
DWORD* ptr_dialog_target = reinterpret_cast<DWORD*>(_dialog_target);
DWORD* ptr_dialog_target_is_party = reinterpret_cast<DWORD*>(_dialog_target_is_party);
DWORD* ptr_drugInfoList = reinterpret_cast<DWORD*>(_drugInfoList);
DWORD* ptr_edit_win = reinterpret_cast<DWORD*>(_edit_win);
DWORD* ptr_Educated = reinterpret_cast<DWORD*>(_Educated);
DWORD* ptr_Experience_ = reinterpret_cast<DWORD*>(_Experience_);
DWORD* ptr_fallout_game_time = reinterpret_cast<DWORD*>(_fallout_game_time);
DWORD* ptr_flptr = reinterpret_cast<DWORD*>(_flptr);
DWORD* ptr_folder_card_desc = reinterpret_cast<DWORD*>(_folder_card_desc);
DWORD* ptr_folder_card_fid = reinterpret_cast<DWORD*>(_folder_card_fid);
DWORD* ptr_folder_card_title = reinterpret_cast<DWORD*>(_folder_card_title);
DWORD* ptr_folder_card_title2 = reinterpret_cast<DWORD*>(_folder_card_title2);
DWORD* ptr_frame_time = reinterpret_cast<DWORD*>(_frame_time);
char* ptr_free_perk = reinterpret_cast<char*>(_free_perk);
DWORD* ptr_game_global_vars = reinterpret_cast<DWORD*>(_game_global_vars);
DWORD* ptr_game_user_wants_to_quit = reinterpret_cast<DWORD*>(_game_user_wants_to_quit);
DWORD* ptr_gcsd = reinterpret_cast<DWORD*>(_gcsd);
DWORD* ptr_gdBarterMod = reinterpret_cast<DWORD*>(_gdBarterMod);
DWORD* ptr_gdNumOptions = reinterpret_cast<DWORD*>(_gdNumOptions);
DWORD* ptr_gIsSteal = reinterpret_cast<DWORD*>(_gIsSteal);
DWORD* ptr_glblmode = reinterpret_cast<DWORD*>(_glblmode);
DWORD* ptr_gmouse_current_cursor = reinterpret_cast<DWORD*>(_gmouse_current_cursor);
DWORD* ptr_gmovie_played_list = reinterpret_cast<DWORD*>(_gmovie_played_list);
DWORD* ptr_GreenColor = reinterpret_cast<DWORD*>(_GreenColor);
DWORD* ptr_gsound_initialized = reinterpret_cast<DWORD*>(_gsound_initialized);
DWORD* ptr_hit_location_penalty = reinterpret_cast<DWORD*>(_hit_location_penalty);
DWORD* ptr_holo_flag = reinterpret_cast<DWORD*>(_holo_flag);
DWORD* ptr_holopages = reinterpret_cast<DWORD*>(_holopages);
DWORD* ptr_hot_line_count = reinterpret_cast<DWORD*>(_hot_line_count);
DWORD* ptr_i_fid = reinterpret_cast<DWORD*>(_i_fid);
DWORD* ptr_i_lhand = reinterpret_cast<DWORD*>(_i_lhand);
DWORD* ptr_i_rhand = reinterpret_cast<DWORD*>(_i_rhand);
DWORD* ptr_i_wid = reinterpret_cast<DWORD*>(_i_wid);
DWORD* ptr_i_worn = reinterpret_cast<DWORD*>(_i_worn);
DWORD* ptr_In_WorldMap = reinterpret_cast<DWORD*>(_In_WorldMap);
DWORD* ptr_info_line = reinterpret_cast<DWORD*>(_info_line);
DWORD* ptr_interfaceWindow = reinterpret_cast<DWORD*>(_interfaceWindow);
DWORD* ptr_intfaceEnabled = reinterpret_cast<DWORD*>(_intfaceEnabled);
DWORD* ptr_intotal = reinterpret_cast<DWORD*>(_intotal);
TGameObj** ptr_inven_dude = reinterpret_cast<TGameObj**>(_inven_dude);
DWORD* ptr_inven_pid = reinterpret_cast<DWORD*>(_inven_pid);
DWORD* ptr_inven_scroll_dn_bid = reinterpret_cast<DWORD*>(_inven_scroll_dn_bid);
DWORD* ptr_inven_scroll_up_bid = reinterpret_cast<DWORD*>(_inven_scroll_up_bid);
DWORD* ptr_inventry_message_file = reinterpret_cast<DWORD*>(_inventry_message_file);
DWORD* ptr_itemButtonItems = reinterpret_cast<DWORD*>(_itemButtonItems);
DWORD* ptr_itemCurrentItem = reinterpret_cast<DWORD*>(_itemCurrentItem); // 0 - left, 1 - right
DWORD* ptr_kb_lock_flags = reinterpret_cast<DWORD*>(_kb_lock_flags);
DWORD* ptr_last_buttons = reinterpret_cast<DWORD*>(_last_buttons);
DWORD* ptr_last_button_winID = reinterpret_cast<DWORD*>(_last_button_winID);
DWORD* ptr_last_level = reinterpret_cast<DWORD*>(_last_level);
DWORD* ptr_Level_ = reinterpret_cast<DWORD*>(_Level_);
DWORD* ptr_Lifegiver = reinterpret_cast<DWORD*>(_Lifegiver);
DWORD* ptr_list_com = reinterpret_cast<DWORD*>(_list_com);
DWORD* ptr_list_total = reinterpret_cast<DWORD*>(_list_total);
DWORD* ptr_loadingGame = reinterpret_cast<DWORD*>(_loadingGame);
DWORD* ptr_LSData = reinterpret_cast<DWORD*>(_LSData);
DWORD* ptr_lsgwin = reinterpret_cast<DWORD*>(_lsgwin);
DWORD* ptr_main_ctd = reinterpret_cast<DWORD*>(_main_ctd);
DWORD* ptr_main_window = reinterpret_cast<DWORD*>(_main_window);
DWORD* ptr_map_elevation = reinterpret_cast<DWORD*>(_map_elevation);
DWORD* ptr_map_global_vars = reinterpret_cast<DWORD*>(_map_global_vars);
DWORD* ptr_master_db_handle = reinterpret_cast<DWORD*>(_master_db_handle);
DWORD* ptr_max = reinterpret_cast<DWORD*>(_max);
DWORD* ptr_maxScriptNum = reinterpret_cast<DWORD*>(_maxScriptNum);
DWORD* ptr_Meet_Frank_Horrigan = reinterpret_cast<DWORD*>(_Meet_Frank_Horrigan);
DWORD* ptr_mouse_hotx = reinterpret_cast<DWORD*>(_mouse_hotx);
DWORD* ptr_mouse_hoty = reinterpret_cast<DWORD*>(_mouse_hoty);
DWORD* ptr_mouse_is_hidden = reinterpret_cast<DWORD*>(_mouse_is_hidden);
DWORD* ptr_mouse_x_ = reinterpret_cast<DWORD*>(_mouse_x_);
DWORD* ptr_mouse_y = reinterpret_cast<DWORD*>(_mouse_y);
DWORD* ptr_mouse_y_ = reinterpret_cast<DWORD*>(_mouse_y_);
DWORD* ptr_Mutate_ = reinterpret_cast<DWORD*>(_Mutate_);
DWORD* ptr_name_color = reinterpret_cast<DWORD*>(_name_color);
DWORD* ptr_name_font = reinterpret_cast<DWORD*>(_name_font);
DWORD* ptr_name_sort_list = reinterpret_cast<DWORD*>(_name_sort_list);
DWORD* ptr_num_game_global_vars = reinterpret_cast<DWORD*>(_num_game_global_vars);
DWORD* ptr_num_map_global_vars = reinterpret_cast<DWORD*>(_num_map_global_vars);
TGameObj** ptr_obj_dude = reinterpret_cast<TGameObj**>(_obj_dude);
DWORD* ptr_objectTable = reinterpret_cast<DWORD*>(_objectTable);
DWORD* ptr_objItemOutlineState = reinterpret_cast<DWORD*>(_objItemOutlineState);
DWORD* ptr_optionRect = reinterpret_cast<DWORD*>(_optionRect);
DWORD* ptr_outlined_object = reinterpret_cast<DWORD*>(_outlined_object);
DWORD* ptr_partyMemberAIOptions = reinterpret_cast<DWORD*>(_partyMemberAIOptions);
DWORD* ptr_partyMemberCount = reinterpret_cast<DWORD*>(_partyMemberCount);
DWORD* ptr_partyMemberLevelUpInfoList = reinterpret_cast<DWORD*>(_partyMemberLevelUpInfoList);
DWORD* ptr_partyMemberList = reinterpret_cast<DWORD*>(_partyMemberList); // each struct - 4 integers, first integer - objPtr
DWORD* ptr_partyMemberMaxCount = reinterpret_cast<DWORD*>(_partyMemberMaxCount);
DWORD* ptr_partyMemberPidList = reinterpret_cast<DWORD*>(_partyMemberPidList);
DWORD* ptr_patches = reinterpret_cast<DWORD*>(_patches);
DWORD* ptr_paths = reinterpret_cast<DWORD*>(_paths);
DWORD* ptr_pc_crit_succ_eff = reinterpret_cast<DWORD*>(_pc_crit_succ_eff);
DWORD* ptr_pc_kill_counts = reinterpret_cast<DWORD*>(_pc_kill_counts);
char* ptr_pc_name = reinterpret_cast<char*>(_pc_name);
DWORD* ptr_pc_proto = reinterpret_cast<DWORD*>(_pc_proto);
DWORD* ptr_perk_data = reinterpret_cast<DWORD*>(_perk_data);
int** ptr_perkLevelDataList = reinterpret_cast<int**>(_perkLevelDataList);
DWORD* ptr_pip_win = reinterpret_cast<DWORD*>(_pip_win);
DWORD* ptr_pipboy_message_file = reinterpret_cast<DWORD*>(_pipboy_message_file);
DWORD* ptr_pipmesg = reinterpret_cast<DWORD*>(_pipmesg);
DWORD* ptr_preload_list_index = reinterpret_cast<DWORD*>(_preload_list_index);
DWORD* ptr_procTableStrs = reinterpret_cast<DWORD*>(_procTableStrs); // table of procId (from define.h) => procName map
DWORD* ptr_proto_main_msg_file = reinterpret_cast<DWORD*>(_proto_main_msg_file);
DWORD* ptr_ptable = reinterpret_cast<DWORD*>(_ptable);
DWORD* ptr_pud = reinterpret_cast<DWORD*>(_pud);
DWORD* ptr_queue = reinterpret_cast<DWORD*>(_queue);
DWORD* ptr_quick_done = reinterpret_cast<DWORD*>(_quick_done);
DWORD* ptr_read_callback = reinterpret_cast<DWORD*>(_read_callback);
DWORD* ptr_RedColor = reinterpret_cast<DWORD*>(_RedColor);
DWORD* ptr_retvals = reinterpret_cast<DWORD*>(_retvals);
DWORD* ptr_scr_size = reinterpret_cast<DWORD*>(_scr_size);
DWORD* ptr_scriptListInfo = reinterpret_cast<DWORD*>(_scriptListInfo);
DWORD* ptr_skill_data = reinterpret_cast<DWORD*>(_skill_data);
DWORD* ptr_slot_cursor = reinterpret_cast<DWORD*>(_slot_cursor);
DWORD* ptr_sneak_working = reinterpret_cast<DWORD*>(_sneak_working); // DWORD var
DWORD* ptr_square = reinterpret_cast<DWORD*>(_square);
DWORD* ptr_squares = reinterpret_cast<DWORD*>(_squares);
DWORD* ptr_stack = reinterpret_cast<DWORD*>(_stack);
DWORD* ptr_stack_offset = reinterpret_cast<DWORD*>(_stack_offset);
DWORD* ptr_stat_data = reinterpret_cast<DWORD*>(_stat_data);
DWORD* ptr_stat_flag = reinterpret_cast<DWORD*>(_stat_flag);
DWORD* ptr_Tag_ = reinterpret_cast<DWORD*>(_Tag_);
DWORD* ptr_tag_skill = reinterpret_cast<DWORD*>(_tag_skill);
DWORD* ptr_target_curr_stack = reinterpret_cast<DWORD*>(_target_curr_stack);
DWORD* ptr_target_pud = reinterpret_cast<DWORD*>(_target_pud);
DWORD* ptr_target_stack = reinterpret_cast<DWORD*>(_target_stack);
DWORD* ptr_target_stack_offset = reinterpret_cast<DWORD*>(_target_stack_offset);
DWORD* ptr_target_str = reinterpret_cast<DWORD*>(_target_str);
DWORD* ptr_target_xpos = reinterpret_cast<DWORD*>(_target_xpos);
DWORD* ptr_target_ypos = reinterpret_cast<DWORD*>(_target_ypos);
DWORD* ptr_text_char_width = reinterpret_cast<DWORD*>(_text_char_width);
DWORD* ptr_text_height = reinterpret_cast<DWORD*>(_text_height);
DWORD* ptr_text_max = reinterpret_cast<DWORD*>(_text_max);
DWORD* ptr_text_mono_width = reinterpret_cast<DWORD*>(_text_mono_width);
DWORD* ptr_text_spacing = reinterpret_cast<DWORD*>(_text_spacing);
DWORD* ptr_text_to_buf = reinterpret_cast<DWORD*>(_text_to_buf);
DWORD* ptr_text_width = reinterpret_cast<DWORD*>(_text_width);
DWORD* ptr_title_color = reinterpret_cast<DWORD*>(_title_color);
DWORD* ptr_title_font = reinterpret_cast<DWORD*>(_title_font);
DWORD* ptr_trait_data = reinterpret_cast<DWORD*>(_trait_data);
DWORD* ptr_view_page = reinterpret_cast<DWORD*>(_view_page);
DWORD* ptr_wd_obj = reinterpret_cast<DWORD*>(_wd_obj);
DWORD* ptr_wmAreaInfoList = reinterpret_cast<DWORD*>(_wmAreaInfoList);
DWORD* ptr_wmLastRndTime = reinterpret_cast<DWORD*>(_wmLastRndTime);
DWORD* ptr_wmWorldOffsetX = reinterpret_cast<DWORD*>(_wmWorldOffsetX);
DWORD* ptr_wmWorldOffsetY = reinterpret_cast<DWORD*>(_wmWorldOffsetY);
DWORD* ptr_world_xpos = reinterpret_cast<DWORD*>(_world_xpos);
DWORD* ptr_world_ypos = reinterpret_cast<DWORD*>(_world_ypos);
DWORD* ptr_WorldMapCurrArea = reinterpret_cast<DWORD*>(_WorldMapCurrArea);
DWORD* ptr_YellowColor = reinterpret_cast<DWORD*>(_YellowColor);
/**
ENGINE FUNCTIONS OFFSETS
@@ -120,6 +293,7 @@ const DWORD db_get_file_list_ = 0x4C6628;
const DWORD db_read_to_buf_ = 0x4C5DD4;
const DWORD dbase_close_ = 0x4E5270;
const DWORD dbase_open_ = 0x4E4F58;
const DWORD debug_printf_ = 0x4C6F48;
const DWORD debug_register_env_ = 0x4C6D90;
const DWORD determine_to_hit_func_ = 0x4243A8;
const DWORD dialog_out_ = 0x41CF20;
@@ -145,6 +319,7 @@ const DWORD elevator_start_ = 0x43F324;
const DWORD endgame_slideshow_ = 0x43F788;
const DWORD exec_script_proc_ = 0x4A4810;
const DWORD executeProcedure_ = 0x46DD2C;
const DWORD findCurrentProc_ = 0x467160;
const DWORD fadeSystemPalette_ = 0x4C7320;
const DWORD findVar_ = 0x4410AC;
const DWORD folder_print_line_ = 0x43E3D8;
@@ -177,6 +352,7 @@ const DWORD interpretPopLong_ = 0x467500;
const DWORD interpretPopShort_ = 0x4674F0;
const DWORD interpretPushLong_ = 0x4674DC;
const DWORD interpretPushShort_ = 0x46748C;
const DWORD interpretError_ = 0x4671F0;
const DWORD intface_redraw_ = 0x45EB98;
const DWORD intface_toggle_item_state_ = 0x45F4E0;
const DWORD intface_toggle_items_ = 0x45F404;
@@ -185,6 +361,9 @@ const DWORD intface_update_hit_points_ = 0x45EBD8;
const DWORD intface_update_items_ = 0x45EFEC;
const DWORD intface_update_move_points_ = 0x45EE0C;
const DWORD intface_use_item_ = 0x45F5EC;
const DWORD intface_show_ = 0x45EA10;
const DWORD intface_hide_ = 0x45E9E0;
const DWORD intface_is_hidden_ = 0x45EA5C;
const DWORD invenUnwieldFunc_ = 0x472A64;
const DWORD invenWieldFunc_ = 0x472768;
const DWORD inven_display_msg_ = 0x472D24;
@@ -264,6 +443,7 @@ const DWORD mouse_in_ = 0x4CA8C8;
const DWORD mouse_show_ = 0x4CA34C;
const DWORD move_inventory_ = 0x474708;
const DWORD NixHotLines_ = 0x4999C0;
const DWORD nrealloc_ = 0x4F1669;
const DWORD obj_ai_blocking_at_ = 0x48BA20;
const DWORD obj_blocking_at_ = 0x48B848; // (EAX *obj, EDX hexNum, EBX level)
const DWORD obj_bound_ = 0x48B66C;
@@ -435,29 +615,36 @@ const DWORD xvfprintf_ = 0x4DF1AC;
int __stdcall ItemGetType(TGameObj* item) {
__asm {
mov eax, item;
call item_get_type_;
mov eax, item
call item_get_type_
}
}
int _stdcall IsPartyMember(TGameObj* obj) {
__asm {
mov eax, obj;
call isPartyMember_;
mov eax, obj
call isPartyMember_
}
}
TGameObj* GetInvenWeaponLeft(TGameObj* obj) {
int _stdcall PartyMemberGetCurrentLevel(TGameObj* obj) {
__asm {
mov eax, obj;
call inven_left_hand_;
mov eax, obj
call partyMemberGetCurLevel_
}
}
TGameObj* GetInvenWeaponRight(TGameObj* obj) {
TGameObj* __stdcall GetInvenWeaponLeft(TGameObj* obj) {
__asm {
mov eax, obj;
call inven_right_hand_;
mov eax, obj
call inven_left_hand_
}
}
TGameObj* __stdcall GetInvenWeaponRight(TGameObj* obj) {
__asm {
mov eax, obj
call inven_right_hand_
}
}
@@ -465,9 +652,9 @@ TGameObj* GetInvenWeaponRight(TGameObj* obj) {
char* GetProtoPtr(DWORD pid) {
char* proto;
__asm {
mov eax, pid;
lea edx, proto;
call proto_ptr_;
mov eax, pid
lea edx, proto
call proto_ptr_
}
return proto;
}
@@ -482,17 +669,15 @@ char AnimCodeByWeapon(TGameObj* weapon) {
return 0;
}
void DisplayConsoleMessage(const char* msg) {
__asm {
mov eax, msg;
call display_print_;
mov eax, msg
call display_print_
}
}
static DWORD mesg_buf[4] = {0, 0, 0, 0};
const char* _stdcall GetMessageStr(DWORD fileAddr, DWORD messageId)
{
const char* _stdcall GetMessageStr(DWORD fileAddr, DWORD messageId) {
DWORD buf = (DWORD)mesg_buf;
const char* result;
__asm {
@@ -504,3 +689,139 @@ const char* _stdcall GetMessageStr(DWORD fileAddr, DWORD messageId)
}
return result;
}
// Change the name of playable character
void CritterPcSetName(const char* newName) {
__asm {
mov eax, newName
call critter_pc_set_name_
}
}
// Returns the name of the critter
const char* __stdcall CritterName(TGameObj* critter) {
__asm {
mov eax, critter
call critter_name_
}
}
void SkillGetTags(int* result, DWORD num) {
if (num > 4) {
num = 4;
}
__asm {
mov eax, result
mov edx, num
call skill_get_tags_
}
}
void SkillSetTags(int* tags, DWORD num) {
if (num > 4) {
num = 4;
}
__asm {
mov eax, tags
mov edx, num
call skill_set_tags_
}
}
int __stdcall ScrPtr(int scriptId, TScript** scriptPtr) {
__asm {
mov eax, scriptId;
mov edx, scriptPtr;
call scr_ptr_;
}
}
// redraws the main game interface windows (useful after changing some data like active hand, etc.)
void InterfaceRedraw() {
__asm call intface_redraw_
}
// pops value type from Data stack (must be followed by InterpretPopLong)
DWORD __stdcall InterpretPopShort(TProgram* scriptPtr) {
__asm {
mov eax, scriptPtr
call interpretPopShort_
}
}
// pops value from Data stack (must be preceded by InterpretPopShort)
DWORD __stdcall InterpretPopLong(TProgram* scriptPtr) {
__asm {
mov eax, scriptPtr
call interpretPopLong_
}
}
// pushes value to Data stack (must be followed by InterpretPushShort)
void __stdcall InterpretPushLong(TProgram* scriptPtr, DWORD val) {
__asm {
mov edx, val
mov eax, scriptPtr
call interpretPushLong_
}
}
// pushes value type to Data stack (must be preceded by InterpretPushLong)
void __stdcall InterpretPushShort(TProgram* scriptPtr, DWORD valType) {
__asm {
mov edx, valType
mov eax, scriptPtr
call interpretPushShort_
}
}
DWORD __stdcall InterpretAddString(TProgram* scriptPtr, const char* strval) {
__asm {
mov edx, strval
mov eax, scriptPtr
call interpretAddString_
}
}
const char* __stdcall InterpretGetString(TProgram* scriptPtr, DWORD strId, DWORD dataType) {
__asm {
mov edx, dataType
mov ebx, strId
mov eax, scriptPtr
call interpretGetString_
}
}
void __declspec(naked) InterpretError(const char* fmt, ...) {
__asm {
jmp interpretError_
}
}
void __declspec(naked) DebugPrintf(const char* fmt, ...) {
__asm {
jmp debug_printf_
}
}
const char* __stdcall FindCurrentProc(TProgram* program) {
__asm {
mov eax, program
call findCurrentProc_
}
}
TGameObj* __stdcall InvenWorn(TGameObj* critter) {
__asm mov eax, critter
__asm call inven_worn_
}
TGameObj* __stdcall InvenLeftHand(TGameObj* critter) {
__asm mov eax, critter
__asm call inven_left_hand_
}
TGameObj* __stdcall InvenRightHand(TGameObj* critter) {
__asm mov eax, critter
__asm call inven_right_hand_
}
+251 -13
View File
@@ -26,6 +26,9 @@
#include "FalloutStructs.h"
// Global variable offsets
// TODO: probably need to hide these by moving inside implementation file
#define _aiInfoList 0x510948
#define _ambient_light 0x51923C
#define _art 0x510738
@@ -87,6 +90,7 @@
#define _i_rhand 0x59E968
#define _i_wid 0x59E964
#define _i_worn 0x59E954
#define _idle_func 0x51E234
#define _In_WorldMap 0x672E1C
#define _info_line 0x5707D0
#define _interfaceWindow 0x519024
@@ -206,15 +210,189 @@
#define _YellowColor 0x6AB8BB
// variables
extern TGameObj** obj_dude_ptr;
extern TGameObj** inven_dude_ptr;
extern DWORD* activeUIHand_ptr; // 0 - left, 1 - right
extern DWORD* dude_traits; // 2 of them
extern DWORD* itemCurrentItem;
extern DWORD* itemButtonItems;
// TODO: move to separate namespace
extern long* ptr_pc_traits; // 2 of them
// misc. offsets from engine
extern DWORD* ptr_aiInfoList;
extern DWORD* ptr_ambient_light;
extern DWORD* ptr_art;
extern DWORD* ptr_art_name;
extern DWORD* ptr_art_vault_guy_num;
extern DWORD* ptr_art_vault_person_nums;
extern DWORD* ptr_bckgnd;
extern DWORD* ptr_black_palette;
extern DWORD* ptr_bottom_line;
extern DWORD* ptr_btable;
extern DWORD* ptr_btncnt;
extern DWORD* ptr_CarCurrArea;
extern DWORD* ptr_cmap;
extern DWORD* ptr_colorTable;
extern DWORD* ptr_combat_free_move;
extern DWORD* ptr_combat_list;
extern DWORD* ptr_combat_state;
extern DWORD* ptr_combat_turn_running;
extern DWORD* ptr_combatNumTurns;
extern DWORD* ptr_crit_succ_eff;
extern DWORD* ptr_critter_db_handle;
extern DWORD* ptr_critterClearObj;
extern DWORD* ptr_crnt_func;
extern DWORD* ptr_curr_font_num;
extern DWORD* ptr_curr_pc_stat;
extern DWORD* ptr_curr_stack;
extern DWORD* ptr_cursor_line;
extern DWORD* ptr_dialog_target;
extern DWORD* ptr_dialog_target_is_party;
extern DWORD* ptr_drugInfoList;
extern DWORD* ptr_edit_win;
extern DWORD* ptr_Educated;
extern DWORD* ptr_Experience_;
extern DWORD* ptr_fallout_game_time;
extern DWORD* ptr_flptr;
extern DWORD* ptr_folder_card_desc;
extern DWORD* ptr_folder_card_fid;
extern DWORD* ptr_folder_card_title;
extern DWORD* ptr_folder_card_title2;
extern DWORD* ptr_frame_time;
extern char* ptr_free_perk;
extern DWORD* ptr_game_global_vars;
extern DWORD* ptr_game_user_wants_to_quit;
extern DWORD* ptr_gcsd;
extern DWORD* ptr_gdBarterMod;
extern DWORD* ptr_gdNumOptions;
extern DWORD* ptr_gIsSteal;
extern DWORD* ptr_glblmode;
extern DWORD* ptr_gmouse_current_cursor;
extern DWORD* ptr_gmovie_played_list;
extern DWORD* ptr_GreenColor;
extern DWORD* ptr_gsound_initialized;
extern DWORD* ptr_hit_location_penalty;
extern DWORD* ptr_holo_flag;
extern DWORD* ptr_holopages;
extern DWORD* ptr_hot_line_count;
extern DWORD* ptr_i_fid;
extern DWORD* ptr_i_lhand;
extern DWORD* ptr_i_rhand;
extern DWORD* ptr_i_wid;
extern DWORD* ptr_i_worn;
extern DWORD* ptr_In_WorldMap;
extern DWORD* ptr_info_line;
extern DWORD* ptr_interfaceWindow;
extern DWORD* ptr_intfaceEnabled;
extern DWORD* ptr_intotal;
extern TGameObj** ptr_inven_dude;
extern DWORD* ptr_inven_pid;
extern DWORD* ptr_inven_scroll_dn_bid;
extern DWORD* ptr_inven_scroll_up_bid;
extern DWORD* ptr_inventry_message_file;
extern DWORD* ptr_itemButtonItems;
extern DWORD* ptr_itemCurrentItem; // 0 - left, 1 - right
extern DWORD* ptr_kb_lock_flags;
extern DWORD* ptr_last_buttons;
extern DWORD* ptr_last_button_winID;
extern DWORD* ptr_last_level;
extern DWORD* ptr_Level_;
extern DWORD* ptr_Lifegiver;
extern DWORD* ptr_list_com;
extern DWORD* ptr_list_total;
extern DWORD* ptr_loadingGame;
extern DWORD* ptr_LSData;
extern DWORD* ptr_lsgwin;
extern DWORD* ptr_main_ctd;
extern DWORD* ptr_main_window;
extern DWORD* ptr_map_elevation;
extern DWORD* ptr_map_global_vars;
extern DWORD* ptr_master_db_handle;
extern DWORD* ptr_max;
extern DWORD* ptr_maxScriptNum;
extern DWORD* ptr_Meet_Frank_Horrigan;
extern DWORD* ptr_mouse_hotx;
extern DWORD* ptr_mouse_hoty;
extern DWORD* ptr_mouse_is_hidden;
extern DWORD* ptr_mouse_x_;
extern DWORD* ptr_mouse_y;
extern DWORD* ptr_mouse_y_;
extern DWORD* ptr_Mutate_;
extern DWORD* ptr_name_color;
extern DWORD* ptr_name_font;
extern DWORD* ptr_name_sort_list;
extern DWORD* ptr_num_game_global_vars;
extern DWORD* ptr_num_map_global_vars;
extern TGameObj** ptr_obj_dude;
extern DWORD* ptr_objectTable;
extern DWORD* ptr_objItemOutlineState;
extern DWORD* ptr_optionRect;
extern DWORD* ptr_outlined_object;
extern DWORD* ptr_partyMemberAIOptions;
extern DWORD* ptr_partyMemberCount;
extern DWORD* ptr_partyMemberLevelUpInfoList;
extern DWORD* ptr_partyMemberList; // each struct - 4 integers, first integer - objPtr
extern DWORD* ptr_partyMemberMaxCount;
extern DWORD* ptr_partyMemberPidList;
extern DWORD* ptr_patches;
extern DWORD* ptr_paths;
extern DWORD* ptr_pc_crit_succ_eff;
extern DWORD* ptr_pc_kill_counts;
extern char* ptr_pc_name;
extern DWORD* ptr_pc_proto;
extern DWORD* ptr_perk_data;
extern int** ptr_perkLevelDataList; // limited to PERK_Count
extern DWORD* ptr_pip_win;
extern DWORD* ptr_pipboy_message_file;
extern DWORD* ptr_pipmesg;
extern DWORD* ptr_preload_list_index;
extern DWORD* ptr_procTableStrs; // table of procId (from define.h) => procName map
extern DWORD* ptr_proto_main_msg_file;
extern DWORD* ptr_ptable;
extern DWORD* ptr_pud;
extern DWORD* ptr_queue;
extern DWORD* ptr_quick_done;
extern DWORD* ptr_read_callback;
extern DWORD* ptr_RedColor;
extern DWORD* ptr_retvals;
extern DWORD* ptr_scr_size;
extern DWORD* ptr_scriptListInfo;
extern DWORD* ptr_skill_data;
extern DWORD* ptr_slot_cursor;
extern DWORD* ptr_sneak_working; // DWORD var
extern DWORD* ptr_square;
extern DWORD* ptr_squares;
extern DWORD* ptr_stack;
extern DWORD* ptr_stack_offset;
extern DWORD* ptr_stat_data;
extern DWORD* ptr_stat_flag;
extern DWORD* ptr_Tag_;
extern DWORD* ptr_tag_skill;
extern DWORD* ptr_target_curr_stack;
extern DWORD* ptr_target_pud;
extern DWORD* ptr_target_stack;
extern DWORD* ptr_target_stack_offset;
extern DWORD* ptr_target_str;
extern DWORD* ptr_target_xpos;
extern DWORD* ptr_target_ypos;
extern DWORD* ptr_text_char_width;
extern DWORD* ptr_text_height;
extern DWORD* ptr_text_max;
extern DWORD* ptr_text_mono_width;
extern DWORD* ptr_text_spacing;
extern DWORD* ptr_text_to_buf;
extern DWORD* ptr_text_width;
extern DWORD* ptr_title_color;
extern DWORD* ptr_title_font;
extern DWORD* ptr_trait_data;
extern DWORD* ptr_view_page;
extern DWORD* ptr_wd_obj;
extern DWORD* ptr_wmAreaInfoList;
extern DWORD* ptr_wmLastRndTime;
extern DWORD* ptr_wmWorldOffsetX;
extern DWORD* ptr_wmWorldOffsetY;
extern DWORD* ptr_world_xpos;
extern DWORD* ptr_world_ypos;
extern DWORD* ptr_WorldMapCurrArea;
extern DWORD* ptr_YellowColor;
// engine function offsets
// TODO: move to separate namespace
extern const DWORD action_get_an_object_;
extern const DWORD action_loot_container_;
extern const DWORD action_use_an_item_on_object_;
@@ -285,6 +463,7 @@ extern const DWORD db_get_file_list_;
extern const DWORD db_read_to_buf_;
extern const DWORD dbase_close_;
extern const DWORD dbase_open_;
extern const DWORD debug_printf_;
extern const DWORD debug_register_env_;
extern const DWORD determine_to_hit_func_;
extern const DWORD dialog_out_;
@@ -342,6 +521,7 @@ extern const DWORD interpretPopLong_;
extern const DWORD interpretPopShort_;
extern const DWORD interpretPushLong_;
extern const DWORD interpretPushShort_;
extern const DWORD interpretError_;
extern const DWORD intface_redraw_; // no args
extern const DWORD intface_toggle_item_state_;
extern const DWORD intface_toggle_items_;
@@ -350,6 +530,9 @@ extern const DWORD intface_update_hit_points_;
extern const DWORD intface_update_items_;
extern const DWORD intface_update_move_points_;
extern const DWORD intface_use_item_;
extern const DWORD intface_show_;
extern const DWORD intface_hide_;
extern const DWORD intface_is_hidden_;
extern const DWORD invenUnwieldFunc_; // (int critter@<eax>, int slot@<edx>, int a3@<ebx>) - int result (-1 on error, 0 on success)
extern const DWORD invenWieldFunc_; // (int who@<eax>, int item@<edx>, int a3@<ecx>, int slot@<ebx>) - int result (-1 on error, 0 on success)
extern const DWORD inven_display_msg_;
@@ -432,6 +615,7 @@ extern const DWORD mouse_in_;
extern const DWORD mouse_show_;
extern const DWORD move_inventory_;
extern const DWORD NixHotLines_;
extern const DWORD nrealloc_;
extern const DWORD obj_ai_blocking_at_;
extern const DWORD obj_blocking_at_; // <eax>(int aExcludeObject<eax> /* can be 0 */, signed int aTile<edx>, int aElevation<ebx>)
extern const DWORD obj_bound_;
@@ -530,11 +714,11 @@ extern const DWORD set_game_time_;
extern const DWORD SexWindow_;
extern const DWORD skill_check_stealing_;
extern const DWORD skill_dec_point_;
extern const DWORD skill_get_tags_;
extern const DWORD skill_get_tags_; // eax - pointer to array DWORD, edx - number of elements to read
extern const DWORD skill_inc_point_;
extern const DWORD skill_level_;
extern const DWORD skill_points_;
extern const DWORD skill_set_tags_;
extern const DWORD skill_set_tags_; // eax - pointer to array DWORD, edx - number of elements to write
extern const DWORD skill_use_;
extern const DWORD skilldex_select_;
extern const DWORD sprintf_;
@@ -542,7 +726,7 @@ extern const DWORD square_num_;
extern const DWORD stat_get_base_direct_;
extern const DWORD stat_get_bonus_;
extern const DWORD stat_level_;
extern const DWORD stat_pc_add_experience_;
extern const DWORD stat_pc_add_experience_; // eax - amount to add
extern const DWORD stat_pc_get_;
extern const DWORD stat_pc_set_;
extern const DWORD stat_set_bonus_;
@@ -656,11 +840,65 @@ extern const DWORD getmsg_; // eax - msg file addr, ebx - message ID, edx - int[
#define MSG_FILE_WORLDMAP (0x672FB0)
// WRAPPERS:
// TODO: move these to different namespace
int _stdcall IsPartyMember(TGameObj* obj);
TGameObj* GetInvenWeaponLeft(TGameObj* obj);
TGameObj* GetInvenWeaponRight(TGameObj* obj);
int _stdcall PartyMemberGetCurrentLevel(TGameObj* obj);
TGameObj* __stdcall GetInvenWeaponLeft(TGameObj* obj);
TGameObj* __stdcall GetInvenWeaponRight(TGameObj* obj);
char* GetProtoPtr(DWORD pid);
char AnimCodeByWeapon(TGameObj* weapon);
// Displays message in main UI console window
void DisplayConsoleMessage(const char* msg);
const char* _stdcall GetMessageStr(DWORD fileAddr, DWORD messageId);
int __stdcall ItemGetType(TGameObj* item);
int __stdcall ItemGetType(TGameObj* item);
// Change the name of playable character
void CritterPcSetName(const char* newName);
// Returns the name of the critter
const char* __stdcall CritterName(TGameObj* critter);
// Saves pointer to script object into scriptPtr using scriptID.
// Returns 0 on success, -1 on failure.
int __stdcall ScrPtr(int scriptId, TScript** scriptPtr);
void SkillGetTags(int* result, DWORD num);
void SkillSetTags(int* tags, DWORD num);
// redraws the main game interface windows (useful after changing some data like active hand, etc.)
void InterfaceRedraw();
// critter worn item (armor)
TGameObj* __stdcall InvenWorn(TGameObj* critter);
// item in critter's left hand slot
TGameObj* __stdcall InvenLeftHand(TGameObj* critter);
// item in critter's right hand slot
TGameObj* __stdcall InvenRightHand(TGameObj* critter);
// pops value type from Data stack (must be followed by InterpretPopLong)
DWORD __stdcall InterpretPopShort(TProgram* scriptPtr);
// pops value from Data stack (must be preceded by InterpretPopShort)
DWORD __stdcall InterpretPopLong(TProgram* scriptPtr);
// pushes value to Data stack (must be followed by InterpretPushShort)
void __stdcall InterpretPushLong(TProgram* scriptPtr, DWORD val);
// pushes value type to Data stack (must be preceded by InterpretPushLong)
void __stdcall InterpretPushShort(TProgram* scriptPtr, DWORD valType);
const char* __stdcall InterpretGetString(TProgram* scriptPtr, DWORD strId, DWORD dataType);
DWORD __stdcall InterpretAddString(TProgram* scriptPtr, const char* str);
// prints scripting error in debug.log and stops current script execution by performing longjmp
// USE WITH CAUTION
void __declspec() InterpretError(const char* fmt, ...);
// prints message to debug.log file
void __declspec() DebugPrintf(const char* fmt, ...);
// returns the name of current procedure by program pointer
const char* __stdcall FindCurrentProc(TProgram* program);
+3 -3
View File
@@ -34,7 +34,7 @@ struct TInvenRec
};
#pragma pack(pop)
/* 8 */
/* 15 */
#pragma pack(push, 1)
struct TGameObj
{
@@ -52,7 +52,7 @@ struct TGameObj
TInvenRec *invenTablePtr;
char gap_38[4];
int itemCharges;
int movePoints;
int critterAP_weaponAmmoPid;
char gap_44[16];
int lastTarget;
char gap_58[12];
@@ -139,7 +139,7 @@ enum ObjectTypes
#pragma pack(push, 1)
struct TProgram
{
char gap_0[4];
const char* fileName;
int *codeStackPtr;
char gap_8[8];
int *codePtr;
+4 -3
View File
@@ -16,11 +16,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <vector>
#include "main.h"
#include "FalloutEngine.h"
#include "FileSystem.h"
#include "vector9x.cpp"
extern void GetSavePath(char* buf, char* ftype);
@@ -31,7 +32,7 @@ struct fsFile {
DWORD wpos;
};
vector<fsFile> files;
std::vector<fsFile> files;
static DWORD loadedtiles=0;
static DWORD retval;
@@ -417,7 +418,7 @@ void FileSystemReset() {
}
if(!loadedtiles) files.clear();
else {
for(DWORD i=files.size()-1;i>=loadedtiles;i--) files.remove_at(i);
for(DWORD i=files.size()-1;i>=loadedtiles;i--) files.erase(files.begin() + i);
}
}
void FileSystemSave(HANDLE h) {
+11 -10
View File
@@ -1088,7 +1088,7 @@ void _stdcall RegisterHook( DWORD script, DWORD id, DWORD procNum )
}
sScriptProgram *prog = GetGlobalScriptProgram(script);
if (prog) {
dlog_f( "Global script %8x registered as hook id %d ", DL_HOOK, script, id);
dlog_f("Global script %08x registered as hook id %d\r\n", DL_HOOK, script, id);
sHookScript hook;
hook.prog = *prog;
hook.callback = procNum;
@@ -1102,39 +1102,40 @@ static void LoadHookScript(const char* name, int id) {
char filename[MAX_PATH];
sprintf(filename, "scripts\\%s.int", name);
bool result;
bool fileExist;
__asm {
lea eax, filename
call db_access_
mov result, al
mov fileExist, al
}
if (result && !isGameScript(name)) {
if (fileExist && !isGameScript(name)) {
sScriptProgram prog;
dlog("Loading hook script: ", DL_HOOK);
dlog(filename, DL_HOOK);
dlog(">", DL_HOOK);
dlog(name, DL_HOOK);
LoadScriptProgram(prog, name);
if (prog.ptr) {
dlogr(" Done", DL_HOOK);
sHookScript hook;
hook.prog = prog;
hook.callback = -1;
hook.isGlobalScript = false;
hooks[id].push_back(hook);
AddProgramToMap(prog);
dlogr(" Done", DL_HOOK);
} else dlogr(" Error!", DL_HOOK);
}
}
static void HookScriptInit2() {
dlogr("Initing hook scripts", DL_HOOK|DL_INIT);
dlogr("Loading hook scripts", DL_HOOK|DL_INIT);
char* mask = "scripts\\hs_*.int";
DWORD *filenames;
__asm {
xor ecx, ecx
xor ebx, ebx
mov eax, mask
lea edx, filenames
mov eax, mask
call db_get_file_list_
}
@@ -1289,7 +1290,7 @@ static void HookScriptInit2() {
call db_free_file_list_
}
dlogr("Completed hook script init", DL_HOOK|DL_INIT);
dlogr("Finished loading hook scripts", DL_HOOK|DL_INIT);
}
void HookScriptClear() {
+2 -2
View File
@@ -49,11 +49,11 @@ static const char* MsgSearch(int msgno, DWORD file) {
}
DWORD& GetActiveItemMode() {
return itemButtonItems[(*itemCurrentItem * 6) + 4];
return ptr_itemButtonItems[(*ptr_itemCurrentItem * 6) + 4];
}
TGameObj* GetActiveItem() {
return (TGameObj*)itemButtonItems[*itemCurrentItem * 6];
return (TGameObj*)ptr_itemButtonItems[*ptr_itemCurrentItem * 6];
}
void InventoryKeyPressedHook(DWORD dxKey, bool pressed, DWORD vKey) {
+18 -17
View File
@@ -16,14 +16,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <math.h>
#include <vector>
#include "main.h"
#include <math.h>
#include "FalloutEngine.h"
#include "Knockback.h"
#include "vector9x.cpp"
static vector<DWORD> NoBursts;
static std::vector<DWORD> NoBursts;
struct KnockbackModifier {
DWORD id;
@@ -31,9 +32,9 @@ struct KnockbackModifier {
double value;
};
static vector<KnockbackModifier> mTargets;
static vector<KnockbackModifier> mAttackers;
static vector<KnockbackModifier> mWeapons;
static std::vector<KnockbackModifier> mTargets;
static std::vector<KnockbackModifier> mAttackers;
static std::vector<KnockbackModifier> mWeapons;
struct ChanceModifier {
DWORD id;
@@ -41,8 +42,8 @@ struct ChanceModifier {
int mod;
};
static vector<ChanceModifier> HitChanceMods;
static vector<ChanceModifier> PickpocketMods;
static std::vector<ChanceModifier> HitChanceMods;
static std::vector<ChanceModifier> PickpocketMods;
static ChanceModifier BaseHitChance;
static ChanceModifier BasePickpocket;
@@ -50,10 +51,10 @@ static ChanceModifier BasePickpocket;
static bool hookedAimedShot;
static const DWORD aimedShotRet1=0x478EE4;
static const DWORD aimedShotRet2=0x478EEA;
static vector<DWORD> disabledAS;
static vector<DWORD> forcedAS;
static std::vector<DWORD> disabledAS;
static std::vector<DWORD> forcedAS;
static double ApplyModifiers(vector<KnockbackModifier>* mods, DWORD id, double val) {
static double ApplyModifiers(std::vector<KnockbackModifier>* mods, DWORD id, double val) {
for(DWORD i=0;i<mods->size();i++) {
if((*mods)[i].id==id) {
KnockbackModifier* mod=&(*mods)[i];
@@ -207,7 +208,7 @@ void Knockback_OnGameLoad() {
}
void _stdcall KnockbackSetMod(DWORD id, DWORD type, float val, DWORD on) {
vector<KnockbackModifier>* mods;
std::vector<KnockbackModifier>* mods;
switch(on) {
case 0: mods=&mWeapons; break;
case 1: mods=&mTargets; break;
@@ -225,7 +226,7 @@ void _stdcall KnockbackSetMod(DWORD id, DWORD type, float val, DWORD on) {
}
void _stdcall KnockbackRemoveMod(DWORD id, DWORD on) {
vector<KnockbackModifier>* mods;
std::vector<KnockbackModifier>* mods;
switch(on) {
case 0: mods=&mWeapons; break;
case 1: mods=&mTargets; break;
@@ -234,7 +235,7 @@ void _stdcall KnockbackRemoveMod(DWORD id, DWORD on) {
}
for(DWORD i=0;i<mods->size();i++) {
if((*mods)[i].id==id) {
mods->remove_at(i);
mods->erase(mods->begin() + i);
return;
}
}
@@ -287,7 +288,7 @@ void _stdcall SetNoBurstMode(DWORD critter, DWORD on) {
} else {
for(DWORD i=0;i<NoBursts.size();i++) {
if(NoBursts[i]==critter) {
NoBursts.remove_at(i);
NoBursts.erase(NoBursts.begin() + i);
return;
}
}
@@ -329,13 +330,13 @@ static void HookAimedShots() {
}
void _stdcall DisableAimedShots(DWORD pid) {
if(!hookedAimedShot) HookAimedShots();
for(DWORD i=0;i<forcedAS.size();i++) if(forcedAS[i]==pid) forcedAS.remove_at(i--);
for(DWORD i=0;i<forcedAS.size();i++) if(forcedAS[i]==pid) forcedAS.erase(forcedAS.begin() + (i--));
for(DWORD i=0;i<disabledAS.size();i++) if(disabledAS[i]==pid) return;
disabledAS.push_back(pid);
}
void _stdcall ForceAimedShots(DWORD pid) {
if(!hookedAimedShot) HookAimedShots();
for(DWORD i=0;i<disabledAS.size();i++) if(disabledAS[i]==pid) disabledAS.remove_at(i--);
for(DWORD i=0;i<disabledAS.size();i++) if(disabledAS[i]==pid) disabledAS.erase(disabledAS.begin() + (i--));
for(DWORD i=0;i<forcedAS.size();i++) if(forcedAS[i]==pid) return;
forcedAS.push_back(pid);
}
+6 -7
View File
@@ -104,9 +104,9 @@ static void _stdcall SaveGame2() {
static char SaveFailMsg[128];
static DWORD _stdcall combatSaveTest() {
if(!SaveInCombatFix) return 1;
if(InLoop&COMBAT) {
if(SaveInCombatFix==2 || !(InLoop&PCOMBAT)) {
if (!SaveInCombatFix && !IsNpcControlled()) return 1;
if (InLoop & COMBAT) {
if (SaveInCombatFix == 2 || IsNpcControlled() || !(InLoop & PCOMBAT)) {
DisplayConsoleMessage(SaveFailMsg);
return 0;
}
@@ -122,13 +122,14 @@ static DWORD _stdcall combatSaveTest() {
call perk_level_;
mov bonusmove, eax;
}
if(*(DWORD*)(*(DWORD*)_obj_dude + 0x40) != ap || bonusmove*2!=*(DWORD*)_combat_free_move) {
if (*(DWORD*)(*(DWORD*)_obj_dude + 0x40) != ap || bonusmove * 2 != *(DWORD*)_combat_free_move) {
DisplayConsoleMessage(SaveFailMsg);
return 0;
}
}
return 1;
}
static void __declspec(naked) SaveGame() {
__asm {
push ebx;
@@ -411,9 +412,7 @@ static void __declspec(naked) AutomapHook() {
void LoadGameHookInit() {
SaveInCombatFix = GetPrivateProfileInt("Misc", "SaveInCombatFix", 1, ini);
if (SaveInCombatFix > 2) SaveInCombatFix = 0;
if (SaveInCombatFix) {
GetPrivateProfileString("sfall", "SaveInCombat", "Cannot save at this time", SaveFailMsg, 128, translationIni);
}
GetPrivateProfileString("sfall", "SaveInCombat", "Cannot save at this time", SaveFailMsg, 128, translationIni);
GetPrivateProfileString("sfall", "SaveSfallDataFail", "ERROR saving extended savegame information! Check if other programs interfere with savegame files/folders and try again!", SaveSfallDataFailMsg, 128, translationIni);
switch (GetPrivateProfileInt("Misc", "PipBoyAvailableAtGameStart", 0, ini)) {

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