raze/source/games/blood/src/actor.h

258 lines
7.2 KiB
C
Raw Normal View History

2019-09-19 22:42:45 +00:00
//-------------------------------------------------------------------------
/*
Copyright (C) 2010-2019 EDuke32 developers and contributors
Copyright (C) 2019 Nuke.YKT
This file is part of NBlood.
NBlood is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
#pragma once
BEGIN_BLD_NS
class DBloodActor;
2019-09-19 22:42:45 +00:00
enum DAMAGE_TYPE {
DAMAGE_TYPE_0 = 0,
DAMAGE_TYPE_1, // Flame
DAMAGE_TYPE_2,
DAMAGE_TYPE_3,
DAMAGE_TYPE_4,
DAMAGE_TYPE_5,
DAMAGE_TYPE_6, // Tesla
kDamageMax = 7,
2019-09-19 22:42:45 +00:00
};
enum VECTOR_TYPE {
VECTOR_TYPE_0 = 0,
VECTOR_TYPE_1,
VECTOR_TYPE_2,
VECTOR_TYPE_3,
VECTOR_TYPE_4,
VECTOR_TYPE_5,
VECTOR_TYPE_6,
VECTOR_TYPE_7,
VECTOR_TYPE_8,
VECTOR_TYPE_9,
VECTOR_TYPE_10,
VECTOR_TYPE_11,
VECTOR_TYPE_12,
VECTOR_TYPE_13,
VECTOR_TYPE_14,
VECTOR_TYPE_15,
VECTOR_TYPE_16,
VECTOR_TYPE_17,
VECTOR_TYPE_18,
VECTOR_TYPE_19,
VECTOR_TYPE_20,
VECTOR_TYPE_21,
#ifdef NOONE_EXTENSIONS
kVectorGenDudePunch,
#endif
2019-09-19 22:42:45 +00:00
kVectorMax,
};
struct THINGINFO
{
short startHealth;
short mass;
uint8_t clipdist;
short flags;
int elastic; // elasticity
int dmgResist; // damage resistance
short cstat;
short picnum;
int8_t shade;
uint8_t pal;
uint8_t xrepeat; // xrepeat
uint8_t yrepeat; // yrepeat
int dmgControl[kDamageMax]; // damage
2019-09-19 22:42:45 +00:00
};
struct AMMOITEMDATA
{
short cstat;
short picnum;
int8_t shade;
uint8_t pal;
uint8_t xrepeat;
uint8_t yrepeat;
short count;
uint8_t type;
uint8_t weaponType;
2019-09-19 22:42:45 +00:00
};
struct WEAPONITEMDATA
{
short cstat;
short picnum;
int8_t shade;
uint8_t pal;
uint8_t xrepeat;
uint8_t yrepeat;
short type;
short ammoType;
short count;
2019-09-19 22:42:45 +00:00
};
struct ITEMDATA
{
short cstat;
short picnum;
int8_t shade;
uint8_t pal;
uint8_t xrepeat;
uint8_t yrepeat;
short packSlot;
2019-09-19 22:42:45 +00:00
};
struct MissileType
{
short picnum;
int velocity;
int angleOfs;
uint8_t xrepeat;
uint8_t yrepeat;
int8_t shade;
uint8_t clipDist;
2019-09-19 22:42:45 +00:00
};
struct EXPLOSION
{
uint8_t repeat;
char dmg;
char dmgRng;
int radius;
int dmgType;
int burnTime;
int ticks;
int quakeEffect;
int flashEffect;
2019-09-19 22:42:45 +00:00
};
struct SURFHIT {
FX_ID fx1;
FX_ID fx2;
FX_ID fx3;
int fxSnd;
2019-09-19 22:42:45 +00:00
};
struct VECTORDATA {
DAMAGE_TYPE dmgType;
int dmg; // damage
int impulse;
int maxDist;
int fxChance;
int burnTime; // burn
int bloodSplats; // blood splats
int splatChance; // blood splat chance
SURFHIT surfHit[15];
2019-09-19 22:42:45 +00:00
};
extern const AMMOITEMDATA gAmmoItemData[];
extern const WEAPONITEMDATA gWeaponItemData[];
extern const ITEMDATA gItemData[];
extern const MissileType missileInfo[];
extern const EXPLOSION explodeInfo[];
2019-12-06 23:07:02 +00:00
extern const THINGINFO thingInfo[];
2019-09-19 22:42:45 +00:00
extern VECTORDATA gVectorData[];
const int gDudeDrag = 0x2a00;
2019-09-19 22:42:45 +00:00
template<typename T> bool IsPlayerSprite(T const * const pSprite)
2019-09-19 22:42:45 +00:00
{
return pSprite->type >= kDudePlayer1 && pSprite->type <= kDudePlayer8;
2019-09-19 22:42:45 +00:00
}
template<typename T> bool IsDudeSprite(T const * const pSprite)
2019-09-19 22:42:45 +00:00
{
return pSprite->type >= kDudeBase && pSprite->type < kDudeMax;
}
template<typename T> bool IsItemSprite(T const * const pSprite)
{
return pSprite->type >= kItemBase && pSprite->type < kItemMax;
}
template<typename T> bool IsWeaponSprite(T const * const pSprite)
{
return pSprite->type >= kItemWeaponBase && pSprite->type < kItemWeaponMax;
}
template<typename T> bool IsAmmoSprite(T const * const pSprite)
{
return pSprite->type >= kItemAmmoBase && pSprite->type < kItemAmmoMax;
2019-09-19 22:42:45 +00:00
}
inline void actBurnSprite(int nSource, XSPRITE *pXSprite, int nTime)
{
pXSprite->burnTime = ClipHigh(pXSprite->burnTime + nTime, sprite[pXSprite->reference].statnum == kStatDude ? 2400 : 1200);
2019-09-19 22:42:45 +00:00
pXSprite->burnSource = nSource;
}
#ifdef POLYMER
void actAddGameLight(int lightRadius, int spriteNum, int zOffset, int lightRange, int lightColor, int lightPrio);
void actDoLight(int spriteNum);
#endif
2019-09-19 22:42:45 +00:00
bool IsUnderwaterSector(int nSector);
void actInit(bool bSaveLoad);
2019-09-19 22:42:45 +00:00
int actWallBounceVector(int *x, int *y, int nWall, int a4);
int actFloorBounceVector(int *x, int *y, int *z, int nSector, int a5);
void actRadiusDamage(DBloodActor* source, int x, int y, int z, int nSector, int nDist, int a7, int a8, DAMAGE_TYPE a9, int a10, int a11);
2019-09-19 22:42:45 +00:00
spritetype *actDropObject(spritetype *pSprite, int nType);
bool actHealDude(DBloodActor* pXDude, int a2, int a3);
2019-09-19 22:42:45 +00:00
bool actHealDude(XSPRITE *pXDude, int a2, int a3);
void actKillDude(int a1, spritetype *pSprite, DAMAGE_TYPE a3, int a4);
int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE a3, int a4);
2020-12-02 19:55:08 +00:00
int actDamageSprite(DBloodActor* pSource, DBloodActor* pTarget, DAMAGE_TYPE damageType, int damage);
2019-09-19 22:42:45 +00:00
void actHitcodeToData(int a1, HITINFO *pHitInfo, int *a3, spritetype **a4, XSPRITE **a5, int *a6, walltype **a7, XWALL **a8, int *a9, sectortype **a10, XSECTOR **a11);
void actImpactMissile(spritetype *pMissile, int hitCode);
2019-09-19 22:42:45 +00:00
void actKickObject(spritetype *pSprite1, spritetype *pSprite2);
void actTouchFloor(spritetype *pSprite, int nSector);
void ProcessTouchObjects(spritetype *pSprite, int nXSprite);
void actAirDrag(spritetype *pSprite, int a2);
int MoveThing(spritetype *pSprite);
void MoveDude(spritetype *pSprite);
int MoveMissile(spritetype *pSprite);
void actExplodeSprite(spritetype *pSprite);
void actActivateGibObject(DBloodActor *actor);
2019-09-19 22:42:45 +00:00
bool IsUnderWater(spritetype *pSprite);
void actProcessSprites(void);
2020-12-02 22:39:38 +00:00
spritetype * actSpawnSprite_(int nSector, int x, int y, int z, int nStat, char a6);
DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool a6);
2019-09-19 22:42:45 +00:00
spritetype *actSpawnDude(spritetype *pSource, short nType, int a3, int a4);
spritetype * actSpawnSprite(spritetype *pSource, int nStat);
spritetype * actSpawnThing(int nSector, int x, int y, int z, int nThingType);
spritetype * actFireThing_(spritetype *pSprite, int a2, int a3, int a4, int thingType, int a6);
DBloodActor* actFireThing(DBloodActor* pSprite, int a2, int a3, int a4, int thingType, int a6);
2019-09-19 22:42:45 +00:00
spritetype* actFireMissile(spritetype *pSprite, int a2, int a3, int a4, int a5, int a6, int nType);
int actGetRespawnTime(spritetype *pSprite);
bool actCheckRespawn(spritetype *pSprite);
bool actCanSplatWall(int nWall);
void actFireVector(spritetype *pShooter, int a2, int a3, int a4, int a5, int a6, VECTOR_TYPE vectorType);
void actPostSprite(int nSprite, int nStatus);
void actPostSprite(DBloodActor* actor, int status);
2019-09-19 22:42:45 +00:00
void actPostProcess(void);
void MakeSplash(DBloodActor *actor);
void actBuildMissile(spritetype* pMissile, int nXSprite, int nSprite);
extern const int DudeDifficulty[];
2019-10-26 11:16:32 +00:00
END_BLD_NS