- Made texture indices in FSwitchDef full integers. Since that required

some data restructuring I also eliminated the MAX_FRAMES limit of 128
  per switch.


SVN r828 (trunk)
This commit is contained in:
Christoph Oelckers 2008-03-21 12:17:20 +00:00
parent d3e34d1edd
commit 064f64e3a7
2 changed files with 33 additions and 34 deletions

View file

@ -1,3 +1,8 @@
March 21, 2008 (Changes by Graf Zahl)
- Made texture indices in FSwitchDef full integers. Since that required
some data restructuring I also eliminated the MAX_FRAMES limit of 128
per switch.
March 20, 2008 March 20, 2008
- Removed some debug output from SBarInfo::ParseSBarInfo(). - Removed some debug output from SBarInfo::ParseSBarInfo().
- Fixed: Heretic linetype translations included the wrong file. - Fixed: Heretic linetype translations included the wrong file.

View file

@ -95,16 +95,16 @@ protected:
struct FSwitchDef struct FSwitchDef
{ {
SWORD PreTexture; // texture to switch from int PreTexture; // texture to switch from
WORD PairIndex; // switch def to use to return to PreTexture WORD PairIndex; // switch def to use to return to PreTexture
SWORD Sound; // sound to play at start of animation SWORD Sound; // sound to play at start of animation
WORD NumFrames; // # of animation frames WORD NumFrames; // # of animation frames
bool QuestPanel; // Special texture for Strife mission bool QuestPanel; // Special texture for Strife mission
union // Array of times followed by array of textures struct frame // Array of times followed by array of textures
{ // actual length of each array is <NumFrames> { // actual length of each array is <NumFrames>
DWORD Times[1]; DWORD Time;
SWORD Textures[3]; int Texture;
} u; } u[1];
}; };
static int STACK_ARGS SortSwitchDefs (const void *a, const void *b); static int STACK_ARGS SortSwitchDefs (const void *a, const void *b);
@ -167,11 +167,11 @@ void P_InitSwitchList ()
{ {
def1 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); def1 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef));
def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef));
def1->PreTexture = def2->u.Textures[2] = TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags); def1->PreTexture = def2->u[0].Texture = TexMan.CheckForTexture (list_p /* .name1 */, FTexture::TEX_Wall, texflags);
def2->PreTexture = def1->u.Textures[2] = TexMan.CheckForTexture (list_p + 9, FTexture::TEX_Wall, texflags); def2->PreTexture = def1->u[0].Texture = TexMan.CheckForTexture (list_p + 9, FTexture::TEX_Wall, texflags);
def1->Sound = def2->Sound = 0; def1->Sound = def2->Sound = 0;
def1->NumFrames = def2->NumFrames = 1; def1->NumFrames = def2->NumFrames = 1;
def1->u.Times[0] = def2->u.Times[0] = 0; def1->u[0].Time = def2->u[0].Time = 0;
def2->PairIndex = AddSwitchDef (def1); def2->PairIndex = AddSwitchDef (def1);
def1->PairIndex = AddSwitchDef (def2); def1->PairIndex = AddSwitchDef (def2);
} }
@ -317,12 +317,12 @@ void P_ProcessSwitchDef (FScanner &sc)
def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef)); def2 = (FSwitchDef *)M_Malloc (sizeof(FSwitchDef));
def2->Sound = def1->Sound; def2->Sound = def1->Sound;
def2->NumFrames = 1; def2->NumFrames = 1;
def2->u.Times[0] = 0; def2->u[0].Time = 0;
def2->u.Textures[2] = picnum; def2->u[0].Texture = picnum;
} }
def1->PreTexture = picnum; def1->PreTexture = picnum;
def2->PreTexture = def1->u.Textures[def1->NumFrames*2+def1->NumFrames-1]; def2->PreTexture = def1->u[def1->NumFrames-1].Texture;
if (def1->PreTexture == def2->PreTexture) if (def1->PreTexture == def2->PreTexture)
{ {
sc.ScriptError ("The on state for switch %s must end with a texture other than %s", picname.GetChars(), picname.GetChars()); sc.ScriptError ("The on state for switch %s must end with a texture other than %s", picname.GetChars(), picname.GetChars());
@ -336,14 +336,12 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
{ {
const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny; const BITFIELD texflags = FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_TryAny;
FSwitchDef *def; FSwitchDef *def;
SWORD pics[MAX_FRAMES]; TArray<FSwitchDef::frame> frames;
DWORD times[MAX_FRAMES]; FSwitchDef::frame thisframe;
int numframes;
int picnum; int picnum;
bool bad; bool bad;
SWORD sound; SWORD sound;
numframes = 0;
sound = 0; sound = 0;
bad = false; bad = false;
@ -360,10 +358,6 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
} }
else if (sc.Compare ("pic")) else if (sc.Compare ("pic"))
{ {
if (numframes == MAX_FRAMES)
{
sc.ScriptError ("Switch has too many frames");
}
sc.MustGetString (); sc.MustGetString ();
picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags); picnum = TexMan.CheckForTexture (sc.String, FTexture::TEX_Wall, texflags);
if (picnum < 0 && !ignoreBad) if (picnum < 0 && !ignoreBad)
@ -371,12 +365,12 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
//Printf ("Unknown switch texture %s\n", sc.String); //Printf ("Unknown switch texture %s\n", sc.String);
bad = true; bad = true;
} }
pics[numframes] = picnum; thisframe.Texture = picnum;
sc.MustGetString (); sc.MustGetString ();
if (sc.Compare ("tics")) if (sc.Compare ("tics"))
{ {
sc.MustGetNumber (); sc.MustGetNumber ();
times[numframes] = sc.Number & 65535; thisframe.Time = sc.Number & 65535;
} }
else if (sc.Compare ("rand")) else if (sc.Compare ("rand"))
{ {
@ -390,13 +384,13 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
{ {
swap (min, max); swap (min, max);
} }
times[numframes] = ((max - min + 1) << 16) | min; thisframe.Time = ((max - min + 1) << 16) | min;
} }
else else
{ {
sc.ScriptError ("Must specify a duration for switch frame"); sc.ScriptError ("Must specify a duration for switch frame");
} }
numframes++; frames.Push(thisframe);
} }
else else
{ {
@ -404,7 +398,7 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
break; break;
} }
} }
if (numframes == 0) if (frames.Size() == 0)
{ {
sc.ScriptError ("Switch state needs at least one frame"); sc.ScriptError ("Switch state needs at least one frame");
} }
@ -412,11 +406,11 @@ FSwitchDef *ParseSwitchDef (FScanner &sc, bool ignoreBad)
{ {
return NULL; return NULL;
} }
def = (FSwitchDef *)M_Malloc (myoffsetof (FSwitchDef, u.Times[0]) + numframes * 6);
def = (FSwitchDef *)M_Malloc (myoffsetof (FSwitchDef, u[0]) + frames.Size()*sizeof(frames[0]));
def->Sound = sound; def->Sound = sound;
def->NumFrames = numframes; def->NumFrames = frames.Size();
memcpy (&def->u.Times[0], times, numframes * 4); memcpy (&def->u[0], &frames[0], frames.Size() * sizeof(frames[0]));
memcpy (&def->u.Textures[numframes*2], pics, numframes * 2);
def->PairIndex = 65535; def->PairIndex = 65535;
return def; return def;
} }
@ -606,7 +600,7 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, BYTE special, bool *ques
pt[0] = line->v1->x + (line->dx >> 1); pt[0] = line->v1->x + (line->dx >> 1);
pt[1] = line->v1->y + (line->dy >> 1); pt[1] = line->v1->y + (line->dy >> 1);
*texture = SwitchList[i]->u.Textures[SwitchList[i]->NumFrames*2]; *texture = SwitchList[i]->u[0].Texture;
if (useAgain || SwitchList[i]->NumFrames > 1) if (useAgain || SwitchList[i]->NumFrames > 1)
playsound = P_StartButton (side, Where, i, pt[0], pt[1], !!useAgain); playsound = P_StartButton (side, Where, i, pt[0], pt[1], !!useAgain);
else else
@ -691,7 +685,7 @@ void DActiveButton::Tick ()
} }
bool killme = AdvanceFrame (); bool killme = AdvanceFrame ();
StoreTexture (def->u.Textures[def->NumFrames*2+m_Frame]); StoreTexture (def->u[m_Frame].Texture);
if (killme) if (killme)
{ {
@ -718,17 +712,17 @@ bool DActiveButton::AdvanceFrame ()
} }
else else
{ {
if (def->u.Times[m_Frame] & 0xffff0000) if (def->u[m_Frame].Time & 0xffff0000)
{ {
int t = pr_switchanim(); int t = pr_switchanim();
m_Timer = (WORD)((((t | (pr_switchanim() << 8)) m_Timer = (WORD)((((t | (pr_switchanim() << 8))
% def->u.Times[m_Frame]) >> 16) % def->u[m_Frame].Time) >> 16)
+ (def->u.Times[m_Frame] & 0xffff)); + (def->u[m_Frame].Time & 0xffff));
} }
else else
{ {
m_Timer = (WORD)def->u.Times[m_Frame]; m_Timer = (WORD)def->u[m_Frame].Time;
} }
} }
return ret; return ret;