Commit 55f2fbd3 authored by Steven Fuller's avatar Steven Fuller

Finished conversion of actor states from individual structions to an array

of structures, using enumerated indexes instead of pointers (idea from
WolfGL).
parent 328d9220
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -909,7 +909,7 @@ void Cmd_Fire()
gamestate.weaponframe = 0;
player->state = &s_attack;
player->state = s_attack;
gamestate.attackframe = 0;
gamestate.attackcount =
......@@ -1028,7 +1028,7 @@ void SpawnPlayer (int tilex, int tiley, int dir)
*(mapsegs[0] + farmapylookup[player->tiley]+player->tilex);
player->x = ((long)tilex<<TILESHIFT)+TILEGLOBAL/2;
player->y = ((long)tiley<<TILESHIFT)+TILEGLOBAL/2;
player->state = &s_player;
player->state = s_player;
player->angle = (1-dir)*90;
if (player->angle<0)
player->angle += ANGLES;
......@@ -1250,7 +1250,7 @@ void T_Attack(objtype *ob)
switch (cur->attack)
{
case -1:
ob->state = &s_player;
ob->state = s_player;
if (!gamestate.ammo)
{
gamestate.weapon = wp_knife;
......
......@@ -524,8 +524,8 @@ typedef struct statestruct
int shapenum; /* a shapenum of -1 means get from ob->temp1 */
int tictime;
void (*think)(), (*action)();
struct statestruct *next;
} PACKED statetype;
int next; /* stateenum */
} statetype;
//---------------------
//
......@@ -540,7 +540,7 @@ typedef struct statstruct
int shapenum; /* if shapenum == -1 the obj has been removed */
byte flags;
byte itemnumber;
} PACKED statobj_t;
} statobj_t;
//---------------------
//
......@@ -555,7 +555,7 @@ typedef struct doorstruct
byte lock;
enum {dr_open,dr_closed,dr_opening,dr_closing} action;
int ticcount;
} PACKED doorobj_t;
} doorobj_t;
//--------------------
//
......@@ -568,7 +568,7 @@ typedef struct objstruct
activetype active;
int ticcount;
classtype obclass;
statetype *state;
int state; /* stateenum */
byte flags; /* FL_SHOOTABLE, etc */
......@@ -589,11 +589,11 @@ typedef struct objstruct
int temp1,temp2,temp3;
struct objstruct *next,*prev;
} PACKED objtype;
} objtype;
#define NUMBUTTONS 8
enum {
enum {
bt_nobutton=-1,
bt_attack=0,
bt_strafe,
......@@ -607,7 +607,7 @@ enum {
#define NUMWEAPONS 4
typedef enum {
typedef enum {
wp_knife,
wp_pistol,
wp_machinegun,
......@@ -647,7 +647,7 @@ typedef struct
long TimeCount;
long killx,killy;
boolean victoryflag; // set during victory animations
} PACKED gametype;
} gametype;
typedef enum {
......@@ -730,7 +730,6 @@ extern boolean spearflag;
void ScanInfoPlane (void);
void SetupGameLevel (void);
void DrawPlayScreen (void);
void FizzleOut (void);
void GameLoop (void);
void ClearMemory (void);
void PlayDemo(int demonumber);
......@@ -878,8 +877,8 @@ void ThreeDRefresh (void);
#define SPDPATROL 512
#define SPDDOG 1500
void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
void NewState (objtype *ob, statetype *state);
void SpawnNewObj(unsigned tilex, unsigned tiley, int state); /* stateenum */
void NewState(objtype *ob, int state); /* stateenum */
boolean TryWalk (objtype *ob);
void SelectChaseDir (objtype *ob);
......
......@@ -248,8 +248,8 @@ static int CalcRotate(objtype *ob)
while (angle<0)
angle+=ANGLES;
if (ob->state->rotate == 2) // 2 rotation pain frame
return 4*(angle/(ANGLES/2)); // seperated by 3 (art layout...)
if (gamestates[ob->state].rotate == 2) // 2 rotation pain frame
return 4*(angle/(ANGLES/2)); // seperated by 3
return angle/(ANGLES/8);
}
......@@ -320,7 +320,7 @@ static void DrawScaleds()
//
for (obj = player->next; obj; obj = obj->next)
{
if (!(visptr->shapenum = obj->state->shapenum))
if (!(visptr->shapenum = gamestates[obj->state].shapenum))
continue; // no shape
spotloc = (obj->tilex << 6) + obj->tiley;
......@@ -350,7 +350,7 @@ static void DrawScaleds()
if (visptr->shapenum == -1)
visptr->shapenum = obj->temp1; // special shape
if (obj->state->rotate)
if (gamestates[obj->state].rotate)
visptr->shapenum += CalcRotate(obj);
if (visptr < &vislist[MAXVISABLE-1]) /* don't let it overflow */
......@@ -412,7 +412,7 @@ static void DrawPlayerWeapon()
#ifndef SPEAR
if (gamestate.victoryflag)
{
if (player->state == &s_deathcam && (get_TimeCount() & 32) )
if ((player->state == s_deathcam) && (get_TimeCount() & 32))
SimpleScaleShape(viewwidth/2,SPR_DEATHCAM,viewheight+1);
return;
}
......
......@@ -831,7 +831,7 @@ static void RemoveObj(objtype *gone)
if (gone == player)
Quit ("RemoveObj: Tried to remove the player!");
gone->state = NULL;
gone->state = s_none;
//
// fix the next object's back link
......@@ -1120,11 +1120,11 @@ void DoActor(objtype *ob)
if (!ob->ticcount)
{
think = ob->state->think;
think = gamestates[ob->state].think;
if (think)
{
think (ob);
if (!ob->state)
think(ob);
if (ob->state == s_none)
{
RemoveObj (ob);
return;
......@@ -1145,45 +1145,45 @@ void DoActor(objtype *ob)
// transitional object
//
ob->ticcount-=tics;
while ( ob->ticcount <= 0)
while (ob->ticcount <= 0)
{
think = ob->state->action; // end of state action
think = gamestates[ob->state].action; // end of state action
if (think)
{
think (ob);
if (!ob->state)
think(ob);
if (ob->state == s_none)
{
RemoveObj(ob);
return;
}
}
ob->state = ob->state->next;
ob->state = gamestates[ob->state].next;
if (!ob->state)
if (ob->state == s_none)
{
RemoveObj (ob);
RemoveObj(ob);
return;
}
if (!ob->state->tictime)
if (!gamestates[ob->state].tictime)
{
ob->ticcount = 0;
goto think;
}
ob->ticcount += ob->state->tictime;
ob->ticcount += gamestates[ob->state].tictime;
}
think:
//
// think
//
think = ob->state->think;
think = gamestates[ob->state].think;
if (think)
{
think (ob);
if (!ob->state)
think(ob);
if (ob->state == s_none)
{
RemoveObj(ob);
return;
......
......@@ -42,13 +42,13 @@ void FirstSighting (objtype *ob);
===================
*/
void SpawnNewObj(unsigned tilex, unsigned tiley, statetype *state)
void SpawnNewObj(unsigned tilex, unsigned tiley, int state) /* stateenum */
{
GetNewActor();
new->state = state;
if (state->tictime)
new->ticcount = US_RndT () % state->tictime;
if (gamestates[state].tictime)
new->ticcount = US_RndT () % gamestates[state].tictime;
else
new->ticcount = 0;
......@@ -73,10 +73,10 @@ void SpawnNewObj(unsigned tilex, unsigned tiley, statetype *state)
===================
*/
void NewState(objtype *ob, statetype *state)
void NewState(objtype *ob, int state) /* stateenum */
{
ob->state = state;
ob->ticcount = state->tictime;
ob->ticcount = gamestates[state].tictime;
}
/*
......@@ -742,25 +742,25 @@ void KillActor (objtype *ob)
{
case guardobj:
GivePoints (100);
NewState (ob,&s_grddie1);
NewState (ob,s_grddie1);
PlaceItemType (bo_clip2,tilex,tiley);
break;
case officerobj:
GivePoints (400);
NewState (ob,&s_ofcdie1);
NewState (ob,s_ofcdie1);
PlaceItemType (bo_clip2,tilex,tiley);
break;
case mutantobj:
GivePoints (700);
NewState (ob,&s_mutdie1);
NewState (ob,s_mutdie1);
PlaceItemType (bo_clip2,tilex,tiley);
break;
case ssobj:
GivePoints (500);
NewState (ob,&s_ssdie1);
NewState (ob,s_ssdie1);
if (gamestate.bestweapon < wp_machinegun)
PlaceItemType (bo_machinegun,tilex,tiley);
else
......@@ -769,19 +769,19 @@ void KillActor (objtype *ob)
case dogobj:
GivePoints (200);
NewState (ob,&s_dogdie1);
NewState (ob,s_dogdie1);
break;
#ifndef SPEAR
case bossobj:
GivePoints (5000);
NewState (ob,&s_bossdie1);
NewState (ob,s_bossdie1);
PlaceItemType (bo_key1,tilex,tiley);
break;
case gretelobj:
GivePoints (5000);
NewState (ob,&s_greteldie1);
NewState (ob,s_greteldie1);
PlaceItemType (bo_key1,tilex,tiley);
break;
......@@ -789,71 +789,71 @@ void KillActor (objtype *ob)
GivePoints (5000);
gamestate.killx = player->x;
gamestate.killy = player->y;
NewState (ob,&s_giftdie1);
NewState (ob,s_giftdie1);
break;
case fatobj:
GivePoints (5000);
gamestate.killx = player->x;
gamestate.killy = player->y;
NewState (ob,&s_fatdie1);
NewState (ob,s_fatdie1);
break;
case schabbobj:
GivePoints (5000);
gamestate.killx = player->x;
gamestate.killy = player->y;
NewState (ob,&s_schabbdie1);
NewState (ob,s_schabbdie1);
A_DeathScream(ob);
break;
case fakeobj:
GivePoints (2000);
NewState (ob,&s_fakedie1);
NewState (ob,s_fakedie1);
break;
case mechahitlerobj:
GivePoints (5000);
NewState (ob,&s_mechadie1);
NewState (ob,s_mechadie1);
break;
case realhitlerobj:
GivePoints (5000);
gamestate.killx = player->x;
gamestate.killy = player->y;
NewState (ob,&s_hitlerdie1);
NewState (ob,s_hitlerdie1);
A_DeathScream(ob);
break;
#else
case spectreobj:
GivePoints (200);
NewState (ob,&s_spectredie1);
NewState (ob,s_spectredie1);
break;
case angelobj:
GivePoints (5000);
NewState (ob,&s_angeldie1);
NewState (ob,s_angeldie1);
break;
case transobj:
GivePoints (5000);
NewState (ob,&s_transdie0);
NewState (ob,s_transdie0);
PlaceItemType (bo_key1,tilex,tiley);
break;
case uberobj:
GivePoints (5000);
NewState (ob,&s_uberdie0);
NewState (ob,s_uberdie0);
PlaceItemType (bo_key1,tilex,tiley);
break;
case willobj:
GivePoints (5000);
NewState (ob,&s_willdie1);
NewState (ob,s_willdie1);
PlaceItemType (bo_key1,tilex,tiley);
break;
case deathobj:
GivePoints (5000);
NewState (ob,&s_deathdie1);
NewState (ob,s_deathdie1);
PlaceItemType (bo_key1,tilex,tiley);
break;
#endif
......@@ -905,30 +905,30 @@ void DamageActor (objtype *ob, unsigned damage)
{
case guardobj:
if (ob->hitpoints&1)
NewState (ob,&s_grdpain);
NewState (ob,s_grdpain);
else
NewState (ob,&s_grdpain1);
NewState (ob,s_grdpain1);
break;
case officerobj:
if (ob->hitpoints&1)
NewState (ob,&s_ofcpain);
NewState (ob,s_ofcpain);
else
NewState (ob,&s_ofcpain1);
NewState (ob,s_ofcpain1);
break;
case mutantobj:
if (ob->hitpoints&1)
NewState (ob,&s_mutpain);
NewState (ob,s_mutpain);
else
NewState (ob,&s_mutpain1);
NewState (ob,s_mutpain1);
break;
case ssobj:
if (ob->hitpoints&1)
NewState (ob,&s_sspain);
NewState (ob,s_sspain);
else
NewState (ob,&s_sspain1);
NewState (ob,s_sspain1);
break;
default:
......@@ -1179,120 +1179,120 @@ void FirstSighting (objtype *ob)
{
case guardobj:
PlaySoundLocActor(HALTSND,ob);
NewState (ob,&s_grdchase1);
NewState (ob,s_grdchase1);
ob->speed *= 3; // go faster when chasing player
break;
case officerobj:
PlaySoundLocActor(SPIONSND,ob);
NewState (ob,&s_ofcchase1);
NewState (ob,s_ofcchase1);
ob->speed *= 5; // go faster when chasing player
break;
case mutantobj:
NewState (ob,&s_mutchase1);
NewState (ob,s_mutchase1);
ob->speed *= 3; // go faster when chasing player
break;
case ssobj:
PlaySoundLocActor(SCHUTZADSND,ob);
NewState (ob,&s_sschase1);
NewState (ob,s_sschase1);
ob->speed *= 4; // go faster when chasing player
break;
case dogobj:
PlaySoundLocActor(DOGBARKSND,ob);
NewState (ob,&s_dogchase1);
NewState (ob,s_dogchase1);
ob->speed *= 2; // go faster when chasing player
break;
#ifndef SPEAR
case bossobj:
SD_PlaySound(GUTENTAGSND);
NewState (ob,&s_bosschase1);
NewState (ob,s_bosschase1);
ob->speed = SPDPATROL*3; // go faster when chasing player
break;
case gretelobj:
SD_PlaySound(KEINSND);
NewState (ob,&s_gretelchase1);
NewState (ob,s_gretelchase1);
ob->speed *= 3; // go faster when chasing player
break;
case giftobj:
SD_PlaySound(EINESND);
NewState (ob,&s_giftchase1);
NewState (ob,s_giftchase1);
ob->speed *= 3; // go faster when chasing player
break;
case fatobj:
SD_PlaySound(ERLAUBENSND);
NewState (ob,&s_fatchase1);
NewState (ob,s_fatchase1);
ob->speed *= 3; // go faster when chasing player
break;
case schabbobj:
SD_PlaySound(SCHABBSHASND);
NewState (ob,&s_schabbchase1);
NewState (ob,s_schabbchase1);
ob->speed *= 3; // go faster when chasing player
break;
case fakeobj:
SD_PlaySound(TOT_HUNDSND);
NewState (ob,&s_fakechase1);
NewState (ob,s_fakechase1);
ob->speed *= 3; // go faster when chasing player
break;
case mechahitlerobj:
SD_PlaySound(DIESND);
NewState (ob,&s_mechachase1);
NewState (ob,s_mechachase1);
ob->speed *= 3; // go faster when chasing player
break;
case realhitlerobj:
SD_PlaySound(DIESND);
NewState (ob,&s_hitlerchase1);
NewState (ob,s_hitlerchase1);
ob->speed *= 5; // go faster when chasing player
break;
case ghostobj:
NewState (ob,&s_blinkychase1);
NewState (ob,s_blinkychase1);
ob->speed *= 2; // go faster when chasing player
break;
#else
case spectreobj:
SD_PlaySound(GHOSTSIGHTSND);
NewState (ob,&s_spectrechase1);
NewState (ob,s_spectrechase1);
ob->speed = 800; // go faster when chasing player
break;
case angelobj:
SD_PlaySound(ANGELSIGHTSND);
NewState (ob,&s_angelchase1);
NewState (ob,s_angelchase1);
ob->speed = 1536; // go faster when chasing player
break;
case transobj:
SD_PlaySound(TRANSSIGHTSND);
NewState (ob,&s_transchase1);
NewState (ob,s_transchase1);
ob->speed = 1536; // go faster when chasing player
break;
case uberobj:
NewState (ob,&s_uberchase1);
NewState (ob,s_uberchase1);
ob->speed = 3000; // go faster when chasing player
break;
case willobj:
SD_PlaySound(WILHELMSIGHTSND);
NewState (ob,&s_willchase1);
NewState (ob,s_willchase1);
ob->speed = 2048; // go faster when chasing player
break;
case deathobj:
SD_PlaySound(KNIGHTSIGHTSND);
NewState (ob,&s_deathchase1);
NewState (ob,s_deathchase1);
ob->speed = 2048; // go faster when chasing player
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment