Hexen did this with a call to A_BridgeRemove in Thing_Destroy which merely set a flag in the bridge object, which cannot be done safely in ZDoom because it's not guaranteed that the ball object calls A_BridgeOrbit and the garbage collector may delete the bridge actor before it can be checked so now the Bridge's Destroy method deletes all balls attached to the bridge object itself.
- Since the tokenizer never gives the parser negative numbers but always a
unary minus followed by a positive number, it seems reasonable to make
the parser smart enough to turn these into negative constants without
generating extra tree nodes.
- And since we're doing it for unary -, we might as well do it for unary +
as well and avoid extra nodes when we know we don't need them.
- For an enum like this:
enum { value1 = SOME_NUM*2, value2 };
Generate an increment expression for value2 of the form
(add (id value1) 1)
and not
(add (* SOME_NUM 2) 1)
- Instead of representating enumeration values with a special node type,
use the same ZCC_ConstantDef nodes that const_def produces. These are
created at the same scope as the ZCC_Enum, rather than being contained
entirely within it. To mark the end of enums for a single instance of
ZCC_Enum, a ZCC_EnumTerminator node is now appended to the chain of
ZCC_ConstantDefs.
- Constants can be strings, but the existing PSymbolConst couldn't handle
them. The old PSymbolConst is now PSymbolConstNumeric, and the new
PSymbolConst is a now a baseclass for it and PSymbolConstString.
- Instead of having ZCC_ExprString, ZCC_ExprInt, and ZCC_ExprFloat,
just use a single ZCC_ExprConstant. It should simplify type
promotion and constant folding in the future.
- Constants can fill out the type field right away. Other expressions will need
to wait until a later pass, after names have been resolved, so they get
initialized to NULL.
- A texture defined in TEXTUREx without any patches isn't necessarily an
error, so accept. This also means they shouldn't be used for determining
if a TEXTURE directory belongs to Strife instead of Doom.
- When P_OpenMapData() is called by P_CheckMapData(), we don't actually
care if any required lumps are missing. This just means it isn't a valid
map, so don't abort with I_Error().
- Fixed: When an ACS string pool was read from a savegame, FirstFreeEntry
would not be updatedt, except by the Clear() function. This left FirstFreeEntry
at 0, which meant the next string added to the pool would always go in
slot 0, whether it was free or not.
- If a player is spying through another player, CheckPlayerCamera will
return the TID of the player you are "spying", but as coopspy isn't a
net command, this wont be reflected by all nodes. So to fix this,
CheckPlayerCamera now returns -1 if a player's camera is that of any
player at all. (thanks edward850)
- Added I_GetLongPathName(). It wraps the Win32 API's GetLongPathName().
DArgs::CollectFiles() now calls this for every argument it processes, so
any arguments passed using short file names will be converted to long
file names. This is mainly of interest so that savegames will never
record the short file name, which can change based on what else is in
the directory.