From e3facccb9d624c4d390eddca99cc7e258676f852 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 14 Aug 2018 14:49:11 -0400 Subject: [PATCH] Ideya fixes when a player has more than one Ideya --- src/p_inter.c | 11 ++++++++--- src/p_mobj.c | 1 + src/p_user.c | 10 ++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 2f66949b6..c5af9cb0b 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -799,10 +799,15 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (toucher->tracer) // Move the ideya over to the drone! { mobj_t *hnext = special->hnext; + P_SetTarget(&special->hnext, toucher->tracer); - P_SetTarget(&special->hnext->hnext, hnext); // Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo. + if (!special->hnext->hnext) + P_SetTarget(&special->hnext->hnext, hnext); // Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo. + else + P_SetTarget(&special->hnext->hnext->target, special); P_SetTarget(&special->hnext->target, special); P_SetTarget(&toucher->tracer, NULL); + if (hnext) { special->hnext->extravalue1 = (angle_t)(hnext->extravalue1 - 72*ANG1); @@ -958,8 +963,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->powers[pw_carry] == CR_NIGHTSMODE && !toucher->target) return; - if (toucher->tracer && toucher->tracer->state-states > S_ORBIDYA1) - return; // Don't have multiple ideya, unless it's the first one given + if (toucher->tracer && toucher->tracer->health > 0) + return; // Don't have multiple ideya, unless it's the first one given (health = 0) if (player->mare != special->threshold) // wrong mare return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 4353e67c3..f8cc87db8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9445,6 +9445,7 @@ void P_SpawnPlayer(INT32 playernum) if (p == players) // this is totally the wrong place to do this aaargh. { mobj_t *idya = P_SpawnMobjFromMobj(mobj, 0, 0, mobj->height, MT_GOTEMERALD); + idya->health = 0; // for identification P_SetTarget(&idya->target, mobj); P_SetMobjState(idya, mobjinfo[MT_GOTEMERALD].missilestate); P_SetTarget(&mobj->tracer, idya); diff --git a/src/p_user.c b/src/p_user.c index fd09b0847..991d10fea 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6045,6 +6045,7 @@ static void P_DoNiGHTSCapsule(player_t *player) UINT8 em = P_GetNextEmerald(); // Only give it to ONE person, and THAT player has to get to the goal! mobj_t *emmo = P_SpawnMobjFromMobj(player->mo, 0, 0, player->mo->height, MT_GOTEMERALD); + emmo->health = em; // for identification P_SetTarget(&emmo->target, player->mo); P_SetMobjState(emmo, mobjinfo[MT_GOTEMERALD].meleestate + em); P_SetTarget(&player->mo->tracer, emmo); @@ -6071,8 +6072,17 @@ static void P_DoNiGHTSCapsule(player_t *player) }*/ mobj_t *idya = P_SpawnMobjFromMobj(player->mo, 0, 0, player->mo->height, MT_GOTEMERALD); idya->extravalue2 = player->mare/5; + idya->health = player->mare + 1; // for identification P_SetTarget(&idya->target, player->mo); P_SetMobjState(idya, mobjinfo[MT_GOTEMERALD].missilestate + ((player->mare + 1) % 5)); + + if (player->mo->tracer) + { + P_SetTarget(&idya->hnext, player->mo->tracer); + idya->extravalue1 = (angle_t)(player->mo->tracer->extravalue1 - 72*ANG1); + if (idya->extravalue1 > player->mo->tracer->extravalue1) + idya->extravalue1 -= (72*ANG1)/idya->extravalue1; + } P_SetTarget(&player->mo->tracer, idya); } for (i = 0; i < MAXPLAYERS; i++)