Actor-related code cleanup part 2: give actor t_data[] indexes names.

Using macros like AC_COUNT(t). Clean up related code:
 - comment out the dead condition noted in the previous commit
 - Lunatic: use get_count() instead of get_t_data(0) in one place,
   rename to _get_t_data(), i.e. make that method internal

git-svn-id: https://svn.eduke32.com/eduke32@3920 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-06-30 20:38:48 +00:00
parent 90ddee2296
commit e164bd7f1e
9 changed files with 126 additions and 98 deletions

View file

@ -782,16 +782,17 @@ static void A_MoveSector(int32_t i)
} }
#if !defined LUNATIC #if !defined LUNATIC
# define LIGHTRAD_PICOFS (T5 ? *(script+T5) + (*(script+T5+2))*T4 : 0) // NOTE: T5 is AC_ACTION_ID
# define LIGHTRAD_PICOFS (T5 ? *(script+T5) + (*(script+T5+2))*AC_CURFRAME(actor[i].t_data) : 0)
#else #else
// SACTION
// startframe + viewtype*[cyclic counter] // startframe + viewtype*[cyclic counter]
# define LIGHTRAD_PICOFS (actor[i].ac.startframe + actor[i].ac.viewtype*T4) # define LIGHTRAD_PICOFS (actor[i].ac.startframe + actor[i].ac.viewtype*AC_CURFRAME(actor[i].t_data))
#endif #endif
// this is the same crap as in game.c's tspr manipulation. puke. // this is the same crap as in game.c's tspr manipulation. puke.
#define LIGHTRAD (s->yrepeat * tilesizy[s->picnum+LIGHTRAD_PICOFS]) // XXX: may access tilesizy out-of-bounds by bad user code.
#define LIGHTRAD2 (((s->yrepeat) + (rand()%(s->yrepeat>>2))) * tilesizy[s->picnum+LIGHTRAD_PICOFS]) #define LIGHTRAD (s->yrepeat * tilesizy[s->picnum + LIGHTRAD_PICOFS])
#define LIGHTRAD2 (((s->yrepeat) + (rand()%(s->yrepeat>>2))) * tilesizy[s->picnum + LIGHTRAD_PICOFS])
void G_AddGameLight(int32_t radius, int32_t srcsprite, int32_t zoffset, int32_t range, int32_t color, int32_t priority) void G_AddGameLight(int32_t radius, int32_t srcsprite, int32_t zoffset, int32_t range, int32_t color, int32_t priority)
{ {

View file

@ -74,6 +74,18 @@ enum uactortypes_t {
enemystayput enemystayput
}; };
// These macros are there to give names to the t_data[]/T*/vm.g_t[] indices
// when used with actors. Greppability of source code is certainly a virtue.
#define AC_COUNT(t) (t[0]) /* the actor's count */
/* The ID of the actor's current move. In C-CON, the bytecode offset to the
* move composite: */
#define AC_MOVE_ID(t) (t[1])
#define AC_ACTION_COUNT(t) (t[2]) /* the actor's action count */
#define AC_CURFRAME(t) (t[3]) /* the actor's current frame offset */
/* The ID of the actor's current action. In C-CON, the bytecode offset to the
* action composite: */
#define AC_ACTION_ID(t) (t[4])
#define AC_AI_ID(t) (t[5]) /* the ID of the actor's current ai */
#ifdef LUNATIC #ifdef LUNATIC
struct action { struct action {
@ -147,14 +159,14 @@ typedef struct {
#endif #endif
#if UINTPTR_MAX == 0xffffffff #if UINTPTR_MAX == 0xffffffff
/* 32-bit */ /* 32-bit */
# ifndef LUNATIC # if !defined LUNATIC
int8_t filler[20]; int8_t filler[20];
# else # else
int8_t filler[4]; int8_t filler[4];
# endif # endif
#else #else
/* 64-bit */ /* 64-bit */
# ifndef LUNATIC # if !defined LUNATIC
int8_t filler[16]; int8_t filler[16];
# else # else
/* no padding */ /* no padding */

View file

@ -4804,8 +4804,8 @@ static int32_t G_InitActor(int32_t i, int32_t tilenum, int32_t set_movflag_uncon
if (g_tile[tilenum].execPtr) if (g_tile[tilenum].execPtr)
{ {
SH = *(g_tile[tilenum].execPtr); SH = *(g_tile[tilenum].execPtr);
T5 = *(g_tile[tilenum].execPtr+1); AC_ACTION_ID(actor[i].t_data) = *(g_tile[tilenum].execPtr+1);
T2 = *(g_tile[tilenum].execPtr+2); AC_MOVE_ID(actor[i].t_data) = *(g_tile[tilenum].execPtr+2);
if (set_movflag_uncond || SHT == 0) if (set_movflag_uncond || SHT == 0)
SHT = *(g_tile[tilenum].execPtr+3); SHT = *(g_tile[tilenum].execPtr+3);
@ -4819,8 +4819,8 @@ static int32_t G_InitActor(int32_t i, int32_t tilenum, int32_t set_movflag_uncon
const el_actor_t *a = &g_elActors[tilenum]; const el_actor_t *a = &g_elActors[tilenum];
SH = a->strength; SH = a->strength;
T5 = a->act.id; AC_ACTION_ID(actor[i].t_data) = a->act.id;
T2 = a->mov.id; AC_MOVE_ID(actor[i].t_data) = a->mov.id;
Bmemcpy(&actor[i].ac, &a->act.ac, sizeof(struct action)); Bmemcpy(&actor[i].ac, &a->act.ac, sizeof(struct action));
Bmemcpy(&actor[i].mv, &a->mov.mv, sizeof(struct move)); Bmemcpy(&actor[i].mv, &a->mov.mv, sizeof(struct move));
@ -5025,7 +5025,7 @@ int32_t A_Spawn(int32_t j, int32_t pn)
CS |= 256; CS |= 256;
if (!G_InitActor(i, s, 0)) if (!G_InitActor(i, s, 0))
T2 = T5 = 0; T2 = T5 = 0; // AC_MOVE_ID, AC_ACTION_ID
} }
sp = &sprite[i]; sp = &sprite[i];
@ -7194,7 +7194,7 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
{ {
int32_t switchpic; int32_t switchpic;
int32_t curframe; int32_t curframe;
#ifndef LUNATIC #if !defined LUNATIC
int32_t scrofs_action; int32_t scrofs_action;
#else #else
int32_t startframe, viewtype; int32_t startframe, viewtype;
@ -7241,15 +7241,16 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
sect = s->sectnum; sect = s->sectnum;
Bassert(i >= 0); Bassert(i >= 0);
curframe = T4; curframe = AC_CURFRAME(actor[i].t_data);
#ifndef LUNATIC #if !defined LUNATIC
scrofs_action = T5; // SACTION scrofs_action = AC_ACTION_ID(actor[i].t_data);
#else #else
startframe = actor[i].ac.startframe; startframe = actor[i].ac.startframe;
viewtype = actor[i].ac.viewtype; viewtype = actor[i].ac.viewtype;
#endif #endif
switchpic = s->picnum; switchpic = s->picnum;
//some special cases because dynamictostatic system can't handle addition to constants // Some special cases because dynamictostatic system can't handle
// addition to constants.
if ((s->picnum >= SCRAP6) && (s->picnum<=SCRAP6+7)) if ((s->picnum >= SCRAP6) && (s->picnum<=SCRAP6+7))
switchpic = SCRAP5; switchpic = SCRAP5;
else if ((s->picnum==MONEY+1) || (s->picnum==MAIL+1) || (s->picnum==PAPER+1)) else if ((s->picnum==MONEY+1) || (s->picnum==MAIL+1) || (s->picnum==PAPER+1))
@ -7508,7 +7509,7 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
{ {
// Display APLAYER sprites with action PSTAND when viewed through // Display APLAYER sprites with action PSTAND when viewed through
// a camera. Not implemented for Lunatic. // a camera. Not implemented for Lunatic.
#ifndef LUNATIC #if !defined LUNATIC
const intptr_t *aplayer_scr = g_tile[APLAYER].execPtr; const intptr_t *aplayer_scr = g_tile[APLAYER].execPtr;
// [0]=strength, [1]=actionofs, [2]=moveofs // [0]=strength, [1]=actionofs, [2]=moveofs
@ -7603,7 +7604,7 @@ PALONLY:
if (G_HaveActor(s->picnum)) if (G_HaveActor(s->picnum))
{ {
#ifndef LUNATIC #if !defined LUNATIC
if ((unsigned)scrofs_action + 2 >= (unsigned)g_scriptSize) if ((unsigned)scrofs_action + 2 >= (unsigned)g_scriptSize)
goto skip; goto skip;
@ -7675,7 +7676,7 @@ PALONLY:
/* completemirror() already reverses the drawn frame, so the above isn't necessary. /* completemirror() already reverses the drawn frame, so the above isn't necessary.
* Even Polymost's and Polymer's mirror seems to function correctly this way. */ * Even Polymost's and Polymer's mirror seems to function correctly this way. */
#ifndef LUNATIC #if !defined LUNATIC
skip: skip:
#endif #endif
// XXX: Currently, for the splitscreen mod, sprites will be pal6-colored iff the first // XXX: Currently, for the splitscreen mod, sprites will be pal6-colored iff the first

View file

@ -248,18 +248,18 @@ int32_t A_Dodge(spritetype *s)
return 0; return 0;
} }
int32_t A_GetFurthestAngle(int32_t iActor,int32_t angs) int32_t A_GetFurthestAngle(int32_t iActor, int32_t angs)
{ {
spritetype *s = &sprite[iActor]; spritetype *s = &sprite[iActor];
if (s->picnum != APLAYER && (actor[iActor].t_data[0]&63) > 2) if (s->picnum != APLAYER && (AC_COUNT(actor[iActor].t_data)&63) > 2)
return(s->ang + 1024); return s->ang + 1024;
{ {
int32_t furthest_angle=0; int32_t furthest_angle=0;
int32_t d; int32_t d, j;
int32_t greatestd = -(1<<30); int32_t greatestd = INT32_MIN;
int32_t angincs = 2048/angs,j; int32_t angincs=2048/angs;
hitdata_t hit; hitdata_t hit;
for (j=s->ang; j<(2048+s->ang); j+=angincs) for (j=s->ang; j<(2048+s->ang); j+=angincs)
@ -278,13 +278,14 @@ int32_t A_GetFurthestAngle(int32_t iActor,int32_t angs)
furthest_angle = j; furthest_angle = j;
} }
} }
return (furthest_angle&2047);
return furthest_angle&2047;
} }
} }
int32_t A_FurthestVisiblePoint(int32_t iActor,spritetype *ts,int32_t *dax,int32_t *day) int32_t A_FurthestVisiblePoint(int32_t iActor, spritetype *ts, int32_t *dax, int32_t *day)
{ {
if ((actor[iActor].t_data[0]&63)) if (AC_COUNT(actor[iActor].t_data)&63)
return -1; return -1;
{ {
@ -454,19 +455,19 @@ int32_t G_GetAngleDelta(int32_t a,int32_t na)
GAMEEXEC_STATIC void VM_AlterAng(int32_t movflags) GAMEEXEC_STATIC void VM_AlterAng(int32_t movflags)
{ {
const int32_t ticselapsed = (vm.g_t[0])&31; const int32_t ticselapsed = (AC_COUNT(vm.g_t))&31;
#if !defined LUNATIC #if !defined LUNATIC
const intptr_t *moveptr; const intptr_t *moveptr;
if ((unsigned)vm.g_t[1] >= (unsigned)g_scriptSize-1) if ((unsigned)AC_MOVE_ID(vm.g_t) >= (unsigned)g_scriptSize-1)
{ {
vm.g_t[1] = 0; AC_MOVE_ID(vm.g_t) = 0;
OSD_Printf_nowarn(OSD_ERROR "bad moveptr for actor %d (%d)!\n", vm.g_i, TrackerCast(vm.g_sp->picnum)); OSD_Printf_nowarn(OSD_ERROR "bad moveptr for actor %d (%d)!\n", vm.g_i, TrackerCast(vm.g_sp->picnum));
return; return;
} }
moveptr = script + vm.g_t[1]; // RESEARCH: what's with move 0 and >>> 1 <<<? moveptr = script + AC_MOVE_ID(vm.g_t);
vm.g_sp->xvel += (*moveptr - vm.g_sp->xvel)/5; vm.g_sp->xvel += (*moveptr - vm.g_sp->xvel)/5;
if (vm.g_sp->zvel < 648) if (vm.g_sp->zvel < 648)
@ -591,16 +592,16 @@ GAMEEXEC_STATIC void VM_Move(void)
#if !defined LUNATIC #if !defined LUNATIC
const intptr_t *moveptr; const intptr_t *moveptr;
#endif #endif
// NOTE: source/gameexec.c:596:5: warning: comparison is always false due // NOTE: commented out condition is dead since r3159 (making hi/lotag unsigned).
// to limited range of data type [-Wtype-limits] // XXX: Does it break anything? Where are movflags with all bits set created?
const int32_t movflags = (vm.g_sp->hitag==-1) ? 0 : vm.g_sp->hitag; const int32_t movflags = /*(vm.g_sp->hitag==-1) ? 0 :*/ vm.g_sp->hitag;
const int32_t deadflag = (A_CheckEnemySprite(vm.g_sp) && vm.g_sp->extra <= 0); const int32_t deadflag = (A_CheckEnemySprite(vm.g_sp) && vm.g_sp->extra <= 0);
int32_t badguyp, angdif; int32_t badguyp, angdif;
vm.g_t[0]++; AC_COUNT(vm.g_t)++;
// If the move ID is zero, or the movflags are 0 // If the move ID is zero, or the movflags are 0
if (vm.g_t[1] == 0 || movflags == 0) if (AC_MOVE_ID(vm.g_t) == 0 || movflags == 0)
{ {
if (deadflag || (actor[vm.g_i].bpos.x != vm.g_sp->x) || (actor[vm.g_i].bpos.y != vm.g_sp->y)) if (deadflag || (actor[vm.g_i].bpos.x != vm.g_sp->x) || (actor[vm.g_i].bpos.y != vm.g_sp->y))
{ {
@ -618,15 +619,15 @@ GAMEEXEC_STATIC void VM_Move(void)
VM_FacePlayer(2); VM_FacePlayer(2);
if (movflags&spin) if (movflags&spin)
vm.g_sp->ang += sintable[((vm.g_t[0]<<3)&2047)]>>6; vm.g_sp->ang += sintable[((AC_COUNT(vm.g_t)<<3)&2047)]>>6;
if (movflags&face_player_slow) if (movflags&face_player_slow)
VM_FacePlayer(4); VM_FacePlayer(4);
if ((movflags&jumptoplayer) == jumptoplayer) if ((movflags&jumptoplayer) == jumptoplayer)
{ {
if (vm.g_t[0] < 16) if (AC_COUNT(vm.g_t) < 16)
vm.g_sp->zvel -= (sintable[(512+(vm.g_t[0]<<4))&2047]>>5); vm.g_sp->zvel -= (sintable[(512+(AC_COUNT(vm.g_t)<<4))&2047]>>5);
} }
if (movflags&face_player_smart) if (movflags&face_player_smart)
@ -641,14 +642,14 @@ GAMEEXEC_STATIC void VM_Move(void)
dead: dead:
#if !defined LUNATIC #if !defined LUNATIC
if ((unsigned)vm.g_t[1] >= (unsigned)g_scriptSize-1) if ((unsigned)AC_MOVE_ID(vm.g_t) >= (unsigned)g_scriptSize-1)
{ {
vm.g_t[1] = 0; AC_MOVE_ID(vm.g_t) = 0;
OSD_Printf_nowarn(OSD_ERROR "clearing bad moveptr for actor %d (%d)\n", vm.g_i, TrackerCast(vm.g_sp->picnum)); OSD_Printf_nowarn(OSD_ERROR "clearing bad moveptr for actor %d (%d)\n", vm.g_i, TrackerCast(vm.g_sp->picnum));
return; return;
} }
moveptr = script + vm.g_t[1]; // RESEARCH: what's with move 0 and >>> 1 <<<? moveptr = script + AC_MOVE_ID(vm.g_t);
if (movflags&geth) vm.g_sp->xvel += ((*moveptr)-vm.g_sp->xvel)>>1; if (movflags&geth) vm.g_sp->xvel += ((*moveptr)-vm.g_sp->xvel)>>1;
if (movflags&getv) vm.g_sp->zvel += ((*(moveptr+1)<<4)-vm.g_sp->zvel)>>1; if (movflags&getv) vm.g_sp->zvel += ((*(moveptr+1)<<4)-vm.g_sp->zvel)>>1;
@ -763,11 +764,13 @@ dead:
} }
else if (vm.g_sp->picnum != DRONE && vm.g_sp->picnum != SHARK && vm.g_sp->picnum != COMMANDER) else if (vm.g_sp->picnum != DRONE && vm.g_sp->picnum != SHARK && vm.g_sp->picnum != COMMANDER)
{ {
if (ps->actorsqu == vm.g_i) return; if (ps->actorsqu == vm.g_i)
return;
if (!A_CheckSpriteFlags(vm.g_i, SPRITE_SMOOTHMOVE)) if (!A_CheckSpriteFlags(vm.g_i, SPRITE_SMOOTHMOVE))
{ {
if (vm.g_t[0]&1) return; if (AC_COUNT(vm.g_t)&1)
return;
daxvel <<= 1; daxvel <<= 1;
} }
} }
@ -775,7 +778,8 @@ dead:
{ {
vec3_t tmpvect = { (daxvel*(sintable[(angdif+512)&2047]))>>14, vec3_t tmpvect = { (daxvel*(sintable[(angdif+512)&2047]))>>14,
(daxvel*(sintable[angdif&2047]))>>14, vm.g_sp->zvel (daxvel*(sintable[angdif&2047]))>>14,
vm.g_sp->zvel
}; };
actor[vm.g_i].movflag = A_MoveSprite( actor[vm.g_i].movflag = A_MoveSprite(
@ -948,7 +952,7 @@ static void VM_Fall(int32_t g_i, spritetype *g_sp)
default: default:
{ {
#if !defined LUNATIC #if !defined LUNATIC
int32_t moveScriptOfs = vm.g_t[1]; int32_t moveScriptOfs = AC_MOVE_ID(vm.g_t);
#endif #endif
// fix for flying/jumping monsters getting stuck in water // fix for flying/jumping monsters getting stuck in water
if ((g_sp->hitag & jumptoplayer) || if ((g_sp->hitag & jumptoplayer) ||
@ -1349,18 +1353,18 @@ skip_check:
case CON_AI: case CON_AI:
insptr++; insptr++;
//Following changed to use pointersizes //Following changed to use pointersizes
vm.g_t[5] = *insptr++; // Ai AC_AI_ID(vm.g_t) = *insptr++; // Ai
vm.g_t[4] = *(script + vm.g_t[5]); // Action AC_ACTION_ID(vm.g_t) = *(script + AC_AI_ID(vm.g_t)); // Action
// NOTE: "if (g_t[5])" added in r1155. It used to be a pointer though. // NOTE: "if" check added in r1155. It used to be a pointer though.
if (vm.g_t[5]) if (AC_AI_ID(vm.g_t))
{ AC_MOVE_ID(vm.g_t) = *(script + AC_AI_ID(vm.g_t) + 1); // move
vm.g_t[1] = *(script + vm.g_t[5] + 1); // move
} vm.g_sp->hitag = *(script + AC_AI_ID(vm.g_t) + 2); // move flags
vm.g_sp->hitag = *(script + vm.g_t[5] + 2); // move flags
AC_COUNT(vm.g_t) = AC_ACTION_COUNT(vm.g_t) = AC_CURFRAME(vm.g_t) = 0;
vm.g_t[0] = vm.g_t[2] = vm.g_t[3] = 0; // count, actioncount... vm.g_t[3] = ??
if (!A_CheckEnemySprite(vm.g_sp) || vm.g_sp->extra > 0) // hack if (!A_CheckEnemySprite(vm.g_sp) || vm.g_sp->extra > 0) // hack
if (vm.g_sp->hitag&random_angle) if (vm.g_sp->hitag&random_angle)
vm.g_sp->ang = krand()&2047; vm.g_sp->ang = krand()&2047;
@ -1368,8 +1372,8 @@ skip_check:
case CON_ACTION: case CON_ACTION:
insptr++; insptr++;
vm.g_t[2] = vm.g_t[3] = 0; AC_ACTION_COUNT(vm.g_t) = AC_CURFRAME(vm.g_t) = 0;
vm.g_t[4] = *insptr++; AC_ACTION_ID(vm.g_t) = *insptr++;
continue; continue;
case CON_IFPLAYERSL: case CON_IFPLAYERSL:
@ -1783,8 +1787,8 @@ skip_check:
case CON_MOVE: case CON_MOVE:
insptr++; insptr++;
vm.g_t[0]=0; AC_COUNT(vm.g_t) = 0;
vm.g_t[1] = *insptr++; AC_MOVE_ID(vm.g_t) = *insptr++;
vm.g_sp->hitag = *insptr++; vm.g_sp->hitag = *insptr++;
if (A_CheckEnemySprite(vm.g_sp) && vm.g_sp->extra <= 0) // hack if (A_CheckEnemySprite(vm.g_sp) && vm.g_sp->extra <= 0) // hack
continue; continue;
@ -2205,32 +2209,37 @@ nullquote:
CON_ERRPRINTF("Invalid statnum: %d\n", j); CON_ERRPRINTF("Invalid statnum: %d\n", j);
continue; continue;
} }
if (sprite[i].statnum == j) continue; if (sprite[i].statnum == j)
continue;
/* initialize actor data when changing to an actor statnum because there's usually /* initialize actor data when changing to an actor statnum because there's usually
garbage left over from being handled as a hard coded object */ garbage left over from being handled as a hard coded object */
if (sprite[i].statnum > STAT_ZOMBIEACTOR && (j == STAT_ACTOR || j == STAT_ZOMBIEACTOR)) if (sprite[i].statnum > STAT_ZOMBIEACTOR && (j == STAT_ACTOR || j == STAT_ZOMBIEACTOR))
{ {
actor[i].lastvx = 0; actor_t *a = &actor[i];
actor[i].lastvy = 0;
actor[i].timetosleep = 0; a->lastvx = 0;
actor[i].cgg = 0; a->lastvy = 0;
actor[i].movflag = 0; a->timetosleep = 0;
actor[i].tempang = 0; a->cgg = 0;
actor[i].dispicnum = 0; a->movflag = 0;
a->tempang = 0;
a->dispicnum = 0;
T1=T2=T3=T4=T5=T6=T7=T8=T9=0; T1=T2=T3=T4=T5=T6=T7=T8=T9=0;
actor[i].flags = 0; a->flags = 0;
sprite[i].hitag = 0; sprite[i].hitag = 0;
// TODO: Lunatic
if (g_tile[sprite[i].picnum].execPtr) if (G_HaveActor(sprite[i].picnum))
{ {
const intptr_t *actorptr = g_tile[sprite[i].picnum].execPtr;
// offsets // offsets
T5 = *(g_tile[sprite[i].picnum].execPtr+1); // action AC_ACTION_ID(a->t_data) = actorptr[1];
T2 = *(g_tile[sprite[i].picnum].execPtr+2); // move AC_MOVE_ID(a->t_data) = actorptr[2];
sprite[i].hitag = *(g_tile[sprite[i].picnum].execPtr+3); // ai bits sprite[i].hitag = actorptr[3]; // ai bits (movflags)
} }
} }
changespritestat(i,j); changespritestat(i,j);
continue; continue;
} }
@ -3179,22 +3188,22 @@ nullquote:
case CON_IFAI: case CON_IFAI:
insptr++; insptr++;
VM_CONDITIONAL(vm.g_t[5] == *insptr); VM_CONDITIONAL(AC_AI_ID(vm.g_t) == *insptr);
continue; continue;
case CON_IFACTION: case CON_IFACTION:
insptr++; insptr++;
VM_CONDITIONAL(vm.g_t[4] == *insptr); VM_CONDITIONAL(AC_ACTION_ID(vm.g_t) == *insptr);
continue; continue;
case CON_IFACTIONCOUNT: case CON_IFACTIONCOUNT:
insptr++; insptr++;
VM_CONDITIONAL(vm.g_t[2] >= *insptr); VM_CONDITIONAL(AC_ACTION_COUNT(vm.g_t) >= *insptr);
continue; continue;
case CON_RESETACTIONCOUNT: case CON_RESETACTIONCOUNT:
insptr++; insptr++;
vm.g_t[2] = 0; AC_ACTION_COUNT(vm.g_t) = 0;
continue; continue;
case CON_DEBRIS: case CON_DEBRIS:
@ -3226,7 +3235,7 @@ nullquote:
case CON_COUNT: case CON_COUNT:
insptr++; insptr++;
vm.g_t[0] = (int16_t) *insptr++; AC_COUNT(vm.g_t) = (int16_t) *insptr++;
continue; continue;
case CON_CSTATOR: case CON_CSTATOR:
@ -3287,7 +3296,7 @@ nullquote:
case CON_IFMOVE: case CON_IFMOVE:
insptr++; insptr++;
VM_CONDITIONAL(vm.g_t[1] == *insptr); VM_CONDITIONAL(AC_MOVE_ID(vm.g_t) == *insptr);
continue; continue;
case CON_RESETPLAYER: case CON_RESETPLAYER:
@ -3307,7 +3316,7 @@ nullquote:
case CON_IFCOUNT: case CON_IFCOUNT:
insptr++; insptr++;
VM_CONDITIONAL(vm.g_t[0] >= *insptr); VM_CONDITIONAL(AC_COUNT(vm.g_t) >= *insptr);
continue; continue;
case CON_IFACTOR: case CON_IFACTOR:
@ -3317,7 +3326,7 @@ nullquote:
case CON_RESETCOUNT: case CON_RESETCOUNT:
insptr++; insptr++;
vm.g_t[0] = 0; AC_COUNT(vm.g_t) = 0;
continue; continue;
case CON_ADDINVENTORY: case CON_ADDINVENTORY:
@ -5323,6 +5332,8 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
{ {
#ifdef LUNATIC #ifdef LUNATIC
int32_t killit=0; int32_t killit=0;
#else
intptr_t actionofs, *actionptr;
#endif #endif
vmstate_t tempvm = { iActor, iPlayer, lDist, &actor[iActor].t_data[0], vmstate_t tempvm = { iActor, iPlayer, lDist, &actor[iActor].t_data[0],
&sprite[iActor], 0 &sprite[iActor], 0
@ -5354,17 +5365,18 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
* which might be corrected if the code is converted to use offsets */ * which might be corrected if the code is converted to use offsets */
/* Helixhorned: let's do away with intptr_t's... */ /* Helixhorned: let's do away with intptr_t's... */
#if !defined LUNATIC #if !defined LUNATIC
// NOTE: for Lunatic, need split into numeric literal / action label actionofs = AC_ACTION_ID(vm.g_t);
// (maybe >=0/<0, respectively?) actionptr = (actionofs!=0 && actionofs+4u < (unsigned)g_scriptSize) ?
if (vm.g_t[4]!=0 && (unsigned)vm.g_t[4] + 4 < (unsigned)g_scriptSize) &script[actionofs] : NULL;
if (actionptr != NULL)
#endif #endif
{ {
#if !defined LUNATIC #if !defined LUNATIC
const int32_t action_frames = *(script + vm.g_t[4] + 1); const int32_t action_frames = actionptr[1];
const int32_t action_incval = *(script + vm.g_t[4] + 3); const int32_t action_incval = actionptr[3];
const int32_t action_delay = *(script + vm.g_t[4] + 4); const int32_t action_delay = actionptr[4];
#else #else
// SACTION
const int32_t action_frames = actor[vm.g_i].ac.numframes; const int32_t action_frames = actor[vm.g_i].ac.numframes;
const int32_t action_incval = actor[vm.g_i].ac.incval; const int32_t action_incval = actor[vm.g_i].ac.incval;
const int32_t action_delay = actor[vm.g_i].ac.delay; const int32_t action_delay = actor[vm.g_i].ac.delay;
@ -5373,14 +5385,14 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist)
if (vm.g_sp->lotag > action_delay) if (vm.g_sp->lotag > action_delay)
{ {
vm.g_t[2]++; AC_ACTION_COUNT(vm.g_t)++;
vm.g_sp->lotag = 0; vm.g_sp->lotag = 0;
vm.g_t[3] += action_incval; AC_CURFRAME(vm.g_t) += action_incval;
} }
if (klabs(vm.g_t[3]) >= klabs(action_frames * action_incval)) if (klabs(AC_CURFRAME(vm.g_t)) >= klabs(action_frames * action_incval))
vm.g_t[3] = 0; AC_CURFRAME(vm.g_t) = 0;
} }
#ifdef LUNATIC #ifdef LUNATIC

View file

@ -393,7 +393,7 @@ local ActorLabels = {
htbposy = AC".bpos.y", htbposy = AC".bpos.y",
htbposz = AC".bpos.z", htbposz = AC".bpos.z",
-- Read access differs from write ({ get, set }): -- Read access differs from write ({ get, set }):
htg_t = { AC":get_t_data(%s)", AC":_set_t_data(%s,%%s)" }, htg_t = { AC":_get_t_data(%s)", AC":_set_t_data(%s,%%s)" },
htflags = AC".flags", htflags = AC".flags",
-- (mostly) model-related flags -- (mostly) model-related flags

View file

@ -1272,7 +1272,7 @@ end
-- "otherspr" is either player or holoduke sprite -- "otherspr" is either player or holoduke sprite
local function A_FurthestVisiblePoint(aci, otherspr) local function A_FurthestVisiblePoint(aci, otherspr)
if (bit.band(actor[aci]:get_t_data(0), 63) ~= 0) then if (bit.band(actor[aci]:get_count(), 63) ~= 0) then
return return
end end

View file

@ -1063,7 +1063,7 @@ local actor_mt = {
-- Getters/setters. -- Getters/setters.
-- TODO: make a bcarray instead. -- TODO: make a bcarray instead.
get_t_data = function(a, idx) _get_t_data = function(a, idx)
if (idx >= 10ULL) then if (idx >= 10ULL) then
error("invalid t_data index "..idx, 2) error("invalid t_data index "..idx, 2)
end end

View file

@ -842,6 +842,7 @@ function static_members.sprite.changesect(spritenum, sectnum, noerr)
end end
function static_members.sprite.changestat(spritenum, statnum, noerr) function static_members.sprite.changestat(spritenum, statnum, noerr)
-- TODO: see gameexec.c's CON_CHANGESPRITESTAT.
check_sprite_idx(spritenum) check_sprite_idx(spritenum)
if (statnum >= ffiC.MAXSTATUS+0ULL) then if (statnum >= ffiC.MAXSTATUS+0ULL) then
error("invalid status number "..statnum, 2) error("invalid status number "..statnum, 2)

View file

@ -4387,7 +4387,7 @@ void P_ProcessInput(int32_t snum)
if (p->pals.f > 0) if (p->pals.f > 0)
{ {
#ifndef LUNATIC #if !defined LUNATIC
p->pals.f--; p->pals.f--;
#else #else
if (p->palsfadespeed > 0) if (p->palsfadespeed > 0)
@ -5138,6 +5138,7 @@ HORIZONLY:
if (!ud.noclip && sector[p->cursectnum].lotag == ST_31_TWO_WAY_TRAIN) if (!ud.noclip && sector[p->cursectnum].lotag == ST_31_TWO_WAY_TRAIN)
{ {
// XXX: POTENTIAL_OOB
if (sprite[sector[p->cursectnum].hitag].xvel && actor[sector[p->cursectnum].hitag].t_data[0] == 0) if (sprite[sector[p->cursectnum].hitag].xvel && actor[sector[p->cursectnum].hitag].t_data[0] == 0)
{ {
P_QuickKill(p); P_QuickKill(p);