0
0
Fork 0
mirror of https://github.com/ZDoom/Raze.git synced 2025-03-22 17:01:08 +00:00

- wrap state setters so they can use state names.

This commit is contained in:
Christoph Oelckers 2023-05-24 16:54:49 +02:00
parent 213bdbadad
commit 7eb713ab04
14 changed files with 263 additions and 89 deletions

View file

@ -57,3 +57,24 @@ xx(isExhumed)
xx(ChangeAction)
xx(ChangeAI)
xx(ChangeMove)
xx(Swim)
xx(DeathJump)
xx(Jump)
xx(DeathFall)
xx(Fall)
xx(Dead)
xx(Run)
xx(Sit)
xx(Stand)
xx(Death1)
xx(Death2)
xx(Duck)
xx(Rise)
xx(Fly)
xx(Crawl)
xx(Pain)
xx(Climb)
xx(Special)
xx(CloseAttack)
xx(Attack)

View file

@ -135,7 +135,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
case COOLIE_RUN_R0:
actor->ChangeStateEnd();
actor->vel.X *= 2;
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
actor->spr.Angles.Yaw += DAngle180;
break;
@ -162,7 +162,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
}
actor->ChangeStateEnd();
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
actor->vel.X = 12.5 + RandomRangeF(12.5);
actor->user.jump_speed = -200 - RandomRange(250);
DoActorBeginJump(actor);
@ -182,7 +182,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
actor->user.__legacyState.RotNum = 0;
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
//actor->user.__legacyState.ActorActionFunc = NullAnimator;
if (!sw_ninjahack)
actor->spr.Angles.Yaw = weapActor->spr.Angles.Yaw;
@ -215,7 +215,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
actor->user.jump_speed = -10 - RandomRange(25);
DoActorBeginJump(actor);
}
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
// Get angle to player
actor->spr.Angles.Yaw = (actor->user.targetActor->spr.pos - actor->spr.pos.Y).Angle() + DAngle180;
break;
@ -237,7 +237,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
actor->user.jump_speed = -100 - RandomRange(250);
}
DoActorBeginJump(actor);
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
// Get angle to player
actor->spr.Angles.Yaw = (actor->user.targetActor->spr.pos - actor->spr.pos).Angle() + DAngle180;
break;
@ -259,7 +259,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
if (RandomRange(1000) > 500)
actor->spr.cstat |= (CSTAT_SPRITE_YFLIP);
actor->ChangeStateEnd();
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
actor->vel.X = 18.75 + RandomRangeF(25);
actor->user.jump_speed = -300 - RandomRange(350);
DoActorBeginJump(actor);
@ -546,7 +546,7 @@ void KeepActorOnFloor(DSWActor* actor)
if (actor->user.__legacyState.Rot == actor->user.__legacyState.ActorActionSet->Run)
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Swim);
actor->setStateGroup(NAME_Swim);
}
// are swimming
@ -557,7 +557,7 @@ void KeepActorOnFloor(DSWActor* actor)
// only start swimming if you are running
if (actor->user.__legacyState.Rot == actor->user.__legacyState.ActorActionSet->Run || actor->user.__legacyState.Rot == actor->user.__legacyState.ActorActionSet->Swim)
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Swim);
actor->setStateGroup(NAME_Swim);
actor->spr.pos.Z = actor->user.oz = actor->user.loz - depth;
actor->user.Flags |= (SPR_SWIMMING);
actor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
@ -659,9 +659,9 @@ int DoActorBeginJump(DSWActor* actor)
if (actor->user.__legacyState.ActorActionSet)
{
if (actor->user.Flags & (SPR_DEAD))
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->DeathJump);
actor->setStateGroup(NAME_DeathJump);
else
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Jump);
actor->setStateGroup(NAME_Jump);
}
actor->user.__legacyState.StateFallOverride = nullptr;
@ -732,10 +732,10 @@ int DoActorBeginFall(DSWActor* actor)
{
if (actor->user.Flags & (SPR_DEAD))
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->DeathFall);
actor->setStateGroup(NAME_DeathFall);
}
else
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Fall);
actor->setStateGroup(NAME_Fall);
if (actor->user.__legacyState.StateFallOverride)
{
@ -800,19 +800,19 @@ int DoActorStopFall(DSWActor* actor)
{
if (actor->user.Flags & (SPR_DEAD))
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Dead);
actor->setStateGroup(NAME_Dead);
PlaySound(DIGI_ACTORBODYFALL1, actor, v3df_none);
}
else
{
PlaySound(DIGI_ACTORHITGROUND, actor, v3df_none);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
if ((actor->user.track >= 0) && (actor->user.jump_speed) > 800 && (actor->user.__legacyState.ActorActionSet->Sit))
{
actor->user.WaitTics = 80;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Sit);
actor->setStateGroup(NAME_Sit);
}
}
}
@ -986,4 +986,117 @@ void DSWActor::ChangeStateEnd()
}
Personality* DSWActor::getPersonality()
{
return nullptr; // not implemented yet.
}
static STATE** getLegacyState(ACTOR_ACTION_SET* a, FName label, int subl)
{
if (label == NAME_Run)
{
return a->Run;
}
if (label == NAME_Swim)
{
return a->Swim;
}
if (label == NAME_DeathJump)
{
return a->DeathJump;
}
if (label == NAME_Jump)
{
return a->Jump;
}
if (label == NAME_DeathFall)
{
return a->DeathFall;
}
if (label == NAME_Fall)
{
return a->Fall;
}
if (label == NAME_Dead)
{
return a->Dead;
}
if (label == NAME_Sit)
{
return a->Sit;
}
if (label == NAME_Stand)
{
return a->Stand;
}
if (label == NAME_Death1)
{
return a->Death1;
}
if (label == NAME_Death2)
{
return a->Death2;
}
if (label == NAME_Duck)
{
return a->Duck;
}
if (label == NAME_Rise)
{
return a->Rise;
}
if (label == NAME_Fly)
{
return a->Fly;
}
if (label == NAME_Crawl)
{
return a->Crawl;
}
if (label == NAME_Pain)
{
return a->Pain;
}
if (label == NAME_Climb)
{
return a->Climb;
}
if (label == NAME_Special)
{
return a->Special[1]; // special[0] is never used anywhere
}
if (label == NAME_CloseAttack)
{
return a->CloseAttack[subl];
}
if (label == NAME_Attack)
{
return a->Attack[subl];
}
return nullptr;
}
int DoActorDecide(DSWActor* actor);
void DSWActor::setActionDecide() { user.__legacyState.ActorActionFunc = DoActorDecide; }
void DSWActor::setStateGroup(FName label, int subl)
{
auto a = user.__legacyState.ActorActionSet;
if (a) NewStateGroup(this, getLegacyState(a, label, subl));
}
bool DSWActor::checkStateGroup(FName label, int subl)
{
auto a = user.__legacyState.ActorActionSet;
if (!a) return false;
return user.__legacyState.Rot == getLegacyState(a, label, subl);
}
bool DSWActor::hasState(FName label, int subl)
{
auto a = user.__legacyState.ActorActionSet;
if (!a) return false;
return getLegacyState(a, label, subl) != nullptr;
}
END_SW_NS

View file

@ -441,7 +441,7 @@ int DoActorOperate(DSWActor* actor)
{
actor->user.WaitTics = 2 * 120;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Sit);
actor->setStateGroup(NAME_Sit);
}
}
@ -649,7 +649,7 @@ ANIMATOR* DoActorActionDecide(DSWActor* actor)
int InitActorDecide(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return DoActorDecide(actor);
}
@ -697,7 +697,7 @@ int DoActorDecide(DSWActor* actor)
else
{
// Actually staying put
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Stand);
actor->setStateGroup(NAME_Stand);
//CON_Message("DoActorDecide: Staying put");
}
@ -719,7 +719,7 @@ int sw_snd_scratch = 0;
int InitActorAlertNoise(DSWActor* actor)
{
sw_snd_scratch = 1;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -728,7 +728,7 @@ int InitActorAlertNoise(DSWActor* actor)
int InitActorAmbientNoise(DSWActor* actor)
{
sw_snd_scratch = 2;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -736,7 +736,7 @@ int InitActorAmbientNoise(DSWActor* actor)
int InitActorAttackNoise(DSWActor* actor)
{
sw_snd_scratch = 3;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -744,7 +744,7 @@ int InitActorAttackNoise(DSWActor* actor)
int InitActorPainNoise(DSWActor* actor)
{
sw_snd_scratch = 4;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -752,7 +752,7 @@ int InitActorPainNoise(DSWActor* actor)
int InitActorDieNoise(DSWActor* actor)
{
sw_snd_scratch = 5;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -760,7 +760,7 @@ int InitActorDieNoise(DSWActor* actor)
int InitActorExtra1Noise(DSWActor* actor)
{
sw_snd_scratch = 6;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -768,7 +768,7 @@ int InitActorExtra1Noise(DSWActor* actor)
int InitActorExtra2Noise(DSWActor* actor)
{
sw_snd_scratch = 7;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -776,7 +776,7 @@ int InitActorExtra2Noise(DSWActor* actor)
int InitActorExtra3Noise(DSWActor* actor)
{
sw_snd_scratch = 8;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -784,7 +784,7 @@ int InitActorExtra3Noise(DSWActor* actor)
int InitActorExtra4Noise(DSWActor* actor)
{
sw_snd_scratch = 9;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -792,7 +792,7 @@ int InitActorExtra4Noise(DSWActor* actor)
int InitActorExtra5Noise(DSWActor* actor)
{
sw_snd_scratch = 10;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -800,7 +800,7 @@ int InitActorExtra5Noise(DSWActor* actor)
int InitActorExtra6Noise(DSWActor* actor)
{
sw_snd_scratch = 11;
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
@ -817,7 +817,7 @@ int InitActorMoveCloser(DSWActor* actor)
actor->user.__legacyState.ActorActionFunc = DoActorMoveCloser;
if (actor->user.__legacyState.Rot != actor->user.__legacyState.ActorActionSet->Run)
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
(*actor->user.__legacyState.ActorActionFunc)(actor);
@ -842,8 +842,8 @@ int DoActorCantMoveCloser(DSWActor* actor)
DoActorSetSpeed(actor, MID_SPEED);
actor->user.Flags |= (SPR_FIND_PLAYER);
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
}
else
{
@ -1078,8 +1078,8 @@ int FindWanderTrack(DSWActor* actor)
int InitActorRunAway(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
actor->user.track = FindTrackAwayFromPlayer(actor);
@ -1107,8 +1107,8 @@ int InitActorRunAway(DSWActor* actor)
int InitActorRunToward(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
InitActorReposition(actor);
DoActorSetSpeed(actor, FAST_SPEED);
@ -1170,7 +1170,7 @@ int InitActorAttack(DSWActor* actor)
actor->user.__legacyState.ActorActionFunc = DoActorAttack;
// move into standing frame
//NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Stand);
//actor->setStateGroup(NAME_Stand);
// face player when attacking
actor->spr.Angles.Yaw = (actor->user.targetActor->spr.pos - actor->spr.pos).Angle();
@ -1191,8 +1191,8 @@ int InitActorAttack(DSWActor* actor)
{
if (CHOOSE2(100))
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Death2);
actor->setActionDecide();
actor->setStateGroup(NAME_Death2);
return 0;
}
}
@ -1224,7 +1224,7 @@ int DoActorAttack(DSWActor* actor)
{
rand_num = ChooseActionNumber(actor->user.__legacyState.ActorActionSet->CloseAttackPercent);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->CloseAttack[rand_num]);
actor->setStateGroup(NAME_CloseAttack, rand_num);
}
else
{
@ -1234,12 +1234,10 @@ int DoActorAttack(DSWActor* actor)
ASSERT(rand_num < actor->user.WeaponNum);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Attack[rand_num]);
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setStateGroup(NAME_Attack, rand_num);
actor->setActionDecide();
}
//actor->user.__legacyState.ActorActionFunc = DoActorDecide;
return 0;
}
@ -1254,8 +1252,8 @@ int InitActorEvade(DSWActor* actor)
// Evade is same thing as run away except when you get to the end of the track
// you stop and take up the fight again.
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
actor->user.track = FindTrackAwayFromPlayer(actor);
@ -1279,8 +1277,8 @@ int InitActorEvade(DSWActor* actor)
int InitActorWanderAround(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
DoActorPickClosePlayer(actor);
@ -1304,8 +1302,8 @@ int InitActorWanderAround(DSWActor* actor)
int InitActorFindPlayer(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
actor->user.track = FindTrackToPlayer(actor);
@ -1316,8 +1314,8 @@ int InitActorFindPlayer(DSWActor* actor)
DoActorSetSpeed(actor, MID_SPEED);
actor->user.Flags |= (SPR_FIND_PLAYER);
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setActionDecide();
actor->setStateGroup(NAME_Run);
}
else
{
@ -1336,12 +1334,12 @@ int InitActorDuck(DSWActor* actor)
{
if (!actor->user.__legacyState.ActorActionSet->Duck)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
return 0;
}
actor->user.__legacyState.ActorActionFunc = DoActorDuck;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Duck);
actor->setStateGroup(NAME_Duck);
double dist = (actor->spr.pos.XY() - actor->user.targetActor->spr.pos.XY()).LengthSquared();
@ -1371,8 +1369,8 @@ int DoActorDuck(DSWActor* actor)
{
if ((actor->user.WaitTics -= ACTORMOVETICS) < 0)
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Rise);
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setStateGroup(NAME_Rise);
actor->setActionDecide();
actor->user.Flags &= ~(SPR_TARGETED);
}
@ -1693,7 +1691,7 @@ int InitActorReposition(DSWActor* actor)
actor->user.__legacyState.ActorActionFunc = DoActorReposition;
if (!(actor->user.Flags & SPR_SWIMMING))
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
(*actor->user.__legacyState.ActorActionFunc)(actor);
@ -1756,7 +1754,7 @@ int DoActorPause(DSWActor* actor)
// WaitTics is used by too much other actor code and causes problems here
if ((actor->user.Vis -= ACTORMOVETICS) < 0)
{
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
actor->user.Flags &= ~(SPR_TARGETED);
}

View file

@ -27,8 +27,32 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#ifndef AI_H
#define AI_H
class VMFunction;
BEGIN_SW_NS
// Call functions based on a random range value
struct Decision
{
int range;
VMFunction* action;
};
// Personality structure
struct Personality
{
Decision* Battle;
Decision* Offense;
Decision* Broadcast;
Decision* Surprised;
Decision* Evasive;
Decision* LostTarget;
Decision* CloseRange;
Decision* TouchTarget;
};
// Call functions based on a random range value
struct DECISION
{

View file

@ -715,7 +715,7 @@ int InitCoolgCircle(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoCoolgCircle;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
// set it close
DoActorSetSpeed(actor, FAST_SPEED);
@ -820,7 +820,7 @@ int DoCoolgDeath(DSWActor* actor)
{
actor->user.Flags &= ~(SPR_FALLING|SPR_SLIDING);
actor->spr.cstat &= ~(CSTAT_SPRITE_YFLIP); // If upside down, reset it
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Dead);
actor->setStateGroup(NAME_Dead);
return 0;
}

View file

@ -468,9 +468,9 @@ void EnemyDefaults(DSWActor* actor, ACTOR_ACTION_SET* action, PERSONALITY* perso
if (!action)
return;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
actor->user.__legacyState.ActorActionFunc = DoActorDecide;
actor->setActionDecide();
// find the number of long range attacks
for (wpn = wpn_cnt = 0; wpn < SIZ(actor->user.__legacyState.ActorActionSet->Attack); wpn++)

View file

@ -564,7 +564,7 @@ int DoEelDeath(DSWActor* actor)
actor->spr.cstat |= (CSTAT_SPRITE_XFLIP);
if (RandomRange(1000) > 500)
actor->spr.cstat |= (CSTAT_SPRITE_YFLIP);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Dead);
actor->setStateGroup(NAME_Dead);
return 0;
}
@ -582,7 +582,7 @@ int DoEelMove(DSWActor* actor)
ASSERT(actor->user.__legacyState.Rot != nullptr);
if (SpriteOverlap(actor, actor->user.targetActor))
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->CloseAttack[0]);
actor->setStateGroup(NAME_CloseAttack, 0);
if (actor->user.Flags & (SPR_SLIDING))
DoActorSlide(actor);

View file

@ -430,7 +430,7 @@ int InitHornetCircle(DSWActor* actor)
{
actor->user.__legacyState.ActorActionFunc = DoHornetCircle;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
// set it close
DoActorSetSpeed(actor, FAST_SPEED);
@ -542,7 +542,7 @@ int DoHornetDeath(DSWActor* actor)
{
actor->user.Flags &= ~(SPR_FALLING|SPR_SLIDING);
actor->spr.cstat &= ~(CSTAT_SPRITE_YFLIP); // If upside down, reset it
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Dead);
actor->setStateGroup(NAME_Dead);
DeleteNoSoundOwner(actor);
return 0;
}

View file

@ -1941,7 +1941,7 @@ int DoNinjaHariKari(DSWActor* actor)
actor->user.Flags &= ~(SPR_FALLING | SPR_JUMPING);
actor->user.floor_dist = (40);
actor->user.__legacyState.RotNum = 0;
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
actor->spr.extra |= (SPRX_BREAKABLE);
actor->spr.cstat |= (CSTAT_SPRITE_BREAKABLE);
@ -1976,7 +1976,7 @@ int DoNinjaGrabThroat(DSWActor* actor)
actor->user.Flags &= ~(SPR_FALLING | SPR_JUMPING);
actor->user.floor_dist = (40);
actor->user.__legacyState.RotNum = 0;
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
actor->spr.extra |= (SPRX_BREAKABLE);
actor->spr.cstat |= (CSTAT_SPRITE_BREAKABLE);

View file

@ -1017,7 +1017,7 @@ int DoRipperMoveHang(DSWActor* actor)
{
if (actor->user.coll.type == kHitWall)
{
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Special[1]);
actor->setStateGroup(NAME_Special);
actor->user.WaitTics = 2 + ((RANDOM_P2(4 << 8) >> 8) * 120);
// hang flush with the wall

View file

@ -1022,7 +1022,7 @@ int DoRipper2MoveHang(DSWActor* actor)
if (abs(actor->spr.pos.Z - actor->user.targetActor->spr.pos.Z) > 250)
return 0;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Special[1]);
actor->setStateGroup(NAME_Special);
if (RANDOM_P2(1024<<8)>>8 > 500)
actor->user.WaitTics = ((RANDOM_P2(2 << 8) >> 8) * 120);
else

View file

@ -4,6 +4,7 @@
BEGIN_SW_NS
struct Personality;
class DSWActor : public DCoreActor
{
@ -18,6 +19,10 @@ public:
TObjPtr<DSWActor*> ownerActor;
FTextureID texparam, texparam2; // some special variants of ST1 need this...
// These should probably be elsewhere later but for now this is most convenient.
int16_t CloseAttackPercent[MAX_ACTOR_CLOSE_ATTACK];
int16_t AttackPercent[MAX_ACTOR_ATTACK];
DSWActor() = default;
bool hasU() { return hasUser; }
@ -35,7 +40,20 @@ public:
}
void Serialize(FSerializer& arc) override;
// wrappers to static class data. Must be stored in the meta data, but will require better means of access than what's currently available.
Personality* getPersonality();
int16_t* getCloseAttackPercent() { return CloseAttackPercent; }
int16_t* getAttackPercent() { return AttackPercent; }
// wrappers that hide legacy implementation details.
void ChangeStateEnd();
void clearActionFunc() { user.__legacyState.ActorActionFunc = nullptr; }
void setActionDecide();
void setStateGroup(FName label, int substate = 0); // substate is only valid for Attack and CloseAttack
bool checkStateGroup(FName label, int substate = 0);
bool hasState(FName label, int substate = 0);
};
inline void UpdateChangeXY(DSWActor* actor)

View file

@ -1071,7 +1071,7 @@ void SetupSectorObject(sectortype* sectp, short tag)
{
change_actor_stat(actor, STAT_NO_STATE);
SpawnUser(actor, 0, nullptr);
actor->user.__legacyState.ActorActionFunc = nullptr;
actor->clearActionFunc();
}
break;
@ -2897,7 +2897,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
break;
case TRACK_ACTOR_STAND:
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Stand);
actor->setStateGroup(NAME_Stand);
break;
case TRACK_ACTOR_JUMP:
@ -3045,7 +3045,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
else
actor->user.WaitTics = tpoint->tag_high * 128;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Stand);
actor->setStateGroup(NAME_Stand);
}
}
}
@ -3059,7 +3059,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
else
actor->user.WaitTics = tpoint->tag_high * 128;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Sit);
actor->setStateGroup(NAME_Sit);
}
}
@ -3094,20 +3094,20 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
case TRACK_ACTOR_CRAWL:
if (actor->user.__legacyState.Rot != actor->user.__legacyState.ActorActionSet->Crawl)
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Crawl);
actor->setStateGroup(NAME_Crawl);
else
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Rise);
actor->setStateGroup(NAME_Rise);
break;
case TRACK_ACTOR_SWIM:
if (actor->user.__legacyState.Rot != actor->user.__legacyState.ActorActionSet->Swim)
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Swim);
actor->setStateGroup(NAME_Swim);
else
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Rise);
actor->setStateGroup(NAME_Rise);
break;
case TRACK_ACTOR_FLY:
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Fly);
actor->setStateGroup(NAME_Fly);
break;
case TRACK_ACTOR_SIT:
@ -3119,7 +3119,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
else
actor->user.WaitTics = tpoint->tag_high * 128;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Sit);
actor->setStateGroup(NAME_Sit);
}
break;
@ -3128,7 +3128,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
if (actor->user.__legacyState.ActorActionSet->Death2)
{
actor->user.WaitTics = 4 * 120;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Death1);
actor->setStateGroup(NAME_Death1);
}
break;
@ -3137,7 +3137,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
if (actor->user.__legacyState.ActorActionSet->Death2)
{
actor->user.WaitTics = 4 * 120;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Death2);
actor->setStateGroup(NAME_Death2);
}
break;
@ -3150,7 +3150,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
actor->vel.X *= 2;
actor->user.jump_speed = -495;
DoActorBeginJump(actor);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->DeathJump);
actor->setStateGroup(NAME_DeathJump);
}
break;
@ -3164,7 +3164,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
else
actor->user.WaitTics = tpoint->tag_high * 128;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->CloseAttack[0]);
actor->setStateGroup(NAME_CloseAttack, 0);
}
break;
@ -3178,7 +3178,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
else
actor->user.WaitTics = tpoint->tag_high * 128;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->CloseAttack[1]);
actor->setStateGroup(NAME_CloseAttack, 1);
}
break;
@ -3290,7 +3290,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
//
actor->user.Flags |= (SPR_CLIMBING);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Climb);
actor->setStateGroup(NAME_Climb);
actor->vel.Z -= 1;
}
@ -3356,7 +3356,7 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
if (actor->user.WaitTics <= 0)
{
actor->user.Flags &= ~(SPR_DONT_UPDATE_ANG);
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Run);
actor->setStateGroup(NAME_Run);
actor->user.WaitTics = 0;
}

View file

@ -5237,7 +5237,7 @@ int ActorPain(DSWActor* actor)
{
ActorLeaveTrack(actor);
actor->user.WaitTics = 60;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Pain);
actor->setStateGroup(NAME_Pain);
return true;
}
}
@ -5258,7 +5258,7 @@ int ActorPainPlasma(DSWActor* actor)
if (actor->user.__legacyState.ActorActionSet && actor->user.__legacyState.ActorActionSet->Pain)
{
actor->user.WaitTics = PLASMA_FOUNTAIN_TIME;
NewStateGroup(actor, actor->user.__legacyState.ActorActionSet->Pain);
actor->setStateGroup(NAME_Pain);
return true;
}
else