From 3734eab7b618cd2946bd5d445de85829b6041be1 Mon Sep 17 00:00:00 2001 From: lachwright Date: Sat, 9 Nov 2019 00:47:51 +0800 Subject: [PATCH] Add signpost camera (and fix a typo whoops) --- src/p_enemy.c | 2 +- src/p_spec.c | 6 ++++++ src/p_user.c | 52 ++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index efeadda2f..30c5b88fb 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5183,7 +5183,7 @@ void A_SignPlayer(mobj_t *actor) ov->color = SKINCOLOR_NONE; P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN if (signcolor) - acotor->tracer->color = signcolor; + actor->tracer->color = signcolor; else actor->tracer->color = signcolor = SKINCOLOR_CARBON; actor->tracer->frame = signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); diff --git a/src/p_spec.c b/src/p_spec.c index 02aeda4fd..366377bed 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4054,6 +4054,9 @@ void P_SetupSignExit(player_t *player) if (thing->type != MT_SIGN) continue; + if (!player->mo->target || player->mo->target->type != MT_SIGN) + P_SetTarget(&player->mo->target, thing); + if (thing->state != &states[thing->info->spawnstate]) continue; @@ -4080,6 +4083,9 @@ void P_SetupSignExit(player_t *player) if (thing->type != MT_SIGN) continue; + if (!player->mo->target || player->mo->target->type != MT_SIGN) + P_SetTarget(&player->mo->target, thing); + if (thing->state != &states[thing->info->spawnstate]) continue; diff --git a/src/p_user.c b/src/p_user.c index 561183cd5..a31657383 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9501,7 +9501,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall fixed_t x, y, z, dist, distxy, distz, checkdist, viewpointx, viewpointy, camspeed, camdist, camheight, pviewheight, slopez = 0; INT32 camrotate; boolean camstill, cameranoclip, camorbit; - mobj_t *mo; + mobj_t *mo, *sign = NULL; subsector_t *newsubsec; fixed_t f1, f2; @@ -9511,6 +9511,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall mo = player->mo; + if (player->exiting && mo->target && mo->target->type == MT_SIGN) + sign = mo->target; + cameranoclip = (player->powers[pw_carry] == CR_NIGHTSMODE || player->pflags & PF_NOCLIP) || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)); // Noclipping player camera noclips too!! if (!(player->climbing || (player->powers[pw_carry] == CR_NIGHTSMODE) || player->playerstate == PST_DEAD || tutorialmode)) @@ -9557,6 +9560,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusangle = mo->angle; focusaiming = 0; } + else if (sign) + { + focusangle = FixedAngle(sign->spawnpoint->angle << FRACBITS) + ANGLE_180; + focusaiming = 0; + } else if (player == &players[consoleplayer]) { focusangle = localangle; @@ -9705,6 +9713,12 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall camheight = FixedMul(camheight, 6*FRACUNIT/5); } + if (sign) + { + camheight = mo->scale << 7; + camspeed = FRACUNIT/12; + } + if (player->climbing || player->exiting || player->playerstate == PST_DEAD || (player->powers[pw_carry] == CR_ROPEHANG || player->powers[pw_carry] == CR_GENERIC || player->powers[pw_carry] == CR_MACESPIN)) dist <<= 1; } @@ -9751,8 +9765,16 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall distz = slopez; } - x = mo->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); - y = mo->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + if (sign) + { + x = sign->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + y = sign->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + } + else + { + x = mo->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + y = mo->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + } #if 0 if (twodlevel || (mo->flags2 & MF2_TWOD)) @@ -9997,14 +10019,30 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall // point viewed by the camera // this point is just 64 unit forward the player dist = FixedMul(64 << FRACBITS, mo->scale); - viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); - viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + if (sign) + { + viewpointx = sign->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = sign->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } + else + { + viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } if (!camstill && !resetcalled && !paused) thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy); - viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); - viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + if (sign) + { + viewpointx = sign->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = sign->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } + else + { + viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } /* if (twodlevel || (mo->flags2 & MF2_TWOD))