diff --git a/src/g_shared/a_armor.cpp b/src/g_shared/a_armor.cpp index 6bed525d8..1475f86d2 100644 --- a/src/g_shared/a_armor.cpp +++ b/src/g_shared/a_armor.cpp @@ -211,16 +211,17 @@ void ABasicArmorPickup::Serialize (FArchive &arc) AInventory *ABasicArmorPickup::CreateCopy (AActor *other) { ABasicArmorPickup *copy = static_cast (Super::CreateCopy (other)); - copy->SavePercent = SavePercent; - copy->SaveAmount = SaveAmount; - copy->MaxAbsorb = MaxAbsorb; - copy->MaxFullAbsorb = MaxFullAbsorb; if (!(ItemFlags & IF_IGNORESKILL)) { SaveAmount = FixedMul(SaveAmount, G_SkillProperty(SKILLP_ArmorFactor)); } + copy->SavePercent = SavePercent; + copy->SaveAmount = SaveAmount; + copy->MaxAbsorb = MaxAbsorb; + copy->MaxFullAbsorb = MaxFullAbsorb; + return copy; } @@ -291,6 +292,12 @@ void ABasicArmorBonus::Serialize (FArchive &arc) AInventory *ABasicArmorBonus::CreateCopy (AActor *other) { ABasicArmorBonus *copy = static_cast (Super::CreateCopy (other)); + + if (!(ItemFlags & IF_IGNORESKILL)) + { + SaveAmount = FixedMul(SaveAmount, G_SkillProperty(SKILLP_ArmorFactor)); + } + copy->SavePercent = SavePercent; copy->SaveAmount = SaveAmount; copy->MaxSaveAmount = MaxSaveAmount; @@ -299,10 +306,6 @@ AInventory *ABasicArmorBonus::CreateCopy (AActor *other) copy->MaxAbsorb = MaxAbsorb; copy->MaxFullAbsorb = MaxFullAbsorb; - if (!(ItemFlags & IF_IGNORESKILL)) - { - SaveAmount = FixedMul(SaveAmount, G_SkillProperty(SKILLP_ArmorFactor)); - } return copy; } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index bf480fe73..556592991 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2759,6 +2759,7 @@ int DLevelScript::GetActorProperty (int tid, int property) // so pretends it's normal. return STYLE_Normal; case APROP_Gravity: return actor->gravity; + case APROP_Invulnerable:return !!(actor->flags2 & MF2_INVULNERABLE); case APROP_Ambush: return !!(actor->flags & MF_AMBUSH); case APROP_Dropped: return !!(actor->flags & MF_DROPPED); case APROP_ChaseGoal: return !!(actor->flags5 & MF5_CHASEGOAL); @@ -2820,6 +2821,7 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value) // Boolean values need to compare to a binary version of value case APROP_Ambush: + case APROP_Invulnerable: case APROP_Dropped: case APROP_ChaseGoal: case APROP_Frightened: diff --git a/src/po_man.cpp b/src/po_man.cpp index 7619bd06a..da8399b3d 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -1245,6 +1245,7 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) bool blocked; ld = sd->linedef; + top = (ld->bbox[BOXTOP]-bmaporgy) >> MAPBLOCKSHIFT; bottom = (ld->bbox[BOXBOTTOM]-bmaporgy) >> MAPBLOCKSHIFT; left = (ld->bbox[BOXLEFT]-bmaporgx) >> MAPBLOCKSHIFT; @@ -1294,6 +1295,17 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) { continue; } + // We have a two-sided linedef so we should only check one side + // so that the thrust from both sides doesn't cancel each other out. + // Best use the one facing the player and ignore the back side. + if (ld->sidedef[1] != NULL) + { + int side = P_PointOnLineSide(mobj->x, mobj->y, ld); + if (ld->sidedef[side] != sd) + { + continue; + } + } ThrustMobj (mobj, sd); blocked = true; }