 Sonic Robo Blast 2: The Great Galactic Journey Alpha 0.1.0 README file

 How to install:
 Extract srb2ggj-win.exe and srb2ggj.pk3 from the ZIP file that this README.txt was included in into where you got SRB2 2.2.15 installed.
 SRB2GGJ uses its own configs now, but it is still a good idea to make sure to backup your configs just in case.

 !*! Please make sure you read the rest of this file if you want to know how each new feature works. !*!
 Manue City:
 MAPA1 is the default hub map for Multiplanar Mode in SRB2GGJ and will be improved in later updates.
 In singleplayer, Manue City is now the starting map and if the TOL_MULTIPLANAR flag is detected
 in singleplayer, then Multiplanar Mode will basically be enabled to allow for certain Multiplanar Mode-
 exclusive features to work.

 Seperate saves:
 SRB2GGJ has seperate gamedata and save files from vanilla SRB2.

 Increased flat limits:
 You can now have as many unique flats as you want in a single map until everything stops rendering
 due to engine-related limitations, or the game crashes depending on the device you use to play
 SRB2GGJ.

 SRB2GGJ Lua Menu
 The SRB2GGJ Lua Menu appears as a menu option in the special ESC menu that opens up when you are in-
 game, and it can be enabled by going in a map with a level header that has its luamenunum set to
 a value greater than 0. Please note that the luamenunum for all levels are set to 0 by default to
 disable the SRB2GGJ Lua Menu option with the exception of the Manue City WIP map after loading srb2ggj.pk3,
 which has its luamenunum set to 1 to enable the SRB2GGJ Lua Menu option which has been implemented in alpha 0.1 (Ex. luamenunum = 1)
 The SRB2GGJ Lua Menu menu option calls the SRB2GGJLuaMenu hook after closing the special ESC menu
 to allow for creating custom menus that can be entered through the special ESC menu. The hook
 function takes 1 integer argument, which is the currently active luamenunum, for the SRB2GGJLuaMenu hook.
 WARNING: The SRB2GGJLuaMenu hook is not net-safe! Be careful!
 (Ex. addHook("SRB2GGJLuaMenu", function(luamenunum) print(tostring(luamenunum)) end))
 The SRB2GGJ Lua Menu when luamenunum is set to 1 is only accessible in Multiplanar Mode by default,
 and is only used for timeline and moderation purposes at the moment.

 Timelines:
 Timelines are a new struct that are separate from the map data structures themselves, while
 only objects in the same timeline can interact with each other.
 Timelines are only available in Multiplanar Mode as of SRB2GGJ Alpha 0.1.
 However, for each player, objects that are not in their same timeline are invisible to that player.
 In fact, each player's timeline number must be consistant on all clients and servers to avoid desynchs,
 hence why they are used to consistancy checking as well as the player's state instead of the
 player's position for improved consistancy. Also, players can only viewpoint other players that
 are in the same timeline as them. Timelines are freed up entirely when switching out of Multiplanar Mode or exiting the game session
 and timelines are initialized whenever switching back into Multiplanar Mode as timelines now have their own tag for zone memory.
 when a title map is in action. There are some new functions, test commands, a new hook related
 to timelines, a new timeline_t userdata structure that have been added in SRB2PA Alpha 0.0.1.
 Whatever timeline you are located in, the sky, weather and music of that timeline will be used
 locally. Many issues with timelines were fixed in alpha 0.1.
 Timeline -1 does not use a timeline userdata as it is a global timeline that is used for non-player objects to allow for certain
 objects to appear on all timelines if necessary.
 Timeline 0 is the default timeline which gets updated upon map load in Multiplanar Mode, which uses the mapheader's sky, weather, and music.
 Timeline IO has been implemented in alpha 0.1. Timelines -1 and 0 are excluded in timeline IO as they are special timelines.
 
 Timeline Lua functions:
 P_ResetTimelines() ## overwrites the timelines dynamic array
 # to where it only has one default timeline with starting variables, by default ##
 P_AddTimeline(str realtitle, str subtitle, int weather, int skynum, str musicname, str creatorname) ## adds a new timeline
 # to the timelines dynamic array by making it grow and setting the new timeline's required variables
 P_SwitchTimeline(mobj_t thing, int timelinenum) ## switches to a different timeline by id
 # if it exists in the timeline dynamic array ##
 timelines.iterate ## used for iterating through timelines (Ex. for timeline in timelines.iterate print(timeline.realtitle) end)
 # You can even use #timeline using the timelines iterator to get the timeline id (Ex. for timeline in timelines.iterate print(#timeline) end) ##
 #timelines ## Yes it is really #timelines and it is used for getting the number of existing timelines.
 # (Ex. if timelines > 1 print("There are multiple timelines that exist right now.") end) ##
 ## The timeline dynamic array has also been exposed to Lua (Note: timelines[0] through timelines[numtimelines-1] are valid timelines) ##

 Timeline test commands:
 printtimelines - prints a list of timelines in the timelines dynamic array in a json format
 resettimelines - calls the P_ResetTimelines function (resets the timelines)
 addtimeline <realtitle> <subtitle> <weather> <skynum> <musicname> - calls the P_AddTimeline function (adds a new timeline)
 switchtimeline <timelinenum> - calls the P_SwitchTimeline on the player object of the player that executed this
 command (switches to a different timeline if that timeline id is valid)
 * The following 2 commands require you to be the server or an admin *
 loadtimelines <numtimelines> - loads timelines from luafiles/client/SRB2GGJ subfolder (numtimelines must be greater than or equal to 1 and is the number of timelines that you want to load)
 savetimelines - saves timelines into luafiles/client/SRB2GGJ subfolder (there must be more timelines loaded other than the default timeline)

 Timeline Lua hooks:
 The ResetTimelines hook is a new hook that gets called after the timelines have been resetted in
 the P_ResetTimelines function. The hook function takes no arguments for the ResetTimelines hook.
 It is useful to allow for different default timelines per map depending on what addons you got loaded.
 (Ex. addHook("ResetTimelines", function() P_AddTimeline("Example", "SRB2PA", 0, 1) end))

 The SwitchTimeline hook is a hook that has been implemented in alpha 0.1 which gets called upon successfully
 switching timelines. The hook function takes a mobj_t userdata argument.
 (Ex. addHook("SwitchTimeline", function(mobj) if not mobj.player or not mobj.player.valid return end print("Switching to timeline #"..tostring(mobj.player.storedtimelinenum).."\n" end, MT_PLAYER))

 Timeline userdata structure:
 timeline_t
 R/W - Yes/Yes
 Allows for custom variables - Yes
 realtitle - str[29]
 subtitle - str[29]
 weather - UINT8
 skynum - INT16
 musicname - str[7]
 creatorname - str[22]

 New moderation commands:
 * These new moderation commands are case-insensitive and easier to use than the original moderation commands
  as the original moderation commands are case-sensitive, and promoting/demoting and muting/unmuting all each used their own command. * 
 promoteordemote <playername> - promotes or demotes a player from admin (server only unlike the other new moderation commands, which require you to be the server or an admin)
 newkick <playername> - kicks a player
 newban <playername> - bans a player
 muteorunmute <playername> - mutes or unmutes a player

 New extra Lua stuff:
 * Since I had to make an efficient function that gets the number of real players
 and had to expose it to Lua as well for the timeline IO to be efficient, I also decided to make a couple of functions for getting
 the number of total players and the number of bots and expose those functions to Lua as well. *
 G_GetNumOfPlayers() - returns the number of total players
 G_GetNumOfRealPlayers() - returns the number of real players
 G_GetNumOfBots() - returns the number of bots

 overridemapmusname - str[7] ## used exclusively in Multiplanar Mode to allow for timeline music to be used instead of just the default map music,
 # without breaking support for the tunes command ##

 This version of SRB2GGJ is based on STJr/SRB2 public repo commit 010c0c7d.
