diff --git a/src/p_acs.cpp b/src/p_acs.cpp index ac5988a77..2c7f8633d 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4558,7 +4558,7 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType * addr = baddr; // We don't want Int subclasses like Name or Color to be accessible, // but we do want to support Float subclasses like Fixed. - if (!type->IsA(RUNTIME_CLASS(PInt)) || !type->IsKindOf(RUNTIME_CLASS(PFloat))) + if (!type->IsA(RUNTIME_CLASS(PInt)) && !type->IsKindOf(RUNTIME_CLASS(PFloat))) { // For reading, we also support Name and String types. if (readonly && (type->IsA(RUNTIME_CLASS(PName)) || type->IsA(RUNTIME_CLASS(PString)))) diff --git a/src/p_map.cpp b/src/p_map.cpp index 82c55eeaa..37ba513d7 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -335,6 +335,8 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi tmf.abovemidtex = false; P_GetFloorCeilingZ(tmf, 0); + spechit.Clear(); // this is needed so that no more specials get activated after crossing a teleporter. + bool StompAlwaysFrags = ((thing->flags2 & MF2_TELESTOMP) || (level.flags & LEVEL_MONSTERSTELEFRAG) || telefrag) && !(thing->flags7 & MF7_NOTELESTOMP); // P_LineOpening requires the thing's z to be the destination z in order to work. @@ -2284,12 +2286,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, line_t *ld = spec.line; // see if the line was crossed - // One more case of trying to preserve some side effects from the original: - // If the reference position is the same as the actor's position before checking the spechits, - // we use the thing's actual position, including all the side effects of the original. - // If some portal transition has to be considered here, we cannot do that and use the reference position stored with the spechit. - bool posisoriginal = (spec.Refpos == lastpos); - side = posisoriginal? P_PointOnLineSide(thing->Pos(), ld) : P_PointOnLineSide(spec.Refpos, ld); + side = P_PointOnLineSide(spec.Refpos, ld); oldside = P_PointOnLineSide(spec.Oldrefpos, ld); if (side != oldside && ld->special && !(thing->flags6 & MF6_NOTRIGGER)) { diff --git a/src/thingdef/thingdef_parse.cpp b/src/thingdef/thingdef_parse.cpp index b2204066d..cd893f13f 100644 --- a/src/thingdef/thingdef_parse.cpp +++ b/src/thingdef/thingdef_parse.cpp @@ -525,17 +525,12 @@ static void ParseUserVariable (FScanner &sc, PSymbolTable *symt, PClassActor *cl // Read the type and make sure it's acceptable. sc.MustGetAnyToken(); - switch (sc.TokenType) + if (sc.TokenType != TK_Int && sc.TokenType != TK_Float) { - case TK_Int: type = TypeSInt32; break; - case TK_Float: type = TypeFloat64; break; - case TK_String: type = TypeString; break; - default: - type = TypeError; - sc.ScriptMessage("User variables must be of type 'int' or 'float' or 'string'"); + sc.ScriptMessage("User variables must be of type 'int' or 'float'"); FScriptPosition::ErrorCounter++; - break; } + type = sc.TokenType == TK_Int ? (PType *)TypeSInt32 : (PType *)TypeFloat64; sc.MustGetToken(TK_Identifier); // For now, restrict user variables to those that begin with "user_" to guarantee @@ -582,7 +577,7 @@ static void ParseUserVariable (FScanner &sc, PSymbolTable *symt, PClassActor *cl sc.MustGetToken(';'); PField *sym = cls->AddField(symname, type, 0); - if (cls == NULL) + if (sym == NULL) { sc.ScriptMessage ("'%s' is already defined in '%s'.", symname.GetChars(), cls ? cls->TypeName.GetChars() : "Global");