Merge branch 'master' into v2.x

This commit is contained in:
Christoph Oelckers 2014-09-12 21:01:55 +02:00
commit 3c2f1952fd
3 changed files with 81 additions and 65 deletions

View file

@ -3383,43 +3383,16 @@ class CommandInInventory : public SBarInfoCommandFlowControl
AInventory *invItem[2] = { statusBar->CPlayer->mo->FindInventory(item[0]), statusBar->CPlayer->mo->FindInventory(item[1]) }; AInventory *invItem[2] = { statusBar->CPlayer->mo->FindInventory(item[0]), statusBar->CPlayer->mo->FindInventory(item[1]) };
if (invItem[0] != NULL && amount[0] > 0 && invItem[0]->Amount < amount[0]) invItem[0] = NULL; if (invItem[0] != NULL && amount[0] > 0 && invItem[0]->Amount < amount[0]) invItem[0] = NULL;
if (invItem[1] != NULL && amount[1] > 0 && invItem[1]->Amount < amount[1]) invItem[1] = NULL; if (invItem[1] != NULL && amount[1] > 0 && invItem[1]->Amount < amount[1]) invItem[1] = NULL;
if(invItem[1] != NULL && conditionAnd)
if (item[1])
{ {
if((invItem[0] != NULL && invItem[1] != NULL) && !negate) if (conditionAnd)
{ SetTruth((invItem[0] && invItem[1]) != negate, block, statusBar);
SetTruth(true, block, statusBar); else
return; SetTruth((invItem[0] || invItem[1]) != negate, block, statusBar);
} }
else if((invItem[0] == NULL || invItem[1] == NULL) && negate) else
{ SetTruth((invItem[0] != NULL) != negate, block, statusBar);
SetTruth(true, block, statusBar);
return;
}
}
else if(invItem[1] != NULL && !conditionAnd)
{
if((invItem[0] != NULL || invItem[1] != NULL) && !negate)
{
SetTruth(true, block, statusBar);
return;
}
else if((invItem[0] == NULL && invItem[1] == NULL) && negate)
{
SetTruth(true, block, statusBar);
return;
}
}
else if((invItem[0] != NULL) && !negate)
{
SetTruth(true, block, statusBar);
return;
}
else if((invItem[0] == NULL) && negate)
{
SetTruth(true, block, statusBar);
return;
}
SetTruth(false, block, statusBar);
} }
protected: protected:
bool conditionAnd; bool conditionAnd;
@ -3458,6 +3431,46 @@ class CommandAlpha : public SBarInfoMainBlock
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
class CommandIfHealth : public SBarInfoCommandFlowControl
{
public:
CommandIfHealth(SBarInfo *script) : SBarInfoCommandFlowControl(script),
negate(false), percentage(false)
{
}
void Parse(FScanner &sc, bool fullScreenOffsets)
{
if (sc.CheckToken(TK_Identifier))
{
if (sc.Compare("not"))
negate = true;
else
sc.ScriptError("Expected 'not', but got '%s' instead.", sc.String);
}
sc.MustGetToken(TK_IntConst);
percentage = sc.CheckToken('%');
hpamount = sc.Number;
SBarInfoCommandFlowControl::Parse(sc, fullScreenOffsets);
}
void Tick(const SBarInfoMainBlock *block, const DSBarInfo *statusBar, bool hudChanged)
{
SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged);
int phealth = percentage ? statusBar->CPlayer->mo->health * 100 / statusBar->CPlayer->mo->GetMaxHealth() : statusBar->CPlayer->mo->health;
SetTruth((phealth >= hpamount) ^ negate, block, statusBar);
}
protected:
bool negate;
bool percentage;
int hpamount;
};
////////////////////////////////////////////////////////////////////////////////
static const char *SBarInfoCommandNames[] = static const char *SBarInfoCommandNames[] =
{ {
"drawimage", "drawnumber", "drawswitchableimage", "drawimage", "drawnumber", "drawswitchableimage",
@ -3467,7 +3480,7 @@ static const char *SBarInfoCommandNames[] =
"gamemode", "playerclass", "playertype", "aspectratio", "gamemode", "playerclass", "playertype", "aspectratio",
"isselected", "usesammo", "usessecondaryammo", "isselected", "usesammo", "usessecondaryammo",
"hasweaponpiece", "inventorybarnotvisible", "hasweaponpiece", "inventorybarnotvisible",
"weaponammo", "ininventory", "alpha", "weaponammo", "ininventory", "alpha", "ifhealth",
NULL NULL
}; };
@ -3480,7 +3493,7 @@ enum SBarInfoCommands
SBARINFO_GAMEMODE, SBARINFO_PLAYERCLASS, SBARINFO_PLAYERTYPE, SBARINFO_ASPECTRATIO, SBARINFO_GAMEMODE, SBARINFO_PLAYERCLASS, SBARINFO_PLAYERTYPE, SBARINFO_ASPECTRATIO,
SBARINFO_ISSELECTED, SBARINFO_USESAMMO, SBARINFO_USESSECONDARYAMMO, SBARINFO_ISSELECTED, SBARINFO_USESAMMO, SBARINFO_USESSECONDARYAMMO,
SBARINFO_HASWEAPONPIECE, SBARINFO_INVENTORYBARNOTVISIBLE, SBARINFO_HASWEAPONPIECE, SBARINFO_INVENTORYBARNOTVISIBLE,
SBARINFO_WEAPONAMMO, SBARINFO_ININVENTORY, SBARINFO_ALPHA, SBARINFO_WEAPONAMMO, SBARINFO_ININVENTORY, SBARINFO_ALPHA, SBARINFO_IFHEALTH,
}; };
SBarInfoCommand *SBarInfoCommandFlowControl::NextCommand(FScanner &sc) SBarInfoCommand *SBarInfoCommandFlowControl::NextCommand(FScanner &sc)
@ -3513,6 +3526,7 @@ SBarInfoCommand *SBarInfoCommandFlowControl::NextCommand(FScanner &sc)
case SBARINFO_WEAPONAMMO: return new CommandWeaponAmmo(script); case SBARINFO_WEAPONAMMO: return new CommandWeaponAmmo(script);
case SBARINFO_ININVENTORY: return new CommandInInventory(script); case SBARINFO_ININVENTORY: return new CommandInInventory(script);
case SBARINFO_ALPHA: return new CommandAlpha(script); case SBARINFO_ALPHA: return new CommandAlpha(script);
case SBARINFO_IFHEALTH: return new CommandIfHealth(script);
} }
sc.ScriptError("Unknown command '%s'.\n", sc.String); sc.ScriptError("Unknown command '%s'.\n", sc.String);

View file

@ -311,6 +311,9 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::vbo_fakefloor]; dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::vbo_fakefloor];
dest->vboheight[sector_t::ceiling] = s->vboheight[sector_t::floor]; dest->vboheight[sector_t::ceiling] = s->vboheight[sector_t::floor];
dest->portals[sector_t::ceiling] = NULL;
if (!(s->MoreFlags & SECF_NOFAKELIGHT)) if (!(s->MoreFlags & SECF_NOFAKELIGHT))
{ {
dest->lightlevel = s->lightlevel; dest->lightlevel = s->lightlevel;
@ -362,6 +365,8 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::ceiling]; dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::ceiling];
dest->vboheight[sector_t::ceiling] = sec->vboheight[sector_t::ceiling]; dest->vboheight[sector_t::ceiling] = sec->vboheight[sector_t::ceiling];
dest->portals[sector_t::floor] = NULL;
if (!(s->MoreFlags & SECF_NOFAKELIGHT)) if (!(s->MoreFlags & SECF_NOFAKELIGHT))
{ {
dest->lightlevel = s->lightlevel; dest->lightlevel = s->lightlevel;

View file

@ -537,34 +537,31 @@ void MapData::GetChecksum(BYTE cksum[16])
{ {
MD5Context md5; MD5Context md5;
if (file != NULL)
{
if (isText) if (isText)
{ {
Seek(ML_TEXTMAP); Seek(ML_TEXTMAP);
md5.Update(file, Size(ML_TEXTMAP)); if (file != NULL) md5.Update(file, Size(ML_TEXTMAP));
} }
else else
{ {
if (Size(ML_LABEL) != 0) if (Size(ML_LABEL) != 0)
{ {
Seek(ML_LABEL); Seek(ML_LABEL);
md5.Update(file, Size(ML_LABEL)); if (file != NULL) md5.Update(file, Size(ML_LABEL));
} }
Seek(ML_THINGS); Seek(ML_THINGS);
md5.Update(file, Size(ML_THINGS)); if (file != NULL) md5.Update(file, Size(ML_THINGS));
Seek(ML_LINEDEFS); Seek(ML_LINEDEFS);
md5.Update(file, Size(ML_LINEDEFS)); if (file != NULL) md5.Update(file, Size(ML_LINEDEFS));
Seek(ML_SIDEDEFS); Seek(ML_SIDEDEFS);
md5.Update(file, Size(ML_SIDEDEFS)); if (file != NULL) md5.Update(file, Size(ML_SIDEDEFS));
Seek(ML_SECTORS); Seek(ML_SECTORS);
md5.Update(file, Size(ML_SECTORS)); if (file != NULL) md5.Update(file, Size(ML_SECTORS));
} }
if (HasBehavior) if (HasBehavior)
{ {
Seek(ML_BEHAVIOR); Seek(ML_BEHAVIOR);
md5.Update(file, Size(ML_BEHAVIOR)); if (file != NULL) md5.Update(file, Size(ML_BEHAVIOR));
}
} }
md5.Final(cksum); md5.Final(cksum);
} }