Compare commits

...
8 Commits
Author SHA1 Message Date
NovaRain 061a3925e6 Minor edits to Message.cpp/h 2020-10-27 00:54:29 +08:00
NovaRain c6fa6bac30 Cleaned up define_lite.h and command_lite.h
Improved/corrected the fix for function args in commit e59af7e8.
Minor code edits.
2020-10-26 11:25:31 +08:00
NovaRain 0988004245 Fixed the error handling in win_fill_color
Some code fixes.
2020-10-25 08:07:49 +08:00
NovaRain e59af7e88a Fixed function args not being reset properly
Removed redundant safeguard/manual arg init in various script functions.
2020-10-25 01:05:34 +08:00
NovaRain 7cf1b60b38 Backported the extended functionality of ExtraGameMsgFileList from 4.x 2020-10-24 21:23:04 +08:00
NovaRain a8919367ea Added "win_fill_color" script function 2020-10-24 13:54:43 +08:00
NovaRain 0a44f7118a Added support for drawing PCX images to draw_image, draw_image_scaled, and interface_art_draw
Fixed bug in TalkingHeads.cpp.
2020-10-24 00:55:40 +08:00
NovaRain cda56aca7d Fixed the macro guard in command_lite.h and added two macros 2020-10-21 22:36:59 +08:00
20 changed files with 451 additions and 533 deletions
+4 -1
View File
@@ -1,5 +1,5 @@
;sfall configuration settings ;sfall configuration settings
;v3.8.28 ;v3.8.28.1
[Main] [Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file. ;Change to 1 if you want to use command line args to tell sfall to use another ini file.
@@ -687,6 +687,9 @@ CarPlacedTileFix=1
InstantWeaponEquip=0 InstantWeaponEquip=0
;To add additional game msg files, uncomment the next line and set a comma delimited list of filenames without .msg extension ;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 ;You need to use the message_str_game script function to get messages from the files
;ExtraGameMsgFileList= ;ExtraGameMsgFileList=
+44 -148
View File
@@ -1,13 +1,9 @@
/*
Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved.
*/
#ifndef COMMAND_H #ifndef COMMAND_H
#define COMMAND_H #define COMMAND_H
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) orElse \
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \
((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) ((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
#define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3)) #define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3))
#define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor) #define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor)
@@ -21,13 +17,13 @@
#define dude_iq (get_critter_stat(dude_obj,STAT_iq)) #define dude_iq (get_critter_stat(dude_obj,STAT_iq))
#define dude_agility (get_critter_stat(dude_obj,STAT_ag)) #define dude_agility (get_critter_stat(dude_obj,STAT_ag))
#define dude_luck (get_critter_stat(dude_obj,STAT_lu)) #define dude_luck (get_critter_stat(dude_obj,STAT_lu))
#ifndef dude_level
#define dude_level (get_pc_stat(PCSTAT_level)) #define dude_level (get_pc_stat(PCSTAT_level))
#endif
#define dude_age (get_critter_stat(dude_obj,STAT_age)) #define dude_age (get_critter_stat(dude_obj,STAT_age))
#define dude_weight critter_weight(dude_obj) #define dude_weight critter_weight(dude_obj)
#define dude_cur_carry who_carry_amount(dude_obj)
#define dude_max_carry who_max_carry(dude_obj)
#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) #define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) andAlso ((get_critter_stat(dude_obj,STAT_iq)) < 3) )
#define dude_is_male (dude_gender == GENDER_MALE) #define dude_is_male (dude_gender == GENDER_MALE)
#define dude_is_female (dude_gender == GENDER_FEMALE) #define dude_is_female (dude_gender == GENDER_FEMALE)
@@ -39,43 +35,50 @@
(obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \ (obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \
(obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0) (obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0)
#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) or \ #define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SWITCHBLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SHIV) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_WAKIZASHI_BLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SWITCHBLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SHIV) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_WAKIZASHI_BLADE))
#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) or \ #define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR))
#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) or \ #define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR))
#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) or \ #define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II))
#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) or \ #define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II))
#define dude_wearing_vault_suit COND019(1) #define dude_has_gambling_skills ((dude_iq > 3) andAlso (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
#define dude_has_gambling_skills ((dude_iq > 3) and (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
#define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK)) #define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK))
#define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk) #define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk)
#define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running) #define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running)
#define dude_is_poisoned (get_poison(dude_obj)) #define dude_is_poisoned (get_poison(dude_obj))
#define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad)) #define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad))
#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) or \ #define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) or \ (critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) or \ (critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT)) (critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT))
#define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT)) #define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT))
@@ -99,8 +102,6 @@
#define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR)) #define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR))
#define dude_is_pornstar dude_has_porn_star_rep #define dude_is_pornstar dude_has_porn_star_rep
#define dude_is_high drug_influence(dude_obj) #define dude_is_high drug_influence(dude_obj)
#define dude_found_geck global_var(GVAR_VAULT13_FOUND_GECK)
#define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0))) #define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0)))
#define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0))) #define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0)))
@@ -112,7 +113,6 @@
#define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict)) #define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict))
#define self_name (obj_name(self_obj)) #define self_name (obj_name(self_obj))
#define self_gender (get_critter_stat(self_obj,STAT_gender)) #define self_gender (get_critter_stat(self_obj,STAT_gender))
#define self_strength (get_critter_stat(self_obj,STAT_st)) #define self_strength (get_critter_stat(self_obj,STAT_st))
@@ -128,7 +128,7 @@
#define self_is_armed critter_is_armed(self_obj) #define self_is_armed critter_is_armed(self_obj)
#define self_wearing_armor critter_wearing_armor(self_obj) #define self_wearing_armor critter_wearing_armor(self_obj)
#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) or \ #define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) orElse \
(obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL)) (obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL))
#define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK)) #define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK))
@@ -169,23 +169,24 @@
// some timer event macros // some timer event macros
#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x) #define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x)
#define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \ #define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \
add_timer_event(obj, time, param) add_timer_event(obj, time, param)
#define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param) #define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param)
/****************************************************************** /******************************************************************
General commands getting information about time General commands getting information about time
******************************************************************/ ******************************************************************/
#define morning ((game_time_hour >= 600) and (game_time_hour < 700)) #define morning ((game_time_hour >= 600) andAlso (game_time_hour < 700))
#ifndef day #ifndef day
#define day ((game_time_hour >= 700) and (game_time_hour < 1800)) #define day ((game_time_hour >= 700) andAlso (game_time_hour < 1800))
#endif #endif
#define evening ((game_time_hour >= 1800) and (game_time_hour < 1900)) #define evening ((game_time_hour >= 1800) andAlso (game_time_hour < 1900))
#ifndef night #ifndef night
#define night ((game_time_hour >= 1900) or (game_time_hour < 600)) #define night ((game_time_hour >= 1900) orElse (game_time_hour < 600))
#endif #endif
#define GAME_TIME_SUBSECOND_RESOLUTION (10) #define GAME_TIME_SUBSECOND_RESOLUTION (10)
@@ -200,7 +201,6 @@
#define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE)) #define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE))
#define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION) #define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION)
#define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE)) #define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE))
#define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x)) #define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x))
@@ -219,9 +219,7 @@
/*************************************************************** /***************************************************************
**************** Dialogue Information *********************** **************** Dialogue Information ***********************
***************************************************************/ ***************************************************************/
#ifndef floater #define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
#define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
#endif
#define floater_rand(x,y) floater(random(x,y)) #define floater_rand(x,y) floater(random(x,y))
#define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) #define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
@@ -229,7 +227,6 @@
#define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD) #define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD)
#define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK) #define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK)
#define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW #define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW
#define FLOAT_COLOR_SICK FLOAT_MSG_GREEN #define FLOAT_COLOR_SICK FLOAT_MSG_GREEN
#define FLOAT_COLOR_BAD FLOAT_MSG_RED #define FLOAT_COLOR_BAD FLOAT_MSG_RED
@@ -335,9 +332,7 @@
******************************************************************/ ******************************************************************/
#define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE) #define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE)
#define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE) #define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE)
/*#define critter_is_armed (((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) \
or ((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
*/
/****************************************************************** /******************************************************************
General commands setting and getting the map exit General commands setting and getting the map exit
******************************************************************/ ******************************************************************/
@@ -385,59 +380,12 @@
#define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED)) #define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED))
#define status_is_sex(status_var) (status_is(status_var, PERSON_SEX)) #define status_is_sex(status_var) (status_is(status_var, PERSON_SEX))
#define status_is_alive(status_var) (not (status_is_killed(status_var) or status_is_assassinated(status_var) or status_is_dead(status_var))) #define status_is_alive(status_var) (not (status_is_killed(status_var) orElse status_is_assassinated(status_var) orElse status_is_dead(status_var)))
/****************************************************************** /******************************************************************
General commands getting information about cities General commands getting information about cities
******************************************************************/ ******************************************************************/
#define abbey_visible_on_map (town_known(AREA_ABBEY) != MARK_STATE_UNKNOWN)
#define arroyo_visible_on_map (town_known(AREA_ARROYO) != MARK_STATE_UNKNOWN)
#define broken_hills_visible_on_map (town_known(AREA_BROKEN_HILLS) != MARK_STATE_UNKNOWN)
#define colusa_visible_on_map (town_known(AREA_NAVARRO) != MARK_STATE_UNKNOWN)
#define den_visible_on_map (town_known(AREA_DEN) != MARK_STATE_UNKNOWN)
#define enclave_visible_on_map (town_known(AREA_THE_ENCLAVE) != MARK_STATE_UNKNOWN)
#define EPA_visible_on_map (town_known(AREA_EPA) != MARK_STATE_UNKNOWN)
#define gecko_visible_on_map (town_known(AREA_GECKO) != MARK_STATE_UNKNOWN)
#define klamath_visible_on_map (town_known(AREA_KLAMATH) != MARK_STATE_UNKNOWN)
#define military_base_visible_on_map (town_known(AREA_MILITARY_BASE) != MARK_STATE_UNKNOWN)
#define modoc_visible_on_map (town_known(AREA_MODOC) != MARK_STATE_UNKNOWN)
#define new_CA_republic_visible_on_map (town_known(AREA_NCR) != MARK_STATE_UNKNOWN)
#define primitive_tribe_visible_on_map (town_known(AREA_PRIMITIVE_TRIBE) != MARK_STATE_UNKNOWN)
#define redding_visible_on_map (town_known(AREA_REDDING) != MARK_STATE_UNKNOWN)
#define new_reno_visible_on_map (town_known(AREA_NEW_RENO) != MARK_STATE_UNKNOWN)
#define san_francisco_visible_on_map (town_known(AREA_SAN_FRANCISCO) != MARK_STATE_UNKNOWN)
#define sierra_army_base_visible_on_map (town_known(AREA_SIERRA_ARMY_BASE) != MARK_STATE_UNKNOWN)
#define vault_13_visible_on_map (town_known(AREA_VAULT_13) != MARK_STATE_UNKNOWN)
#define vault_15_visible_on_map (town_known(AREA_VAULT_15) != MARK_STATE_UNKNOWN)
#define vault_city_visible_on_map (town_known(AREA_VAULT_CITY) != MARK_STATE_UNKNOWN)
#define vault_fake_13A_visible_on_map (town_known(AREA_FAKE_VAULT_13A) != MARK_STATE_UNKNOWN)
#define vault_fake_13B_visible_on_map (town_known(AREA_FAKE_VAULT_13B) != MARK_STATE_UNKNOWN)
#define abbey_visit (town_known(AREA_ABBEY) == MARK_STATE_VISITED)
#define arroyo_visit (town_known(AREA_ARROYO) == MARK_STATE_VISITED)
#define broken_hills_visit (town_known(AREA_BROKEN_HILLS) == MARK_STATE_VISITED)
#define colusa_visit (town_known(AREA_NAVARRO) == MARK_STATE_VISITED)
#define den_visit (town_known(AREA_DEN) == MARK_STATE_VISITED)
#define enclave_visit (town_known(AREA_THE_ENCLAVE) == MARK_STATE_VISITED)
#define EPA_visit (town_known(AREA_EPA) == MARK_STATE_VISITED)
#define gecko_visit (town_known(AREA_GECKO) == MARK_STATE_VISITED)
#define klamath_visit (town_known(AREA_KLAMATH) == MARK_STATE_VISITED)
#define military_base_visit (town_known(AREA_MILITARY_BASE) == MARK_STATE_VISITED)
#define modoc_visit (town_known(AREA_MODOC) == MARK_STATE_VISITED)
#define new_CA_republic_visit (town_known(AREA_NCR) == MARK_STATE_VISITED)
#define primitive_tribe_visit (town_known(AREA_PRIMITIVE_TRIBE) == MARK_STATE_VISITED)
#define redding_visit (town_known(AREA_REDDING) == MARK_STATE_VISITED)
#define new_reno_visit (town_known(AREA_NEW_RENO) == MARK_STATE_VISITED)
#define san_francisco_visit (town_known(AREA_SAN_FRANCISCO) == MARK_STATE_VISITED)
#define sierra_army_base_visit (town_known(AREA_SIERRA_ARMY_BASE) == MARK_STATE_VISITED)
#define vault_13_visit (town_known(AREA_VAULT_13) == MARK_STATE_VISITED)
#define vault_15_visit (town_known(AREA_VAULT_15) == MARK_STATE_VISITED)
#define vault_city_visit (town_known(AREA_VAULT_CITY) == MARK_STATE_VISITED)
#define arroyo_destroyed_visit (town_known(AREA_ARROYO_DESTROYED) == MARK_STATE_VISITED)
#define vault_fake_13A_visit (town_known(AREA_FAKE_VAULT_13A) == MARK_STATE_VISITED)
#define vault_fake_13B_visit (town_known(AREA_FAKE_VAULT_13B) == MARK_STATE_VISITED)
#define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \ #define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \
debug_msg(" mark_on_map("+x+")"); \ debug_msg(" mark_on_map("+x+")"); \
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \
@@ -448,63 +396,11 @@
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \
end end
#define mark_abbey_on_map mark_on_map(AREA_ABBEY)
#define mark_arroyo_on_map mark_on_map(AREA_ARROYO)
#define mark_broken_hills_on_map mark_on_map(AREA_BROKEN_HILLS)
#define mark_colusa_on_map mark_on_map(AREA_NAVARRO)
#define mark_navarro_on_map mark_on_map(AREA_NAVARRO)
#define mark_den_on_map mark_on_map(AREA_DEN)
#define mark_enclave_on_map mark_on_map(AREA_THE_ENCLAVE)
#define mark_EPA_on_map mark_on_map(AREA_EPA)
#define mark_gecko_on_map mark_on_map(AREA_GECKO)
#define mark_klamath_on_map mark_on_map(AREA_KLAMATH)
#define mark_military_base_on_map mark_on_map(AREA_MILITARY_BASE)
#define mark_modoc_on_map mark_on_map(AREA_MODOC)
#define mark_new_CA_republic_on_map mark_on_map(AREA_NCR)
#define mark_primitive_tribe_on_map mark_on_map(AREA_PRIMITIVE_TRIBE)
#define mark_redding_on_map mark_on_map(AREA_REDDING)
#define mark_new_reno_on_map mark_on_map(AREA_NEW_RENO)
#define mark_san_francisco_on_map mark_on_map(AREA_SAN_FRANCISCO)
#define mark_sierra_army_base_on_map mark_on_map(AREA_SIERRA_ARMY_BASE)
#define mark_vault_13_on_map mark_on_map(AREA_VAULT_13)
#define mark_vault_15_on_map mark_on_map(AREA_VAULT_15)
#define mark_vault_city_on_map mark_on_map(AREA_VAULT_CITY)
#define mark_vault_fake_13A_on_map mark_on_map(AREA_FAKE_VAULT_13A)
#define mark_vault_fake_13B_on_map mark_on_map(AREA_FAKE_VAULT_13B)
#define unmark_vault_fake_13A_on_map unmark_on_map(AREA_FAKE_VAULT_13A)
/******************************************************************************************************************* /*******************************************************************************************************************
********** These represent the players acomplishments through the game ********************************************* ********** These represent the players acomplishments through the game *********************************************
********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were ***************** ********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were *****************
********** going to have a magic variable to keep track of the player stats throught the game ********************** ********** going to have a magic variable to keep track of the player stats throught the game **********************
*******************************************************************************************************************/ *******************************************************************************************************************/
#define f2_state_v13_looking (0)
#define f2_state_v13_known (1) // set -Chris H
#define f2_state_v13_found (2) // set -Chris H
#define f2_state_v13_entered (3) // set -Chris H
#define f2_state_tribe_kidnapped (4) // ### state not set
#define f2_state_fix_tanker (5) // didn't need to exist
#define f2_state_tanker_fix_known (6) // set -Chris H
#define f2_state_tanker_fixed (7) // set -Chris H
#define f2_state_enclave_destroyed (8) // ### state not set
#define set_f2(x) if (global_var(GVAR_FALLOUT_2) < x) then set_global_var(GVAR_FALLOUT_2, x)
#define force_f2(x) set_global_var(GVAR_FALLOUT_2, x)
#define get_f2(x) (global_var(GVAR_FALLOUT_2) == x)
#define f2_flag_any (global_var(GVAR_FALLOUT_2))
#define Fallout2_vault13_looking get_f2(f2_state_v13_looking)
#define Fallout2_vault13_location_known get_f2(f2_state_v13_known)
#define Fallout2_vault13_found get_f2(f2_state_v13_found)
#define Fallout2_vault13_entered get_f2(f2_state_v13_entered)
#define Fallout2_tribe_kidnapped get_f2(f2_state_tribe_kidnapped)
#define Fallout2_fix_tanker get_f2(f2_state_fix_tanker)
#define Fallout2_tanker_known get_f2(f2_state_tanker_fix_known)
#define Fallout2_tanker_fixed get_f2(f2_state_tanker_fixed)
#define Fallout2_enclave_destroyed get_f2(f2_state_enclave_destroyed)
// Info relating to carry weight, how much something costs, and weights // Info relating to carry weight, how much something costs, and weights
#define pid_weight(x) proto_data(x,it_weight) #define pid_weight(x) proto_data(x,it_weight)
File diff suppressed because it is too large Load Diff
+2
View File
@@ -265,6 +265,7 @@
#define art_cache_clear sfall_func0("art_cache_clear") #define art_cache_clear sfall_func0("art_cache_clear")
#define attack_is_aimed sfall_func0("attack_is_aimed") #define attack_is_aimed sfall_func0("attack_is_aimed")
#define car_gas_amount sfall_func0("car_gas_amount") #define car_gas_amount sfall_func0("car_gas_amount")
#define clear_window sfall_func0("win_fill_color")
#define combat_data sfall_func0("combat_data") #define combat_data sfall_func0("combat_data")
#define create_win(winName, x, y, w, h) sfall_func5("create_win", winName, x, y, w, h) #define create_win(winName, x, y, w, h) sfall_func5("create_win", winName, x, y, w, h)
#define create_win_flag(winName, x, y, w, h, flag) sfall_func6("create_win", winName, x, y, w, h, flag) #define create_win_flag(winName, x, y, w, h, flag) sfall_func6("create_win", winName, x, y, w, h, flag)
@@ -341,5 +342,6 @@
#define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define unjam_lock(obj) sfall_func1("unjam_lock", obj)
#define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1)
#define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) #define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot)
#define win_fill_color(x, y, width, height, color) sfall_func5("win_fill_color", x, y, width, height, color)
#endif #endif
+8 -2
View File
@@ -324,6 +324,7 @@ Some utility/math functions are available:
- works exactly the same as message_str, except you get messages from files in "text\<language>\game\" directory - works exactly the same as message_str, except you get messages from files in "text\<language>\game\" directory
- use GAME_MSG_* defines or mstr_* macros from sfall.h to use specific msg file - use GAME_MSG_* defines or mstr_* macros from sfall.h to use specific msg file
- Additional game msg files added by ExtraGameMsgFileList setting will have consecutive fileIds assigned beginning from 0x2000 to 0x2FFF. (e.g. if you set ExtraGameMsgFileList=foo,bar in ddraw.ini, foo.msg will be associated with 0x2000 and bar.msg with 0x2001.) - Additional game msg files added by ExtraGameMsgFileList setting will have consecutive fileIds assigned beginning from 0x2000 to 0x2FFF. (e.g. if you set ExtraGameMsgFileList=foo,bar in ddraw.ini, foo.msg will be associated with 0x2000 and bar.msg with 0x2001.)
- if a file has a specific number assigned in ExtraGameMsgFileList, its fileId will be (0x2000 + assigned number). (e.g. with ExtraGameMsgFileList=foo,bar:2,foobar in ddraw.ini, bar.msg will be associated with 0x2002 and foobar.msg with 0x2003.)
> int sneak_success > int sneak_success
- returns 1 if the player is currently sneaking, and last sneak attempt (roll against skill) was successful; 0 otherwise - returns 1 if the player is currently sneaking, and last sneak attempt (roll against skill) was successful; 0 otherwise
@@ -647,7 +648,7 @@ optional arguments:
- message: the text in the dialog box. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!") - message: the text in the dialog box. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!")
optional arguments: optional arguments:
- flags: mode flags (see MSGBOX_* constants in define_extra.h). Pass -1 to skip setting the flags (default flags are NORMAL and YESNO) - flags: mode flags (see MSGBOX_* constants in define_extra.h). Pass -1 to skip setting the flags (default flags are NORMAL and YESNO)
- color1/color2: the color index in Fallout palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145) - color1/color2: the color index in the game palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145)
> int sfall_func1("get_stat_min", int stat) > int sfall_func1("get_stat_min", int stat)
> int sfall_func1("get_stat_max", int stat) > int sfall_func1("get_stat_max", int stat)
@@ -677,7 +678,7 @@ optional arguments:
- text: the text to be printed. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!") - text: the text to be printed. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!")
- winType: the type number of the interface window (see WINTYPE_* constants in sfall.h) - winType: the type number of the interface window (see WINTYPE_* constants in sfall.h)
- x/y: offset relative to the top-left corner of the window - x/y: offset relative to the top-left corner of the window
- color: the color index in Fallout palette. Pass 0 if the text color was previously set by vanilla SetTextColor function - color: the color index in the game palette. Pass 0 if the text color was previously set by vanilla SetTextColor function
it can also take additional flags (via bwor) for displaying text: it can also take additional flags (via bwor) for displaying text:
0x0010000 - adds a shadow to the text, the 'textshadow' compiler constant 0x0010000 - adds a shadow to the text, the 'textshadow' compiler constant
0x1000000 - prevents immediate redrawing of the interface window, the 'textdirect' compiler constant (works the other way around) 0x1000000 - prevents immediate redrawing of the interface window, the 'textdirect' compiler constant (works the other way around)
@@ -689,6 +690,11 @@ optional arguments:
- can be used in conjunction with the get_object_data and set_object_data functions - can be used in conjunction with the get_object_data and set_object_data functions
example: sfall_func3("set_object_data", sfall_func0("combat_data"), C_ATTACK_UNUSED, 255); example: sfall_func3("set_object_data", sfall_func0("combat_data"), C_ATTACK_UNUSED, 255);
> int sfall_func0("win_fill_color")
> int sfall_func5("win_fill_color", int x, int y, int width, int height, int color)
- fills the rectangle area of the currently selected script window with the specified color, or clears the window with transparent (index 0) color (call the function without arguments)
- color: the color index in the game palette (from 0 to 255)
------------------------ ------------------------
------ MORE INFO ------- ------ MORE INFO -------
------------------------ ------------------------
+38 -3
View File
@@ -210,7 +210,7 @@ DWORD* ptr_stack_offset = reinterpret_cast<DWORD*>(_stack_offset
DWORD* ptr_stat_data = reinterpret_cast<DWORD*>(_stat_data); DWORD* ptr_stat_data = reinterpret_cast<DWORD*>(_stat_data);
DWORD* ptr_stat_flag = reinterpret_cast<DWORD*>(_stat_flag); DWORD* ptr_stat_flag = reinterpret_cast<DWORD*>(_stat_flag);
SubTitleList** ptr_subtitleList = reinterpret_cast<SubTitleList**>(_subtitleList); SubTitleList** ptr_subtitleList = reinterpret_cast<SubTitleList**>(_subtitleList);
DWORD* ptr_sWindows = reinterpret_cast<DWORD*>(_sWindows); // total 16 sWindow struct sWindow* ptr_sWindows = reinterpret_cast<sWindow*>(_sWindows); // array of 16 sWindow
DWORD* ptr_Tag_ = reinterpret_cast<DWORD*>(_Tag_); DWORD* ptr_Tag_ = reinterpret_cast<DWORD*>(_Tag_);
DWORD* ptr_tag_skill = reinterpret_cast<DWORD*>(_tag_skill); DWORD* ptr_tag_skill = reinterpret_cast<DWORD*>(_tag_skill);
DWORD* ptr_target_curr_stack = reinterpret_cast<DWORD*>(_target_curr_stack); DWORD* ptr_target_curr_stack = reinterpret_cast<DWORD*>(_target_curr_stack);
@@ -352,6 +352,7 @@ const DWORD critter_name_ = 0x42D0A8;
const DWORD critter_pc_set_name_ = 0x42D138; const DWORD critter_pc_set_name_ = 0x42D138;
const DWORD critterClearObjDrugs_ = 0x42DA54; const DWORD critterClearObjDrugs_ = 0x42DA54;
const DWORD critterIsOverloaded_ = 0x42E66C; const DWORD critterIsOverloaded_ = 0x42E66C;
const DWORD datafileConvertData_ = 0x42EE84;
const DWORD db_access_ = 0x4390B4; const DWORD db_access_ = 0x4390B4;
const DWORD db_dir_entry_ = 0x4C5D68; const DWORD db_dir_entry_ = 0x4C5D68;
const DWORD db_fclose_ = 0x4C5EB4; const DWORD db_fclose_ = 0x4C5EB4;
@@ -554,6 +555,7 @@ const DWORD ListSkills_ = 0x436154;
const DWORD ListTraits_ = 0x43B8A8; const DWORD ListTraits_ = 0x43B8A8;
const DWORD loadColorTable_ = 0x4C78E4; const DWORD loadColorTable_ = 0x4C78E4;
const DWORD LoadGame_ = 0x47C640; const DWORD LoadGame_ = 0x47C640;
const DWORD loadPCX_ = 0x496494;
const DWORD loadProgram_ = 0x4A3B74; const DWORD loadProgram_ = 0x4A3B74;
const DWORD LoadSlot_ = 0x47DC68; const DWORD LoadSlot_ = 0x47DC68;
const DWORD load_frame_ = 0x419EC0; const DWORD load_frame_ = 0x419EC0;
@@ -591,6 +593,7 @@ const DWORD move_inventory_ = 0x474708;
const DWORD movieRun_ = 0x487AC8; const DWORD movieRun_ = 0x487AC8;
const DWORD movieStop_ = 0x487150; const DWORD movieStop_ = 0x487150;
const DWORD movieUpdate_ = 0x487BEC; const DWORD movieUpdate_ = 0x487BEC;
const DWORD my_free_ = 0x4C5C2C;
const DWORD new_obj_id_ = 0x4A386C; const DWORD new_obj_id_ = 0x4A386C;
const DWORD NixHotLines_ = 0x4999C0; const DWORD NixHotLines_ = 0x4999C0;
const DWORD nrealloc_ = 0x4F1669; const DWORD nrealloc_ = 0x4F1669;
@@ -718,6 +721,7 @@ const DWORD scr_set_ext_param_ = 0x4A3B34;
const DWORD scr_set_local_var_ = 0x4A6E58; const DWORD scr_set_local_var_ = 0x4A6E58;
const DWORD scr_set_objs_ = 0x4A3B0C; const DWORD scr_set_objs_ = 0x4A3B0C;
const DWORD scr_write_ScriptNode_ = 0x4A5704; const DWORD scr_write_ScriptNode_ = 0x4A5704;
const DWORD selectWindowID_ = 0x4B81C4;
const DWORD set_focus_func_ = 0x4C9438; const DWORD set_focus_func_ = 0x4C9438;
const DWORD set_game_time_ = 0x4A347C; const DWORD set_game_time_ = 0x4A347C;
const DWORD setup_move_timer_win_ = 0x476AB8; const DWORD setup_move_timer_win_ = 0x476AB8;
@@ -1188,6 +1192,23 @@ void __cdecl TransBufToBuf(BYTE* src, long width, long height, long src_width, B
__asm emms; __asm emms;
} }
BYTE* __fastcall LoadPCXData(const char* file, long* width, long* height) {
__asm {
mov eax, ecx;
mov ebx, height;
mov ecx, _pal;
call loadPCX_;
push eax;
mov ebx, [width];
mov edx, _pal;
mov ecx, [height];
mov ebx, [ebx];
mov ecx, [ecx];
call datafileConvertData_;
pop eax;
}
}
long __fastcall GetGameConfigString(const char* outValue, const char* section, const char* param) { long __fastcall GetGameConfigString(const char* outValue, const char* section, const char* param) {
__asm { __asm {
mov ebx, param; mov ebx, param;
@@ -1552,11 +1573,25 @@ void DrawToSurface(long width, long height, long fromX, long fromY, long fromWid
} }
} }
// Fills the specified non-scripted interface window with index color 0 (black color) // Fills the specified interface window with index color
void WinFillRect(long winID, long x, long y, long width, long height, BYTE indexColor) {
WINinfo* win = GNWFind(winID);
BYTE* surf = win->surface + (win->width * y) + x;
long pitch = win->width - width;
while (height--) {
long w = width;
while (w--) *surf++ = indexColor;
surf += pitch;
};
}
// Fills the specified interface window with index color 0 (black color)
void ClearWindow(long winID, bool refresh) { void ClearWindow(long winID, bool refresh) {
WINinfo* win = GNWFind(winID); WINinfo* win = GNWFind(winID);
BYTE* surf = win->surface;
for (long i = 0; i < win->height; i++) { for (long i = 0; i < win->height; i++) {
std::memset(win->surface, 0, win->width); std::memset(surf, 0, win->width);
surf += win->width;
} }
if (refresh) { if (refresh) {
GNWWinRefresh(win, &win->rect, 0); GNWWinRefresh(win, &win->rect, 0);
+13 -2
View File
@@ -106,6 +106,7 @@
#define _folder_card_title2 0x5705BC #define _folder_card_title2 0x5705BC
#define _frame_time 0x5709C4 #define _frame_time 0x5709C4
#define _free_perk 0x570A29 #define _free_perk 0x570A29
#define _freePtr 0x519594
#define _frstc_draw1 0x5707D8 #define _frstc_draw1 0x5707D8
#define _game_config 0x58E950 #define _game_config 0x58E950
#define _game_global_vars 0x5186C0 #define _game_global_vars 0x5186C0
@@ -206,6 +207,7 @@
#define _optionsButtonUpKey 0x518F28 #define _optionsButtonUpKey 0x518F28
#define _optnwin 0x663900 #define _optnwin 0x663900
#define _outlined_object 0x518D94 #define _outlined_object 0x518D94
#define _pal 0x56D7E0
#define _partyMemberAIOptions 0x519DB8 #define _partyMemberAIOptions 0x519DB8
#define _partyMemberCount 0x519DAC #define _partyMemberCount 0x519DAC
#define _partyMemberLevelUpInfoList 0x519DBC #define _partyMemberLevelUpInfoList 0x519DBC
@@ -513,7 +515,7 @@ extern DWORD* ptr_stack_offset;
extern DWORD* ptr_stat_data; extern DWORD* ptr_stat_data;
extern DWORD* ptr_stat_flag; extern DWORD* ptr_stat_flag;
extern SubTitleList** ptr_subtitleList; extern SubTitleList** ptr_subtitleList;
extern DWORD* ptr_sWindows; // total 16 sWindow struct extern sWindow* ptr_sWindows; // array of 16 sWindow
extern DWORD* ptr_Tag_; extern DWORD* ptr_Tag_;
extern DWORD* ptr_tag_skill; extern DWORD* ptr_tag_skill;
extern DWORD* ptr_target_curr_stack; extern DWORD* ptr_target_curr_stack;
@@ -638,6 +640,7 @@ extern const DWORD critter_name_;
extern const DWORD critter_pc_set_name_; extern const DWORD critter_pc_set_name_;
extern const DWORD critterClearObjDrugs_; extern const DWORD critterClearObjDrugs_;
extern const DWORD critterIsOverloaded_; extern const DWORD critterIsOverloaded_;
extern const DWORD datafileConvertData_;
extern const DWORD db_access_; extern const DWORD db_access_;
extern const DWORD db_dir_entry_; extern const DWORD db_dir_entry_;
extern const DWORD db_fclose_; extern const DWORD db_fclose_;
@@ -843,6 +846,7 @@ extern const DWORD ListSkills_;
extern const DWORD ListTraits_; extern const DWORD ListTraits_;
extern const DWORD loadColorTable_; extern const DWORD loadColorTable_;
extern const DWORD LoadGame_; extern const DWORD LoadGame_;
extern const DWORD loadPCX_;
extern const DWORD loadProgram_; // loads script from scripts/ folder by file name and returns pointer to it: char* <eax> - file name (w/o extension) extern const DWORD loadProgram_; // loads script from scripts/ folder by file name and returns pointer to it: char* <eax> - file name (w/o extension)
extern const DWORD LoadSlot_; extern const DWORD LoadSlot_;
extern const DWORD load_frame_; extern const DWORD load_frame_;
@@ -883,6 +887,7 @@ extern const DWORD move_inventory_;
extern const DWORD movieRun_; extern const DWORD movieRun_;
extern const DWORD movieStop_; extern const DWORD movieStop_;
extern const DWORD movieUpdate_; extern const DWORD movieUpdate_;
extern const DWORD my_free_;
extern const DWORD new_obj_id_; extern const DWORD new_obj_id_;
extern const DWORD NixHotLines_; extern const DWORD NixHotLines_;
extern const DWORD nrealloc_; extern const DWORD nrealloc_;
@@ -1013,6 +1018,7 @@ extern const DWORD scr_set_ext_param_;
extern const DWORD scr_set_local_var_; extern const DWORD scr_set_local_var_;
extern const DWORD scr_set_objs_; extern const DWORD scr_set_objs_;
extern const DWORD scr_write_ScriptNode_; extern const DWORD scr_write_ScriptNode_;
extern const DWORD selectWindowID_;
extern const DWORD set_focus_func_; extern const DWORD set_focus_func_;
extern const DWORD set_game_time_; extern const DWORD set_game_time_;
extern const DWORD setup_move_timer_win_; extern const DWORD setup_move_timer_win_;
@@ -1195,6 +1201,8 @@ void __cdecl BufToBuf(BYTE* src, long width, long height, long src_width, BYTE*
// trans_buf_to_buf_ function implementation // trans_buf_to_buf_ function implementation
void __cdecl TransBufToBuf(BYTE* src, long width, long height, long src_width, BYTE* dst, long dst_width); void __cdecl TransBufToBuf(BYTE* src, long width, long height, long src_width, BYTE* dst, long dst_width);
BYTE* __fastcall LoadPCXData(const char* file, long* width, long* height);
long __fastcall GetGameConfigString(const char* outValue, const char* section, const char* param); long __fastcall GetGameConfigString(const char* outValue, const char* section, const char* param);
// X-Macro for wrapper functions. // X-Macro for wrapper functions.
@@ -1334,7 +1342,10 @@ void DrawToSurface(long width, long height, long fromX, long fromY, long fromWid
void DrawToSurface(long width, long height, long fromX, long fromY, long fromWidth, BYTE* fromSurf, long toX, long toY, long toWidth, long toHeight, BYTE* toSurf); void DrawToSurface(long width, long height, long fromX, long fromY, long fromWidth, BYTE* fromSurf, long toX, long toY, long toWidth, long toHeight, BYTE* toSurf);
// Fills the specified non-scripted interface window with index color 0 (black color) // Fills the specified interface window with index color
void WinFillRect(long winID, long x, long y, long width, long height, BYTE indexColor);
// Fills the specified interface window with index color 0 (black color)
void ClearWindow(long winID, bool refresh = true); void ClearWindow(long winID, bool refresh = true);
// Print text to surface // Print text to surface
+1
View File
@@ -187,6 +187,7 @@ WRAP_WATCOM_FUNC3(long, RegisterObjectTakeOut, register_object_take_out_, TGameO
WRAP_WATCOM_FUNC3(long, RegisterObjectTurnTowards, register_object_turn_towards_, TGameObj*, object, long, tileNum, long, nothing) WRAP_WATCOM_FUNC3(long, RegisterObjectTurnTowards, register_object_turn_towards_, TGameObj*, object, long, tileNum, long, nothing)
WRAP_WATCOM_FUNC2(long, RollRandom, roll_random_, long, minValue, long, maxValue) WRAP_WATCOM_FUNC2(long, RollRandom, roll_random_, long, minValue, long, maxValue)
WRAP_WATCOM_FUNC1(long*, RunProgram, runProgram_, TProgram*, progPtr) WRAP_WATCOM_FUNC1(long*, RunProgram, runProgram_, TProgram*, progPtr)
WRAP_WATCOM_FUNC1(long, SelectWindowID, selectWindowID_, long, sWinID)
WRAP_WATCOM_FUNC1(TScript*, ScrFindFirstAt, scr_find_first_at_, long, elevation) WRAP_WATCOM_FUNC1(TScript*, ScrFindFirstAt, scr_find_first_at_, long, elevation)
WRAP_WATCOM_FUNC0(TScript*, ScrFindNextAt, scr_find_next_at_) WRAP_WATCOM_FUNC0(TScript*, ScrFindNextAt, scr_find_next_at_)
WRAP_WATCOM_FUNC1(TGameObj*, ScrFindObjFromProgram, scr_find_obj_from_program_, TProgram*, program) WRAP_WATCOM_FUNC1(TGameObj*, ScrFindObjFromProgram, scr_find_obj_from_program_, TProgram*, program)
+42 -24
View File
@@ -158,8 +158,7 @@ struct CombatGcsd {
struct TScript { struct TScript {
long id; long id;
long next; long next;
// first 3 bits - elevation, rest - tile number long elevationAndTile; // first 3 bits - elevation, rest - tile number
long elevationAndTile;
long spatialRadius; long spatialRadius;
long flags; long flags;
long scriptIdx; long scriptIdx;
@@ -175,31 +174,50 @@ struct TScript {
TGameObj *targetObject; TGameObj *targetObject;
long actionNum; long actionNum;
long scriptOverrides; long scriptOverrides;
char gap_48[4]; long field_48;
long howMuch; long howMuch;
char gap_50[4]; long field_50;
long procedureTable[28]; long procedureTable[28];
}; };
// Script run-time data // Script run-time data
struct TProgram { struct TProgram {
const char* fileName; const char* fileName; // path and file name of the script "scripts\*.int"
long *codeStackPtr; long *codeStackPtr;
long gap_8; long field_8;
long gap_9; long field_C;
long *codePtr; long *codePtr;
long field_14; long field_14;
long gap_18; long field_18;
long *dStackPtr; long *dStackPtr;
long *aStackPtr; long *aStackPtr;
long *dStackOffs; long *dStackOffs;
long *aStackOffs; long *aStackOffs;
long gap_2C; long field_2C;
long *stringRefPtr; long *stringRefPtr;
long gap_34; long field_34; // procTablePtr
long *procTablePtr; long *procTablePtr; // field_38
long regs[12];
long field_6C;
long field_70;
long field_74;
long field_78;
long field_7C;
union {
long flags;
struct {
char flags1;
char flags2;
char flags3;
char flags4;
};
};
long currentScriptWin; // current window for executing script
long field_88;
}; };
static_assert(sizeof(TProgram) == 140, "Incorrect TProgram definition.");
struct ItemButtonItem { struct ItemButtonItem {
TGameObj* item; TGameObj* item;
union { union {
@@ -478,14 +496,14 @@ struct WINinfo {
long width; long width;
long height; long height;
long clearColour; long clearColour;
long rand1; long randX;
long rand2; long randY;
BYTE *surface; // bytes frame data ref to palette BYTE *surface; // bytes frame data ref to palette
long *buttonsList; long *buttonsList;
long unknown5; // buttonptr? long buttonT1; // buttonptr?
long unknown6; long buttonT2;
long *menuBar; long *menuBar;
long *drawFunc; long *drawFunc; // trans_buf_to_buf_
}; };
struct sWindow { struct sWindow {
@@ -493,18 +511,18 @@ struct sWindow {
long wID; long wID;
long width; long width;
long height; long height;
long unknown1; long region1;
long unknown2; long region2;
long unknown3; long region3;
long unknown4; long region4;
long *buttons; long *buttons;
long numButtons; long numButtons;
long unknown5; long setPositionX;
long unknown6; long setPositionY;
long clearColour; long clearColour;
long flags; long flags;
long unknown7; float randX;
long unknown8; float randY;
}; };
struct LSData { struct LSData {
+4 -6
View File
@@ -567,14 +567,12 @@ static void __declspec(naked) main_death_scene_hook() {
} }
static void __declspec(naked) display_body_hook() { static void __declspec(naked) display_body_hook() {
static const DWORD display_body_hook_Ret = 0x47098D;
__asm { __asm {
mov ebx, [esp + 0x60 - 0x28 + 8]; mov ebx, [esp + 0x60 - 0x28 + 8];
cmp ebx, 1; // check mode 0 or 1 cmp ebx, 1; // check mode 0 or 1
jbe fix; jbe fix;
add esp, 8; xor ebx, ebx;
mov dword ptr [esp + 0x60 - 0x40], 0; // frm_ptr jmp art_id_;
jmp display_body_hook_Ret;
fix: fix:
dec edx; // USE.FRM dec edx; // USE.FRM
mov ecx, 48; // INVBOX.FRM mov ecx, 48; // INVBOX.FRM
@@ -618,7 +616,7 @@ void InterfaceInit() {
if (hrpIsEnabled == false || hrpVersionValid) SafeWrite8(0x481345, 4); // main_death_scene_ if (hrpIsEnabled == false || hrpVersionValid) SafeWrite8(0x481345, 4); // main_death_scene_
if (hrpVersionValid) SafeWrite8(HRPAddress(0x10011738), 10); if (hrpVersionValid) SafeWrite8(HRPAddress(0x10011738), 10);
// Cosmetic fix for the background image of the character portrait on the inventory and character screens // Cosmetic fix for the background image of the character portrait on the player's inventory screen
HookCall(0x47093C, display_body_hook); HookCall(0x47093C, display_body_hook);
BYTE code[11] = { BYTE code[11] = {
0x8B, 0xD3, // mov edx, ebx 0x8B, 0xD3, // mov edx, ebx
@@ -626,7 +624,7 @@ void InterfaceInit() {
0x0F, 0xAF, 0xD3, // imul edx, ebx (y * frame width) 0x0F, 0xAF, 0xD3, // imul edx, ebx (y * frame width)
0x53, 0x90 // push ebx (frame width) 0x53, 0x90 // push ebx (frame width)
}; };
SafeWriteBytes(0x470971, code, 11); SafeWriteBytes(0x470971, code, 11); // calculates the offset in the pixel array for x/y coordinates
} }
void InterfaceExit() { void InterfaceExit() {
+1 -5
View File
@@ -346,10 +346,6 @@ static void __declspec(naked) NewGame() {
} }
} }
static void ReadExtraGameMsgFilesIfNeeded() {
if (gExtraGameMsgLists.empty()) ReadExtraGameMsgFiles();
}
static void __declspec(naked) MainMenuHook() { static void __declspec(naked) MainMenuHook() {
__asm { __asm {
pushad; pushad;
@@ -357,7 +353,7 @@ static void __declspec(naked) MainMenuHook() {
call ResetState; call ResetState;
mov al, pipBoyAvailableAtGameStart; mov al, pipBoyAvailableAtGameStart;
mov byte ptr ds:[_gmovie_played_list + 3], al; mov byte ptr ds:[_gmovie_played_list + 3], al;
call ReadExtraGameMsgFilesIfNeeded; call ReadExtraGameMsgFiles;
popad; popad;
jmp main_menu_loop_; jmp main_menu_loop_;
} }
+26 -29
View File
@@ -17,9 +17,10 @@
*/ */
#include <string> #include <string>
#include "main.h"
#include "main.h"
#include "FalloutEngine.h" #include "FalloutEngine.h"
#include "Message.h" #include "Message.h"
#define CASTMSG(adr) reinterpret_cast<MSGList*>(adr) #define CASTMSG(adr) reinterpret_cast<MSGList*>(adr)
@@ -48,6 +49,7 @@ const MSGList* gameMsgFiles[] = {
#undef CASTMSG #undef CASTMSG
ExtraGameMessageListsMap gExtraGameMsgLists; ExtraGameMessageListsMap gExtraGameMsgLists;
static std::vector<std::string> msgFileList;
// Loads the msg file from the 'english' folder if it does not exist in the current language directory // Loads the msg file from the 'english' folder if it does not exist in the current language directory
static void __declspec(naked) message_load_hook() { static void __declspec(naked) message_load_hook() {
@@ -106,40 +108,27 @@ char* GetMsg(MSGList* msgList, int msgRef, int msgNum) {
} }
void ReadExtraGameMsgFiles() { void ReadExtraGameMsgFiles() {
int read; if (!msgFileList.empty()) {
std::string names; int number = 0;
for (std::vector<std::string>::const_iterator it = msgFileList.begin(); it != msgFileList.end(); ++it) {
names.resize(256); std::string path("game\\");
size_t n = it->find(':');
while ((read = GetConfigString("Misc", "ExtraGameMsgFileList", "", if (n == std::string::npos) {
(LPSTR)names.data(), names.size())) == names.size() - 1) path += *it;
names.resize(names.size() + 256); } else {
path += it->substr(0, n);
if (names.empty()) return; number = std::stoi(it->substr(n + 1), nullptr, 0);
}
names.resize(names.find_first_of('\0')); path += ".msg";
names.append(","); MSGList* list = new MSGList();
int begin = 0;
int end;
int length;
int number = 0;
while ((end = names.find_first_of(',', begin)) != std::string::npos) {
length = end - begin;
if (length > 0) {
std::string path = "game\\" + names.substr(begin, length) + ".msg";
MSGList* list = new MSGList;
if (MessageLoad(list, path.c_str()) == 1) { if (MessageLoad(list, path.c_str()) == 1) {
gExtraGameMsgLists.insert(std::make_pair(0x2000 + number, list)); gExtraGameMsgLists.insert(std::make_pair(0x2000 + number, list));
} else { } else {
delete list; delete list;
} }
if (++number == 4096) break;
} }
if (++number == 4096) break; msgFileList.clear();
begin = end + 1;
} }
} }
@@ -156,3 +145,11 @@ void ClearReadExtraGameMsgFiles() {
delete it->second; delete it->second;
} }
} }
void MessageInit() {
msgFileList = GetConfigList("Misc", "ExtraGameMsgFileList", "", 512);
}
void MessageExit() {
//gExtraGameMsgLists.clear();
}
+6 -2
View File
@@ -19,6 +19,7 @@
#pragma once #pragma once
#include <unordered_map> #include <unordered_map>
#include "main.h" #include "main.h"
#define MSG_FILE_COMBAT (0x56D368) #define MSG_FILE_COMBAT (0x56D368)
@@ -46,9 +47,12 @@ typedef std::tr1::unordered_map<int, MSGList*> ExtraGameMessageListsMap;
extern ExtraGameMessageListsMap gExtraGameMsgLists; extern ExtraGameMessageListsMap gExtraGameMsgLists;
extern const MSGList* gameMsgFiles[]; extern const MSGList* gameMsgFiles[];
MSGNode* GetMsgNode(MSGList* msgList, int msgRef); void MessageInit();
char* GetMsg(MSGList* msgList, int msgRef, int msgNum); void MessageExit();
void ReadExtraGameMsgFiles(); void ReadExtraGameMsgFiles();
void FallbackEnglishLoadMsgFiles(); void FallbackEnglishLoadMsgFiles();
void ClearReadExtraGameMsgFiles(); void ClearReadExtraGameMsgFiles();
MSGNode* GetMsgNode(MSGList* msgList, int msgRef);
char* GetMsg(MSGList* msgList, int msgRef, int msgNum);
+12 -8
View File
@@ -206,12 +206,12 @@ class OpcodeHandler {
public: public:
OpcodeHandler() { OpcodeHandler() {
_argShift = 0; _argShift = 0;
_args.reserve(OP_MAX_ARGUMENTS); _args.resize(OP_MAX_ARGUMENTS);
} }
// number of arguments, possibly reduced by argShift // number of arguments, possibly reduced by argShift
int numArgs() const { int numArgs() const {
return _args.size() - _argShift; return _numArgs - _argShift;
} }
// returns current argument shift, default is 0 // returns current argument shift, default is 0
@@ -223,7 +223,6 @@ public:
// for example if shift value is 2, then subsequent calls to arg(i) will return arg(i+2) instead, etc. // for example if shift value is 2, then subsequent calls to arg(i) will return arg(i+2) instead, etc.
void setArgShift(int shift) { void setArgShift(int shift) {
assert(shift >= 0); assert(shift >= 0);
_argShift = shift; _argShift = shift;
} }
@@ -257,10 +256,12 @@ public:
void resetState(TProgram* program, int argNum) { void resetState(TProgram* program, int argNum) {
_program = program; _program = program;
// reset argument list
if (argNum < OP_MAX_ARGUMENTS) std::fill(_args.begin() + argNum, _args.end(), ScriptValue());
// reset return value // reset return value
_ret = ScriptValue(); _ret = ScriptValue();
// reset argument list // reset number of arguments
_args.resize(argNum); _numArgs = argNum;
// reset arg shift // reset arg shift
_argShift = 0; _argShift = 0;
} }
@@ -356,11 +357,13 @@ public:
} }
private: private:
TProgram* _program;
int _argShift;
std::vector<ScriptValue> _args; std::vector<ScriptValue> _args;
ScriptValue _ret; ScriptValue _ret;
TProgram* _program;
int _numArgs;
int _argShift;
}; };
static OpcodeHandler opHandler; static OpcodeHandler opHandler;
@@ -880,6 +883,7 @@ static const SfallOpcodeMetadata opcodeMetaArray[] = {
{mf_tile_by_position, "tile_by_position", {DATATYPE_MASK_INT, DATATYPE_MASK_INT}}, {mf_tile_by_position, "tile_by_position", {DATATYPE_MASK_INT, DATATYPE_MASK_INT}},
{mf_unjam_lock, "unjam_lock", {DATATYPE_MASK_VALID_OBJ}}, {mf_unjam_lock, "unjam_lock", {DATATYPE_MASK_VALID_OBJ}},
{mf_unwield_slot, "unwield_slot", {DATATYPE_MASK_VALID_OBJ, DATATYPE_MASK_INT}}, {mf_unwield_slot, "unwield_slot", {DATATYPE_MASK_VALID_OBJ, DATATYPE_MASK_INT}},
{mf_win_fill_color, "win_fill_color", {DATATYPE_MASK_INT, DATATYPE_MASK_INT, DATATYPE_MASK_INT, DATATYPE_MASK_INT, DATATYPE_MASK_INT}},
#ifndef NDEBUG #ifndef NDEBUG
{mf_test, "validate_test", {DATATYPE_MASK_INT, DATATYPE_MASK_INT | DATATYPE_MASK_FLOAT, DATATYPE_MASK_STR, DATATYPE_NONE}}, {mf_test, "validate_test", {DATATYPE_MASK_INT, DATATYPE_MASK_INT | DATATYPE_MASK_FLOAT, DATATYPE_MASK_STR, DATATYPE_NONE}},
#endif #endif
+104 -83
View File
@@ -340,8 +340,7 @@ static void __declspec(naked) op_is_iface_tag_active() {
} }
static void mf_intface_redraw() { static void mf_intface_redraw() {
DWORD flag = (opHandler.numArgs() > 0) ? opHandler.arg(0).rawValue() : 0; if (opHandler.arg(0).rawValue() == 0) {
if (flag == 0) {
IntfaceRedraw(); IntfaceRedraw();
} else { } else {
RefreshGNW(2); // fake redraw all interfaces (TODO: need a real redraw of interfaces) RefreshGNW(2); // fake redraw all interfaces (TODO: need a real redraw of interfaces)
@@ -445,7 +444,7 @@ static void mf_create_win() {
: WinFlags::MoveOnTop; : WinFlags::MoveOnTop;
if (CreateWindowFunc(opHandler.arg(0).strValue(), if (CreateWindowFunc(opHandler.arg(0).strValue(),
opHandler.arg(1).rawValue(), opHandler.arg(2).rawValue(), // y, x opHandler.arg(1).rawValue(), opHandler.arg(2).rawValue(), // x, y
opHandler.arg(3).rawValue(), opHandler.arg(4).rawValue(), // w, h opHandler.arg(3).rawValue(), opHandler.arg(4).rawValue(), // w, h
(flags & WinFlags::Transparent) ? 0 : 256, flags) == -1) (flags & WinFlags::Transparent) ? 0 : 256, flags) == -1)
{ {
@@ -457,11 +456,9 @@ static void mf_create_win() {
static void mf_show_window() { static void mf_show_window() {
if (opHandler.numArgs() > 0) { if (opHandler.numArgs() > 0) {
const char* name = opHandler.arg(0).strValue(); const char* name = opHandler.arg(0).strValue();
sWindow sWin;
for (size_t i = 0; i < 16; i++) { for (size_t i = 0; i < 16; i++) {
sWin = *(sWindow*)&ptr_sWindows[i * 23]; // sWindow struct = 92 bytes if (_stricmp(name, ptr_sWindows[i].name) == 0) {
if (_stricmp(name, sWin.name) == 0) { WinShow(ptr_sWindows[i].wID);
WinShow(sWin.wID);
return; return;
} }
} }
@@ -474,11 +471,9 @@ static void mf_show_window() {
static void mf_hide_window() { static void mf_hide_window() {
if (opHandler.numArgs() > 0) { if (opHandler.numArgs() > 0) {
const char* name = opHandler.arg(0).strValue(); const char* name = opHandler.arg(0).strValue();
sWindow sWin;
for (size_t i = 0; i < 16; i++) { for (size_t i = 0; i < 16; i++) {
sWin = *(sWindow*)&ptr_sWindows[i * 23]; // sWindow struct = 92 bytes if (_stricmp(name, ptr_sWindows[i].name) == 0) {
if (_stricmp(name, sWin.name) == 0) { WinHide(ptr_sWindows[i].wID);
WinHide(sWin.wID);
return; return;
} }
} }
@@ -503,16 +498,14 @@ static void mf_set_window_flag() {
bool mode = opHandler.arg(2).asBool(); bool mode = opHandler.arg(2).asBool();
if (opHandler.arg(0).isString()) { if (opHandler.arg(0).isString()) {
const char* name = opHandler.arg(0).strValue(); const char* name = opHandler.arg(0).strValue();
sWindow sWin;
for (size_t i = 0; i < 16; i++) { for (size_t i = 0; i < 16; i++) {
sWin = *(sWindow*)&ptr_sWindows[i * 23]; // sWindow struct = 92 bytes if (_stricmp(name, ptr_sWindows[i].name) == 0) {
if (_stricmp(name, sWin.name) == 0) { WINinfo* win = GNWFind(ptr_sWindows[i].wID);
WINinfo* win = GNWFind(sWin.wID);
if (mode) { if (mode) {
sWin.flags |= bitFlag; ptr_sWindows[i].flags |= bitFlag;
win->flags |= bitFlag; win->flags |= bitFlag;
} else { } else {
sWin.flags &= ~bitFlag; ptr_sWindows[i].flags &= ~bitFlag;
win->flags &= ~bitFlag; win->flags &= ~bitFlag;
} }
return; return;
@@ -531,6 +524,45 @@ static void mf_set_window_flag() {
} }
} }
static void __fastcall FreeArtFile(FrmFile* frmPtr) {
if (frmPtr->id == 'PCX') {
__asm mov eax, frmPtr;
__asm mov eax, [eax]frmPtr.pixelData;
__asm call ds:[_freePtr];
delete[] frmPtr;
} else {
__asm mov eax, frmPtr;
__asm call my_free_;
}
}
static FrmFile* LoadArtFile(const char* file, long frame, long direction, FrmFrameData* &framePtr, bool checkPCX) {
FrmFile* frmPtr = nullptr;
if (checkPCX) {
const char* pos = strrchr(file, '.');
if (pos && _stricmp(++pos, "PCX") == 0) {
long w, h;
BYTE* data = LoadPCXData(file, &w, &h);
if (!data) return nullptr;
frmPtr = reinterpret_cast<FrmFile*>(new BYTE[78]);
std::memset(frmPtr, 0, 74);
frmPtr->id = 'PCX';
frmPtr->width = static_cast<short>(w);
frmPtr->height = static_cast<short>(h);
frmPtr->pixelData = data;
framePtr = frmPtr->GetFrameData(0, 0);
return frmPtr;
}
}
if (LoadFrame(file, &frmPtr)) {
return nullptr;
}
framePtr = frmPtr->GetFrameData(direction, frame);
return frmPtr;
}
static long GetArtFIDFile(long fid, const char* &file) { static long GetArtFIDFile(long fid, const char* &file) {
long direction = 0; long direction = 0;
long _fid = fid & 0xFFFFFFF; long _fid = fid & 0xFFFFFFF;
@@ -544,25 +576,17 @@ static long GetArtFIDFile(long fid, const char* &file) {
return direction; return direction;
} }
static FrmFile* LoadArtFile(const char* file, long frame, long direction, FrmFrameData* &framePtr) {
FrmFile* frmPtr = nullptr;
if (LoadFrame(file, &frmPtr)) {
return nullptr;
}
framePtr = frmPtr->GetFrameData(direction, frame);
return frmPtr;
}
static void mf_draw_image() { static void mf_draw_image() {
if (*(DWORD*)_currentWindow == -1) { if (!SelectWindowID(opHandler.program()->currentScriptWin) || *(DWORD*)_currentWindow == -1) {
opHandler.printOpcodeError("draw_image() - no created/selected window for the image."); opHandler.printOpcodeError("draw_image() - no created or selected window.");
opHandler.setReturn(0); opHandler.setReturn(0);
return; return;
} }
long direction = 0; long direction = 0;
const char* file = nullptr; const char* file = nullptr;
if (opHandler.arg(0).isInt()) { // art id
bool isID = opHandler.arg(0).isInt();
if (isID) { // art id
long fid = opHandler.arg(0).rawValue(); long fid = opHandler.arg(0).rawValue();
if (fid == -1) { if (fid == -1) {
opHandler.setReturn(-1); opHandler.setReturn(-1);
@@ -572,43 +596,35 @@ static void mf_draw_image() {
} else { } else {
file = opHandler.arg(0).strValue(); // path to frm/pcx file file = opHandler.arg(0).strValue(); // path to frm/pcx file
} }
// initialize other args
int frameno = 0, x = 0, y = 0, noTrans = 0;
switch (opHandler.numArgs()) {
case 5:
noTrans = opHandler.arg(4).rawValue();
case 4:
y = opHandler.arg(3).rawValue();
case 3:
x = opHandler.arg(2).rawValue();
case 2:
frameno = opHandler.arg(1).rawValue();
}
FrmFrameData* framePtr; FrmFrameData* framePtr;
FrmFile* frmPtr = LoadArtFile(file, frameno, direction, framePtr); FrmFile* frmPtr = LoadArtFile(file, opHandler.arg(1).rawValue(), direction, framePtr, !isID);
if (frmPtr == nullptr) { if (frmPtr == nullptr) {
opHandler.printOpcodeError("draw_image() - cannot open the file: %s", file); opHandler.printOpcodeError("draw_image() - cannot open the file: %s", file);
opHandler.setReturn(-1); opHandler.setReturn(-1);
return; return;
} }
BYTE* pixelData = (frmPtr->id == 'PCX') ? frmPtr->pixelData : framePtr->data;
int x = opHandler.arg(2).rawValue(), y = opHandler.arg(3).rawValue();
// with x/y frame offsets // with x/y frame offsets
WindowDisplayBuf(x + frmPtr->xshift[direction], framePtr->width, y + frmPtr->yshift[direction], framePtr->height, framePtr->data, noTrans); WindowDisplayBuf(x + frmPtr->xshift[direction], framePtr->width, y + frmPtr->yshift[direction], framePtr->height, pixelData, opHandler.arg(4).rawValue());
MemFree(frmPtr); FreeArtFile(frmPtr);
opHandler.setReturn(1); opHandler.setReturn(1);
} }
static void mf_draw_image_scaled() { static void mf_draw_image_scaled() {
if (*(DWORD*)_currentWindow == -1) { if (!SelectWindowID(opHandler.program()->currentScriptWin) || *(DWORD*)_currentWindow == -1) {
opHandler.printOpcodeError("draw_image_scaled() - no created/selected window for the image."); opHandler.printOpcodeError("draw_image_scaled() - no created or selected window.");
opHandler.setReturn(0); opHandler.setReturn(0);
return; return;
} }
long direction = 0; long direction = 0;
const char* file = nullptr; const char* file = nullptr;
if (opHandler.arg(0).isInt()) { // art id
bool isID = opHandler.arg(0).isInt();
if (isID) { // art id
long fid = opHandler.arg(0).rawValue(); long fid = opHandler.arg(0).rawValue();
if (fid == -1) { if (fid == -1) {
opHandler.setReturn(-1); opHandler.setReturn(-1);
@@ -618,39 +634,28 @@ static void mf_draw_image_scaled() {
} else { } else {
file = opHandler.arg(0).strValue(); // path to frm/pcx file file = opHandler.arg(0).strValue(); // path to frm/pcx file
} }
// initialize other args
int frameno = 0, x = 0, y = 0, wsize = 0;
switch (opHandler.numArgs()) {
case 6:
case 5:
wsize = opHandler.arg(4).rawValue();
case 4:
y = opHandler.arg(3).rawValue();
case 3:
x = opHandler.arg(2).rawValue();
case 2:
frameno = opHandler.arg(1).rawValue();
}
FrmFrameData* framePtr; FrmFrameData* framePtr;
FrmFile* frmPtr = LoadArtFile(file, frameno, direction, framePtr); FrmFile* frmPtr = LoadArtFile(file, opHandler.arg(1).rawValue(), direction, framePtr, !isID);
if (frmPtr == nullptr) { if (frmPtr == nullptr) {
opHandler.printOpcodeError("draw_image_scaled() - cannot open the file: %s", file); opHandler.printOpcodeError("draw_image_scaled() - cannot open the file: %s", file);
opHandler.setReturn(-1); opHandler.setReturn(-1);
return; return;
} }
long result = 1; long result = 1;
BYTE* pixelData = (frmPtr->id == 'PCX') ? frmPtr->pixelData : framePtr->data;
if (opHandler.numArgs() < 3) { if (opHandler.numArgs() < 3) {
DisplayInWindow(framePtr->width, framePtr->width, framePtr->height, framePtr->data); // scaled to window size (w/o transparent) DisplayInWindow(framePtr->width, framePtr->width, framePtr->height, pixelData); // scaled to window size (w/o transparent)
} else { } else {
int x = opHandler.arg(2).rawValue(), y = opHandler.arg(3).rawValue();
// draw to scale // draw to scale
long s_width, s_height; long s_width, s_height;
if (opHandler.numArgs() < 5) { if (opHandler.numArgs() < 5) {
s_width = framePtr->width; s_width = framePtr->width;
s_height = framePtr->height; s_height = framePtr->height;
} else { } else {
s_width = wsize; s_width = opHandler.arg(4).rawValue();
s_height = (opHandler.numArgs() > 5) ? opHandler.arg(5).rawValue() : -1; s_height = (opHandler.numArgs() > 5) ? opHandler.arg(5).rawValue() : -1;
} }
// scale with aspect ratio if w or h is set to -1 // scale with aspect ratio if w or h is set to -1
@@ -666,11 +671,11 @@ static void mf_draw_image_scaled() {
long w_width = WindowWidth(); long w_width = WindowWidth();
long xy_pos = (y * w_width) + x; long xy_pos = (y * w_width) + x;
WindowTransCscale(framePtr->width, framePtr->height, s_width, s_height, xy_pos, w_width, framePtr->data); // custom scaling WindowTransCscale(framePtr->width, framePtr->height, s_width, s_height, xy_pos, w_width, pixelData); // custom scaling
} }
exit: exit:
MemFree(frmPtr); FreeArtFile(frmPtr);
opHandler.setReturn(result); opHandler.setReturn(result);
} }
@@ -682,12 +687,11 @@ static void mf_interface_art_draw() {
bool useShift = false; bool useShift = false;
long direction = -1, w = -1, h = -1; long direction = -1, w = -1, h = -1;
if (opHandler.arg(1).isInt()) { // art id bool isID = opHandler.arg(1).isInt();
if (isID) { // art id
long fid = opHandler.arg(1).rawValue(); long fid = opHandler.arg(1).rawValue();
if (fid == -1) { if (fid == -1) goto exit;
result = -1;
goto exit;
}
useShift = (((fid & 0xF000000) >> 24) == OBJ_TYPE_CRITTER); useShift = (((fid & 0xF000000) >> 24) == OBJ_TYPE_CRITTER);
direction = GetArtFIDFile(fid, file); direction = GetArtFIDFile(fid, file);
} else { } else {
@@ -703,13 +707,12 @@ static void mf_interface_art_draw() {
if (size > 2) h = sArray->val[2].intVal; if (size > 2) h = sArray->val[2].intVal;
} }
} }
long frame = (opHandler.numArgs() > 4) ? opHandler.arg(4).rawValue() : 0; long frame = opHandler.arg(4).rawValue();
FrmFrameData* framePtr; FrmFrameData* framePtr;
FrmFile* frmPtr = LoadArtFile(file, frame, direction, framePtr); FrmFile* frmPtr = LoadArtFile(file, frame, direction, framePtr, !isID);
if (frmPtr == nullptr) { if (frmPtr == nullptr) {
opHandler.printOpcodeError("interface_art_draw() - cannot open the file: %s", file); opHandler.printOpcodeError("interface_art_draw() - cannot open the file: %s", file);
result = -1;
goto exit; goto exit;
} }
int x = opHandler.arg(2).rawValue(); int x = opHandler.arg(2).rawValue();
@@ -725,14 +728,15 @@ static void mf_interface_art_draw() {
int width = (w >= 0) ? w : framePtr->width; int width = (w >= 0) ? w : framePtr->width;
int height = (h >= 0) ? h : framePtr->height; int height = (h >= 0) ? h : framePtr->height;
TransCscale(framePtr->data, framePtr->width, framePtr->height, framePtr->width, TransCscale(((frmPtr->id == 'PCX') ? frmPtr->pixelData : framePtr->data), framePtr->width, framePtr->height, framePtr->width,
interfaceWin->surface + (y * interfaceWin->width) + x, width, height, interfaceWin->width interfaceWin->surface + (y * interfaceWin->width) + x, width, height, interfaceWin->width
); );
if (!(opHandler.arg(0).rawValue() & 0x1000000)) { if (!(opHandler.arg(0).rawValue() & 0x1000000)) {
GNWWinRefresh(interfaceWin, &interfaceWin->rect, 0); GNWWinRefresh(interfaceWin, &interfaceWin->rect, 0);
} }
MemFree(frmPtr);
FreeArtFile(frmPtr);
result = 1; result = 1;
} else { } else {
opHandler.printOpcodeError("interface_art_draw() - the game interface window is not created or invalid value for the interface."); opHandler.printOpcodeError("interface_art_draw() - the game interface window is not created or invalid value for the interface.");
@@ -804,11 +808,9 @@ static void mf_unwield_slot() {
} }
static void mf_get_window_attribute() { static void mf_get_window_attribute() {
long attr = (opHandler.numArgs() > 1) ? opHandler.arg(1).rawValue() : 0;
WINinfo* win = Interface_GetWindow(opHandler.arg(0).rawValue()); WINinfo* win = Interface_GetWindow(opHandler.arg(0).rawValue());
if (win == nullptr) { if (win == nullptr) {
if (attr != 0) { if (opHandler.arg(1).rawValue() != 0) {
opHandler.printOpcodeError("get_window_attribute() - failed to get the interface window."); opHandler.printOpcodeError("get_window_attribute() - failed to get the interface window.");
opHandler.setReturn(-1); opHandler.setReturn(-1);
} }
@@ -820,15 +822,15 @@ static void mf_get_window_attribute() {
return; return;
} }
long result = 0; long result = 0;
switch (attr) { switch (opHandler.arg(1).rawValue()) {
case 0: // check if window exists case 0: // check if window exists
result = 1; result = 1;
break; break;
case 1: // x case 1: // x
result = win->wRect.left; result = win->rect.x;
break; break;
case 2: // y case 2: // y
result = win->wRect.top; result = win->rect.y;
break; break;
} }
opHandler.setReturn(result); opHandler.setReturn(result);
@@ -849,7 +851,7 @@ static void mf_interface_print() { // same as vanilla PrintRect
if (y < 0) y = 0; if (y < 0) y = 0;
long color = opHandler.arg(4).rawValue(); long color = opHandler.arg(4).rawValue();
long width = (opHandler.numArgs() > 5) ? opHandler.arg(5).rawValue() : 0; long width = opHandler.arg(5).rawValue();
int maxHeight = win->height - y; int maxHeight = win->height - y;
int maxWidth = win->width - x; int maxWidth = win->width - x;
@@ -873,3 +875,22 @@ static void mf_interface_print() { // same as vanilla PrintRect
// no redraw (textdirect) // no redraw (textdirect)
if (!(color & 0x1000000)) GNWWinRefresh(win, &win->rect, 0); if (!(color & 0x1000000)) GNWWinRefresh(win, &win->rect, 0);
} }
static void mf_win_fill_color() {
long result = SelectWindowID(opHandler.program()->currentScriptWin);
long iWin = *(DWORD*)_currentWindow;
if (!result || iWin == -1) {
opHandler.printOpcodeError("win_fill_color() - no created or selected window.");
opHandler.setReturn(-1);
return;
}
if (opHandler.numArgs() > 0) {
WinFillRect(ptr_sWindows[iWin].wID,
opHandler.arg(0).rawValue(), opHandler.arg(1).rawValue(), // x, y
opHandler.arg(2).rawValue(), opHandler.arg(3).rawValue(), // w, h
static_cast<BYTE>(opHandler.arg(4).rawValue())
);
} else {
ClearWindow(ptr_sWindows[iWin].wID, false); // full clear
}
}
+1
View File
@@ -184,6 +184,7 @@ static const SfallMetarule metaruleArray[] = {
{"tile_refresh_display", mf_tile_refresh_display, 0, 0}, {"tile_refresh_display", mf_tile_refresh_display, 0, 0},
{"unjam_lock", mf_unjam_lock, 1, 1}, {"unjam_lock", mf_unjam_lock, 1, 1},
{"unwield_slot", mf_unwield_slot, 2, 2}, {"unwield_slot", mf_unwield_slot, 2, 2},
{"win_fill_color", mf_win_fill_color, 0, 5},
#ifndef NDEBUG #ifndef NDEBUG
{"validate_test", mf_test, 2, 5}, {"validate_test", mf_test, 2, 5},
#endif #endif
+1 -1
View File
@@ -639,7 +639,7 @@ static void mf_set_object_data() {
static void mf_set_unique_id() { static void mf_set_unique_id() {
TGameObj* obj = opHandler.arg(0).object(); TGameObj* obj = opHandler.arg(0).object();
long id; long id;
if (opHandler.numArgs() > 1 && opHandler.arg(1).rawValue() == -1) { if (opHandler.arg(1).rawValue() == -1) {
id = NewObjId(); id = NewObjId();
obj->id = id; obj->id = id;
} else { } else {
+13 -6
View File
@@ -164,21 +164,28 @@ static bool LoadFrm(Frm* frm) {
return true; return true;
} }
static WINinfo* dialogWin = nullptr; static struct DialogWinPos {
long x;
long y;
DialogWinPos() : x(-1) {}
} dialogWinPos;
static void __fastcall DrawHeadFrame(Frm* frm, int frameno) { static void __fastcall DrawHeadFrame(Frm* frm, int frameno) {
if (frm && !frm->broken) { if (frm && !frm->broken) {
if (!frm->loaded && !LoadFrm(frm)) goto loadFail; if (!frm->loaded && !LoadFrm(frm)) goto loadFail;
FrmFrameData* frame = FramePtr((FrmHeaderData*)frm, frameno, 0); FrmFrameData* frame = FramePtr((FrmHeaderData*)frm, frameno, 0);
if (dialogWin == nullptr) { if (dialogWinPos.x == -1) {
dialogWin = GNWFind(*ptr_dialogueBackWindow); WINinfo* dialogWin = GNWFind(*ptr_dialogueBackWindow);
dialogWinPos.x = dialogWin->rect.x;
dialogWinPos.y = dialogWin->rect.y;
} }
Gfx_SetHeadTex(frm->textures[frameno], Gfx_SetHeadTex(frm->textures[frameno],
frame->width, frame->width,
frame->height, frame->height,
frame->x + frm->xshift + dialogWin->wRect.left, frame->x + frm->xshift + dialogWinPos.x,
frame->y + frm->yshift + dialogWin->wRect.top frame->y + frm->yshift + dialogWinPos.y
); );
showHighlights = frm->showHighlights; showHighlights = frm->showHighlights;
return; return;
@@ -207,7 +214,7 @@ void __declspec(naked) gdDestroyHeadWindow_hack() {
__asm { __asm {
call Gfx_SetDefaultTechnique; call Gfx_SetDefaultTechnique;
mov showHighlights, 0; mov showHighlights, 0;
//mov dialogWin, 0; // uncomment if the dialog window position is supposed to change //mov dword ptr ds:[dialogWinPos], -1; // uncomment if the dialog window position is supposed to change
pop ebp; pop ebp;
pop edi; pop edi;
pop edx; pop edx;
+4 -1
View File
@@ -254,6 +254,9 @@ static void DllMain2() {
dlogr("Running ExplosionInit().", DL_INIT); dlogr("Running ExplosionInit().", DL_INIT);
ExplosionInit(); ExplosionInit();
dlogr("Running MessageInit().", DL_INIT);
MessageInit();
dlogr("Running ElevatorsInit().", DL_INIT); dlogr("Running ElevatorsInit().", DL_INIT);
ElevatorsInit(); ElevatorsInit();
@@ -304,7 +307,7 @@ static void __stdcall OnExit() {
ConsoleExit(); ConsoleExit();
ExtraSaveSlotsExit(); ExtraSaveSlotsExit();
BooksExit(); BooksExit();
//gExtraGameMsgLists.clear(); MessageExit();
AnimationsExit(); AnimationsExit();
BarBoxesExit(); BarBoxesExit();
HeroAppearanceModExit(); HeroAppearanceModExit();
+3 -3
View File
@@ -25,10 +25,10 @@
#define VERSION_MAJOR 3 #define VERSION_MAJOR 3
#define VERSION_MINOR 8 #define VERSION_MINOR 8
#define VERSION_BUILD 28 #define VERSION_BUILD 28
#define VERSION_REV 0 #define VERSION_REV 1
#ifdef WIN2K #ifdef WIN2K
#define VERSION_STRING "3.8.28 win2k" #define VERSION_STRING "3.8.28.1 win2k"
#else #else
#define VERSION_STRING "3.8.28" #define VERSION_STRING "3.8.28.1"
#endif #endif