- If emerald not yet collected on that cup, pick the first uncollected emerald, then get the cup's CUPCACHE_SPECIAL with that ID to pick the stage
- Already collected emeralds retain their swappage across gamedata saves
- Returns to normal order if you get all 7 OR Special Mode is unlocked (chao key? debug? password in modded games? sky's the limit)
- Pops up a Message from the Stars telling you the gems have been returned to their natural place
- Add-ons will always use their dedicated sealed star, since it's unordered material
If it weren't so last minute I could have a better solution for GP Backups, but right now what I've gone for is it always trusts whatever G_GPCupIntoRoundQueue does AS LONG AS THE COURSE ISN'T THE ONE YOU'RE RELOADING INTO. If it IS, then it checks to see if it's exactly what's been saved, and complains (with the generic error message, unfortunately) if it isn't.
For a cvar cheat to save in replays do this:
- Make sure it's a netvar
- Only netvars are saved in replays
- Use OnlineCheat
- Make sure it's not CV_HIDDEN
- CV_HIDDEN cvars are not added to the linked list, so
replays cannot find them
- Use CV_NOSHOWHELP instead, to prevent people from
modifying it in console
- Use CV_Set or CV_SetValue to change a cvar's value
- Setting cvar_t.value directly will not change its
string value
- The string value is used to determine how it should be
saved in replays
- Previous order:
- K_HandleLapIncrement
- K_UpdateAllPlayerPositions
- Sets player->position
- !! Relies on player->exiting
- Set lap points
- !! Based on player->position
- Set latestlap
- P_DoPlayerExit
- Set player->exiting
- K_UpdateAllPlayerPositions
- Sets player->position
- Relies on player->exiting
- Overwrites latestlap if not set
- K_InitPlayerTally
- Based on lap points
- New order:
- K_HandleLapIncrement
- Set latestlap
- If ending last lap, P_DoPlayerExit
- Set player->exiting
- K_UpdateAllPlayerPositions
- Sets player->position
- Relies on player->exiting
- Overwrites latestlap if not set
- [NO LONGER INITS TALLY]
- OTHERWISE, K_UpdateAllPlayerPositions
- Sets player->position
- Relies on player->exiting
- Set lap points
- Based on player->position
- P_PlayerAfterThink
- If player is exiting and no tally, K_InitPlayerTally
Hopefully you can see the magnitude of the gordian knot I had to untangle to fix this
- Polyobject carrying set lastlook on mobjs for internal
tracking
- lastlook is used by some objects to track their own
state
- Ring Shooter uses lastlook to remember which player
summoned it
- A Ring Shooter spawned right next to a polyobject would
become buggy; If its owner player pressed the respawn
button again before the Ring Shooter despawned, that
player would be teleported back to the Ring Shooter
instead of spawning a new Ring Shooter (which would be
the correct behavior)
This does not prevent you from using the respawn button to
summon a Ring Shooter.
- Ring Shooter only tracks the last player who touched it,
to prevent that player from reusing it
- If another player touches the Ring Shooter, it loses
track of the original user
- Near a Block Lightsnake waypoint, this would enter an
endless loop where both players are able to touch the
Ring Shooter and use it to respawn, placing them right
above the Ring Shooter (and the cycle repeats)
- When updating nextwaypoint, check if distancetofinish
jumps more than 32768 units (8192 in 1/4 scale maps)
- If it jumps this much, do not update the waypoints
- This prevents nextwaypoint from skipping ahead in a map
where waypoints from later in the course overlap
waypoints from earlier