Add physics version

This commit is contained in:
Miloslav Ciz 2025-03-04 16:06:58 +01:00
parent ad8baef113
commit 5c8e4c4c2b
3 changed files with 44 additions and 8 deletions

View file

@ -3,10 +3,6 @@
- car deglitch idea: deglitch only if the middle joint collided this frame? - car deglitch idea: deglitch only if the middle joint collided this frame?
- some kinda easteregg in menu or smt - some kinda easteregg in menu or smt
- make the U-ramp map taller due to new physics - make the U-ramp map taller due to new physics
- replay format should probably record game version
- also there should probably be some version system that says version of
physics vs version of everything else; replay could only record physics
version (maybe just two or three chars?)
- on 1st map the camera is obscured by the wall at the start, fix it somehow - on 1st map the camera is obscured by the wall at the start, fix it somehow
(not the best first impression) (not the best first impression)
- culling is very slow now, it showed that distance bailout can accelerate it - culling is very slow now, it showed that distance bailout can accelerate it
@ -62,12 +58,18 @@
=========== BUGS ================= =========== BUGS =================
- sometimes getting a SLIGHTLY slower time counts as beating it (prolly
conversion fail)
- immediately after starting the map countdown seems to be lower - immediately after starting the map countdown seems to be lower
- the pinch collision test seems to sometimes stop the car e.g. after falling - the pinch collision test seems to sometimes stop the car e.g. after falling
from bigger height or when running into ramp at high speed (or not?) - FIX from bigger height or when running into ramp at high speed (or not?) - FIX
=========== HANDLED ============== =========== HANDLED ==============
- replay format should probably record game version
- also there should probably be some version system that says version of
physics vs version of everything else; replay could only record physics
version (maybe just two or three chars?)
- player name (modifiable via resource file) <-- prolly not - player name (modifiable via resource file) <-- prolly not
- address the bug with driving on curved ramp diagonally, try DECREASING number - address the bug with driving on curved ramp diagonally, try DECREASING number
of reshapes of reshapes

2
data
View file

@ -3,6 +3,8 @@
#Rrep2;testmap;482f70f9 00000843:0173:0081:0029:0111:0039:0071:00a3:0061:0169:0051:00b3:0041:0073:0081:0033:0041:0033:0231:0030:0098:0029:0011:0163:00f1:0053:0081:0033:0051:0023:0031:00f0:0032:0023:0131:00b9:0081:0023:00a1:0119:00e1:00c9:0071:0039:00a1:00d3:0021:01f9:0091:0079:0091:0039:0051:0049:0021:0083:0031:0083:0031:0083:0061:0089:0121:00a0:0058:002c:0048:0061:0013:0150:0052:00c0:00a1:0053:0041:0043:0031:0020:0092:0063:0181:0010:00a2:0013:0071:00e0:0028:00e9:0078:00a9:0043:0032:0123:0042:0080:0038:004c:01a8:0050:0032:0033:0101 #Rrep2;testmap;482f70f9 00000843:0173:0081:0029:0111:0039:0071:00a3:0061:0169:0051:00b3:0041:0073:0081:0033:0041:0033:0231:0030:0098:0029:0011:0163:00f1:0053:0081:0033:0051:0023:0031:00f0:0032:0023:0131:00b9:0081:0023:00a1:0119:00e1:00c9:0071:0039:00a1:00d3:0021:01f9:0091:0079:0091:0039:0051:0049:0021:0083:0031:0083:0031:0083:0061:0089:0121:00a0:0058:002c:0048:0061:0013:0150:0052:00c0:00a1:0053:0041:0043:0031:0020:0092:0063:0181:0010:00a2:0013:0071:00e0:0028:00e9:0078:00a9:0043:0032:0123:0042:0080:0038:004c:01a8:0050:0032:0033:0101
#Btestmap; #Btestmap;
#Rrrr;00LCtiny1;8ecff5c0 0000531:0011:03a9:0041:0179:0021:0059:0031:0039:0091:0049:0031:0253:0041:0013:0051:0053:0041:0023:0051:0043:0031:0064:0016:0022:0026:01a4:002c:0040:0042:0013:0081:0053:0102:0050:0021:0049:00e1:0043:0091:0049:01a8:0119:0130:0072:0026:0082:0048:0039:0111:0050:0022:0036:0132:0018:0049:0151:0033:0121:00c3:0041:0059:0041:00d0:0048:0050
#Maaaaa;4321 0 #Maaaaa;4321 0
:*B2vJ :*B2vJ

View file

@ -17,9 +17,17 @@
because the offset is too big (input didn't change for more than 2^12 because the offset is too big (input didn't change for more than 2^12
frames), there must simply be inserted an extra word that just copies the frames), there must simply be inserted an extra word that just copies the
current input state. current input state.
- Replay text format: first there is the name of the map terminated by ';', - Physics engine version: LCR_RACING_VERSION1 and LCR_RACING_VERSION2 define
then hexadecimal hash of the map follows (exactly 8 characters), then a two-character version string of this module that determines compatibility
blank character follows, then achieved time as a series of decimal digits of replays. Whenever a change is made to this module that changes the
behavior of physics, the version string must be changed because replays
will stop being compatible. It's still possible to make other changes to
this module (such as optimizations or comments) without having to change
physics version.
- Replay text format: first there are two characters saying the physics
engine version, then immediately the name of the map terminated by ';', then
hexadecimal hash of the map follows (exactly 8 characters), then blank
character follows, then achieved time as a series of decimal digits
expressing the physics frame at which the run finished, then the replay expressing the physics frame at which the run finished, then the replay
data, i.e. the series of 16 bit words in hexadecimal, each preceded by ':'. data, i.e. the series of 16 bit words in hexadecimal, each preceded by ':'.
The events (but nothing else) may otherwise be preceeded or followed by The events (but nothing else) may otherwise be preceeded or followed by
@ -30,6 +38,9 @@
typedef int32_t LCR_GameUnit; ///< abstract game unit typedef int32_t LCR_GameUnit; ///< abstract game unit
#define LCR_RACING_VERSION1 '0' ///< first part of physics eng. version
#define LCR_RACING_VERSION2 '0' ///< second part of physics eng. version
#define LCR_GAME_UNIT 2048 ///< length of map square in LCR_GameUnits #define LCR_GAME_UNIT 2048 ///< length of map square in LCR_GameUnits
#define LCR_RACING_INPUT_FORW 0x01 #define LCR_RACING_INPUT_FORW 0x01
@ -174,6 +185,9 @@ void LCR_replayOutputStr(void (*printChar)(char))
const char *s = LCR_currentMap.name; const char *s = LCR_currentMap.name;
printChar(LCR_RACING_VERSION1);
printChar(LCR_RACING_VERSION2);
while (*s) while (*s)
{ {
printChar(*s); printChar(*s);
@ -225,11 +239,23 @@ void LCR_replayOutputStr(void (*printChar)(char))
int LCR_replayLoadFromStr(char (*nextChar)(void), int LCR_replayLoadFromStr(char (*nextChar)(void),
uint32_t *mapHash, uint16_t *nameHash) uint32_t *mapHash, uint16_t *nameHash)
{ {
char c = ' '; char c;
LCR_racing.replay.eventCount = 0; LCR_racing.replay.eventCount = 0;
LCR_racing.replay.achievedTime = 0; LCR_racing.replay.achievedTime = 0;
// has to be like this to force correct evaluation order:
c = nextChar() == LCR_RACING_VERSION1;
c |= (nextChar() == LCR_RACING_VERSION2) << 1;
if (c != 3)
{
LCR_LOG1("wrong physics version");
return 0;
}
c = ' ';
if (nameHash) if (nameHash)
*nameHash = _LCR_simpleStrHash(nextChar,';'); *nameHash = _LCR_simpleStrHash(nextChar,';');
else else
@ -243,7 +269,10 @@ int LCR_replayLoadFromStr(char (*nextChar)(void),
c = nextChar(); c = nextChar();
if (_LCR_hexDigitVal(c) < 0) if (_LCR_hexDigitVal(c) < 0)
{
LCR_LOG1("wrong hash");
return 0; return 0;
}
if (mapHash) if (mapHash)
*mapHash = ((*mapHash) << 4) | _LCR_hexDigitVal(c); *mapHash = ((*mapHash) << 4) | _LCR_hexDigitVal(c);
@ -275,7 +304,10 @@ int LCR_replayLoadFromStr(char (*nextChar)(void),
break; break;
if (LCR_racing.replay.eventCount >= LCR_SETTING_REPLAY_MAX_SIZE) if (LCR_racing.replay.eventCount >= LCR_SETTING_REPLAY_MAX_SIZE)
{
LCR_LOG1("replay too big");
return 0; return 0;
}
LCR_racing.replay.events[LCR_racing.replay.eventCount] = e; LCR_racing.replay.events[LCR_racing.replay.eventCount] = e;
LCR_racing.replay.eventCount++; LCR_racing.replay.eventCount++;