1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-25 22:18:30 +02:00
VVVVVV/desktop_version/src
Misa 4f50883d58 Prevent removing the player entity
Removing the player entity has all sorts of nasty effects, such as
softlocking the game because many inputs require there to be a player
present, such as opening the quit menu.

The most infamous glitch to remove the player entity is the Gravitron
Fling, where the game doesn't see a gravity line at a specific
y-position in the current room, and when it moves the bottom gravity
line it moves the player instead. When the gravity line gets outside the
room, it gets destroyed, so if the player gets dragged outside the room,
they get destroyed, too. (Don't misinterpret this as saying anytime the
player gets dragged outside the room, they get destroyed - it's only the
Gravitron logic that destroys them.)

Also, there are many places in the code that use entity-getting
functions that have a fallback value of 0. If it was possible to remove
the player, then it's possible for this fallback value of 0 to index
obj.entities out-of-bounds, which is not good.

To fix this, entityclass::removeentity() is now a bool that signifies if
the entity was successfully removed or not. If the entity given is the
player (meaning it first checks if it's rule 0, just so in 99% of cases
it'll short-circuit and won't do the next check, which is if
entityclass::getplayer() says the indice to be removed is the player),
then it'll refuse to remove the entity, and return false.

This is a change in behavior where callers might expect
entityclass::removeentity() to always succeed, so I changed the
removeentity_iter() macro to only decrement if removing the entity
succeeded. I also changed entityclass::updateentities() from
'removeentity(i); return true;' to 'return removeentity(i);'.
2020-06-13 15:41:44 -04:00
..
BinaryBlob.cpp Don't leak binaryBlob 2020-06-07 22:40:03 -04:00
BinaryBlob.h Don't leak binaryBlob 2020-06-07 22:40:03 -04:00
BlockV.cpp Remove blockclass::clear(), simplify blockclass initializations 2020-04-03 23:28:47 -04:00
BlockV.h Remove blockclass::clear(), simplify blockclass initializations 2020-04-03 23:28:47 -04:00
editor.cpp Remove another header initialization 2020-06-12 19:11:48 -04:00
editor.h Remove another header initialization 2020-06-12 19:11:48 -04:00
Ent.cpp Remove entclass::clear(), simplify entclass initializations 2020-04-03 23:28:47 -04:00
Ent.h Remove entclass::clear(), simplify entclass initializations 2020-04-03 23:28:47 -04:00
Entity.cpp Prevent removing the player entity 2020-06-13 15:41:44 -04:00
Entity.h Prevent removing the player entity 2020-06-13 15:41:44 -04:00
Enums.h Hello WWWWWWorld! 2020-01-08 10:37:50 -05:00
FileSystemUtils.cpp Like the thing I did but the opposite 2020-06-12 16:21:45 -04:00
FileSystemUtils.h Remove TinyXML-1 2020-06-12 15:08:29 -04:00
Finalclass.cpp Statically allocate level arrays 2020-05-29 10:21:25 -04:00
Finalclass.h Refactor Finalclass.cpp to not use strings for tilemaps 2020-05-17 22:03:29 -04:00
Game.cpp Guard all cases obj.getcompanion() is used unchecked 2020-06-12 23:55:48 -04:00
Game.h Don't initialize game.gametimer in the header file 2020-06-12 19:11:48 -04:00
GOGNetwork.c Add support for multiple Network backends, stub in GOGNetwork 2020-01-13 11:15:22 -05:00
Graphics.cpp Indent Graphics::reloadresources() with tabs 2020-06-11 22:13:52 -04:00
Graphics.h Fix mixed indentation 2020-06-12 19:11:48 -04:00
GraphicsResources.cpp Fix some leaks 2020-06-07 22:40:03 -04:00
GraphicsResources.h Fix some leaks 2020-06-07 22:40:03 -04:00
GraphicsUtil.cpp Fix mixed indentation in GraphicsUtil.cpp 2020-04-03 10:40:50 -04:00
GraphicsUtil.h Hello WWWWWWorld! 2020-01-08 10:37:50 -05:00
Input.cpp Guard all cases obj.getplayer() is used unchecked 2020-06-12 23:55:48 -04:00
Input.h Remove global args from Input.cpp 2020-04-03 10:40:50 -04:00
KeyPoll.cpp Remove passing around pointer to gameScreen from KeyPoll::Poll() 2020-06-13 14:50:33 -04:00
KeyPoll.h Remove passing around pointer to gameScreen from KeyPoll::Poll() 2020-06-13 14:50:33 -04:00
Labclass.cpp Statically allocate level arrays 2020-05-29 10:21:25 -04:00
Labclass.h Refactor Labclass.cpp to not use strings for tilemaps 2020-05-17 22:03:29 -04:00
Logic.cpp Guard all cases obj.getcompanion() is used unchecked 2020-06-12 23:55:48 -04:00
Logic.h Merge towerlogic() into gamelogic() 2020-04-26 19:07:40 -04:00
main.cpp Remove passing around pointer to gameScreen from KeyPoll::Poll() 2020-06-13 14:50:33 -04:00
MakeAndPlay.h Re-comment out #define MAKEANDPLAY 2020-02-09 10:42:03 -05:00
Map.cpp Guard all cases obj.getplayer() is used unchecked 2020-06-12 23:55:48 -04:00
Map.h Clean up editorclass externs into one location 2020-05-22 09:46:12 -04:00
Maths.h Hello WWWWWWorld! 2020-01-08 10:37:50 -05:00
Music.cpp Add bounds checks to script commands that didn't have them 2020-06-13 01:24:42 -04:00
Music.h Don't leak binaryBlob 2020-06-07 22:40:03 -04:00
Network.c Allow for conditional building of Steam and GOG APIs 2020-06-01 14:21:06 -04:00
Network.h Add support for multiple Network backends, stub in GOGNetwork 2020-01-13 11:15:22 -05:00
Otherlevel.cpp Statically allocate level arrays 2020-05-29 10:21:25 -04:00
Otherlevel.h Refactor Otherlevel.cpp to not use strings for tilemaps 2020-05-17 22:03:29 -04:00
preloader.cpp Only render screen effects on the title screen and in-game 2020-04-27 15:07:58 -04:00
preloader.h Remove global args from preloader.cpp 2020-04-03 10:40:50 -04:00
Render.cpp Guard all cases obj.getplayer() is used unchecked 2020-06-12 23:55:48 -04:00
Render.h Merge towerrender() into gamerender() 2020-04-26 19:07:40 -04:00
Screen.cpp Move gameScreen off of the stack and onto the heap 2020-06-13 14:50:33 -04:00
Screen.h Move gameScreen off of the stack and onto the heap 2020-06-13 14:50:33 -04:00
Script.cpp Add bounds checks to script commands that didn't have them 2020-06-13 01:24:42 -04:00
Script.h Refactor custom scripts to not be stored in one giant vector of lines 2020-06-11 22:13:52 -04:00
Scripts.cpp Remove include guards from Scripts.cpp and TerminalScripts.cpp 2020-06-11 22:13:52 -04:00
SoundSystem.cpp Revert "Add destructor for SoundTrack/MusicTrack (and explicitly define move constructor to prevent double-free)" 2020-06-07 22:40:03 -04:00
SoundSystem.h Revert "Add destructor for SoundTrack/MusicTrack (and explicitly define move constructor to prevent double-free)" 2020-06-07 22:40:03 -04:00
Spacestation2.cpp Statically allocate Prize for the Reckless tilemap 2020-05-29 19:39:05 -04:00
Spacestation2.h Refactor Spacestation2.cpp to not use strings for tilemaps 2020-05-17 22:03:29 -04:00
SteamNetwork.c Fix build on DragonFlyBSD 2020-04-23 23:35:33 -04:00
TerminalScripts.cpp Remove include guards from Scripts.cpp and TerminalScripts.cpp 2020-06-11 22:13:52 -04:00
Textbox.cpp Remove textboxclass's firstcreate and clear, simplify initializations 2020-04-03 23:28:47 -04:00
Textbox.h Remove textboxclass's firstcreate and clear, simplify initializations 2020-04-03 23:28:47 -04:00
Tower.cpp Remove now-unused fillbackground/fillcontents/fillminitower from Tower 2020-05-17 22:03:29 -04:00
Tower.h Remove now-unused fillbackground/fillcontents/fillminitower from Tower 2020-05-17 22:03:29 -04:00
UtilityClass.cpp Add unsigned char static_cast to argument of std::isdigit() 2020-06-13 01:25:17 -04:00
UtilityClass.h Add is_positive_num() to UtilityClass.cpp 2020-04-17 19:14:44 -04:00
WarpClass.cpp Statically allocate level arrays 2020-05-29 10:21:25 -04:00
WarpClass.h Refactor WarpClass.cpp to not use strings for tilemaps 2020-05-17 22:03:29 -04:00