diff --git a/common/main/collide.h b/common/main/collide.h index 783c13a60..5bd332e35 100644 --- a/common/main/collide.h +++ b/common/main/collide.h @@ -70,11 +70,11 @@ void collide_player_and_nasty_robot(vmobjptridx_t player, vmobjptridx_t robot, c void net_destroy_controlcen(imobjptridx_t controlcen); void collide_live_local_player_and_powerup(const vmobjptridx_t powerup); #if defined(DXX_BUILD_DESCENT_I) -#define check_effect_blowup(Vclip,seg,side,pnt,blower,force_blowup_flag,remote) check_effect_blowup(Vclip,seg,side,pnt) +#define check_effect_blowup(Delta_lights,Dl_indices,Vclip,seg,side,pnt,blower,force_blowup_flag,remote) check_effect_blowup(Vclip,seg,side,pnt) #endif #ifdef dsx namespace dsx { -int check_effect_blowup(const d_vclip_array &Vclip, vmsegptridx_t seg,int side,const vms_vector &pnt, const laser_parent &blower, int force_blowup_flag, int remote); +int check_effect_blowup(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, const d_vclip_array &Vclip, vmsegptridx_t seg,int side,const vms_vector &pnt, const laser_parent &blower, int force_blowup_flag, int remote); } #endif void apply_damage_to_controlcen(vmobjptridx_t controlcen, fix damage, vcobjptr_t who); diff --git a/common/main/fwd-segment.h b/common/main/fwd-segment.h index ba3682965..c660822f1 100644 --- a/common/main/fwd-segment.h +++ b/common/main/fwd-segment.h @@ -145,10 +145,9 @@ constexpr std::integral_constant MAX_DELTA_LIGHTS{}; // Orig constexpr std::integral_constant DL_SCALE{}; // Divide light to allow 3 bits integer, 5 bits fraction. -extern array Delta_lights; +using d_delta_light_array = array; +extern d_delta_light_array Delta_lights; -int subtract_light(vmsegptridx_t segnum, sidenum_fast_t sidenum); -int add_light(vmsegptridx_t segnum, sidenum_fast_t sidenum); void clear_light_subtracted(); void segment2_write(vcsegptr_t s2, PHYSFS_File *fp); @@ -164,6 +163,8 @@ using dlindexnum_t = uint16_t; DXX_VALPTRIDX_DECLARE_SUBTYPE(dsx::, dl_index, dlindexnum_t, 500); namespace dsx { DXX_VALPTRIDX_DEFINE_SUBTYPE_TYPEDEFS(dl_index, dlindex); +int subtract_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, vmsegptridx_t segnum, sidenum_fast_t sidenum); +int add_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, vmsegptridx_t segnum, sidenum_fast_t sidenum); } #endif diff --git a/common/main/gamesave.h b/common/main/gamesave.h index eb3c4245a..f67fbe0e8 100644 --- a/common/main/gamesave.h +++ b/common/main/gamesave.h @@ -30,6 +30,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "pstypes.h" #ifdef __cplusplus +#include "fwd-segment.h" #define D1X_LEVEL_FILE_EXTENSION "RDL" #define D2X_LEVEL_FILE_EXTENSION "RL2" @@ -52,10 +53,18 @@ int get_level_name(void); #ifdef dsx namespace dsx { -extern int load_level(const char *filename); +int load_level( +#if defined(DXX_BUILD_DESCENT_II) + d_delta_light_array &Delta_lights, dl_index_array &Dl_indices, +#endif + const char *filename); +int save_level( +#if defined(DXX_BUILD_DESCENT_II) + const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, +#endif + const char *filename); } #endif -extern int save_level(const char *filename); extern char Gamesave_current_filename[PATH_MAX]; diff --git a/common/main/gameseg.h b/common/main/gameseg.h index 60dc0ef76..e6a919546 100644 --- a/common/main/gameseg.h +++ b/common/main/gameseg.h @@ -217,7 +217,7 @@ unsigned set_segment_depths(int start_seg, array *limit, se static inline void flush_fcd_cache() {} #elif defined(DXX_BUILD_DESCENT_II) void flush_fcd_cache(); -void apply_all_changed_light(void); +void apply_all_changed_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, fvmsegptridx &vmsegptridx); void set_ambient_sound_flags(void); #endif } diff --git a/common/main/state.h b/common/main/state.h index d9f8c001c..894af7286 100644 --- a/common/main/state.h +++ b/common/main/state.h @@ -86,10 +86,6 @@ int state_get_game_id(const char *filename); namespace dsx { #if defined(DXX_BUILD_DESCENT_I) int state_restore_all_sub(const char *filename); -static inline int state_restore_all_sub(const char *filename, secret_restore) -{ - return state_restore_all_sub(filename); -} static inline void set_pos_from_return_segment(void) { } @@ -115,7 +111,7 @@ static inline void init_player_stats_level(player &p, object &o, secret_restore) init_player_stats_level(p, o); } #elif defined(DXX_BUILD_DESCENT_II) -int state_restore_all_sub(const char *filename, secret_restore); +int state_restore_all_sub(const dl_index_array &Dl_indices, secret_restore, const char *filename); void set_pos_from_return_segment(void); int state_save_all(secret_save, blind_save); int state_restore_all(int in_game, secret_restore, const char *filename_override, blind_save); diff --git a/similar/editor/kbuild.cpp b/similar/editor/kbuild.cpp index 080b51f4b..3e06d91bb 100644 --- a/similar/editor/kbuild.cpp +++ b/similar/editor/kbuild.cpp @@ -102,7 +102,11 @@ int CreateSloppyAdjacentJoint() int adj_side; imsegptridx_t adj_sp = segment_none; - save_level("SLOPPY.LVL"); + save_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + "SLOPPY.LVL"); if (med_find_closest_threshold_segment_side(Cursegp, Curside, adj_sp, &adj_side, 20*F1_0)) { if (Cursegp->children[Curside] != adj_sp) { diff --git a/similar/editor/kgame.cpp b/similar/editor/kgame.cpp index 3f86ee32b..a44cf68d0 100644 --- a/similar/editor/kgame.cpp +++ b/similar/editor/kgame.cpp @@ -117,7 +117,11 @@ int SaveGameData() else Perm_player_segnum=segment_none; //position was bogus } - saved_flag=save_level(game_filename); + saved_flag = save_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + game_filename); if (Perm_player_segnum!=segment_none) { if (save_segnum > Highest_segment_index) @@ -150,7 +154,11 @@ if (SafetyCheck()) { if (ui_get_filename( game_filename, "*." DXX_LEVEL_FILE_EXTENSION, "Load Level" )) { checkforgamext(game_filename); - if (load_level(game_filename)) + if (load_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + game_filename)) return 0; Current_level_num = 1; // assume level 1 gamestate = editor_gamestate::none; diff --git a/similar/editor/med.cpp b/similar/editor/med.cpp index a55179ce3..dddcc955f 100644 --- a/similar/editor/med.cpp +++ b/similar/editor/med.cpp @@ -281,7 +281,11 @@ int GotoGameScreen() // Always use the simple mission when playing level (for now at least) create_new_mission(); Current_level_num = 1; - if (save_level("GAMESAVE.LVL")) + if (save_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + "GAMESAVE.LVL")) return 0; editor_status("Level saved.\n"); break; @@ -937,11 +941,12 @@ static void close_editor() break; case editor_gamestate::saved: - state_restore_all_sub(PLAYER_DIRECTORY_STRING("gamesave.sge") + state_restore_all_sub( #if defined(DXX_BUILD_DESCENT_II) - , secret_restore::none + Dl_indices, secret_restore::none, #endif - ); + PLAYER_DIRECTORY_STRING("gamesave.sge") + ); break; default: @@ -996,11 +1001,12 @@ void gamestate_restore_check() Save_position.orient = ConsoleObject->orient; Save_position.segnum = ConsoleObject->segnum; - if (!state_restore_all_sub(PLAYER_DIRECTORY_STRING("gamesave.sge") + if (!state_restore_all_sub( #if defined(DXX_BUILD_DESCENT_II) - , secret_restore::none + Dl_indices, secret_restore::none, #endif - )) + PLAYER_DIRECTORY_STRING("gamesave.sge") + )) return; // Switch back to slew mode - loading saved game made ConsoleObject flying @@ -1025,11 +1031,12 @@ int RestoreGameState() if (!SafetyCheck()) return 0; - if (!state_restore_all_sub(PLAYER_DIRECTORY_STRING("gamesave.sge") + if (!state_restore_all_sub( #if defined(DXX_BUILD_DESCENT_II) - , secret_restore::none + Dl_indices, secret_restore::none, #endif - )) + PLAYER_DIRECTORY_STRING("gamesave.sge") + )) return 0; // Switch back to slew mode - loading saved game made ConsoleObject flying diff --git a/similar/editor/texpage.cpp b/similar/editor/texpage.cpp index 6149861ff..3c242a8c5 100644 --- a/similar/editor/texpage.cpp +++ b/similar/editor/texpage.cpp @@ -301,16 +301,32 @@ void do_replacements_all(void) { for (int i = 0; i < Last_level; i++) { - load_level(Level_names[i]); + load_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + Level_names[i]); do_replacements(); - save_level(Level_names[i]); + save_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + Level_names[i]); } for (int i = 0; i < -Last_secret_level; i++) { - load_level(Secret_level_names[i]); + load_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + Secret_level_names[i]); do_replacements(); - save_level(Secret_level_names[i]); + save_level( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + Secret_level_names[i]); } } diff --git a/similar/main/collide.cpp b/similar/main/collide.cpp index 731e42670..26493af25 100644 --- a/similar/main/collide.cpp +++ b/similar/main/collide.cpp @@ -538,7 +538,7 @@ static int effect_parent_is_guidebot(fvcobjptr &vcobjptr, const laser_parent &la //if an effect is hit, and it can blow up, then blow it up //returns true if it blew up -int check_effect_blowup(const d_vclip_array &Vclip, const vmsegptridx_t seg,int side,const vms_vector &pnt, const laser_parent &blower, int force_blowup_flag, int remote) +int check_effect_blowup(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, const d_vclip_array &Vclip, const vmsegptridx_t seg,int side,const vms_vector &pnt, const laser_parent &blower, int force_blowup_flag, int remote) { int tm; @@ -613,7 +613,7 @@ int check_effect_blowup(const d_vclip_array &Vclip, const vmsegptridx_t seg,int //note: this must get called before the texture changes, //because we use the light value of the texture to change //the static light in the segment - subtract_light(seg,side); + subtract_light(Delta_lights, Dl_indices, seg, side); // we blew up something connected to a trigger. Send it to others! if ((Game_mode & GM_MULTI) && is_trigger && !remote && !force_blowup_flag) @@ -702,7 +702,11 @@ int check_effect_blowup(const d_vclip_array &Vclip, const vmsegptridx_t seg,int // int Show_seg_and_side = 0; namespace dsx { -static window_event_result collide_weapon_and_wall(object_array &Objects, fvmsegptridx &vmsegptridx, const vmobjptridx_t weapon, const vmsegptridx_t hitseg, const unsigned hitwall, const vms_vector &hitpt) +static window_event_result collide_weapon_and_wall( +#if defined(DXX_BUILD_DESCENT_II) + const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, +#endif + object_array &Objects, fvmsegptridx &vmsegptridx, const vmobjptridx_t weapon, const vmsegptridx_t hitseg, const unsigned hitwall, const vms_vector &hitpt) { auto &imobjptridx = Objects.imptridx; auto &vcobjptr = Objects.vcptr; @@ -746,9 +750,9 @@ static window_event_result collide_weapon_and_wall(object_array &Objects, fvmseg // MK: Real pain when you need to know a seg:side and you've got quad lasers. HUD_init_message(HM_DEFAULT, "Hit at segment = %hu, side = %i", static_cast(hitseg), hitwall); if (get_weapon_id(weapon) < 4) - subtract_light(hitseg, hitwall); + subtract_light(Delta_lights, Dl_indices, hitseg, hitwall); else if (get_weapon_id(weapon) == weapon_id_type::FLARE_ID) - add_light(hitseg, hitwall); + add_light(Delta_lights, Dl_indices, hitseg, hitwall); } //@@#ifdef EDITOR @@ -763,7 +767,7 @@ static window_event_result collide_weapon_and_wall(object_array &Objects, fvmseg return window_event_result::ignored; } - blew_up = check_effect_blowup(Vclip, hitseg, hitwall, hitpt, weapon->ctype.laser_info, 0, 0); + blew_up = check_effect_blowup(Delta_lights, Dl_indices, Vclip, hitseg, hitwall, hitpt, weapon->ctype.laser_info, 0, 0); int robot_escort; #if defined(DXX_BUILD_DESCENT_II) @@ -2656,7 +2660,11 @@ window_event_result collide_object_with_wall(const vmobjptridx_t A, fix hitspeed break; case OBJ_PLAYER: collide_player_and_wall(A,hitspeed,hitseg,hitwall,hitpt); break; case OBJ_WEAPON: - return collide_weapon_and_wall(Objects, vmsegptridx, A, hitseg, hitwall, hitpt); + return collide_weapon_and_wall( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + Objects, vmsegptridx, A, hitseg, hitwall, hitpt); case OBJ_DEBRIS: collide_debris_and_wall(A,hitseg,hitwall,hitpt); break; case OBJ_FIREBALL: break; //collide_fireball_and_wall(A,hitspeed,hitseg,hitwall,hitpt); diff --git a/similar/main/dumpmine.cpp b/similar/main/dumpmine.cpp index 28c6da80b..90af89e41 100644 --- a/similar/main/dumpmine.cpp +++ b/similar/main/dumpmine.cpp @@ -726,7 +726,10 @@ static int Ignore_tmap_num2_error; // ---------------------------------------------------------------------------- namespace dsx { -static void determine_used_textures_level(int load_level_flag, int shareware_flag, int level_num, perm_tmap_buffer_type &tmap_buf, wall_buffer_type &wall_buf, level_tmap_buffer_type &level_tmap_buf, int max_tmap) +#if defined(DXX_BUILD_DESCENT_I) +#define determine_used_textures_level(Delta_lights,Dl_indices,load_level_flag,shareware_flag,level_num,tmap_buf,wall_buffer_type,level_tmap_buf,max_tmap) determine_used_textures_level(load_level_flag,shareware_flag,level_num,tmap_buf,wall_buffer_type,level_tmap_buf,max_tmap) +#endif +static void determine_used_textures_level(d_delta_light_array &Delta_lights, dl_index_array &Dl_indices, int load_level_flag, int shareware_flag, int level_num, perm_tmap_buffer_type &tmap_buf, wall_buffer_type &wall_buf, level_tmap_buffer_type &level_tmap_buf, int max_tmap) { int sidenum; int j; @@ -796,7 +799,7 @@ static void determine_used_textures_level(int load_level_flag, int shareware_fla tmap_buf = {}; if (load_level_flag) { - load_level(Adam_level_names[level_num]); + load_level(Delta_lights, Dl_indices, Adam_level_names[level_num]); } @@ -1073,7 +1076,7 @@ static void say_totals_all(void) } #elif defined(DXX_BUILD_DESCENT_II) for (i=First_dump_level; i<=Last_dump_level; i++) { - load_level(Adam_level_names[i]); + load_level(Delta_lights, Dl_indices, Adam_level_names[i]); say_totals(vcobjptridx, my_file, Adam_level_names[i]); } #endif @@ -1088,7 +1091,7 @@ static void dump_used_textures_level(PHYSFS_File *my_file, int level_num) level_tmap_buf.fill(-1); wall_buffer_type temp_wall_buf; - determine_used_textures_level(0, 1, level_num, temp_tmap_buf, temp_wall_buf, level_tmap_buf, sizeof(level_tmap_buf)/sizeof(level_tmap_buf[0])); + determine_used_textures_level(Delta_lights, Dl_indices, 0, 1, level_num, temp_tmap_buf, temp_wall_buf, level_tmap_buf, sizeof(level_tmap_buf)/sizeof(level_tmap_buf[0])); PHYSFSX_printf(my_file, "\nTextures used in [%s]\n", Gamesave_current_filename); say_used_tmaps(my_file, temp_tmap_buf); } @@ -1120,7 +1123,7 @@ say_totals_all(); for (i=0; i flicker_timer_disabled{}; -static void flicker_lights(d_flickering_light_state &fls, fvmsegptridx &vmsegptridx) +static void flicker_lights(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, d_flickering_light_state &fls, fvmsegptridx &vmsegptridx) { range_for (auto &f, partial_range(fls.Flickering_lights, fls.Num_flickering_lights)) { @@ -2002,9 +2002,9 @@ static void flicker_lights(d_flickering_light_state &fls, fvmsegptridx &vmsegptr f.timer += f.delay; f.mask = ((f.mask & 0x80000000) ? 1 : 0) + (f.mask << 1); if (f.mask & 1) - add_light(segp, sidenum); + add_light(Delta_lights, Dl_indices, segp, sidenum); else - subtract_light(segp, sidenum); + subtract_light(Delta_lights, Dl_indices, segp, sidenum); } } } diff --git a/similar/main/gamesave.cpp b/similar/main/gamesave.cpp index 8649b9f6a..b1528f573 100644 --- a/similar/main/gamesave.cpp +++ b/similar/main/gamesave.cpp @@ -826,7 +826,11 @@ static void validate_segment_wall(const vcsegptridx_t seg, shared_side &side, co } } -static int load_game_data(fvmobjptridx &vmobjptridx, fvmsegptridx &vmsegptridx, PHYSFS_File *LoadFile) +static int load_game_data( +#if defined(DXX_BUILD_DESCENT_II) + d_delta_light_array &Delta_lights, dl_index_array &Dl_indices, +#endif + fvmobjptridx &vmobjptridx, fvmsegptridx &vmsegptridx, PHYSFS_File *LoadFile) { const auto &vcsegptridx = vmsegptridx; short game_top_fileinfo_version; @@ -1215,7 +1219,11 @@ int no_old_level_file_error=0; //loads a level (.LVL) file from disk //returns 0 if success, else error code namespace dsx { -int load_level(const char * filename_passed) +int load_level( +#if defined(DXX_BUILD_DESCENT_II) + d_delta_light_array &Delta_lights, dl_index_array &Dl_indices, +#endif + const char * filename_passed) { #if DXX_USE_EDITOR int use_compiled_level=1; @@ -1399,7 +1407,11 @@ int load_level(const char * filename_passed) } PHYSFSX_fseek(LoadFile,gamedata_offset,SEEK_SET); - game_err = load_game_data(vmobjptridx, vmsegptridx, LoadFile); + game_err = load_game_data( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + vmobjptridx, vmsegptridx, LoadFile); if (game_err == -1) { //error!! return 3; @@ -1548,12 +1560,13 @@ int create_new_mine(void) int Errors_in_mine; +namespace dsx { // ----------------------------------------------------------------------------- #if defined(DXX_BUILD_DESCENT_II) -static int compute_num_delta_light_records(void) +static unsigned compute_num_delta_light_records(fvcdlindexptr &vcdlindexptr) { - int total = 0; - range_for (const auto &&i, Dl_indices.vcptr) + unsigned total = 0; + range_for (const auto &&i, vcdlindexptr) total += i->count; return total; @@ -1562,8 +1575,11 @@ static int compute_num_delta_light_records(void) // ----------------------------------------------------------------------------- // Save game -namespace dsx { -static int save_game_data(PHYSFS_File *SaveFile) +static int save_game_data( +#if defined(DXX_BUILD_DESCENT_II) + const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, +#endif + PHYSFS_File *SaveFile) { #if defined(DXX_BUILD_DESCENT_I) short game_top_fileinfo_version = Gamesave_current_version >= 5 ? 31 : GAME_VERSION; @@ -1600,7 +1616,7 @@ static int save_game_data(PHYSFS_File *SaveFile) { const unsigned Num_static_lights = Dl_indices.get_count(); WRITE_HEADER_ENTRY(dl_index, Num_static_lights); - WRITE_HEADER_ENTRY(delta_light, num_delta_lights = compute_num_delta_light_records()); + WRITE_HEADER_ENTRY(delta_light, num_delta_lights = compute_num_delta_light_records(Dl_indices.vcptr)); } // Write the mine name @@ -1705,12 +1721,14 @@ static int save_game_data(PHYSFS_File *SaveFile) return 0; } -} // ----------------------------------------------------------------------------- // Save game -namespace dsx { -static int save_level_sub(fvmobjptridx &vmobjptridx, const char * filename) +static int save_level_sub( +#if defined(DXX_BUILD_DESCENT_II) + const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, +#endif + fvmobjptridx &vmobjptridx, const char *const filename) { char temp_filename[PATH_MAX]; int minedata_offset=0,gamedata_offset=0; @@ -1829,7 +1847,11 @@ static int save_level_sub(fvmobjptridx &vmobjptridx, const char * filename) #endif save_mine_data_compiled(SaveFile); gamedata_offset = PHYSFS_tell(SaveFile); - save_game_data(SaveFile); + save_game_data( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + SaveFile); #if defined(DXX_BUILD_DESCENT_I) hostagetext_offset = PHYSFS_tell(SaveFile); #endif @@ -1855,9 +1877,12 @@ static int save_level_sub(fvmobjptridx &vmobjptridx, const char * filename) return 0; } -} -int save_level(const char * filename) +int save_level( +#if defined(DXX_BUILD_DESCENT_II) + const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, +#endif + const char * filename) { int r1; @@ -1865,9 +1890,14 @@ int save_level(const char * filename) //save_level_sub(filename, 0); // just save compiled one // Save compiled version... - r1 = save_level_sub(vmobjptridx, filename); + r1 = save_level_sub( +#if defined(DXX_BUILD_DESCENT_II) + Delta_lights, Dl_indices, +#endif + vmobjptridx, filename); return r1; } +} #endif //EDITOR diff --git a/similar/main/gameseg.cpp b/similar/main/gameseg.cpp index 4d9924669..41243486b 100644 --- a/similar/main/gameseg.cpp +++ b/similar/main/gameseg.cpp @@ -127,17 +127,6 @@ static void compute_segment_center(fvcvertptr &vcvertptr, vms_vector &r, const a vm_vec_copy_scale(r, vp, F1_0 / 8); } -} - -namespace dsx { -#if defined(DXX_BUILD_DESCENT_II) -array Delta_lights; -#endif - -} - -namespace dcx { - // ------------------------------------------------------------------------------------------ // Compute the center point of a side of a segment. // The center point is defined to be the average of the 4 points defining the side. @@ -1689,7 +1678,7 @@ static void change_segment_light(const vmsegptridx_t segp,int sidenum,int dir) // dir = -1 -> subtract light // dir = 17 -> add 17x light // dir = 0 -> you are dumb -static void change_light(const vmsegptridx_t segnum, const uint8_t sidenum, const int dir) +static void change_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, const vmsegptridx_t segnum, const uint8_t sidenum, const int dir) { const fix ds = dir * DL_SCALE; const auto &&pr = cast_range_result(Dl_indices.vcptr); @@ -1718,14 +1707,14 @@ static void change_light(const vmsegptridx_t segnum, const uint8_t sidenum, cons // Subtract light cast by a light source from all surfaces to which it applies light. // This is precomputed data, stored at static light application time in the editor (the slow lighting function). // returns 1 if lights actually subtracted, else 0 -int subtract_light(const vmsegptridx_t segnum, sidenum_fast_t sidenum) +int subtract_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, const vmsegptridx_t segnum, const sidenum_fast_t sidenum) { if (segnum->light_subtracted & (1 << sidenum)) { return 0; } segnum->light_subtracted |= (1 << sidenum); - change_light(segnum, sidenum, -1); + change_light(Delta_lights, Dl_indices, segnum, sidenum, -1); return 1; } @@ -1733,58 +1722,28 @@ int subtract_light(const vmsegptridx_t segnum, sidenum_fast_t sidenum) // This is precomputed data, stored at static light application time in the editor (the slow lighting function). // You probably only want to call this after light has been subtracted. // returns 1 if lights actually added, else 0 -int add_light(const vmsegptridx_t segnum, sidenum_fast_t sidenum) +int add_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, const vmsegptridx_t segnum, sidenum_fast_t sidenum) { if (!(segnum->light_subtracted & (1 << sidenum))) { return 0; } segnum->light_subtracted &= ~(1 << sidenum); - change_light(segnum, sidenum, 1); + change_light(Delta_lights, Dl_indices, segnum, sidenum, 1); return 1; } // Parse the Light_subtracted array, turning on or off all lights. -void apply_all_changed_light(void) +void apply_all_changed_light(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, fvmsegptridx &vmsegptridx) { range_for (const auto &&segp, vmsegptridx) { for (int j=0; jlight_subtracted & (1 << j)) - change_light(segp, j, -1); + change_light(Delta_lights, Dl_indices, segp, j, -1); } } -//@@// Scans Light_subtracted bit array. -//@@// For all light sources which have had their light subtracted, adds light back in. -//@@void restore_all_lights_in_mine(void) -//@@{ -//@@ int i, j, k; -//@@ -//@@ for (i=0; ivert_light[k] * DL_SCALE; -//@@ Assert((dlp->segnum >= 0) && (dlp->segnum <= Highest_segment_index)); -//@@ Assert((dlp->sidenum >= 0) && (dlp->sidenum < MAX_SIDES_PER_SEGMENT)); -//@@ Segments[dlp->segnum].sides[dlp->sidenum].uvls[k].l += dl; -//@@ } -//@@ dlp++; -//@@ } -//@@ } -//@@ } -//@@} - // Should call this whenever a new mine gets loaded. // More specifically, should call this whenever something global happens // to change the status of static light in the mine. diff --git a/similar/main/gameseq.cpp b/similar/main/gameseq.cpp index b7a30a042..264c0502c 100644 --- a/similar/main/gameseq.cpp +++ b/similar/main/gameseq.cpp @@ -940,7 +940,7 @@ void LoadLevel(int level_num,int page_in_textures) load_level_robots(level_num); - int load_ret = load_level(level_name); //actually load the data from disk! + int load_ret = load_level(Delta_lights, Dl_indices, level_name); //actually load the data from disk! if (load_ret) Error("Could not load level file <%s>, error = %d",static_cast(level_name),load_ret); diff --git a/similar/main/mglobal.cpp b/similar/main/mglobal.cpp index fea604938..9ec739399 100644 --- a/similar/main/mglobal.cpp +++ b/similar/main/mglobal.cpp @@ -97,6 +97,7 @@ namespace dsx { #if defined(DXX_BUILD_DESCENT_II) valptridx::array_managed_type CloakingWalls; valptridx::array_managed_type Dl_indices; +d_delta_light_array Delta_lights; #endif d_level_object_state ObjectState; valptridx::array_managed_type Objects; diff --git a/similar/main/multi.cpp b/similar/main/multi.cpp index e72de48c5..74201195e 100644 --- a/similar/main/multi.cpp +++ b/similar/main/multi.cpp @@ -2302,7 +2302,7 @@ static void multi_do_effect_blowup(const playernum_t pnum, const ubyte *buf) laser.parent_type = OBJ_PLAYER; laser.parent_num = pnum; - check_effect_blowup(Vclip, *useg, side, hitpnt, laser, 0, 1); + check_effect_blowup(Delta_lights, Dl_indices, Vclip, *useg, side, hitpnt, laser, 0, 1); } static void multi_do_drop_marker(object_array &objects, fvmsegptridx &vmsegptridx, const playernum_t pnum, const uint8_t *const buf) @@ -4081,7 +4081,7 @@ static void multi_do_light (const ubyte *buf) { if ((sides & (1<unique_segment::sides[sidenum].tmap_num2 & 0x3fff].lighting) { - ret |= add_light(segnum, sidenum); //any light sets flag + ret |= add_light(Delta_lights, Dl_indices, segnum, sidenum); //any light sets flag enable_flicker(Flickering_light_state, segnum, sidenum); } }; @@ -118,14 +118,14 @@ static int do_light_on(const trigger &t) //turns lighting off. returns true if lights were actually turned off. (they //would not be if they had previously been shot out). -static int do_light_off(const trigger &t) +static int do_light_off(const d_delta_light_array &Delta_lights, const dl_index_array &Dl_indices, d_flickering_light_state &Flickering_light_state, const trigger &t) { int ret=0; - const auto op = [&ret](const vmsegptridx_t segnum, const unsigned sidenum) { + const auto op = [&Delta_lights, &Dl_indices, &Flickering_light_state, &ret](const vmsegptridx_t segnum, const unsigned sidenum) { //check if tmap2 casts light before turning the light off. This //is to keep us from turning off blown-out lights if (TmapInfo[segnum->unique_segment::sides[sidenum].tmap_num2 & 0x3fff].lighting) { - ret |= subtract_light(segnum, sidenum); //any light sets flag + ret |= subtract_light(Delta_lights, Dl_indices, segnum, sidenum); //any light sets flag disable_flicker(Flickering_light_state, segnum, sidenum); } }; @@ -487,12 +487,12 @@ window_event_result check_trigger_sub(object &plrobj, const trgnum_t trigger_num break; case TT_LIGHT_OFF: - if (do_light_off(trigger)) + if (do_light_off(Delta_lights, Dl_indices, Flickering_light_state, trigger)) print_trigger_message(pnum, trigger, shot, "Light%s off!"); break; case TT_LIGHT_ON: - if (do_light_on(trigger)) + if (do_light_on(Delta_lights, Dl_indices, Flickering_light_state, trigger)) print_trigger_message(pnum, trigger, shot, "Light%s on!"); break; diff --git a/similar/main/wall.cpp b/similar/main/wall.cpp index 5d831f7f3..7ea95d119 100644 --- a/similar/main/wall.cpp +++ b/similar/main/wall.cpp @@ -1498,7 +1498,7 @@ void blast_nearby_glass_context::process_segment(const vmsegptridx_t segp, const if ((dist > 0) && (dist < damage/2)) { assert(objp.type == OBJ_WEAPON); - check_effect_blowup(Vclip, segp, sidenum, pnt, objp.ctype.laser_info, 1, 0); + check_effect_blowup(Delta_lights, Dl_indices, Vclip, segp, sidenum, pnt, objp.ctype.laser_info, 1, 0); } } }