Commit graph

9284 commits

Author SHA1 Message Date
Chris Taylor e597f159e9 In event_process, handle the case of a window deleted in drawing loop with no previous window correctly, preventing possible crash 2016-11-13 11:47:59 +08:00
zico 336df21d2c Change/Addition to dafd4a69be, adopting vKp's proposed solution (which I was too blind to notice): Instead of initializing segnum for object syncing, test for object type instead of segnum for obj_unlink() 2016-11-13 03:42:11 +01:00
Kp 73d014c048 Tighten getaddrinfo test
To recognize getaddrinfo as supported, require that the AI_* flags
passed to it be usable:
- AI_NUMERICSERV must be defined as a number or be undefined
- If ipv6=1, then AI_V4MAPPED and AI_ALL must be defined as numbers

When getaddrinfo is used, raise _WIN32_WINNT from 0x501 to 0x600.
Otherwise, lower it to 0x500.
2016-11-12 20:58:16 +00:00
Kp fd39a752dd Factor out cloaking wall utility loops 2016-11-12 18:10:10 +00:00
Kp 38fb4c9c9e Pass cloaking_wall &to do_{,de}cloaking_wall_frame 2016-11-12 18:10:10 +00:00
Kp e8f9f22635 Factor out do_{,de}cloaking_wall_frame common head/tail 2016-11-12 18:10:10 +00:00
Kp b4b0de8801 Cache uvl pointers in do_decloaking_wall_frame 2016-11-12 18:10:10 +00:00
Kp c4a20b019e Simplify test for cloak_value change 2016-11-12 18:10:09 +00:00
Kp be08b119e6 Prepare do_cloaking_wall_frame for future work
Move the wall reference member into a structure, so that future work can
initialize front/back data in a cleaner way.
2016-11-12 18:10:09 +00:00
Kp c54948f916 Eliminate some wback tests in cloaking wall code 2016-11-12 18:10:09 +00:00
Kp f208a8490f Move do_cloaking_wall_frame demo test up 2016-11-12 18:10:09 +00:00
Kp fdc0575133 Cache goal textures
Find the index of the red/blue/hoard goal textures once when
multi_apply_goal_textures starts, instead of each time a goal segment is
found.
2016-11-12 18:10:09 +00:00
Kp 0cc020c217 Prefer DXX_CONSTANT_TRUE over DXX_HAVE_BUILTIN_CONSTANT_P 2016-11-12 18:10:09 +00:00
Kp 36f23e8d60 Use enum class for multi_send_endlevel_start 2016-11-12 18:10:09 +00:00
Kp 7a0a20d455 Remove secret-level flag in D2 MP message
It is always zero.
2016-11-12 18:10:08 +00:00
Kp f6ca0abf5f Fold multi_do_escape flag handling 2016-11-12 18:10:08 +00:00
Kp 6838ffaa95 Move Omega_recharge_delay to player_info 2016-11-12 18:10:08 +00:00
Kp 7064a56788 Track omega recharge delay as relative time
This fixes two problems on systems where sizeof(int) < sizeof(fix64)
(which applies on most systems).

Normally, the omega cannon does not charge for ~1/3 of a
second after firing stops.

The first problem is that, if (Last_omega_fire_time + 1/3 second)
exceeds 0x80000000 (about 9.1 hours), truncation issues confuse this
rule into not applying, thus allowing the omega cannon to charge
whenever energy is available, even while firing.

The second problem is that, if GameTime64 exceeds 0x8000000000000000
(about 4459701.8 years), a sanity check that attempted to compensate for
the incorrect tracking of Last_omega_fire_time would confuse the
recharge rule into deciding that the user had always fired recently,
which would prevent the omega cannon from ever recharging.  The sanity
check would reset Last_omega_fire_time when Last_omega_fire_time was in
the future relative to GameTime64.  Unfortunately, Last_omega_fire_time
was only an int, so the reset truncates off the high bits of GameTime64.
This truncation is harmless when GameTime64 is less than 0x80000000,
causes the first problem when GameTime64 is not less than 0x80000000,
but is positive, and causes the second problem when GameTime64 is
negative.

These problems were mitigated in prior releases by three factors.  First,
a hack resets GameTime64 when restoring from a saved game, so the
affected game needs to run for ~9.1 hours (or ~4459701.8 years) without
reloading.  Second, starting a new level resets GameTime64, so the game
needs to stay on a single level for ~9.1 hours (or ~4459701.8 years).
Third, the omega cannon discharges faster than it can recharge, so even
when the first bug allowed it to charge while firing, a player could
still drain Omega_charge to zero by continuous firing.  However, it
would take longer to drain due to the bug-induced concurrent recharge,
and would not be subject to the 1/3 second wait normally imposed between
depleting Omega_charge and recharge beginning.

Fix these problems by replacing Last_omega_fire_time with
Omega_recharge_delay, which is 0 when recharging is allowed or a
positive amount of frame time if recharging is disallowed due to recent
firing.  Set Omega_recharge_delay to 1/3 second when the user fires.
Decrease it by up to FrameTime when omega_recharge_frame runs.

This does not fix the preexisting problem that reloading a savegame does
not update the recharge delay, which manifests two related problems.
First, firing the omega cannon and then loading a game will bring the
delay through into the save, whether or not the user had been firing
just before saving.  Second, not firing the omega cannon and then
loading a game will allow the user to fire immediately on load, even if
the user had been firing when the game was saved.  Future work can
address the first problem by clearing the delay, but a savegame file
modification is required to address the second problem.

------------->8-------------

    #include <cstdio>

    int last_fire;
    long t64;
    /* The test program only shows the bug on 64-bit systems */
    static_assert(sizeof(last_fire) == 4, "sizeof(int) != 4");
    static_assert(sizeof(t64) == 8, "sizeof(long) != 8");

    void frame(bool expect_recharge, const unsigned line)
    /* clang does not support __builtin_LINE, so fake it with a macro
     */
    #define frame(E)    frame(E, __LINE__)
    {
	    if (last_fire > t64)
	    {
		    printf(__FILE__ ":%u:%u:                        last_fire=%8x t64=%16lx: last_fire > t64, resetting\n", __LINE__, line, last_fire, t64);
		    last_fire = t64;
	    }
	    const int time_bias = 0x5555;
	    if (last_fire + time_bias > t64)
	    {
		    printf(__FILE__ ":%u:%u: %5sexpect_recharge=%i last_fire=%8x t64=%16lx: last_fire recent (%16lx), refusing to recharge\n", __LINE__, line, expect_recharge ? "BUG: " : "", expect_recharge, last_fire, t64, static_cast<long>(last_fire + time_bias));
		    return;
	    }
	    printf(__FILE__ ":%u:%u: %5sexpect_recharge=%i last_fire=%8x t64=%16lx: last_fire old    (%16lx), recharging\n", __LINE__, line, expect_recharge ? "" : "BUG: ", expect_recharge, last_fire, t64, static_cast<long>(last_fire + time_bias));
    }

    int main(int, char **)
    {
	    frame(false);
	    t64 = 0x7fff;
	    frame(true);
	    last_fire = t64 - 4;
	    frame(false);
	    t64 = 0x7fffaaab;
	    frame(true);
	    last_fire = t64;
	    ++t64;
	    frame(false);
	    t64 = 0x7ffffffffd;
	    frame(true);
	    last_fire = t64;
	    ++t64;
	    frame(false);
	    t64 += 0x10000;
	    frame(true);
	    t64 = 0x7fffffffffffff00;
	    frame(true);
	    last_fire = t64;
	    frame(false);
	    t64 = 0x8000000000000000;
	    frame(true);
	    t64 += 0x800000000;
	    frame(true);
    }
2016-11-12 18:10:08 +00:00
Kp 72c13d101c Fold omega Next_laser_firing_time handling into do_laser_firing_player
Previously, do_laser_firing_player would update Next_laser_firing_time,
then do_omega_stuff would update it again.  OMEGA_BASE_TIME is smaller
than Weapon_info[OMEGA_ID].fire_wait, so the first store was overridden
by the second.  As a quirk, the override was skipped if the omega cannon
was unable to fire due to object limits or due to insufficient energy,
causing those rare cases to use the longer
Weapon_info[OMEGA_ID].fire_wait delay.

Fold the omega cannon handling of Next_laser_firing_time into
do_laser_firing_player to eliminate that quirk, simplify the code, and
remove the need to recompute fire_frame_overhead from
Last_omega_fire_time.
2016-11-12 18:10:08 +00:00
Kp 44867c637d Flatten creation of invalid valptridx
Constructing valptridx::basic_ptr with a known-invalid magic index does
not require an array.  Simplify the static_assert to reject uses of
factory functions with known-invalid magic index values.  Fix the two
sites that fail with the stricter static_assert.
2016-11-12 18:10:08 +00:00
Kp 61567eeed0 Move player::KillGoalCount to player_info 2016-11-12 18:10:07 +00:00
Kp 1060c8fabb Move player::net_kills_total to player_info 2016-11-12 18:10:07 +00:00
Kp 411b623aa7 Move player::net_killed_total to player_info 2016-11-12 18:10:07 +00:00
zico ad638539d6 Setting version number to 0.59.100 for upcoming public BETA. 2016-11-12 16:07:21 +01:00
zico 8258532693 Do not process tracker timeout if we're a client (which doesn't get any ACKs) 2016-11-12 15:56:49 +01:00
zico b508e2a294 Restrict powerup repopulation for Multiplayer as well as sending and processing of inventory packets to NETSTAT_PLAYING consistently. 2016-11-12 15:55:37 +01:00
zico dafd4a69be Fixed and revamped 30f9233b36e9e546a7479fd152331b7b0d689d47: initialize segnum for objects during object syncing only. Should only be required for OBJ_NONE but since net_udp_read_object_packet() does only process changed objects and setting segnum in init_objects() isn't desired, this initialization is applied to all objects (except the host player object) before the sync process. 2016-11-12 15:52:16 +01:00
Chris Taylor 6757d89238 Fix crash in editor when trying to unlink a door that isn't linked 2016-11-12 17:30:36 +08:00
Chris Taylor eeb3303b95 Fix crash in editor when trying to link wall with no Markedsegp 2016-11-12 17:28:26 +08:00
Chris Taylor 95fcee9474 Fix crash when removing a wall in the editor
Only update wall_num if != wall_none.
2016-11-12 17:19:38 +08:00
Chris Taylor 4568bbae11 Don't crash when building segment bridge in editor the wrong way
Check if there is Markedsegp and replacing an Assert with a LevelError.
2016-11-12 16:41:54 +08:00
Chris Taylor ac52a30214 Fix spurious exploding wall and crash when playing a level loaded with the editor
When File->'Play in 320x200' is chosen, use StartNewGame(Current_level_num). For now use create_new_mission and Current_level_num = 1 every time. Also remove the now redundant hacks GM_EDITOR and editor_reset_stuff_on_level.
2016-11-12 15:38:38 +08:00
Chris Taylor 2d5d24cedc Fix freeze when clicking on 'Help' menu in editor
The functions med-mark-start and med-mark-end don't exist - that's fine, still read the rest of the menus, so it can actually properly 'hide' the help menu after it's clicked on.
2016-11-11 18:11:14 +08:00
Chris Taylor bae558b2e1 Fix selection in the game view for the editor
build_segment_list and build_object_lists are now required for _search_mode as well (i.e. required for every frame), as the segment list is no longer a set of global variables.
2016-11-11 16:09:57 +08:00
Chris Taylor ac438f4cc2 Allow the user to carry on as usual if any of the editor files are missing (i.e. before editor was loaded).
If a game was playing, continue playing. If it was in the main menu, return to the main menu. (If all files are put in place the editor can load again.)
2016-11-11 16:09:57 +08:00
Chris Taylor 46abf5f31f Set Game_wind to nullptr at the start of responding to EVENT_WINDOW_CLOSE in game_handler
This prevents newdemo_stop_playback from attempting to close Game_wind, which results in it being freed twice - in particular when switching to the editor (via delete-E) when playing a demo.
2016-11-11 16:09:57 +08:00
Chris Taylor b8b19baa92 Make sure wall dialog and hostage dialog close properly
When responding to EVENT_WINDOW_CLOSE, set MainWindow to nullptr - fixing multiple issues with these dialogs including the inability to re-open them and a crash on exiting the editor.
2016-11-11 16:09:57 +08:00
Chris Taylor 396f1e47f0 Do Wall Dialog now works with no wall selected 2016-11-11 16:09:57 +08:00
Chris Taylor e29a4513b6 Allow empty string to be passed to file_getdirlist
This allows the open/save dialogs to work in the editor when a filename without a path separator is passed (which is the default)
2016-11-11 16:09:57 +08:00
Chris Taylor d41146bcbd Set default object index for object dialog
This prevents the Object Editor from crashing when no object is selected (Cur_object_index == object_none).
2016-11-11 16:09:57 +08:00
Chris Taylor 46297c151e Remove ui_gadget_delete_all
As the UI_DIALOG client is now responsible for freeing all gadgets (via unique_ptr's), this function now causes issues where it attempts to access freed gadgets (resulting in std::runtime_error("unknown gadget kind") exception when closing the AI Properties dialog on my Macbook, for example). Removing the offending function fixes the issue.
2016-11-11 16:09:57 +08:00
Chris Taylor b7bbb37885 Fixes freeze when starting new game or editor
Fixes freeze introduced by 9511f65 where event_process wouldn't go to the next window if it's hidden.
2016-11-11 16:09:57 +08:00
Kp b19e93cc04 Skip tracking idx in obj_get_signature 2016-11-10 04:22:19 +00:00
Kp 930c4c6a99 Remove write-only variable multi_goto_secret
multi_goto_secret is read only to decide whether to write a new value to
it, but never to change other control flow.
2016-11-10 04:22:19 +00:00
Kp ce193812d8 Reset Omega_charge when loading save games
If loading an pre-v22 save game, or loading any save where the player
died on the secret level, clear Omega_charge instead of retaining
whatever value the prior game used.
2016-11-10 04:22:18 +00:00
Kp 188ef99536 Assert that newly allocated objects are type OBJ_NONE 2016-11-10 04:22:18 +00:00
zico 30f9233b36 Reverted 2e6aa0f081 and partially reverted 7064fcccba to still allow segnum and signature init for multiplayer games, keeping consistency during object sync. 2016-11-08 14:16:26 +01:00
zico 5f21bdd71f In net_udp_game_connect, moved test for dl->gameid above test for timer. In udp_tracker_process_game removed redundant location of IP/Port delimiter, added another byte for termination of sIP, added size checks for sIP and sPort before actully copying them and added failsafe check for reading TrackerGameID. 2016-11-08 13:18:51 +01:00
Chris Taylor 709a2c3d2a Fixes freeze when starting new game or editor
Fixes freeze introduced by 9511f65 where event_process wouldn't go to the next window if it's hidden.
2016-11-07 09:32:06 +08:00
Kp 1cb04cb64b Merge branch derhass:patches/GLES_GL_extension_unification into master 2016-11-06 19:24:52 +00:00