- allow A_M_Refire to be called without state label because this seems to have been used in existing DECORATE mods. This way of calling it will revert to the old behavior of jumping one state forward instead of to a state label.

This commit is contained in:
Christoph Oelckers 2016-12-11 13:07:25 +01:00
parent 898e2900b3
commit 40355f6298
2 changed files with 16 additions and 3 deletions

View file

@ -3371,6 +3371,17 @@ FxExpression *FxCompareEq::Resolve(FCompileContext& ctx)
{
Promote(ctx);
}
// allows comparing state labels with null pointers.
else if (left->ValueType == TypeStateLabel && right->ValueType == TypeNullPtr)
{
right = new FxTypeCast(right, TypeStateLabel, false);
SAFE_RESOLVE(right, ctx);
}
else if (right->ValueType == TypeStateLabel && left->ValueType == TypeNullPtr)
{
left = new FxTypeCast(left, TypeStateLabel, false);
SAFE_RESOLVE(left, ctx);
}
else if (left->ValueType->GetRegType() == REGT_POINTER && right->ValueType->GetRegType() == REGT_POINTER)
{
if (left->ValueType != right->ValueType && right->ValueType != TypeNullPtr && left->ValueType != TypeNullPtr &&

View file

@ -282,7 +282,7 @@ class ScriptedMarine : Actor
//
//============================================================================
void A_M_Refire (bool ignoremissile, statelabel jumpto)
void A_M_Refire (bool ignoremissile, statelabel jumpto = null)
{
if (target == null || target.health <= 0)
{
@ -293,13 +293,15 @@ class ScriptedMarine : Actor
return;
}
}
SetStateLabel (jumpto);
if (jumpto != null) SetStateLabel (jumpto);
else SetState(CurState + 1);
return;
}
if (((ignoremissile || MissileState == null) && !CheckMeleeRange ()) ||
!CheckSight (target) || random[SMarineRefire]() < 4) // Small chance of stopping even when target not dead
{
SetStateLabel (jumpto);
if (jumpto != null) SetStateLabel (jumpto);
else SetState(CurState + 1);
}
}