When this function was originally written there was no possibility of fractional vertex coordinates so it threw away the fractional parts of the node's directional vector (which in the original nodes was always 0.)
Now, with UDMF and high precision vertices this no longer works and the loss of significant parts of their value caused this code to produce erroneous results if the linedefs were only a few map units long and using fractional positions.
- In ZDoom the timer runs a bit too fast because roundoff errors make 35 tics only last 0.98 seconds. None of the internal timing has been changed, only the places where a time value is printed it will get adjusted for this discrepancy.
Added ability to specify custom command line parameters
Added ability to browse for user files
Improved handling of restart console command
Improved layout for window
- specie: money in the form of coins rather than notes
- species: a group of living organisms consisting of similar individuals
capable of exchanging genes or interbreeding
- cx1, cx2, cy1, and cy2 are not used anywhere, so get rid of them.
- Also annotated the comments to indicate the corresponding arrays in the Build engine.
because they're kind of a pain to type when all uppercase.
- Also, make its sx1 and sx2 members shorts, so it takes less space, since
it's getting crammed into a vissprite now.
- This still doesn't use all the sprite properties correctly. It also
looks like they're going to need different code to build the clipping
arrays. But at least wall sprites are drawn at the proper angle now!
- R_AddLine() and R_RenderDecal() had nearly identical code for setting up
texture mapping. These have now been spun off into methods of
FWallCoords and FWallTmapVals.
- Blood's maps use thing types, much like Doom's, so getting its player
starts is easy. There's no need to synthesize a start from the editor
position like with other Build maps.
Adapting during a dup frame caused jittery network performance
(especially when using high dup values).
The demoplayback check also didn't need to be there anyway.
Even when '+logfile' argument was omitted, the console would print 'Could not start log', because 'logfile != NULL' was used as a check for the presence of '+logfile' argument, but the internal buffer of FString is never NULL, so the right check is 'logfile.isNotEmpty()'.
While I'm at it, I fixed another bad check for 'pagename'.
hu_stuff.h defined some callbacks for qsort without STACK_ARGS which causes problems with this solution's Release setting which uses __fastcall calling convention.
- fixed a CMake warning about uninitialized use of the variable CROSS_EXPORTS in the tools subfolder when CMAKE_CROSSCOMPILING is off;
- fixed a variable typo: CMAKE_CURRENTY_BINARY_DIR instead of CMAKE_CURRENT_BINARY_DIR;
- in src/CMakeLists.txt, fixed a missing merge of a portion of code from maint branch to master.
LZMA SDK recently added an #include <windows.h> to its headers, meaning it's no longer safe to include its headers globally in platform independent files.
The following changes were necessary:
- rename DWORD type in zipdir.c
- add USE_WINDOWS_DWORD and reorder includes in file_7z.cpp
- wrap LZMA decoder stream into a local struct that's declared anonymously in files.h and adjust files.cpp for this change.
Introduce the variable 'ZD_CMAKE_COMPILER_IS_GNUC(XX)_COMPATIBLE' and replace any occurrence of '"${CMAKE_C(XX)_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C(XX)_COMPILER_ID}" STREQUAL "Clang"' with it. This makes it possible to add more GCC compatible compilers in just one place.
The sdl version of the function 'SetLanguageIDs' is very limited, comparing to the win32 counterpart, as it will try to accept only the language codes (ie 'enu', 'fr', 'ptb', etc). If a different string is provided, zdoom will default its language to English.
- Added a segment of code that now makes the intermission wait for all
players before advancing, instead of continuing on any player. A "ready
icon" shows to reflect this.
- The Deathmatch intermisson couldn't show the ready icon (because it
just used the ingame scoreboard), so a proper intermission was added,
which reflects the same design as the coop scoreboard.
- The colour column wasted more space then it should have needed, so it
was replaced with player colour backgrounds.
- Slight y offset adjustments to make everything fit in 320x200
properly.
Root permissions are required to be able to create directories inside /Library/Application Support
So user's ~/Library/Application Support is used to store cached nodes
From what I can see, GCC would miscompile the involved loops, because the index variable is 'signed int' and the multiplication with an unsigned would cause signed overflow (undefined behavior). Change the index variable type to 'unsigned int' to expect unsigned overflow (conformant to standard).
Especially when dropping the current weapon it can still be active, this is most easily observed with Strife's crossbow which loops the flash state, but it also can happen with other weapons, right after shooting.
# By Christoph Oelckers (2) and Edward Richardson (1)
# Via Christoph Oelckers
* 'master' of https://github.com/rheit/zdoom:
- fixed: The map setup code was still truncating texture names in several places.
Fix nettic run-out at end of demo playback
- fixed: ACS's check...Texture functions must use the same search flags as the texture initialization code in p_setup.cpp and p_udmf.cpp. It also should not create textures that don't exist yet. We are only doing a comparison so it's not relevant if the texture exists or not.
- fixed: Thing_Raise didn't properly set the spawn health.
- fixed: Thing_Raise did not the CanRaise state flag.
- fixed: Reviving a monster must also reset the damage type.
- fixed: Thing_Raise reset the actor after calling the raise state, but it should be before, just as the Archvile code is doing.
- consolidated some common code of Thing_Raise and Archvile resurrection into AActor methods.
Instance of FileReader is no longer destructed when header of data file is valid but complete loading of file fails
Loading of truncated .zip file is the simplest test case
Recently added pitch and roll members were not initialized with zeroes when loading Hexen-style maps
At least, hitscan attack can be fired in random direction because of this
- added version check for Windows 8. I also would have liked to add 8.1 but due to some incredibly stupid changes in the version API it's no longer possible to reliably retrieve the correct Windows version for later builds.
Use POSIX-compliant opendir() / readdir() functions instead fts_open() / fts_read()
Unlike Linux version, on OS X fts_read() inserts extra slash character between source directory and traversed entry paths
- This warning is about using zero-sized arrays in structs (aka flexible
member arrays). It's standard-enough for our purposes, so don't warn
about it, since neither GCC nor Clang do.
- Since Clang++, G++, and VC++ all support this extension (even though it's
technically officially only part of C99), use it. It lets Clang's array-
bounds checker know that these are meant to be accessed out of their so-called
"bounds".
- 'notranslate != NULL' is completely useless, because 'notranslate' is an array, hence removed.
- I interpreted 'SbarInfoScript != NULL' as a typo, since 1)in the next expression inside the condition there's a dereference to 'SBarInfoScript[SCRIPT_CUSTOM]' and 2)'SBarInfoScript[SCRIPT_CUSTOM]' is checked against 'NULL', in line 352, and then dereferenced when introducing 'cstype'.
- Fixed: If a part of a multipatch texture is replaced by a HIRESTEX
version, the original patch must not be deleted, since the multipatch
texture still needs it for compositing.
- This function just assumed that every xy angle passed to it was within
the range [0,360). This is obviously bad, since anything outside that
range can result in accessing data outside the range of the finecosine
and finesine tables.
- For maps like xtheateriii that expect non-blocking push lines to
activate when you are standing on them and run into a completely different
line, there is now this compatiblity.txt-only flag.
- Fixed: Loading players from savegames set the skin before their current
class was retrieved, so they could not validate their skins with the
correct class.
- There exist files where the first word of the version number for DRO v1
files is not 0 but something else completely. (Maybe it's not actually a
version number?) Assume they are valid v1 files as long as the second
word is a 1.
Instead of trying to decompress packets from unknown connections (and
failing them anyway), they are now reported and discarded without doing
anything else.
Corrected entries were blood would spawn inconsistently because of
cl_bloodtype. Blood now always spawns but is marked invisible according
to cl_bloodtype.
- commented out output of Cr0NpxState for floating point state because this variable was renamed in most recent Windows headers.
- added CMAKE option to generate assembly output for release builds.
- added my CMake-based project directory to .gitignore.
- Fixed: Commit 75dd5503, which was to enable the use of LANGUAGE
substitutions for conversation items with a cost attached, neglected to
remove the original code that attached the cost to the end of the item,
so the cost got added twice.
- The waiting message is now always cleared, regardless if it needed to
be in the first place. It's a rather simple for-loop so I doubt it
matters.
- Nodes are also cleared from the list if they catch up while other
nodes are still behind.
- "lastglobalrecvtime" is now bumped after the waiting loop if a tic was
successful, rather then bumping it every time a packet was received. It
appears that you can receive a packet before the game knows it stalled,
thus stalling it anyway.
- Instead of comparing the nettics to the local node, all nodes are
tested against gametic+counts (the real reason why the game has
stopped).
- More then one node can be marked as late at any one time.
- In a packet-server game, the arbitrator is now assumed slow, rather
then testing it. There is no point, seeing as we already know the game
has stalled because of it.
- The binary form of ZCC_OpInfoType::FindBestProto() needs special
handling for conversion from single to double precision floating point
so that it doesn't choose an integer form over a floating point form
when picking the best prototype.
- This information is already stored in the node's NodeType field, so
there's no reason to go do a table lookup for it elsewhere. Must have
been a brain fart when I wrote them in the first place.
- Fixed: PType::FindConversion() gave all but the source type a distance of
0, so it only ever returned just one step of a route that requires more
than one step.
- The global symbol table was never marked by the GC, so anything pointed
only by it was fair game to disappear.
- Don't clear the global symbol table during DECORATE parsing. Junk in
there should be considered constant after initialization.
- AST nodes cannot be shared, because type conversion changes them in
place, and what's appropriate for one use is by no means appropriate for
all uses.
- Added ZCCCompiler class as a place to generate IR and symbols from an
AST. Right now, all it does is simplify constant expressions into
constant values.
- Do type promotion on the AST where appropriate.
- Added true and false tokens to the parser driver.
- PType::FindConversion() can find a path to convert one type to another.
This is completely generic and can handle any number of conversion
functions.
- Added ZDOOM_OUTPUT_OLDSTYLE (could probably use a more descriptive name) which causes CMake to vary the executable name by build type and place the exes and pk3s into the directory specified in ZDOOM_OUTPUT_DIR.
- ALL_BUILD will now launch ZDoom.
- Command-line console commands are executed before a level is entered, so
trying to use +warp to position yourself at a specific location will not
work. We now specially handle this command so that it does work.
- Added CF_INTERPVIEW flag for players. A_SetPitch/A_SetAngle and the
similar ACS APROPs set this when changing an angle. This forces the
renderer to interpolate the view angles instead of updating with the
latest mouse positions. The effect lasts one tick.
- To make camera textures pan in world units instead of texture units, you
can now add "WorldPanning" at the end of the cameratexture definition in
ANIMDEFS, after the "fit" specification. e.g.
cameratexture CAMTEX 128 128 fit 64 64 worldpanning
- Fixed: DThinker::Destroy(Most)ThinkersInList() were unreliable when
destroyed thinkers destroyed more thinkers in the same list.
Specifically, if the thinker it destroyed caused the very next thinker
in the list to also be destroyed, it would get lost in the thinker list
and end up with a NULL node. So just keep iterating through the first
thinker in the list until there are none left. Since destroying a
thinker causes it to remove itself from its list, the first thinker will
always be changing as long as there's something to destroy.
- Fixed: You could not set any CVARINFO-defined cvars from the command line
because command line console commands were executed before wads were
even loaded. Off the top of my head, I can't think of anything that would\
break by having them get executed after wads are loaded.
- Since the VM doesn't directly support the GT, GTEQ, and NEQ comparisons,
don't use them in the trees either. Instead, wrap them as LTEQ, LT, and
EQEQ inside a BoolNot operator.
- I can't believe I completely forgot to let the parser handle true and
false literals.
- Consolidate all the %include blocks in zcc-parse.lemon into a single
one, because Lemon all of a sudden decided it didn't like me having more
than one in the grammar file.
- Added a PBool type to represent boolean values with.
- This conversion has behavior similar to %g: It automatically behaves like
%f or %e based on the number of output characters. However, unlike %g,
this decision is also based on what will produce the smallest string
without truncating the output. The precision field (the * in %.*f) is
ignored. Converting a double to text with %H and then back to a double
should be lossless.
- Added TypeVoid for statements, which produce no type.
- Added TypeError for expressions whose arguments are incompatible.
- Pointers now derive from PBasicType instead of PInt. Since they have their own register sets in the VM, this seems to make more sense than treating them as integers.
If an actor is already targeting a goal, and Thing_SetGoal is used on
it, it would still be left targeting the old goal instead of the new
one. This messed up checks in A_Chase for walking towards a goal vs a
real target.
- This fixes crashes when quitting multiplayer games because the default
byte-for-byte copy caused PredictionPlayerBackup and the console player
to point to the exact same userinfo data and to both try and free it
when they are deleted.
- Make wi_noautostartmap a userinfo cvar. This allows it to be
communicated across the network and saved in demos. If any player has it
set, then the intermission screen will not automatically advance to the
next level.
- Instead of tying NoDelay behavior to OF_JustSpawned, use a new actor
flag, MF7_HANDLENODELAY. This only gets cleared once it has actually
been checked by Tick(). This is necessary because freeze mode delays the
initial run of Tick() past the initial spawn, so OF_JustSpawned will no
longer be set when it does the initial tick.
- Delay NoDelay processing if an actor is spawned dormant. Actors spawned
dormant have Deactivate() called before they tick, so MF7_HANDLENODELAY
will remain set as long as an actor is dormant. This allows the NoDelay
handling to occur as expected once it is activated.
- If the current user does not have write permissions for the directory
zdoom.exe is located in, use standard folder paths located in their home
directory instead. This is a common scenario when people put ZDoom into
Program Files. (Ironically, zdoom.ini used to be in AppData, buth then
people complained when it wasn't in the same directory as zdoom.exe, so
it got turned into zdoom-<user>.ini so at least it could retain some
multi-user support. I'm not sure when the AppData support was removed,
though, since it should have still been kept around for migrating
configs to the new name.)
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.