Commit graph

4226 commits

Author SHA1 Message Date
Kp f88cfd9901 Cache canvas in newmenu_mouse MBTN_LEFT 2017-02-11 21:42:38 +00:00
Kp df538f1e01 Cache canvas in scores_handler EVENT_WINDOW_DRAW 2017-02-11 21:42:37 +00:00
Kp 103ed33aad Fold calls to scores_draw_item 2017-02-11 21:42:37 +00:00
Kp cbf791608d Pass canvas to scores_draw_item 2017-02-11 21:42:37 +00:00
Kp 2df20e0823 Pass canvas to scores_rprintf 2017-02-11 21:42:37 +00:00
Kp 5e2f2c0b1c Pass canvas to scores_rputs 2017-02-11 21:42:37 +00:00
Kp 3becce8cb1 Pass canvas to nm_rstring 2017-02-11 21:42:36 +00:00
Kp fbc16efa0f Pass canvas to nm_string 2017-02-11 21:42:36 +00:00
Kp 725ec77006 Avoid unnecessary allocations in nm_string
Only allocate a temporary string if a tab exists to be overwritten.
2017-02-11 21:42:36 +00:00
Kp 2c6e8fd446 Simplify nm_string 2017-02-11 21:42:36 +00:00
Kp d65ad71099 Cache newmenu_mouse LINE_SPACING 2017-02-11 21:42:35 +00:00
Kp c24ea5ae1f Fold kmatrix_status_msg format string 2017-02-11 21:42:35 +00:00
Kp beaa49a7ba Pass destination bitmap to scale_bitmap 2017-02-11 21:42:34 +00:00
Kp 590a025a89 Pass canvas to g3_start_frame 2017-02-11 21:42:34 +00:00
Kp 740b3a9649 Pass canvas to ogl_start_frame 2017-02-11 21:42:33 +00:00
Kp 80e7ade6a1 Pass canvas to g3_draw_sphere 2017-02-11 21:42:33 +00:00
Kp 513e7ceceb Pass canvas to g3_draw_line 2017-02-11 21:42:33 +00:00
Kp ae33aaafc1 Pass canvas to gr_set_fontcolor 2017-02-11 21:42:32 +00:00
Kp 0dcae721d9 Make canvas an explicit argument to gr_printf
Previously, a macro implied *grd_curcanv as the canvas.  Pass the canvas
explicitly so that callers can choose the canvas to use.
2017-02-11 21:42:32 +00:00
Kp d1657ba269 Make canvas an explicit argument to gr_uprintf
Previously, a macro implied *grd_curcanv as the canvas.  Pass the canvas
explicitly so that callers can choose the canvas to use.
2017-02-11 21:42:32 +00:00
Kp 3fb0367423 Use range_for in duplicate_group 2017-02-11 21:42:31 +00:00
Kp 227eb98c3e Pass player_info to do_cockpit_window_view 2017-02-11 21:42:31 +00:00
Kp 8783c22003 Remove obsolete ogl_pal 2017-02-11 21:42:31 +00:00
Kp 1a3d89aecf Use vsegptridx in editor group functions 2017-02-11 21:42:31 +00:00
Kp 43a700a200 Prefer grs_main_bitmap::reset() to direct reinitialization
This ensures that any allocated resources are always freed.
2017-02-11 21:42:31 +00:00
Kp 96eb8b824a Fold briefing::guy_bitmap_show into briefing::guy_bitmap 2017-02-11 21:42:31 +00:00
Kp c1440ff995 Factor out RLE expansion
Many sites open-coded walking a bitmap and handling whether it was
RLE_BIG.  Factor that out into a helper class and redirect those sites
to use it.
2017-02-11 21:42:30 +00:00
Kp 7df99350dd Pass player to do_laser_firing_player 2017-02-08 23:34:41 +00:00
Kp 82d10b910c Pass player_info to allowed_to_fire_laser 2017-02-08 23:34:41 +00:00
Chris Taylor f7471af2d6 In ReadControls, continue executing code even if HandleDeathInput handled a key event
This allows the player to press a movement key to respawn after death, and the same keypress will cause the ship to move. Now this works with the option 'when dead, respawn by pressing any key' as well as 'when dead, respawn by pressing the Fire key'.
2017-02-08 12:17:51 +08:00
Chris Taylor 88b5e616a9 Replace calls to window_set_visible in DoPlayerDead() with stop/start_time()
This is so game_flush_inputs() isn't called - part of change allowing player to respawn and begin moving with the same keypress. With this commit, you can use this feature with the 'when dead, respawn by pressing the Fire key' option - i.e. hold down movement key, then press fire key to respawn.
2017-02-08 12:17:51 +08:00
Chris Taylor 7ab97744c4 Remove call to game_flush_common_inputs() in game_flush_respawn_inputs()
Later commits will enable the player to press a movement key to respawn on death, then move with the same keypress. This commit makes sure the player stops moving when the key is released.
2017-02-08 12:17:51 +08:00
Kp d4f58d7bd3 Reload player object number after loading objects 2017-02-06 02:00:49 +00:00
Kp 98c9374a12 Simplify powerup_grab_cheat_all path
Movement handling has an ugly hack that tries to grab powerups near the
console player, but it reuses general collision handling and fails to
check whether the player is alive.

Add a liveness check.  Place the check so that it happens once, before
the objects are scanned, rather than being needlessly repeated for every
object.

Refactor the collision code to let the movement hack skip the parts it
does not need.

Reported-by: ryusei117 <https://github.com/dxx-rebirth/dxx-rebirth/issues/302#issuecomment-275816259>
2017-02-04 23:10:29 +00:00
Kp d5634f4406 Add hack for old savegames on boss levels
Reported-by: vLKp <https://github.com/dxx-rebirth/dxx-rebirth/issues/291#issuecomment-271118416>
Reported-by: kreatordxx <https://github.com/dxx-rebirth/dxx-rebirth/issues/291#issuecomment-275896181>
Fixes: df5d4196e7 ("When converting object_rw to object, recompute gun points for CT_CNTRLCEN as they are now part of object and not globals anymore")
2017-02-04 23:10:29 +00:00
Kp 62778327a7 Pass cobjptridx to apply_light 2017-01-31 04:25:06 +00:00
Kp cdfe7cc308 Merge branch cheats2 into master 2017-01-31 03:57:59 +00:00
Chris Taylor e9b0ca9a83 Don't decrement trigger in remove_trigger_num if it's trigger_none
Fixes a crash when loading a level with redundant triggers and editor enabled, e.g. Passion of Death.
2017-01-30 11:08:58 +08:00
Kp 28489e0770 Merge branch baldguy into master 2017-01-29 21:17:18 +00:00
Kp 59bad96d5f Add back homing weapons cheat for D2
Kreator proposed restoring the Descent 2 cheat that grants homing
capability to all weapons.  This commit implements that proposition,
with some changes to the implementation details.

Based-on-patch-by: Chris Taylor <chris@icculus.org>
Requested-by: Chris Taylor <https://github.com/dxx-rebirth/dxx-rebirth/pull/318>
2017-01-29 21:02:48 +00:00
Kp 32760e8a8f Simplify test for weapon_info::homing_flag 2017-01-29 21:02:38 +00:00
Kp 07200620a1 Simplify test for weapon_info::homing_flag 2017-01-29 20:57:40 +00:00
Chris Taylor 000ba37b42 Fix typo with cheat - should be 'ORALGROOVE' not 'ALGROOVE'
No noticeable effect in game, except that just typing 'ALGROOVE' will activate the cheat, which is different to original.
2017-01-29 15:19:02 +08:00
Chris Taylor 877cef9a20 Enable "BALDGUY" cheat for Descent 1
Typing "BALDGUY" after enabling cheats will activate the 'baldguy' easter egg for D1X-Rebirth, which will show next time a briefing is shown featuring Dravis (Mac D1 data only). As with the original, it just plays the 'Cheater!' sound with no HUD message.
2017-01-29 13:05:58 +08:00
Chris Taylor 56125b7e64 Get 'baldguy' cheat to work for Mac Descent 1 data
Pressing ALT-B when in the briefings using Mac Descent 1 data in D1X-Rebirth works again - showing Dravis wearing a silly hat. Before it would exit load_briefing_screen prematurely.
2017-01-29 13:05:57 +08:00
Chris Taylor 4fad71ef6d Player keeps omega cannon charge if going between secret and normal level 2017-01-29 07:54:43 +08:00
Chris Taylor 2f4db4a048 Player keeps any keys collected on a secret level even if they die on the secret level 2017-01-29 07:54:43 +08:00
Chris Taylor 4b3a34f943 Player keeps their loot if they went between a secret level and a normal level without dying 2017-01-29 07:54:43 +08:00
Kp a2d03df7aa Prevent treating dying players as weapons
Function `object_create_explosion_sub` is supposed to be given a weapon
and an object on which to explode it.  However, the original game abused
`object_create_explosion_sub` by also calling it from
`object_create_badass_explosion`, which can be called from
`explode_badass_object`, which can be called from
`explode_badass_player`.  Chained together, this lets
`object_create_explosion_sub` check the weapon ID of a dying player,
which is not a valid operation.  This causes a diagnostic from
`get_weapon_id`.  Add an explicit test that the object is a weapon so
that non-weapons do not cause a diagnostic.

Reported-by: ryusei117 <https://github.com/dxx-rebirth/dxx-rebirth/issues/302#issuecomment-272048330>
Analyzed-by: zicodxx <https://github.com/dxx-rebirth/dxx-rebirth/issues/302#issuecomment-272710279>
2017-01-28 18:12:21 +00:00
Kp 31da0f769f Fix invalid access reading demos
Commit e36abb25cb fixed one problem with demo access (invalid bits in
the high byte of index values), but created another.  That commit
switched from direct loading of `front_wall_num` to instead load into
`type`, then move the value to `front_wall_num`.  However, `type` is
`sbyte` (an archaic spelling of `int8_t`), so assignments from `type` to
`front_wall_num` were implemented as a sign-extending move, rather than
a zero-extending move.  When the wall number was 0x80 or greater, the
sign-extending move produced an incorrect result, which led to a crash
when valptridx trapped the invalid index.

Fix this by changing the types of all three byte-sized variables to
`uint8_t`.  None of them need to be signed.

Reported-by: Dosgamer <http://www.dxx-rebirth.com/frm/index.php/topic,2151.0.html>
Fixes: e36abb25cb ("Fix invalid access reading demos")
2017-01-28 18:12:21 +00:00
Kp 4881b7c57a Fix harmless type mismatch
`get_weapon_id` must be called only on objects of type `OBJ_WEAPON`.
One path in `multi_compute_kill` could call `get_weapon_id` on an object
that is either a robot or a weapon.  The code tested for a robot, but
only after performing an access that assumed it had a weapon.  Reorder
the tests to prevent the type mismatch diagnostic.

Reported-by: ryusei117 <https://github.com/dxx-rebirth/dxx-rebirth/issues/302#issuecomment-275546550>
2017-01-28 18:12:20 +00:00
Kp 8c706a88bd Initialize grs_main_bitmap at construction 2017-01-28 18:12:20 +00:00
Kp c46a0ce27c Remove some remotely-triggerable fatal exceptions
By design, valptridx will throw an exception on invalid input.  This is
better than silently permitting invalid input to corrupt program state.
Past releases blindly trusted that multiplayer peers would not send
invalid input.  Conversion to the valptridx design eliminated the
undefined behavior when peers send invalid input, but still allowed
multiplayer peers to remotely crash the game by sending invalid inputs.
Add a mechanism to trap invalid inputs and gracefully ignore those
messages.  This may cause game consistency issues, but will not allow
data corruption.
2017-01-28 18:12:20 +00:00
Kp bdc4752e82 Pass vobjptridx to multi_send_drop_flag 2017-01-28 18:12:20 +00:00
Chris Taylor 30b5ef7c73 Create robot_create function and use it 4x
Contains 2 calls - to obj_create and init_ai_object. For safety reasons and tidiness compared to using obj_create directly. The call to init_ai_object in recreate_thief was already redundant.
2017-01-22 17:56:50 +08:00
Kp 38b33819a5 Workaround Debian Jessie gcc bug
Reported-by: ryusei117 <https://github.com/dxx-rebirth/dxx-rebirth/issues/289>
2017-01-21 19:05:44 +00:00
Kp 949d56fdd9 Avoid uninitialized use of object::ctype.ai_info.danger_laser_signature 2017-01-21 19:05:43 +00:00
Kp baa187801b Add special case to make past releases not die on various segnums
All releases to date have a bug where they treat certain segment number
fields as an int, not a segment number.  Storing segment_none (0xffff)
into the save file causes affected releases to crash in various places
because it fails to recognize that this is segment_none.

Current code correctly treats segment_none as a non-segment and works
correctly without this hack.  The hack is only required to get past
releases to work correctly after loading a saved game written by current
code.
2017-01-21 19:05:43 +00:00
Kp e127072f21 Add special case to make past releases not die on MarkerObject
All releases to date have a bug where they treat MarkerObject as an int,
not an object number.  Storing object_none (0xffff) into the save file
causes affected releases to exhibit several problems.  Most obviously,
they crash if the automap is opened, because they try to show
Objects[0xffff] as a marker, but no such object exists.  Additionally,
they refuse to let the player drop a marker because none of the elements
of MarkerObject are -1, so they incorrectly tell the player that all
marker slots are busy.  Finally, they will crash if the guidebot is
killed, because the guidebot death code deletes marker 0xffff because it
fails to recognize that this is object_none.

Current code correctly treats object_none as a non-object and works
correctly without this hack.  The hack is only required to get past
releases to work correctly after loading a saved game written by current
code.

Fixes: 9125ae32cd ("Make objnum unsigned")
2017-01-21 19:05:43 +00:00
Kp 2e6b5e8467 Add special case to make past releases not die on Dead_controlcen_object_num
All releases to date have a bug where they treat
Dead_controlcen_object_num as an int, not an object number.  Storing
object_none (0xffff) into the save file causes affected releases to
crash when treating object_none as a valid object number.

Current code correctly treats object_none as a non-object and works
correctly without this hack.  The hack is only required to get past
releases to survive destroying the reactor after loading a saved game
written by current code.

Fixes: 9125ae32cd ("Make objnum unsigned")
2017-01-21 19:05:43 +00:00
Kp 6da2b446f5 Use range_for in editor/group.cpp 2017-01-21 19:05:42 +00:00
Chris Taylor f2f6af5bf1 Always set hide_segment in init_ai_object
Fixes bug where in the editor, you insert a robot with normal behaviour then play the level - it fails the check on the hide_segment index in init_ai_objects(). This is because hide_segment was written as the poisoned value of 0xfdfd if the behaviour of the robot is AIB_NORMAL - because hide_segment wasn't initialised. Therefore, always setting hide_segment to suppress this exception (it's an inexpensive operation seldom called).
2017-01-21 13:47:27 +08:00
Kp 0ac4eb52b2 Merge pull #308 into master
Merge kreatordxx's fixes for flags on guest players.
2017-01-17 02:49:54 +00:00
Kp cc885f17a3 Use init_ai_object for dropped robots
zicodxx reported a problem where poison=overwrite builds caused robots
dropped by other robots not to spawn.  I diagnosed it as a problem
caused by not setting `dying_start_time` and proposed using
`init_ai_object` to set this (and other) fields.  Kreatordxx posted pull
request #311 to implement this for dropped robots.  However, his pull
had the unfortunate side effect of zeroing the dropped robot's velocity.
This change is based on his pull, but with the `init_ai_object` call
moved higher so that the velocity is (unnecessarily) zeroed by
`init_ai_object`, then initialized to `new_velocity` by `drop_powerup`
(as it always was).

Reported-by: zicodxx <https://github.com/dxx-rebirth/dxx-rebirth/issues/293>
Patch-inspired-by: kreatordxx <https://github.com/dxx-rebirth/dxx-rebirth/pull/311>
2017-01-17 02:38:21 +00:00
Chris Taylor b1b5de4297 Additional safeguard for bug #306
This is where a client in a multiplayer game hitting a wall fails an assert. Initialise obj->mtype.phys_info.flags in multi_reset_player_object() instead of adding flags. (Tested and still works OK without specifying PF_THRUST.)
2017-01-16 15:39:10 +08:00
Chris Taylor e76c8cf264 Fix bug #306 where a client in a multiplayer game hitting a wall fails an assert
Initialise ConsoleObject->mtype.phys_info.flags in reset_player_object() instead of adding flags. The only place this was initialised properly was when reading the player object from disk.
2017-01-15 18:11:54 +08:00
kreatordxx 5dec6d3975 Merge pull request #307 from dxx-rebirth/multi_gauge_pic
Fix debugger break at draw_weapon_info_sub when multi player dumped
2017-01-15 16:58:58 +08:00
Kp 092d947830 Optimize change_light search
Use std::equal_range to find the upper and lower bounds in a single
binary search, rather than relying on a linear search to find the first
sought element.
2017-01-15 00:03:14 +00:00
Kp 3594e7093f Switch last_hitobj to use array<objnum_t> instead of bitset
This reduces the number of objects that can be tracked concurrently, but
allows MAX_OBJECTS to rise without causing `laser_info` to grow.
2017-01-15 00:03:13 +00:00
Kp 6d3fb34268 Abstract out last_hitobj management 2017-01-15 00:03:13 +00:00
Kp 1b81013a9b Pass active palette to ogl_loadtexture 2017-01-15 00:03:13 +00:00
Kp 764d20d4e1 Make grs_bitmap::bm_flags private 2017-01-15 00:03:13 +00:00
Kp f4fffeea49 Make more render state const when possible
Make Render_zoom const in builds where there are no statements that can
change it.

Use vcseg, not vseg, for some segment accesses.
2017-01-15 00:03:12 +00:00
Chris Taylor 8c51aa0b1e Fix debugger break at draw_weapon_info_sub when multi player dumped (bug #303)
Also happened when a client to a multiplayer game dropped out due to some network error. Delay call of multi_leave_game() until responding to EVENT_WINDOW_CLOSE, so the game isn't in an unstable state between handling the network event and the game closing.
2017-01-14 17:49:43 +08:00
Chris Taylor 479f5ed584 Fix 'format specifies type 'unsigned short' but the argument has type 'unsigned char'' warning
Replace %hu with %hhu for capped in call to con_printf in powerup_cap_state::cap_secondary_ammo.
2017-01-13 12:32:46 +08:00
Chris Taylor 6ecccd3491 Fix 'equality comparison with extraneous parentheses' warning
Remove offending parentheses around call to multi_i_am_master() in net_udp_leave_game().
2017-01-13 12:30:57 +08:00
Kp 5201218e20 Fix D1 build
Commit 4cc801f changed `object_move_one` to return `window_event_result`
instead of `void` and added a default return value at the bottom.
However, it added the value inside a `#if D2` block, so the D1 build now
fails with:

    similar/main/object.cpp: In function 'dcx::window_event_result d1x::object_move_one(d1x::vobjptridx_t)':
    similar/main/object.cpp:1627:7: error: variable 'result' set but not used [-Werror=unused-but-set-variable]
    similar/main/object.cpp:1866:1: error: control reaches end of non-void function [-Werror=return-type]

Move the return statement out of the conditional block to fix both these
errors.

Fixes: 4cc801f42f ("Remove calls to window_close(Game_wind) when game finished or over")
2017-01-13 03:19:19 +00:00
Chris Taylor 0c5a000328 Remove call to window_close(Game_wind) when a network event tells us to end the game
In multi_do_frame(), replace call to window_close(Game_wind) with returning window_event_result::close whenever multi_quit_game is true. Only using this return value where multi_do_frame() is directly called by GameProcessFrame(). multi_quit_game will only be set back to 0 when a new multi game is started.

Closing a window within its handler is problematic - it can result in an unstable state.
2017-01-10 14:10:39 +08:00
Chris Taylor a418f8caec Remove call to window_close(Game_wind) when multiplayer level syncing fails
Replace call to window_close(Game_wind) with returning window_event_result::close to game_handler. Applies to when there is a failure in net_udp_level_sync(). Closing a window within its handler is problematic - it can result in an unstable state.
2017-01-10 13:02:59 +08:00
Chris Taylor 2ecc4c4a07 Remove call to window_close(Game_wind) when stopping demo playback
Replace call to window_close(Game_wind) with returning window_event_result::close to game_handler. Applies to whenever newdemo_stop_playback() is called. Closing a window within its handler is problematic - it can result in an unstable state.
2017-01-09 19:09:34 +08:00
kreatordxx d10896f116 Merge pull request #297 from dxx-rebirth/newdemo_no_space
Fix crash when ran out of disk space when writing demo
2017-01-09 10:05:25 +08:00
kreatordxx f590ec45c6 Merge pull request #298 from dxx-rebirth/no_game_wind_close
Remove calls to window_close(Game_wind)
2017-01-09 09:32:24 +08:00
Chris Taylor 6e2c3c61b1 Format LevelError text better for the case of an exit that is both regular and secret 2017-01-09 09:30:53 +08:00
Chris Taylor 0daf28e787 Small efficiency improvement for a return value in do_endlevel_frame() 2017-01-09 09:26:32 +08:00
Chris Taylor 06968db4bc Fix crash when ran out of disk space when writing demo
Check for nd_record_v_no_space in _newdemo_write.
2017-01-09 09:15:51 +08:00
Kp 0d5d7a01ad Fold PHYSFS_write calls for Automap_visited 2017-01-08 22:32:01 +00:00
Kp 7b08144aee Poison unused exploding walls 2017-01-08 22:32:00 +00:00
Kp d289fec43b Update hitobj_list in multi_object_rw_to_object 2017-01-08 22:32:00 +00:00
Kp 94716dfab5 Scrub OBJ_NONE objects from multiplayer peers 2017-01-08 22:32:00 +00:00
Kp 7fafc22cca Poison multiplayer object_rw without making it unreadable
`struct object_rw` is poisoned prior to initializing and sending it.
However, some fields are legitimately unininitialized (other than their
memset or poison value) at send time.  Add and use a poison variant that
can clear those fields, without marking them unreadable.
2017-01-08 22:32:00 +00:00
Kp 5da784dbed Pass canvas to gr_{,u}string 2017-01-08 22:32:00 +00:00
Kp 1ef6b9d5bc Pass font to gr_get_string_size 2017-01-08 22:31:59 +00:00
Kp 0480ba8030 Pass canvas to gr_string(int,int,const char*,int,int) 2017-01-08 22:31:59 +00:00
Kp 6e8c3b3357 Pass canvas to gr_internal_string_clipped{,_m} 2017-01-08 22:31:59 +00:00
Kp c291873041 Pass canvas to gr_internal_string_clipped_template 2017-01-08 22:31:59 +00:00
Kp 9dbcbc51ce Pass canvas to gr_ustring_mono 2017-01-08 22:31:59 +00:00
Kp 83e86707aa Pass canvas to gr_internal_string0{,m} 2017-01-08 22:31:59 +00:00
Kp f0ee7af1aa Pass canvas to gr_internal_string0_template 2017-01-08 22:31:58 +00:00
Kp f58b66173f Pass canvas to gr_internal_color_string 2017-01-08 22:31:58 +00:00
Kp 8d1bd87b33 Pass canvas to ogl_internal_string 2017-01-08 22:31:58 +00:00
Kp 4b2102f41a Factor out show_framerate x/y for gr_printf 2017-01-08 22:31:58 +00:00
Chris Taylor aac4dd6c0e Remove call to newdemo_stop_playback() in newdemo_record_start_frame
This is in a redundant check, as we shouldn't (and don't) call newdemo_record_start_frame if nd_record_v_no_space is true, i.e. we ran out of disk space recording a demo. We want to return window_event_result::close with every call to newdemo_stop_playback() to close the game, as this is safer than calling window_close on the game window within its handler. In this case, it's much simpler (and safe) to just remove it.

Even if newdemo_record_start_frame is called when nd_record_v_no_space is true, we don't want to close the game, just exit the function.
2017-01-08 21:08:50 +08:00
Chris Taylor 4cc801f42f Remove calls to window_close(Game_wind) when game finished or over
Replace calls to window_close(Game_wind) with returning window_event_result::close to game handler. Applies to when DoEndGame() is called, DoGameOver() is called, aborting in the kmatrix screen (multiplayer game) during AdvanceLevel() and playing one demo frame causes playback to stop in GameProcessFrame(). Closing a window within its handler is problematic - it can result in an unstable state.
2017-01-08 21:08:50 +08:00
Chris Taylor b7c41a0d98 Remove calls to window_close(Game_wind) within close_editor
These are redundant. Will remove all cases of window_close(Game_wind) - it's safer for the handler to return window_event_result::close.
2017-01-08 21:03:41 +08:00
Kp f339e60606 Scrub object subtypes on load
Old versions of Rebirth sometimes saved games with bogus object data,
such that `obj->type == OBJ_NONE`, but `obj->movement_type`,
`obj->control_type`, or `obj->render_type` were not their respective
*_NONE constants.  This confused the game loader code such that it would
load invalid data from the `mtype`, `ctype`, or `rtype` unions and use
it without checking.

Try to counter some of this by exiting early if the object has type
OBJ_NONE.
2017-01-07 23:34:18 +00:00
Kp fe04c3fef6 Initialize obsolete fields
Valgrind warns when writing uninitialized data to a file.  The Descent
savegame format requires writing certain fields that are no longer used.
Set those fields to 0 to prevent leaking stack data into the file.
2017-01-01 23:19:21 +00:00
Kp 3fab4bfeb5 Fix uninitialized write of segment light_subtracted
Levels which fit in MAX_SEGMENTS_ORIGINAL read exactly
MAX_SEGMENTS_ORIGINAL segments worth of light_subtracted, even though
fewer segments were defined.  Prepare light_subtracted into a temporary
stack buffer instead of doing byte-at-a-time writes.  Initialize this
stack buffer to 0 when necessary.  Write the buffer once it is fully
prepared.
2017-01-01 00:45:46 +00:00
Kp a7ec4ccd63 Avoid uninitialized reads when saving game
player_info::cloak_time is only defined if the player is cloaked.
player_info::invulnerable_time is only defined if the player is
invulnerable.

In both cases, the game save code tried to read the ::*_time variable
even when it was undefined.  Modify the saving code to check player
flags before reading the associated timer.
2017-01-01 00:45:46 +00:00
Kp fe50c0a20a Factor out point_list setup 2017-01-01 00:45:45 +00:00
Kp 2c7e36ef1e Cache KEY_M vsegptridx 2017-01-01 00:45:45 +00:00
Kp 22e364e030 Pass canvas to gr_clear_canvas 2017-01-01 00:45:45 +00:00
Kp 0905aefa0a Pass canvas to gr_rect 2017-01-01 00:45:45 +00:00
Kp 794dcce327 Pass canvas to gr_urect 2017-01-01 00:45:44 +00:00
Kp 774dedd21d Pass canvas to gr_bm_pixel 2017-01-01 00:45:44 +00:00
Kp 77c22d3a7f Pass canvas to gr_settransblend 2017-01-01 00:45:44 +00:00
Kp c3c4ab8e3e Pass canvas to gr_box 2017-01-01 00:45:44 +00:00
Kp dac1a69f7c Pass canvas to gr_ubox 2017-01-01 00:45:44 +00:00
Kp 1b57e9a5ff Pass canvas to show_fullscr 2017-01-01 00:45:43 +00:00
Kp 250bf58e51 Pass canvas to gr_bitmapm 2017-01-01 00:45:43 +00:00
zico daad12106d Fixed texture malformations of op_tmappoly in g3_draw_morphing_model_state(). 2016-12-30 14:49:40 +01:00
zico 24bd4170f4 Added debug key combo DEL+M to generate a morphing robot in the player segment, rotating through all available bots. Handy for testing purposes. 2016-12-30 14:45:47 +01:00
Kp 3a4eafac03 Add workaround for passive thief bot
zicodxx reports that f7d0c85 made the thief bot passive and timid.
His analysis suggests that the problem is because f7d0c85 changed
find_connected_distance to return vm_distance::maximum_value() in places
where it previously returned magic values that were not maximum (caching
a distance of F1_0*1000 and returning a distance of -1).  Rather than
try to fix the underlying code that relied on these magic values, revert
those return paths to return these unusual values.  Move the unusual
values to named constants in file scope so that they are easier to find
and correlate.

Reported-by: zicodxx <https://github.com/dxx-rebirth/dxx-rebirth/issues/286>
Analyzed-by: zicodxx

Fixes: f7d0c853ba ("Use special types for distance/magnitude")
2016-12-29 03:27:14 +00:00
Kp 362d526546 Pass canvas to gr_disk 2016-12-29 03:27:13 +00:00
Kp acd309099b Pass canvas to gr_ucircle 2016-12-29 03:27:13 +00:00
Kp 08d0aa9b59 Pass canvas to gr_bitmap 2016-12-29 03:27:13 +00:00
Kp d7cd6d17c3 Pass canvas to gr_ubitmapm 2016-12-29 03:27:13 +00:00
Kp 6ab3b18657 Pass canvas to gr_ubitmap 2016-12-29 03:27:12 +00:00
Kp 99f5cfbb10 Pass canvas to ogl_ubitmapm_cs 2016-12-29 03:27:12 +00:00
Kp 1e1272fcf2 Cache temporaries in show_briefing_bitmap
Avoid recomputing the same width/height expressions.  This saves ~20
instructions and ~100 bytes on x86_64-pc-linux-gnu.
2016-12-29 03:27:11 +00:00
Kp 1fa5aef9ac Pass canvas to gr_line 2016-12-29 03:27:10 +00:00
Kp 7439949595 Pass canvas to gr_uline 2016-12-29 03:27:10 +00:00
Kp ef06aa089a Pass canvas to gr_pixel 2016-12-29 03:27:09 +00:00
Kp 1ed06c91b7 Pass canvas to ogl_ulinec 2016-12-29 03:27:09 +00:00
Kp fee4346dc1 Pass canvas to ogl_urect 2016-12-29 03:27:08 +00:00
Kp 290cb6e7c0 Use array<> for ogl_urect float arrays 2016-12-29 03:27:08 +00:00
Kp 29c912d2da Fid -Wold-style-cast warning in SDL-only code 2016-12-29 03:27:08 +00:00
zico a10d9e0bba Prevent access of potentially uninitialized r.value in nm_trigger_radio_button() 2016-12-28 20:36:00 +01:00
zico 3672bbd1f2 Made show_briefing_bitmap() properly consider HIRESMODE (i.e. Mac data), using scaling logic from show_animated_bitmap(). 2016-12-28 16:28:08 +01:00
zico 03f5cbf3a4 Fixed issue in frame_animation_angle(): Due to deltaang.*a being usually small values and frametime getting smaller with higher FPS, the usual use of fixmul will have scaled_delta_angle result in 0 way too often and long, making the robot animation run circles around itself. So multiply deltaang by DELTA_ANG_SCALE when passed to fixmul. 2016-12-28 15:26:33 +01:00
Kp 879070f814 Fix uninitialized value usage during init_player_stats_new_ship
init_player_stats_new_ship used select_primary_weapon and
select_secondary_weapon to assign the player's weapons.  However, those
functions read the current weapon and jumped according to its value.  A
new ship has no defined value for current weapons, so the jump triggered
an uninitialized value warning from Valgrind.

Add new functions set_primary_weapon, set_secondary_weapon that work
like the previous select_* functions, but always take the path used
for weapons not equal, without checking.  This prevents the warnings
from Valgrind, as well as a theoretical risk of initializing the ship
improperly.
2016-12-25 00:33:25 +00:00
Kp fed011df94 Exclude OBJ_NONE objects from can_collide flags test 2016-12-25 00:33:24 +00:00
Kp 5d752e741d Factor out object_create_explosion_sub collision test
An 11-line if() test is unreadable.  Split it out into a helper.
2016-12-25 00:33:24 +00:00
Kp b05325d0ab Initialize lavafall_hiss_playing for each ship 2016-12-25 00:33:24 +00:00
Kp fa1f8488f0 Use uint8_t for sidenum 2016-12-24 22:44:08 +00:00
Kp e07f5072cb Fix inverted change_light test
An optimization meant to allow change_light to stop early caused it to
stop much too early, so it rarely did any work.  Flip the sense of the
test so it does not stop early.

Fixes: 2bd538f353 ("Sort delta light indices")
2016-12-24 18:12:18 +00:00
Kp 539629c14b Avoid leaking uninitialized bytes to the network 2016-12-24 18:12:17 +00:00
Kp 2ba300be8c Remove bogus demo messages
Demos do not record difficulty level or track hostages correctly.  Do
not show these fields in the demo pause dialog, since they reflect
the state of the player's last played game, not the state of the player
recording the demo.
2016-12-22 05:21:16 +00:00
Kp d085175cbd Scrub invalid primary textures at level load
Past releases, when rendering an invalid primary texture, would
Int3() and then reset the texture to zero.  Commit d767f7c changed the
logic to return without resetting the texture, since the reset seemed to
be unnecessary.  Unfortunately, it is necessary.  Some levels, including
those shipped with the retail game data, specify bogus primary textures
on some surfaces.  After d767f7c, rendering a surface with an invalid
primary texture causes the surface to be invisible, even if it has a
valid secondary texture.

Remove the return statement added in d767f7c.  Extend
validate_segment_side to validate the primary texture on the tested
side.  When an invalid texture is found, reset it and log a diagnostic.
For built-in levels, log at level CON_VERBOSE since players cannot
readily fix the level.  For external levels, log at level CON_URGENT so
that level authors know to fix their level before releasing it.

Fixes: d767f7cd5e ("Pass vcsegptridx to render_face")
2016-12-22 05:21:16 +00:00
Kp 29b9c255fa Remove unnecessary FuelCenter operator- 2016-12-22 05:21:16 +00:00
Kp 10aa2e5106 Move some kconfig symbols into namespace dsx 2016-12-22 05:21:16 +00:00