mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-08 05:51:09 +00:00
bc63b70d88
Conflicts: src/actor.h src/fragglescript/t_func.cpp src/g_doom/a_bossbrain.cpp src/g_doom/a_revenant.cpp src/g_heretic/a_hereticartifacts.cpp src/g_heretic/a_hereticweaps.cpp src/g_heretic/a_knight.cpp src/g_hexen/a_bishop.cpp src/g_hexen/a_clericholy.cpp src/g_hexen/a_dragon.cpp src/g_hexen/a_firedemon.cpp src/g_hexen/a_flechette.cpp src/g_hexen/a_heresiarch.cpp src/g_hexen/a_hexenspecialdecs.cpp src/g_hexen/a_iceguy.cpp src/g_hexen/a_korax.cpp src/g_hexen/a_magelightning.cpp src/g_hexen/a_serpent.cpp src/g_hexen/a_spike.cpp src/g_hexen/a_wraith.cpp src/g_raven/a_minotaur.cpp src/g_shared/a_bridge.cpp src/g_shared/a_pickups.cpp src/g_shared/a_randomspawner.cpp src/g_strife/a_alienspectres.cpp src/g_strife/a_crusader.cpp src/g_strife/a_entityboss.cpp src/g_strife/a_inquisitor.cpp src/g_strife/a_loremaster.cpp src/g_strife/a_programmer.cpp src/g_strife/a_sentinel.cpp src/g_strife/a_spectral.cpp src/g_strife/a_strifestuff.cpp src/g_strife/a_strifeweapons.cpp src/g_strife/a_thingstoblowup.cpp src/p_local.h src/r_utility.cpp
233 lines
5.5 KiB
C++
233 lines
5.5 KiB
C++
/*
|
|
#include "actor.h"
|
|
#include "gi.h"
|
|
#include "m_random.h"
|
|
#include "s_sound.h"
|
|
#include "d_player.h"
|
|
#include "a_action.h"
|
|
#include "a_pickups.h"
|
|
#include "p_local.h"
|
|
#include "a_sharedglobal.h"
|
|
#include "p_enemy.h"
|
|
#include "d_event.h"
|
|
#include "gstrings.h"
|
|
#include "thingdef/thingdef.h"
|
|
*/
|
|
|
|
void P_UpdateBeak (AActor *actor);
|
|
|
|
static FRandom pr_chickenplayerthink ("ChickenPlayerThink");
|
|
static FRandom pr_chicattack ("ChicAttack");
|
|
static FRandom pr_feathers ("Feathers");
|
|
static FRandom pr_beakatkpl1 ("BeakAtkPL1");
|
|
static FRandom pr_beakatkpl2 ("BeakAtkPL2");
|
|
|
|
class AChickenPlayer : public APlayerPawn
|
|
{
|
|
DECLARE_CLASS (AChickenPlayer, APlayerPawn)
|
|
public:
|
|
void MorphPlayerThink ();
|
|
};
|
|
|
|
IMPLEMENT_CLASS(AChickenPlayer)
|
|
|
|
void AChickenPlayer::MorphPlayerThink ()
|
|
{
|
|
if (health > 0)
|
|
{ // Handle beak movement
|
|
P_UpdateBeak (this);
|
|
}
|
|
if (player->morphTics & 15)
|
|
{
|
|
return;
|
|
}
|
|
if (!(velx | vely) && pr_chickenplayerthink () < 160)
|
|
{ // Twitch view angle
|
|
angle += pr_chickenplayerthink.Random2 () << 19;
|
|
}
|
|
if ((Z() <= floorz) && (pr_chickenplayerthink() < 32))
|
|
{ // Jump and noise
|
|
velz += JumpZ;
|
|
|
|
FState * painstate = FindState(NAME_Pain);
|
|
if (painstate != NULL) SetState (painstate);
|
|
}
|
|
if (pr_chickenplayerthink () < 48)
|
|
{ // Just noise
|
|
S_Sound (this, CHAN_VOICE, "chicken/active", 1, ATTN_NORM);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_ChicAttack
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_ChicAttack)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
if (!self->target)
|
|
{
|
|
return 0;
|
|
}
|
|
if (self->CheckMeleeRange())
|
|
{
|
|
int damage = 1 + (pr_chicattack() & 1);
|
|
int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee);
|
|
P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_Feathers
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_Feathers)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
int i;
|
|
int count;
|
|
AActor *mo;
|
|
|
|
if (self->health > 0)
|
|
{ // Pain
|
|
count = pr_feathers() < 32 ? 2 : 1;
|
|
}
|
|
else
|
|
{ // Death
|
|
count = 5 + (pr_feathers()&3);
|
|
}
|
|
for (i = 0; i < count; i++)
|
|
{
|
|
mo = Spawn("Feather", self->PosPlusZ(20*FRACUNIT), NO_REPLACE);
|
|
mo->target = self;
|
|
mo->velx = pr_feathers.Random2() << 8;
|
|
mo->vely = pr_feathers.Random2() << 8;
|
|
mo->velz = FRACUNIT + (pr_feathers() << 9);
|
|
mo->SetState (mo->SpawnState + (pr_feathers()&7));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// PROC P_UpdateBeak
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void P_UpdateBeak (AActor *self)
|
|
{
|
|
if (self->player != NULL)
|
|
{
|
|
self->player->psprites[ps_weapon].sy = WEAPONTOP +
|
|
(self->player->chickenPeck << (FRACBITS-1));
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// PROC A_BeakRaise
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_BeakRaise)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
player_t *player;
|
|
|
|
if (NULL == (player = self->player))
|
|
{
|
|
return 0;
|
|
}
|
|
player->psprites[ps_weapon].sy = WEAPONTOP;
|
|
P_SetPsprite (player, ps_weapon, player->ReadyWeapon->GetReadyState());
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC P_PlayPeck
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void P_PlayPeck (AActor *chicken)
|
|
{
|
|
S_Sound (chicken, CHAN_VOICE, "chicken/peck", 1, ATTN_NORM);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_BeakAttackPL1
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_BeakAttackPL1)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
angle_t angle;
|
|
int damage;
|
|
int slope;
|
|
player_t *player;
|
|
AActor *linetarget;
|
|
|
|
if (NULL == (player = self->player))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
damage = 1 + (pr_beakatkpl1()&3);
|
|
angle = player->mo->angle;
|
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true, &linetarget);
|
|
if (linetarget)
|
|
{
|
|
player->mo->angle = player->mo->AngleTo(linetarget);
|
|
}
|
|
P_PlayPeck (player->mo);
|
|
player->chickenPeck = 12;
|
|
player->psprites[ps_weapon].tics -= pr_beakatkpl1() & 7;
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_BeakAttackPL2
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_BeakAttackPL2)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
angle_t angle;
|
|
int damage;
|
|
int slope;
|
|
player_t *player;
|
|
AActor *linetarget;
|
|
|
|
if (NULL == (player = self->player))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
damage = pr_beakatkpl2.HitDice (4);
|
|
angle = player->mo->angle;
|
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget);
|
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true, &linetarget);
|
|
if (linetarget)
|
|
{
|
|
player->mo->angle = player->mo->AngleTo(linetarget);
|
|
}
|
|
P_PlayPeck (player->mo);
|
|
player->chickenPeck = 12;
|
|
player->psprites[ps_weapon].tics -= pr_beakatkpl2()&3;
|
|
return 0;
|
|
}
|