diff --git a/src/d_player.h b/src/d_player.h index 8697e9836929c0e269f61127d7245686e71b0232..e5c7e72980d644dc926ca8e792f1136a54fd3b16 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -239,7 +239,8 @@ typedef enum CR_MACESPIN, CR_MINECART, CR_ROLLOUT, - CR_PTERABYTE + CR_PTERABYTE, + CR_DUSTDEVIL } carrytype_t; // pw_carry // Player powers. (don't edit this comment) diff --git a/src/dehacked.c b/src/dehacked.c index a71bfe0554b902415e77b5e33c0d34e9a6e6326a..83654d5207b9be08b350431f8cd2f52147dd691d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9488,6 +9488,7 @@ struct { {"CR_MINECART",CR_MINECART}, {"CR_ROLLOUT",CR_ROLLOUT}, {"CR_PTERABYTE",CR_PTERABYTE}, + {"CR_DUSTDEVIL",CR_DUSTDEVIL}, // Ring weapons (ringweapons_t) // Useful for A_GiveWeapon diff --git a/src/p_enemy.c b/src/p_enemy.c index 246ca1321bfbaee050ec0fc2645b68ac88de9500..8fbf5baa6a8a9cf7479c4195fa7af0824fd73956 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -13369,8 +13369,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing) P_ResetPlayer(player); A_PlayActiveSound(dustdevil); } + player->powers[pw_carry] = CR_DUSTDEVIL; player->powers[pw_nocontrol] = 2; - player->drawangle += ANG20; + P_SetTarget(&thing->tracer, dustdevil); P_SetPlayerMobjState(thing, S_PLAY_PAIN); if (dist > dragamount) @@ -13390,7 +13391,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing) P_ResetPlayer(player); thing->z = dustdevil->z + dustdevil->height; thrust = 20 * FRACUNIT; + player->powers[pw_carry] = CR_NONE; player->powers[pw_nocontrol] = 0; + P_SetTarget(&thing->tracer, NULL); S_StartSound(thing, sfx_wdjump); P_SetPlayerMobjState(thing, S_PLAY_FALL); } diff --git a/src/p_user.c b/src/p_user.c index f5c8caf7265a72ffdcc350e6bc85fb8b2c3cb815..5dfed642d66b5eeaf57c473b4ff12d828e43ec26 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -11918,6 +11918,9 @@ void P_PlayerThink(player_t *player) factor = 4; } break; + case CR_DUSTDEVIL: + player->drawangle += ANG20; + break; /* -- in case we wanted to have the camera freely movable during zoom tubes case CR_ZOOMTUBE:*/ case CR_ROPEHANG: @@ -12690,6 +12693,19 @@ void P_PlayerAfterThink(player_t *player) } break; } + case CR_DUSTDEVIL: + { + mobj_t *mo = player->mo, *dustdevil = player->mo->tracer; + + if (abs(mo->x - dustdevil->x) > dustdevil->radius || abs(mo->y - dustdevil->y) > dustdevil->radius) + { + P_SetTarget(&player->mo->tracer, NULL); + player->powers[pw_carry] = CR_NONE; + break; + } + + break; + } case CR_ROLLOUT: { mobj_t *mo = player->mo, *rock = player->mo->tracer;