Pass Dl_indices as context

This commit is contained in:
Kp 2018-12-30 00:43:57 +00:00
parent 25ecf31816
commit aa9e6da297
21 changed files with 180 additions and 130 deletions

View file

@ -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);

View file

@ -145,10 +145,9 @@ constexpr std::integral_constant<std::size_t, 32000> MAX_DELTA_LIGHTS{}; // Orig
constexpr std::integral_constant<fix, 2048> DL_SCALE{}; // Divide light to allow 3 bits integer, 5 bits fraction.
extern array<delta_light, MAX_DELTA_LIGHTS> Delta_lights;
using d_delta_light_array = array<delta_light, MAX_DELTA_LIGHTS>;
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

View file

@ -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];

View file

@ -217,7 +217,7 @@ unsigned set_segment_depths(int start_seg, array<ubyte, MAX_SEGMENTS> *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
}

View file

@ -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);

View file

@ -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) {

View file

@ -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;

View file

@ -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

View file

@ -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]);
}
}

View file

@ -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<vmsegptridx_t::integral_type>(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);

View file

@ -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<NUM_SHAREWARE_LEVELS; i++) {
wall_buffer_type temp_wall_buf;
determine_used_textures_level(1, 1, i, 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, 1, 1, i, 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", Shareware_level_names[i]);
say_used_tmaps(my_file, temp_tmap_buf);
merge_buffers(perm_tmap_buf, temp_tmap_buf);
@ -1145,7 +1148,7 @@ say_totals_all();
#endif
{
wall_buffer_type temp_wall_buf;
determine_used_textures_level(1, 0, i, 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, 1, 0, i, temp_tmap_buf, temp_wall_buf, level_tmap_buf, sizeof(level_tmap_buf)/sizeof(level_tmap_buf[0]));
#if defined(DXX_BUILD_DESCENT_I)
PHYSFSX_printf(my_file, "\nTextures used in [%s]\n", Registered_level_names[i]);
#elif defined(DXX_BUILD_DESCENT_II)

View file

@ -148,7 +148,7 @@ static void powerup_grab_cheat_all();
#if defined(DXX_BUILD_DESCENT_II)
d_flickering_light_state Flickering_light_state;
static void slide_textures(void);
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);
#endif
// Cheats
@ -1889,7 +1889,7 @@ window_event_result GameProcessFrame()
#if defined(DXX_BUILD_DESCENT_II)
omega_charge_frame(player_info);
slide_textures();
flicker_lights(Flickering_light_state, vmsegptridx);
flicker_lights(Delta_lights, Dl_indices, Flickering_light_state, vmsegptridx);
//if the player is taking damage, give up guided missile control
if (local_player_shields_ref != player_shields)
@ -1978,7 +1978,7 @@ static void slide_textures(void)
constexpr std::integral_constant<fix, INT32_MIN> 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);
}
}
}

View file

@ -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

View file

@ -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_light, MAX_DELTA_LIGHTS> 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<const dl_index &>(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; j<MAX_SIDES_PER_SEGMENT; j++)
if (segp->light_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; i<Num_static_lights; i++) {
//@@ int segnum, sidenum;
//@@ delta_light *dlp;
//@@
//@@ segnum = Dl_indices[i].segnum;
//@@ sidenum = Dl_indices[i].sidenum;
//@@ if (Light_subtracted[segnum] & (1 << sidenum)) {
//@@ dlp = &Delta_lights[Dl_indices[i].index];
//@@
//@@ Light_subtracted[segnum] &= ~(1 << sidenum);
//@@ for (j=0; j<Dl_indices[i].count; j++) {
//@@ for (k=0; k<4; k++) {
//@@ fix dl;
//@@ dl = dlp->vert_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.

View file

@ -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<const char *>(level_name),load_ret);

View file

@ -97,6 +97,7 @@ namespace dsx {
#if defined(DXX_BUILD_DESCENT_II)
valptridx<cloaking_wall>::array_managed_type CloakingWalls;
valptridx<dl_index>::array_managed_type Dl_indices;
d_delta_light_array Delta_lights;
#endif
d_level_object_state ObjectState;
valptridx<object>::array_managed_type Objects;

View file

@ -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<<i)))
{
subtract_light(segp, i);
subtract_light(Delta_lights, Dl_indices, segp, i);
side_array[i].tmap_num2 = GET_INTEL_SHORT(&buf[4 + (2 * i)]);
}
}
@ -4962,7 +4962,11 @@ void multi_restore_game(ubyte slot, uint id)
return;
}
state_restore_all_sub(filename, secret_restore::none);
state_restore_all_sub(
#if defined(DXX_BUILD_DESCENT_II)
Dl_indices, secret_restore::none,
#endif
filename);
multi_send_score(); // send my restored scores. I sent 0 when I loaded the level anyways...
}

View file

@ -2648,7 +2648,7 @@ static int newdemo_read_frame_information(int rewrite)
if (Newdemo_vcr_state != ND_STATE_PAUSED)
{
#if defined(DXX_BUILD_DESCENT_I)
check_effect_blowup(Vclip, vmsegptridx(segnum), side, pnt, nullptr, 0, 0);
check_effect_blowup(Delta_lights, Dl_indices, Vclip, vmsegptridx(segnum), side, pnt, nullptr, 0, 0);
#elif defined(DXX_BUILD_DESCENT_II)
//create a dummy object which will be the weapon that hits
//the monitor. the blowup code wants to know who the parent of the
@ -2656,7 +2656,7 @@ static int newdemo_read_frame_information(int rewrite)
laser_parent dummy;
dummy.parent_type = OBJ_PLAYER;
dummy.parent_num = Player_num;
check_effect_blowup(Vclip, vmsegptridx(segnum), side, pnt, dummy, 0, 0);
check_effect_blowup(Delta_lights, Dl_indices, Vclip, vmsegptridx(segnum), side, pnt, dummy, 0, 0);
#endif
}
break;

View file

@ -1393,13 +1393,17 @@ int state_restore_all(const int in_game, const secret_restore secret, const char
}
}
}
return state_restore_all_sub(filename, secret);
return state_restore_all_sub(
#if defined(DXX_BUILD_DESCENT_II)
Dl_indices, secret,
#endif
filename);
}
#if defined(DXX_BUILD_DESCENT_I)
int state_restore_all_sub(const char *filename)
#elif defined(DXX_BUILD_DESCENT_II)
int state_restore_all_sub(const char *filename, const secret_restore secret)
int state_restore_all_sub(const dl_index_array &Dl_indices, const secret_restore secret, const char *const filename)
#endif
{
int version, coop_player_got[MAX_PLAYERS], coop_org_objnum = get_local_player().objnum;
@ -1901,7 +1905,7 @@ int state_restore_all_sub(const char *filename, const secret_restore secret)
PHYSFS_read(fp, &i.light_subtracted, sizeof(i.light_subtracted), 1);
}
}
apply_all_changed_light();
apply_all_changed_light(Delta_lights, Dl_indices, Segments.vmptridx);
} else {
range_for (const auto &&segp, vmsegptr)
{

View file

@ -101,14 +101,14 @@ static void do_close_door(const trigger &t)
//turns lighting on. returns true if lights were actually turned on. (they
//would not be if they had previously been shot out).
static int do_light_on(const trigger &t)
static int do_light_on(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 on. This
//is to keep us from turning on blown-out lights
if (TmapInfo[segnum->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;

View file

@ -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);
}
}
}