diff --git a/src/k_hud.c b/src/k_hud.c index 02e6c3b74..ddf0e9b96 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -85,6 +85,7 @@ static patch_t *kp_catcherminimap; static patch_t *kp_emeraldminimap[2]; static patch_t *kp_capsuleminimap[3]; static patch_t *kp_battleufominimap; +static patch_t *kp_superflickyminimap; static patch_t *kp_ringsticker[2]; static patch_t *kp_ringstickersplit[4]; @@ -198,6 +199,8 @@ patch_t *kp_capsuletarget_far[2]; patch_t *kp_capsuletarget_far_text[2]; patch_t *kp_capsuletarget_near[8]; +patch_t *kp_superflickytarget[4]; + patch_t *kp_button_a[2][2]; patch_t *kp_button_b[2][2]; patch_t *kp_button_c[2][2]; @@ -376,6 +379,7 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_capsuleminimap[2], "MINICAP3"); HU_UpdatePatch(&kp_battleufominimap, "MINIBUFO"); + HU_UpdatePatch(&kp_superflickyminimap, "FLKMAPA"); // Rings & Lives HU_UpdatePatch(&kp_ringsticker[0], "RNGBACKA"); @@ -760,6 +764,13 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_capsuletarget_near[i], "%s", buffer); } + sprintf(buffer, "HUDFLKAx"); + for (i = 0; i < 4; i++) + { + buffer[7] = '0'+i; + HU_UpdatePatch(&kp_superflickytarget[i], "%s", buffer); + } + K_LoadButtonGraphics(kp_button_a[0], 'A'); K_LoadButtonGraphics(kp_button_a[1], 'N'); K_LoadButtonGraphics(kp_button_b[0], 'B'); @@ -4076,6 +4087,13 @@ static void K_drawKartMinimap(void) case MT_BATTLEUFO: workingPic = kp_battleufominimap; break; + case MT_SUPER_FLICKY: + workingPic = kp_superflickyminimap; + if (Obj_SuperFlickyOwner(mobj)->color) + { + colormap = R_GetTranslationColormap(TC_RAINBOW, (Obj_SuperFlickyOwner(mobj)->color), GTC_CACHE); + } + break; default: break; } diff --git a/src/k_hud.h b/src/k_hud.h index 055906290..498a6295f 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -59,6 +59,8 @@ extern patch_t *kp_capsuletarget_far[2]; extern patch_t *kp_capsuletarget_far_text[2]; extern patch_t *kp_capsuletarget_near[8]; +extern patch_t *kp_superflickytarget[4]; + extern patch_t *kp_button_a[2][2]; extern patch_t *kp_button_b[2][2]; extern patch_t *kp_button_c[2][2]; diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index d44f46fbb..a9c6eb4b0 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -42,6 +42,8 @@ struct TargetTracking case MT_PLAYER: return player_emeralds_color(); + case MT_SUPER_FLICKY: + return static_cast(Obj_SuperFlickyOwner(mobj)->color); default: return SKINCOLOR_NONE; } @@ -267,9 +269,9 @@ void K_DrawTargetTracking(const TargetTracking& target) vector2_t targetPos = {}; - bool visible = P_CheckSight(stplyr->mo, target.mobj); + bool visible = P_CheckSight(stplyr->mo, target.mobj); - if (visible == false && (leveltime & 1)) + if ((visible == false || target.mobj->type == MT_SUPER_FLICKY) && (leveltime & 1)) { // Flicker when not visible. return; @@ -290,7 +292,12 @@ void K_DrawTargetTracking(const TargetTracking& target) ); }; - if (useNear == true) + if (target.mobj->type == MT_SUPER_FLICKY) + { + timer = (leveltime / 2); + draw(kp_superflickytarget[timer % 4]); + } + else if (useNear == true) { timer = (leveltime / 2); draw(kp_capsuletarget_near[timer % 8]); @@ -382,6 +389,9 @@ bool is_object_tracking_target(const mobj_t* mobj) case MT_MONITOR: return is_player_tracking_target() && Obj_MonitorGetEmerald(mobj) != 0; + case MT_SUPER_FLICKY: + return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo); + default: return false; } diff --git a/src/k_objects.h b/src/k_objects.h index 26f6d14ac..ff5d03ec9 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -161,7 +161,9 @@ void Obj_WhipSuperFlicky(mobj_t *flicky); void Obj_BlockSuperFlicky(mobj_t *flicky); void Obj_SuperFlickyPlayerCollide(mobj_t *flicky, mobj_t *player); void Obj_SuperFlickyLanding(mobj_t *flicky); +mobj_t *Obj_SuperFlickyOwner(const mobj_t *flicky); boolean Obj_IsSuperFlickyWhippable(const mobj_t *flicky); +boolean Obj_IsSuperFlickyTargettingYou(const mobj_t *flicky, mobj_t *player); /* Battle/Power-UP UFO */ void Obj_BattleUFOLegThink(mobj_t *leg); diff --git a/src/objects/super-flicky.cpp b/src/objects/super-flicky.cpp index 6e65e51ad..d78de32fd 100644 --- a/src/objects/super-flicky.cpp +++ b/src/objects/super-flicky.cpp @@ -277,7 +277,7 @@ struct Flicky : mobj_t void animate() { - P_InstaScale(this, source()->scale * (chasing() ? 2 : 1)); + destscale = source()->scale * (chasing() ? 3 : 1); if (color >= kSuperStart && color <= kSuperEnd) { @@ -761,9 +761,23 @@ tic_t Obj_SuperFlickySwarmTime(mobj_t* mobj) return !P_MobjWasRemoved(x) ? x->powerup_remaining() : 0u; } +mobj_t *Obj_SuperFlickyOwner(const mobj_t* mobj) +{ + const Flicky* x = static_cast(mobj); + + return x->source(); +} + boolean Obj_IsSuperFlickyWhippable(const mobj_t* mobj) { const Flicky* x = static_cast(mobj); return mobj == x->chasing() && !x->stunned(); } + +boolean Obj_IsSuperFlickyTargettingYou(const mobj_t* mobj, mobj_t *player) +{ + const Flicky* x = static_cast(mobj); + + return player == x->chasing(); +} \ No newline at end of file diff --git a/src/p_mobj.c b/src/p_mobj.c index e1a5ce863..dd076a12b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5336,6 +5336,7 @@ static boolean P_IsTrackerType(INT32 type) case MT_MONITOR: case MT_EMERALD: case MT_BATTLEUFO: + case MT_SUPER_FLICKY: return true; default: