Merge branch 'master' into scripting

Conflicts:
	src/p_interaction.cpp
	tools/lemon/lemon.c
This commit is contained in:
Christoph Oelckers 2015-04-30 16:13:32 +02:00
commit 1b29c3b6cf
9 changed files with 97 additions and 36 deletions

View file

@ -1238,8 +1238,8 @@ static int PatchThing (int thingy)
else else
info->renderflags &= ~RF_INVISIBLE; info->renderflags &= ~RF_INVISIBLE;
} }
DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags, info->flags2, DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags.GetValue(), info->flags2.GetValue(),
info->flags, info->flags2); info->flags.GetValue(), info->flags2.GetValue());
} }
else if (stricmp (Line1, "ID #") == 0) else if (stricmp (Line1, "ID #") == 0)
{ {

View file

@ -1391,7 +1391,7 @@ void FBehavior::StaticLoadDefaultModules ()
} }
else else
{ {
Printf ("Could not find autoloaded ACS library %s\n", sc.String); Printf (TEXTCOLOR_RED "Could not find autoloaded ACS library %s\n", sc.String);
} }
} }
} }
@ -1409,7 +1409,17 @@ FBehavior *FBehavior::StaticLoadModule (int lumpnum, FileReader *fr, int len)
} }
} }
return new FBehavior (lumpnum, fr, len); FBehavior * behavior = new FBehavior ();
if (behavior->Init(lumpnum, fr, len))
{
return behavior;
}
else
{
delete behavior;
Printf(TEXTCOLOR_RED "%s: invalid ACS module", Wads.GetLumpFullName(lumpnum));
return NULL;
}
} }
bool FBehavior::StaticCheckAllGood () bool FBehavior::StaticCheckAllGood ()
@ -1668,11 +1678,8 @@ static int ParseLocalArrayChunk(void *chunk, ACSLocalArrays *arrays, int offset)
return offset; return offset;
} }
FBehavior::FBehavior (int lumpnum, FileReader * fr, int len) FBehavior::FBehavior()
{ {
BYTE *object;
int i;
NumScripts = 0; NumScripts = 0;
NumFunctions = 0; NumFunctions = 0;
NumArrays = 0; NumArrays = 0;
@ -1684,11 +1691,21 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
Chunks = NULL; Chunks = NULL;
Data = NULL; Data = NULL;
Format = ACS_Unknown; Format = ACS_Unknown;
LumpNum = lumpnum; LumpNum = -1;
memset (MapVarStore, 0, sizeof(MapVarStore)); memset (MapVarStore, 0, sizeof(MapVarStore));
ModuleName[0] = 0; ModuleName[0] = 0;
FunctionProfileData = NULL; FunctionProfileData = NULL;
}
bool FBehavior::Init(int lumpnum, FileReader * fr, int len)
{
BYTE *object;
int i;
LumpNum = lumpnum;
// Now that everything is set up, record this module as being among the loaded modules. // Now that everything is set up, record this module as being among the loaded modules.
// We need to do this before resolving any imports, because an import might (indirectly) // We need to do this before resolving any imports, because an import might (indirectly)
// need to resolve exports in this module. The only things that can be exported are // need to resolve exports in this module. The only things that can be exported are
@ -1699,7 +1716,6 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
// 1. If not, corrupt modules cause memory leaks // 1. If not, corrupt modules cause memory leaks
// 2. Corrupt modules won't be reported when a level is being loaded if this function quits before // 2. Corrupt modules won't be reported when a level is being loaded if this function quits before
// adding it to the list. // adding it to the list.
LibraryID = StaticModules.Push (this) << LIBRARYID_SHIFT;
if (fr == NULL) len = Wads.LumpLength (lumpnum); if (fr == NULL) len = Wads.LumpLength (lumpnum);
@ -1711,7 +1727,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
// has 24 bytes if it is completely empty. An empty SPTR chunk adds 8 bytes.) // has 24 bytes if it is completely empty. An empty SPTR chunk adds 8 bytes.)
if (len < 32) if (len < 32)
{ {
return; return false;
} }
object = new BYTE[len]; object = new BYTE[len];
@ -1727,7 +1743,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
if (object[0] != 'A' || object[1] != 'C' || object[2] != 'S') if (object[0] != 'A' || object[1] != 'C' || object[2] != 'S')
{ {
delete[] object; delete[] object;
return; return false;
} }
switch (object[3]) switch (object[3])
@ -1743,8 +1759,9 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
break; break;
default: default:
delete[] object; delete[] object;
return; return false;
} }
LibraryID = StaticModules.Push (this) << LIBRARYID_SHIFT;
if (fr == NULL) if (fr == NULL)
{ {
@ -2027,7 +2044,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
int lump = Wads.CheckNumForName (&parse[i], ns_acslibrary); int lump = Wads.CheckNumForName (&parse[i], ns_acslibrary);
if (lump < 0) if (lump < 0)
{ {
Printf ("Could not find ACS library %s.\n", &parse[i]); Printf (TEXTCOLOR_RED "Could not find ACS library %s.\n", &parse[i]);
} }
else else
{ {
@ -2068,7 +2085,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
func->ImportNum = i+1; func->ImportNum = i+1;
if (realfunc->ArgCount != func->ArgCount) if (realfunc->ArgCount != func->ArgCount)
{ {
Printf ("Function %s in %s has %d arguments. %s expects it to have %d.\n", Printf (TEXTCOLOR_ORANGE "Function %s in %s has %d arguments. %s expects it to have %d.\n",
(char *)(chunk + 2) + chunk[3+j], lib->ModuleName, realfunc->ArgCount, (char *)(chunk + 2) + chunk[3+j], lib->ModuleName, realfunc->ArgCount,
ModuleName, func->ArgCount); ModuleName, func->ArgCount);
Format = ACS_Unknown; Format = ACS_Unknown;
@ -2121,7 +2138,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
if (lib->ArrayStore[impNum].ArraySize != expectedSize) if (lib->ArrayStore[impNum].ArraySize != expectedSize)
{ {
Format = ACS_Unknown; Format = ACS_Unknown;
Printf ("The array %s in %s has %u elements, but %s expects it to only have %u.\n", Printf (TEXTCOLOR_ORANGE "The array %s in %s has %u elements, but %s expects it to only have %u.\n",
parse, lib->ModuleName, lib->ArrayStore[impNum].ArraySize, parse, lib->ModuleName, lib->ArrayStore[impNum].ArraySize,
ModuleName, expectedSize); ModuleName, expectedSize);
} }
@ -2135,6 +2152,7 @@ FBehavior::FBehavior (int lumpnum, FileReader * fr, int len)
} }
DPrintf ("Loaded %d scripts, %d functions\n", NumScripts, NumFunctions); DPrintf ("Loaded %d scripts, %d functions\n", NumScripts, NumFunctions);
return true;
} }
FBehavior::~FBehavior () FBehavior::~FBehavior ()
@ -2293,7 +2311,7 @@ void FBehavior::LoadScriptsDirectory ()
{ {
if (Scripts[i].Number == Scripts[i+1].Number) if (Scripts[i].Number == Scripts[i+1].Number)
{ {
Printf("%s appears more than once.\n", Printf(TEXTCOLOR_ORANGE "%s appears more than once.\n",
ScriptPresentation(Scripts[i].Number).GetChars()); ScriptPresentation(Scripts[i].Number).GetChars());
// Make the closed version the first one. // Make the closed version the first one.
if (Scripts[i+1].Type == SCRIPT_Closed) if (Scripts[i+1].Type == SCRIPT_Closed)
@ -2490,7 +2508,7 @@ bool FBehavior::IsGood ()
if (funcdef->Address == 0 && funcdef->ImportNum == 0) if (funcdef->Address == 0 && funcdef->ImportNum == 0)
{ {
DWORD *chunk = (DWORD *)FindChunk (MAKE_ID('F','N','A','M')); DWORD *chunk = (DWORD *)FindChunk (MAKE_ID('F','N','A','M'));
Printf ("Could not find ACS function %s for use in %s.\n", Printf (TEXTCOLOR_RED "Could not find ACS function %s for use in %s.\n",
(char *)(chunk + 2) + chunk[3+i], ModuleName); (char *)(chunk + 2) + chunk[3+i], ModuleName);
bad = true; bad = true;
} }
@ -2501,7 +2519,7 @@ bool FBehavior::IsGood ()
{ {
if (Imports[i] == NULL) if (Imports[i] == NULL)
{ {
Printf ("Not all the libraries used by %s could be found.\n", ModuleName); Printf (TEXTCOLOR_RED "Not all the libraries used by %s could be found.\n", ModuleName);
return false; return false;
} }
} }

View file

@ -283,8 +283,9 @@ enum ACSFormat { ACS_Old, ACS_Enhanced, ACS_LittleEnhanced, ACS_Unknown };
class FBehavior class FBehavior
{ {
public: public:
FBehavior (int lumpnum, FileReader * fr=NULL, int len=0); FBehavior ();
~FBehavior (); ~FBehavior ();
bool Init(int lumpnum, FileReader * fr = NULL, int len = 0);
bool IsGood (); bool IsGood ();
BYTE *FindChunk (DWORD id) const; BYTE *FindChunk (DWORD id) const;

View file

@ -655,7 +655,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
FState *diestate = NULL; FState *diestate = NULL;
int gibhealth = GetGibHealth(); int gibhealth = GetGibHealth();
int iflags4 = inflictor == NULL ? 0 : inflictor->flags4; ActorFlags4 iflags4 = inflictor == NULL ? ActorFlags4::FromInt(0) : inflictor->flags4;
bool extremelydead = ((health < gibhealth || iflags4 & MF4_EXTREMEDEATH) && !(iflags4 & MF4_NOEXTREMEDEATH)); bool extremelydead = ((health < gibhealth || iflags4 & MF4_EXTREMEDEATH) && !(iflags4 & MF4_NOEXTREMEDEATH));
// Special check for 'extreme' damage type to ensure that it gets recorded properly as an extreme death for subsequent checks. // Special check for 'extreme' damage type to ensure that it gets recorded properly as an extreme death for subsequent checks.

View file

@ -6562,35 +6562,35 @@ void PrintMiscActorInfo(AActor *query)
"OptFuzzy", "Stencil", "Translucent", "Add", "Shaded", "TranslucentStencil", "OptFuzzy", "Stencil", "Translucent", "Add", "Shaded", "TranslucentStencil",
"Shadow", "Subtract", "AddStencil", "AddShaded"}; "Shadow", "Subtract", "AddStencil", "AddShaded"};
Printf("%s @ %p has the following flags:\n flags: %x", query->GetTag(), query, query->flags); Printf("%s @ %p has the following flags:\n flags: %x", query->GetTag(), query, query->flags.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags)); if (query->flags & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags));
Printf("\n flags2: %x", query->flags2); Printf("\n flags2: %x", query->flags2.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags2 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags2)); if (query->flags2 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags2));
Printf("\n flags3: %x", query->flags3); Printf("\n flags3: %x", query->flags3.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags3 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags3)); if (query->flags3 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags3));
Printf("\n flags4: %x", query->flags4); Printf("\n flags4: %x", query->flags4.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags4 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags4)); if (query->flags4 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags4));
Printf("\n flags5: %x", query->flags5); Printf("\n flags5: %x", query->flags5.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags5 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags5)); if (query->flags5 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags5));
Printf("\n flags6: %x", query->flags6); Printf("\n flags6: %x", query->flags6.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags6 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags6)); if (query->flags6 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags6));
Printf("\n flags7: %x", query->flags7); Printf("\n flags7: %x", query->flags7.GetValue());
for (flagi = 0; flagi <= 31; flagi++) for (flagi = 0; flagi <= 31; flagi++)
if (query->flags7 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags7)); if (query->flags7 & 1<<flagi) Printf(" %s", FLAG_NAME(1<<flagi, flags7));
Printf("\nBounce flags: %x\nBounce factors: f:%f, w:%f", Printf("\nBounce flags: %x\nBounce factors: f:%f, w:%f",
query->BounceFlags, FIXED2FLOAT(query->bouncefactor), query->BounceFlags.GetValue(), FIXED2FLOAT(query->bouncefactor),
FIXED2FLOAT(query->wallbouncefactor)); FIXED2FLOAT(query->wallbouncefactor));
/*for (flagi = 0; flagi < 31; flagi++) /*for (flagi = 0; flagi < 31; flagi++)
if (query->BounceFlags & 1<<flagi) Printf(" %s", flagnamesb[flagi]);*/ if (query->BounceFlags & 1<<flagi) Printf(" %s", flagnamesb[flagi]);*/
Printf("\nRender style = %i:%s, alpha %f\nRender flags: %x", Printf("\nRender style = %i:%s, alpha %f\nRender flags: %x",
querystyle, (querystyle < STYLE_Count ? renderstyles[querystyle] : "Unknown"), querystyle, (querystyle < STYLE_Count ? renderstyles[querystyle] : "Unknown"),
FIXED2FLOAT(query->alpha), query->renderflags); FIXED2FLOAT(query->alpha), query->renderflags.GetValue());
/*for (flagi = 0; flagi < 31; flagi++) /*for (flagi = 0; flagi < 31; flagi++)
if (query->renderflags & 1<<flagi) Printf(" %s", flagnamesr[flagi]);*/ if (query->renderflags & 1<<flagi) Printf(" %s", flagnamesr[flagi]);*/
Printf("\nSpecial+args: %s(%i, %i, %i, %i, %i)\nspecial1: %i, special2: %i.", Printf("\nSpecial+args: %s(%i, %i, %i, %i, %i)\nspecial1: %i, special2: %i.",

View file

@ -107,4 +107,5 @@ inline T operator^ (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntTyp
inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \
inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \
inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \
inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); } inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); }

View file

@ -2240,10 +2240,10 @@ static bool InitSpawnedItem(AActor *self, AActor *mo, int flags)
mo->RenderStyle = self->RenderStyle; mo->RenderStyle = self->RenderStyle;
} }
if (flags & SIXF_TRANSFERSPRITEFRAME) if (flags & SIXF_TRANSFERSPRITEFRAME)
{ {
mo->sprite = self->sprite; mo->sprite = self->sprite;
mo->frame = self->frame; mo->frame = self->frame;
} }
if (flags & SIXF_TRANSFERROLL) if (flags & SIXF_TRANSFERROLL)
@ -6195,6 +6195,42 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_ResetHealth)
return 0; return 0;
} }
//===========================================================================
// A_JumpIfHigherOrLower
//
// Jumps if a target, master, or tracer is higher or lower than the calling
// actor. Can also specify how much higher/lower the actor needs to be than
// itself. Can also take into account the height of the actor in question,
// depending on which it's checking. This means adding height of the
// calling actor's self if the pointer is higher, or height of the pointer
// if its lower.
//===========================================================================
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfHigherOrLower)
{
PARAM_ACTION_PROLOGUE;
PARAM_STATE(high);
PARAM_STATE(low);
PARAM_FIXED_OPT(offsethigh) { offsethigh = 0; }
PARAM_FIXED_OPT(offsetlow) { offsetlow = 0; }
PARAM_BOOL_OPT(includeHeight) { includeHeight = true; }
PARAM_INT_OPT(ptr) { ptr = AAPTR_TARGET; }
AActor *mobj = COPY_AAPTR(self, ptr);
ACTION_SET_RESULT(false); //No inventory jump chains please.
if (mobj != NULL && mobj != self) //AAPTR_DEFAULT is completely useless in this regard.
{
if ((high) && (mobj->z > ((includeHeight ? self->height : 0) + self->z + offsethigh)))
ACTION_JUMP(high);
else if ((low) && (mobj->z + (includeHeight ? mobj->height : 0)) < (self->z + offsetlow))
ACTION_JUMP(low);
}
return numret;
}
//=========================================================================== //===========================================================================
// //
// A_SetRipperLevel(int level) // A_SetRipperLevel(int level)

View file

@ -437,7 +437,8 @@ struct acttab {
#define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead) #define acttab_yylookahead(X,N) ((X)->aAction[N].lookahead)
/* Free all memory associated with the given acttab */ /* Free all memory associated with the given acttab */
void acttab_free(acttab *p){ void acttab_free(acttab **pp){
acttab *p = *pp;
free( p->aAction ); free( p->aAction );
free( p->aLookahead ); free( p->aLookahead );
free( p ); free( p );
@ -3127,9 +3128,11 @@ struct lemon *lemp;
in = fopen(tpltname,"rb"); in = fopen(tpltname,"rb");
if( in==0 ){ if( in==0 ){
fprintf(stderr,"Can't open the template file \"%s\".\n",templatename); fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
free(tpltname);
lemp->errorcnt++; lemp->errorcnt++;
return 0; return 0;
} }
free(tpltname);
return in; return in;
} }
@ -4016,6 +4019,7 @@ int mhflag; /* Output in makeheaders format if true */
/* Append any addition code the user desires */ /* Append any addition code the user desires */
tplt_print(out,lemp,lemp->extracode,&lineno); tplt_print(out,lemp,lemp->extracode,&lineno);
acttab_free(&pActtab);
fclose(in); fclose(in);
fclose(out); fclose(out);
return; return;

View file

@ -298,6 +298,7 @@ ACTOR Actor native //: Thinker
action native A_SetFloatBobPhase(int bob); action native A_SetFloatBobPhase(int bob);
action native A_SetHealth(int health, int ptr = AAPTR_DEFAULT); action native A_SetHealth(int health, int ptr = AAPTR_DEFAULT);
action native A_ResetHealth(int ptr = AAPTR_DEFAULT); action native A_ResetHealth(int ptr = AAPTR_DEFAULT);
action native A_JumpIfHigherOrLower(state high, state low, float offsethigh = 0, float offsetlow = 0, bool includeHeight = true, int ptr = AAPTR_TARGET);
action native A_SetRipperLevel(int level); action native A_SetRipperLevel(int level);
action native A_SetRipMin(int min); action native A_SetRipMin(int min);
action native A_SetRipMax(int max); action native A_SetRipMax(int max);