From 7fdcba5014a5f4f49d17d436c929bb39c6b7760e Mon Sep 17 00:00:00 2001 From: Jaime Ita Passos Date: Thu, 8 Apr 2021 15:13:39 -0300 Subject: [PATCH] Refactor linedef type 5 (Camera Scanner) --- src/p_floor.c | 52 +++++++++++---------------------------------------- src/p_local.h | 22 +++++++++++++--------- src/p_saveg.c | 25 +++++++++++++++++++++++-- src/p_setup.c | 3 +++ src/p_spec.c | 22 +++++++++++----------- src/p_spec.h | 12 +++++++++++- src/p_user.c | 23 ++++++++++++++--------- 7 files changed, 86 insertions(+), 73 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 7c26065b5..05cfffb44 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1706,7 +1706,7 @@ void T_RaiseSector(raise_t *raise) P_RecalcPrecipInSector(§ors[i]); } -void T_CameraScanner(elevator_t *elevator) +void T_CameraScanner(scanner_t *scanner) { // leveltime is compared to make multiple scanners in one map function correctly. static tic_t lastleveltime = 32000; // any number other than 0 should do here @@ -1720,58 +1720,28 @@ void T_CameraScanner(elevator_t *elevator) if (players[displayplayer].mo) { - if (players[displayplayer].mo->subsector->sector == elevator->actionsector) + if (players[displayplayer].mo->subsector->sector == scanner->actionsector) { - if (t_cam_dist == -42) - t_cam_dist = cv_cam_dist.value; - if (t_cam_height == -42) - t_cam_height = cv_cam_height.value; - if (t_cam_rotate == -42) - t_cam_rotate = cv_cam_rotate.value; - CV_SetValue(&cv_cam_height, FixedInt(elevator->sector->floorheight)); - CV_SetValue(&cv_cam_dist, FixedInt(elevator->sector->ceilingheight)); - CV_SetValue(&cv_cam_rotate, elevator->distance); + camera.scanner.height = scanner->height; + camera.scanner.dist = scanner->dist; + camera.scanner.rotate = &scanner->rotate; camerascanned = true; } else if (!camerascanned) - { - if (t_cam_height != -42 && cv_cam_height.value != t_cam_height) - CV_Set(&cv_cam_height, va("%f", (double)FIXED_TO_FLOAT(t_cam_height))); - if (t_cam_dist != -42 && cv_cam_dist.value != t_cam_dist) - CV_Set(&cv_cam_dist, va("%f", (double)FIXED_TO_FLOAT(t_cam_dist))); - if (t_cam_rotate != -42 && cv_cam_rotate.value != t_cam_rotate) - CV_Set(&cv_cam_rotate, va("%f", (double)t_cam_rotate)); - - t_cam_dist = t_cam_height = t_cam_rotate = -42; - } + P_ResetCameraScanner(&camera); } if (splitscreen && players[secondarydisplayplayer].mo) { - if (players[secondarydisplayplayer].mo->subsector->sector == elevator->actionsector) + if (players[secondarydisplayplayer].mo->subsector->sector == scanner->actionsector) { - if (t_cam2_rotate == -42) - t_cam2_dist = cv_cam2_dist.value; - if (t_cam2_rotate == -42) - t_cam2_height = cv_cam2_height.value; - if (t_cam2_rotate == -42) - t_cam2_rotate = cv_cam2_rotate.value; - CV_SetValue(&cv_cam2_height, FixedInt(elevator->sector->floorheight)); - CV_SetValue(&cv_cam2_dist, FixedInt(elevator->sector->ceilingheight)); - CV_SetValue(&cv_cam2_rotate, elevator->distance); + camera2.scanner.height = scanner->height; + camera2.scanner.dist = scanner->dist; + camera2.scanner.rotate = &scanner->rotate; camerascanned2 = true; } else if (!camerascanned2) - { - if (t_cam2_height != -42 && cv_cam2_height.value != t_cam2_height) - CV_Set(&cv_cam2_height, va("%f", (double)FIXED_TO_FLOAT(t_cam2_height))); - if (t_cam2_dist != -42 && cv_cam2_dist.value != t_cam2_dist) - CV_Set(&cv_cam2_dist, va("%f", (double)FIXED_TO_FLOAT(t_cam2_dist))); - if (t_cam2_rotate != -42 && cv_cam2_rotate.value != t_cam2_rotate) - CV_Set(&cv_cam2_rotate, va("%f", (double)t_cam2_rotate)); - - t_cam2_dist = t_cam2_height = t_cam2_rotate = -42; - } + P_ResetCameraScanner(&camera2); } } diff --git a/src/p_local.h b/src/p_local.h index 8568dd4f8..b45d05a40 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -89,10 +89,7 @@ typedef struct camera_s angle_t startangle; // Camera demobjerization - // Info for drawing: position. fixed_t x, y, z; - - //More drawing info: to determine current sprite. angle_t angle; // orientation struct subsector_s *subsector; @@ -109,6 +106,14 @@ typedef struct camera_s // Momentums, used to update position. fixed_t momx, momy, momz; + + // Camera scanner effect (linedef type 5). + struct + { + fixed_t *height; + fixed_t *dist; + INT32 *rotate; + } scanner; } camera_t; extern camera_t camera, camera2; @@ -122,16 +127,15 @@ extern consvar_t cv_cam_savedist[2][2], cv_cam_saveheight[2][2]; void CV_UpdateCamDist(void); void CV_UpdateCam2Dist(void); -extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate; -extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate; +void P_ResetCamera(player_t *player, camera_t *thiscam); +void P_ResetCameraScanner(camera_t *thiscam); +boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam); +void P_SlideCameraMove(camera_t *thiscam); +boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); INT32 P_GetPlayerControlDirection(player_t *player); void P_AddPlayerScore(player_t *player, UINT32 amount); void P_StealPlayerScore(player_t *player, UINT32 amount); -void P_ResetCamera(player_t *player, camera_t *thiscam); -boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam); -void P_SlideCameraMove(camera_t *thiscam); -boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled); pflags_t P_GetJumpFlags(player_t *player); boolean P_PlayerInPain(player_t *player); void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor); diff --git a/src/p_saveg.c b/src/p_saveg.c index 03229e740..893e58166 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2210,6 +2210,15 @@ static inline void SaveDynamicSlopeThinker(const thinker_t *th, const UINT8 type WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); } +static void SaveScannerThinker(const thinker_t *th, const UINT8 type) +{ + const scanner_t *ht = (const void *)th; + WRITEUINT8(save_p, type); + WRITEUINT32(save_p, SaveSector(ht->sector)); + WRITEUINT32(save_p, SaveSector(ht->actionsector)); + WRITEINT32(save_p, ht->rotate); +} + static inline void SavePolyrotatetThinker(const thinker_t *th, const UINT8 type) { const polyrotate_t *ht = (const void *)th; @@ -2407,7 +2416,7 @@ static void P_NetArchiveThinkers(void) } else if (th->function.acp1 == (actionf_p1)T_CameraScanner) { - SaveElevatorThinker(th, tc_camerascanner); + SaveScannerThinker(th, tc_camerascanner); continue; } else if (th->function.acp1 == (actionf_p1)T_Scroll) @@ -3381,6 +3390,18 @@ static inline thinker_t* LoadDynamicSlopeThinker(actionf_p1 thinker) return &ht->thinker; } +static thinker_t* LoadScannerThinker(actionf_p1 thinker) +{ + scanner_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); + ht->thinker.function.acp1 = thinker; + ht->sector = LoadSector(READUINT32(save_p)); + ht->actionsector = LoadSector(READUINT32(save_p)); + ht->height = &ht->sector->floorheight; + ht->dist = &ht->sector->ceilingheight; + ht->rotate = READINT32(save_p); + return &ht->thinker; +} + static inline thinker_t* LoadPolyrotatetThinker(actionf_p1 thinker) { polyrotate_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); @@ -3602,7 +3623,7 @@ static void P_NetUnArchiveThinkers(void) break; case tc_camerascanner: - th = LoadElevatorThinker((actionf_p1)T_CameraScanner, false); + th = LoadScannerThinker((actionf_p1)T_CameraScanner); break; case tc_bouncecheese: diff --git a/src/p_setup.c b/src/p_setup.c index 40dd1a284..1cd9cd031 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3755,6 +3755,9 @@ static void P_SetupCamera(void) camera.subsector = R_PointInSubsector(camera.x, camera.y); // make sure camera has a subsector set -- Monster Iestyn (12/11/18) } } + + P_ResetCameraScanner(&camera); + P_ResetCameraScanner(&camera2); } static void P_InitCamera(void) diff --git a/src/p_spec.c b/src/p_spec.c index 226e58d15..cfaebead7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5896,21 +5896,21 @@ static void P_AddEachTimeThinker(line_t *sourceline) */ static inline void P_AddCameraScanner(sector_t *sourcesec, sector_t *actionsector, angle_t angle) { - elevator_t *elevator; // Why not? LOL + scanner_t *scanner; - CONS_Alert(CONS_WARNING, M_GetText("Detected a camera scanner effect (linedef type 5). This effect is deprecated and will be removed in the future!\n")); + //CONS_Alert(CONS_WARNING, M_GetText("Detected a camera scanner effect (linedef type 5). This effect is deprecated and will be removed in the future!\n")); - // create and initialize new elevator thinker - elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL); - P_AddThinker(THINK_MAIN, &elevator->thinker); + // create and initialize the new scanner thinker + scanner = Z_Calloc(sizeof (*scanner), PU_LEVSPEC, NULL); + P_AddThinker(THINK_MAIN, &scanner->thinker); - elevator->thinker.function.acp1 = (actionf_p1)T_CameraScanner; - elevator->type = elevateBounce; + scanner->thinker.function.acp1 = (actionf_p1)T_CameraScanner; + scanner->sector = sourcesec; + scanner->actionsector = actionsector; - // set up the fields according to the type of elevator action - elevator->sector = sourcesec; - elevator->actionsector = actionsector; - elevator->distance = FixedInt(AngleFixed(angle)); + scanner->height = &sourcesec->floorheight; + scanner->dist = &sourcesec->ceilingheight; + scanner->rotate = FixedInt(AngleFixed(angle)); } /** Flashes a laser block. diff --git a/src/p_spec.h b/src/p_spec.h index bba7c4a40..89c77466d 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -407,6 +407,16 @@ typedef struct boolean triggerOnExit; } eachtime_t; +typedef struct +{ + thinker_t thinker; + sector_t *sector; + sector_t *actionsector; + fixed_t *height; + fixed_t *dist; + INT32 rotate; +} scanner_t; + typedef enum { RF_REVERSE = 1, //Lower when stood on @@ -464,7 +474,7 @@ void T_MarioBlockChecker(mariocheck_t *block); void T_ThwompSector(thwomp_t *thwomp); void T_NoEnemiesSector(noenemies_t *nobaddies); void T_EachTimeThinker(eachtime_t *eachtime); -void T_CameraScanner(elevator_t *elevator); +void T_CameraScanner(scanner_t *scanner); void T_RaiseSector(raise_t *raise); typedef struct diff --git a/src/p_user.c b/src/p_user.c index 4413cc6cd..4973b9bc1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9721,13 +9721,6 @@ void CV_UpdateCam2Dist(void) CV_Set(&cv_cam2_height, va("%f", FIXED_TO_FLOAT(cv_cam_saveheight[cv_useranalog[1].value][1].value))); } -fixed_t t_cam_dist = -42; -fixed_t t_cam_height = -42; -fixed_t t_cam_rotate = -42; -fixed_t t_cam2_dist = -42; -fixed_t t_cam2_height = -42; -fixed_t t_cam2_rotate = -42; - #define MAXCAMERADIST 140*FRACUNIT // Max distance the camera can be in front of the player (2D mode) void P_ResetCamera(player_t *player, camera_t *thiscam) @@ -9915,6 +9908,13 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall camheight = FixedMul(cv_cam2_height.value, mo->scale); } + if (thiscam->scanner.height) + camheight = (*thiscam->scanner.height); + if (thiscam->scanner.dist) + camdist = (*thiscam->scanner.dist); + if (thiscam->scanner.rotate) + camrotate = (*thiscam->scanner.rotate); + if (!(twodlevel || (mo->flags2 & MF2_TWOD)) && !(player->powers[pw_carry] == CR_NIGHTSMODE)) camheight = FixedMul(camheight, player->camerascale); @@ -9966,8 +9966,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall else angle = focusangle + FixedAngle(camrotate*FRACUNIT); - if (!resetcalled && (cv_analog[0].value || demoplayback) && ((thiscam == &camera && t_cam_rotate != -42) || (thiscam == &camera2 - && t_cam2_rotate != -42))) + if (!resetcalled && (cv_analog[0].value || demoplayback) && thiscam->scanner.rotate) { angle = FixedAngle(camrotate*FRACUNIT); thiscam->angle = angle; @@ -10468,7 +10467,13 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } return (x == thiscam->x && y == thiscam->y && z == thiscam->z && angle == thiscam->aiming); +} +void P_ResetCameraScanner(camera_t *thiscam) +{ + thiscam->scanner.height = NULL; + thiscam->scanner.dist = NULL; + thiscam->scanner.rotate = NULL; } boolean P_SpectatorJoinGame(player_t *player)