Fix seismic duration sync

This commit is contained in:
Kp 2015-02-14 22:48:29 +00:00
parent 697c81e0c3
commit 5212daa4ad
5 changed files with 19 additions and 29 deletions

View file

@ -452,7 +452,7 @@ void multi_send_wall_status_specific (playernum_t pnum,int wallnum,ubyte type,ub
void multi_send_light_specific (playernum_t pnum,segnum_t segnum,ubyte val);
void multi_send_capture_bonus (playernum_t pnum);
int multi_all_players_alive();
void multi_send_seismic (fix64,fix64);
void multi_send_seismic(fix);
void multi_send_drop_blobs(playernum_t);
void multi_send_sound_function (char,char);
void DropFlag();

View file

@ -84,7 +84,7 @@
VALUE(MULTI_GUIDED , 3+sizeof(shortpos)) \
VALUE(MULTI_STOLEN_ITEMS , 11) \
VALUE(MULTI_WALL_STATUS , 6) /* send to new players */ \
VALUE(MULTI_SEISMIC , 9) \
VALUE(MULTI_SEISMIC , 5) \
VALUE(MULTI_LIGHT , 18) \
VALUE(MULTI_START_TRIGGER , 2) \
VALUE(MULTI_FLAGS , 6) \

View file

@ -358,7 +358,7 @@ static inline int weapon_index_is_player_bomb(unsigned id)
return id == PROXIMITY_INDEX;
}
#elif defined(DXX_BUILD_DESCENT_II)
extern fix64 Seismic_disturbance_start_time, Seismic_disturbance_end_time;
extern fix64 Seismic_disturbance_end_time;
int which_bomb(void);
static inline int weapon_index_uses_vulcan_ammo(unsigned id)

View file

@ -3837,19 +3837,16 @@ void multi_check_for_killgoal_winner ()
#if defined(DXX_BUILD_DESCENT_II)
// Sync our seismic time with other players
void multi_send_seismic (fix64 t1,fix64 t2)
void multi_send_seismic(fix duration)
{
int count=1;
PUT_INTEL_INT(multibuf+count, t1); count+=(sizeof(fix));
PUT_INTEL_INT(multibuf+count, t2); count+=(sizeof(fix));
PUT_INTEL_INT(&multibuf[count], duration); count += sizeof(duration);
multi_send_data<MULTI_SEISMIC>(multibuf, count, 2);
}
static void multi_do_seismic (const ubyte *buf)
{
fix duration = GET_INTEL_INT(buf + 5);
Seismic_disturbance_start_time = GameTime64;
const fix duration = GET_INTEL_INT(&buf[1]);
Seismic_disturbance_end_time = GameTime64 + duration;
digi_play_sample (SOUND_SEISMIC_DISTURBANCE_START, F1_0);
}

View file

@ -945,48 +945,41 @@ void rock_the_mine_frame(void)
// Hook in the rumble sound effect here.
}
#define SEISMIC_DISTURBANCE_DURATION (F1_0*5)
fix64 Seismic_disturbance_start_time = 0, Seismic_disturbance_end_time;
int Seismic_level=0;
fix64 Seismic_disturbance_end_time;
void init_seismic_disturbances(void)
{
Seismic_disturbance_start_time = 0;
Seismic_disturbance_end_time = 0;
}
// Return true if time to start a seismic disturbance.
static int start_seismic_disturbance(void)
static bool seismic_disturbance_active()
{
int rval;
if (Level_shake_duration < 1)
return 0;
return false;
if (Seismic_disturbance_end_time && Seismic_disturbance_end_time < GameTime64)
return true;
const fix level_shake_duration = Level_shake_duration;
bool rval;
rval = (2 * fixmul(d_rand(), Level_shake_frequency)) < FrameTime;
if (rval) {
Seismic_disturbance_start_time = GameTime64;
Seismic_disturbance_end_time = GameTime64 + Level_shake_duration;
Seismic_disturbance_end_time = GameTime64 + level_shake_duration;
start_seismic_sound();
if (Game_mode & GM_MULTI)
multi_send_seismic (Seismic_disturbance_start_time,Seismic_disturbance_end_time);
multi_send_seismic(level_shake_duration);
}
return rval;
}
static void seismic_disturbance_frame(void)
{
if (Level_shake_frequency) {
if (((Seismic_disturbance_start_time < GameTime64) && (Seismic_disturbance_end_time > GameTime64)) || start_seismic_disturbance()) {
fix delta_time;
if (seismic_disturbance_active()) {
int fc, rx, rz;
delta_time = GameTime64 - Seismic_disturbance_start_time;
fc = abs(delta_time - (Seismic_disturbance_end_time - Seismic_disturbance_start_time)/2);
fix delta_time = static_cast<fix>(GameTime64 - Seismic_disturbance_end_time);
fc = abs(delta_time - Level_shake_duration / 2);
fc /= F1_0/16;
if (fc > 16)
fc = 16;