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/p_inter.c b/src/p_inter.c index b9a5e3285..ea0853440 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1935,7 +1935,9 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, 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; @@ -2281,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->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 5ff5aef49..c3cc33297 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11729,26 +11729,7 @@ void P_SpawnPlayer(INT32 playernum) // set 'spritedef' override in mobj for player skins.. (see ProjectSprite) // (usefulness: when body mobj is detached from player (who respawns), // the dead body mobj retains the skin through the 'spritedef' override). - - // Loading skins from a player is a little more complicated, now. - { - UINT32 skinflags = (demo.playback) - ? demo.skinlist[demo.currentskinid[p-players]].flags - : skins[p->skin].flags; - UINT32 skinid = p->skin; - - if ((skinflags & SF_IRONMAN) && (p->fakeskin != MAXSKINS)) - { - skinid = p->fakeskin; - if (demo.playback) - { - skinid = demo.skinlist[skinid].mapping; - } - } - - mobj->skin = &skins[skinid]; - } - + mobj->skin = &skins[p->skin]; P_SetupStateAnimation(mobj, mobj->state); mobj->health = 1; diff --git a/src/p_user.c b/src/p_user.c index cf9beeb8e..2e92229ea 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4238,11 +4238,18 @@ 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); + S_StartSound(player->mo, sfx_kc33); + K_SpawnMagicianParticles(player->mo, 5); } else if (!(gametyperules & GTR_CIRCUIT)) {