diff --git a/src/g_game.c b/src/g_game.c index 6cea62b1a..9408bca48 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2292,10 +2292,15 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) } else { + UINT32 skinflags = (demo.playback) + ? demo.skinlist[demo.currentskinid[player]].flags + : skins[players[player].skin].flags; + fakeskin = players[player].fakeskin; kartspeed = players[player].kartspeed; kartweight = players[player].kartweight; - charflags = players[player].charflags; + + charflags = (skinflags & SF_IRONMAN) ? skinflags : players[player].charflags; } lastfakeskin = players[player].lastfakeskin; diff --git a/src/k_kart.c b/src/k_kart.c index d4d4d7955..9c9feac0f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1959,7 +1959,7 @@ void K_SpawnMagicianParticles(mobj_t *mo, int spread) INT32 i; mobj_t *target = mo->target; - if (P_MobjWasRemoved(target)) + if (!target || P_MobjWasRemoved(target)) target = mo; for (i = 0; i < 16; i++) @@ -2531,8 +2531,8 @@ void K_PlayOvertakeSound(mobj_t *source) void K_PlayPainSound(mobj_t *source, mobj_t *other) { sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons - - sfxenum_t sfx_id = ((skin_t *)source->skin)->soundsid[S_sfx[sfx_khurt1 + pick].skinsound]; + skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin)); + sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khurt1 + pick].skinsound]; boolean alwaysHear = false; if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL) @@ -2550,7 +2550,8 @@ void K_PlayPainSound(mobj_t *source, mobj_t *other) void K_PlayHitEmSound(mobj_t *source, mobj_t *other) { - sfxenum_t sfx_id = ((skin_t *)source->skin)->soundsid[S_sfx[sfx_khitem].skinsound]; + skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin)); + sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khitem].skinsound]; boolean alwaysHear = false; if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL) diff --git a/src/p_inter.c b/src/p_inter.c index 4d131fbfb..e11854bbd 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1926,6 +1926,23 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, break; } + if (player->spectator == false) + { + UINT32 skinflags = (demo.playback) + ? demo.skinlist[demo.currentskinid[(player-players)]].flags + : skins[player->skin].flags; + + if (skinflags & SF_IRONMAN) + { + player->mo->skin = &skins[player->skin]; + player->charflags = skinflags; + K_SpawnMagicianParticles(player->mo, 5); + S_StartSound(player->mo, sfx_slip); + } + + player->mo->renderflags &= ~RF_DONTDRAW; + } + K_DropEmeraldsFromPlayer(player, player->emeralds); K_SetHitLagForObjects(player->mo, inflictor, MAXHITLAGTICS, true); @@ -1935,11 +1952,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, P_ResetPlayer(player); - if (player->spectator == false) - { - player->mo->renderflags &= ~RF_DONTDRAW; - } - P_SetPlayerMobjState(player->mo, player->mo->info->deathstate); if (type == DMG_TIMEOVER) @@ -2271,6 +2283,20 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->glanceDir = 0; player->pflags &= ~PF_GAINAX; + if (player->spectator == false && !(player->charflags & SF_IRONMAN)) + { + UINT32 skinflags = (demo.playback) + ? demo.skinlist[demo.currentskinid[(player-players)]].flags + : skins[player->skin].flags; + + if (skinflags & SF_IRONMAN) + { + player->mo->skin = &skins[player->skin]; + player->charflags = skinflags; + K_SpawnMagicianParticles(player->mo, 5); + } + } + switch (type) { case DMG_STING: diff --git a/src/p_mobj.c b/src/p_mobj.c index 9171a1a61..a5539193a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7989,7 +7989,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->extravalue2 == 0) { P_RemoveMobj(mobj); - break; + return false; } else if (mobj->extravalue2 < TICRATE/3) { @@ -8022,7 +8022,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->target->player->hyudorotimer) { P_RemoveMobj(mobj); - break; + return false; } else { diff --git a/src/p_user.c b/src/p_user.c index cf9beeb8e..f4bbd7e6f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4238,11 +4238,21 @@ void P_PlayerThink(player_t *player) { if (player->charflags & SF_IRONMAN) // no fakeskin yet { - if (leveltime >= starttime && !player->exiting) + if (leveltime >= starttime + && !player->exiting + && player->mo->health > 0 + && (player->respawn.state == RESPAWNST_NONE + || (player->respawn.state == RESPAWNST_DROP && !player->respawn.timer)) + && !P_PlayerInPain(player)) { if (player->fakeskin != MAXSKINS) { SetFakePlayerSkin(player, player->fakeskin); + if (player->spectator == false) + { + S_StartSound(player->mo, sfx_kc33); + K_SpawnMagicianParticles(player->mo, 5); + } } else if (!(gametyperules & GTR_CIRCUIT)) { diff --git a/src/r_skins.c b/src/r_skins.c index d38e7a41b..8e236904b 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -433,7 +433,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast) SetFakePlayerSkin(player, i); - if (player->mo) + if (player->mo && player->spectator == false) { S_StartSound(player->mo, sfx_kc33); S_StartSound(player->mo, sfx_cdfm44); @@ -500,8 +500,11 @@ void ClearFakePlayerSkin(player_t* player) if ((flags & SF_IRONMAN) && !P_MobjWasRemoved(player->mo)) { SetFakePlayerSkin(player, skinid); - S_StartSound(player->mo, sfx_s3k9f); - K_SpawnMagicianParticles(player->mo, 5); + if (player->spectator == false) + { + S_StartSound(player->mo, sfx_s3k9f); + K_SpawnMagicianParticles(player->mo, 5); + } } player->fakeskin = MAXSKINS; diff --git a/src/s_sound.c b/src/s_sound.c index 1c35abcce..3d8f80659 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -600,10 +600,11 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) sfx = &S_sfx[sfx_id]; - if (sfx->skinsound != -1 && origin && origin->skin) + if (sfx->skinsound != -1 && origin && (origin->player || origin->skin)) { // redirect player sound to the sound in the skin table - sfx_id = ((skin_t *)origin->skin)->soundsid[sfx->skinsound]; + skin_t *skin = (origin->player ? &skins[origin->player->skin] : ((skin_t *)origin->skin)); + sfx_id = skin->soundsid[sfx->skinsound]; sfx = &S_sfx[sfx_id]; }