mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2025-02-02 19:31:23 +00:00
063c85b157
with an FString now. - Fixed: The music strings in the default level info were never freed and caused memory leaks when used repeatedly. - Fixed: The intermusic string in the level info was never freed. - Fixed: The default fire obituary should only be printed if the damage came from the environment. If it comes from a monster the monster specific obituary should be used instead. - Added custom damage types from the floating point test release. - Changed Pain Elemental's massacre check. Now A_PainDie checks for the damage type and doesn't spawn anything if it is NAME_Massacre. A_PainDie can also be used by other actors so a more generalized approach is needed than hard coding it into the Pain Elemental. - Converted a few of Doom's monsters to DECORATE because I couldn't test the first version of the custom state code with the corpses inheriting from them. - Added custom states from last year's floating point test release and fixed some bugs I found in that code. Unfortunately it wasn't all salvageable and it was easier to recreate some parts from scratch. SVN r368 (trunk)
123 lines
4.1 KiB
C++
123 lines
4.1 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 "p_local.h"
|
|
#include "p_enemy.h"
|
|
#include "a_action.h"
|
|
#include "p_pspr.h"
|
|
#include "gstrings.h"
|
|
#include "a_hexenglobal.h"
|
|
|
|
extern void AdjustPlayerAngle (AActor *pmo);
|
|
|
|
static FRandom pr_atk ("CMaceAttack");
|
|
|
|
void A_CMaceAttack (AActor *actor);
|
|
|
|
// The Cleric's Mace --------------------------------------------------------
|
|
|
|
class ACWeapMace : public AClericWeapon
|
|
{
|
|
DECLARE_ACTOR (ACWeapMace, AClericWeapon)
|
|
};
|
|
|
|
FState ACWeapMace::States[] =
|
|
{
|
|
#define S_CMACEREADY 0
|
|
S_NORMAL (CMCE, 'A', 1, A_WeaponReady , &States[S_CMACEREADY]),
|
|
|
|
#define S_CMACEDOWN (S_CMACEREADY+1)
|
|
S_NORMAL (CMCE, 'A', 1, A_Lower , &States[S_CMACEDOWN]),
|
|
|
|
#define S_CMACEUP (S_CMACEDOWN+1)
|
|
S_NORMAL (CMCE, 'A', 1, A_Raise , &States[S_CMACEUP]),
|
|
|
|
#define S_CMACEATK (S_CMACEUP+1)
|
|
S_NORMAL2 (CMCE, 'B', 2, NULL , &States[S_CMACEATK+1], 60, 20),
|
|
S_NORMAL2 (CMCE, 'B', 1, NULL , &States[S_CMACEATK+2], 30, 33),
|
|
S_NORMAL2 (CMCE, 'B', 2, NULL , &States[S_CMACEATK+3], 8, 45),
|
|
S_NORMAL2 (CMCE, 'C', 1, NULL , &States[S_CMACEATK+4], 8, 45),
|
|
S_NORMAL2 (CMCE, 'D', 1, NULL , &States[S_CMACEATK+5], 8, 45),
|
|
S_NORMAL2 (CMCE, 'E', 1, NULL , &States[S_CMACEATK+6], 8, 45),
|
|
S_NORMAL2 (CMCE, 'E', 1, A_CMaceAttack , &States[S_CMACEATK+7], -11, 58),
|
|
S_NORMAL2 (CMCE, 'F', 1, NULL , &States[S_CMACEATK+8], 8, 45),
|
|
S_NORMAL2 (CMCE, 'F', 2, NULL , &States[S_CMACEATK+9], -8, 74),
|
|
S_NORMAL2 (CMCE, 'F', 1, NULL , &States[S_CMACEATK+10], -20, 96),
|
|
S_NORMAL2 (CMCE, 'F', 8, NULL , &States[S_CMACEATK+11], -33, 160),
|
|
S_NORMAL2 (CMCE, 'A', 2, A_ReFire , &States[S_CMACEATK+12], 8, 75),
|
|
S_NORMAL2 (CMCE, 'A', 1, NULL , &States[S_CMACEATK+13], 8, 65),
|
|
S_NORMAL2 (CMCE, 'A', 2, NULL , &States[S_CMACEATK+14], 8, 60),
|
|
S_NORMAL2 (CMCE, 'A', 1, NULL , &States[S_CMACEATK+15], 8, 55),
|
|
S_NORMAL2 (CMCE, 'A', 2, NULL , &States[S_CMACEATK+16], 8, 50),
|
|
S_NORMAL2 (CMCE, 'A', 1, NULL , &States[S_CMACEREADY], 8, 45),
|
|
};
|
|
|
|
|
|
IMPLEMENT_ACTOR (ACWeapMace, Hexen, -1, 0)
|
|
PROP_Weapon_SelectionOrder (3500)
|
|
PROP_Flags5 (MF5_BLOODSPLATTER)
|
|
PROP_Weapon_Flags (WIF_BOT_MELEE)
|
|
PROP_Weapon_UpState (S_CMACEUP)
|
|
PROP_Weapon_DownState (S_CMACEDOWN)
|
|
PROP_Weapon_ReadyState (S_CMACEREADY)
|
|
PROP_Weapon_AtkState (S_CMACEATK)
|
|
PROP_Weapon_HoldAtkState (S_CMACEATK)
|
|
PROP_Weapon_Kickback (150)
|
|
PROP_Weapon_YAdjust (0-8)
|
|
END_DEFAULTS
|
|
|
|
//===========================================================================
|
|
//
|
|
// A_CMaceAttack
|
|
//
|
|
//===========================================================================
|
|
|
|
void A_CMaceAttack (AActor *actor)
|
|
{
|
|
angle_t angle;
|
|
int damage;
|
|
int slope;
|
|
int i;
|
|
player_t *player;
|
|
|
|
if (NULL == (player = actor->player))
|
|
{
|
|
return;
|
|
}
|
|
|
|
damage = 25+(pr_atk()&15);
|
|
for (i = 0; i < 16; i++)
|
|
{
|
|
angle = player->mo->angle+i*(ANG45/16);
|
|
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
|
if (linetarget)
|
|
{
|
|
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
|
AdjustPlayerAngle (player->mo);
|
|
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
|
// player->mo->y, linetarget->x, linetarget->y);
|
|
goto macedone;
|
|
}
|
|
angle = player->mo->angle-i*(ANG45/16);
|
|
slope = P_AimLineAttack (player->mo, angle, 2*MELEERANGE);
|
|
if (linetarget)
|
|
{
|
|
P_LineAttack (player->mo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
|
AdjustPlayerAngle (player->mo);
|
|
// player->mo->angle = R_PointToAngle2(player->mo->x,
|
|
// player->mo->y, linetarget->x, linetarget->y);
|
|
goto macedone;
|
|
}
|
|
}
|
|
// didn't find any creatures, so try to strike any walls
|
|
player->mo->special1 = 0;
|
|
|
|
angle = player->mo->angle;
|
|
slope = P_AimLineAttack (player->mo, angle, MELEERANGE);
|
|
P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, RUNTIME_CLASS(AHammerPuff));
|
|
macedone:
|
|
return;
|
|
}
|