Rework map string

This commit is contained in:
Miloslav Ciz 2024-12-27 09:06:21 +01:00
parent 85b8b1352d
commit 69d87ab26d
3 changed files with 79 additions and 109 deletions

View file

@ -18,46 +18,46 @@
static const char *LCR_maps[] = static const char *LCR_maps[] =
{ {
"LM;;;0;#*H1k0J" "0 :*H1k0J"
"#=s0s0 #fd190" // big concrete ":=s0s0 :fd190" // big concrete
"#+v0n0" ":+v0n0"
"#+w0o0" ":+w0o0"
"#!x0n0" ":!x0n0"
"#=s0B0 #fd910" // concrete wall ":=s0B0 :fd910" // concrete wall
"#^s1A0 #fk110" // ramps before wall ":^s1A0 :fk110" // ramps before wall
"#nu0j1 #ly0j1 #AA0j1 " ":nu0j1 :ly0j1 :AA0j1 "
"#vw0m0" ":vw0m0"
"#vx0m0J" ":vx0m0J"
"#vw0l0L" ":vw0l0L"
"#vx0l0I" ":vx0l0I"
"#-s0q0" ":-s0q0"
"#;p0w0L #f5130" // bugs ":;p0w0L :f5130" // bugs
"#>f0s0 #fd110" // small labyrinth ":>f0s0 :fd110" // small labyrinth
"#oc0p0 #fd110" ":oc0p0 :fd110"
"#=f0s0 #f11d0" ":=f0s0 :f11d0"
"#=c0p0 #f11d0" ":=c0p0 :f11d0"
"#=C0s1 #fd190" // big dirt ":=C0s1 :fd190" // big dirt
"#=M0s2 #fd190" // big grass ":=M0s2 :fd190" // big grass
"#=W0s3 #fd190" // big ice ":=W0s3 :fd190" // big ice
"#(s0r0" // hill ":(s0r0" // hill
"#~t1t2 #~u1t2 #~t1u2" // bumps ":~t1t2 :~u1t2 :~t1u2" // bumps
"#^t0r0 #fq110 " // ramps ":^t0r0 :fq110 " // ramps
"#}n0l0J #|n1l0J #|n3l0J- #]n4l0J- #=o0l0 #f1510" // loop ":}n0l0J :|n1l0J :|n3l0J- :]n4l0J- :=o0l0 :f1510" // loop
"#]n0m0J #|n1m0J #|n3m0J- #]n4m0J- #=o0m0 #f1510" // loop ":]n0m0J :|n1m0J :|n3m0J- :]n4m0J- :=o0m0 :f1510" // loop
"#}l0k0L #|l1k0L #|l3k0L- #]l4k0L- #=k0k0 #f1510" ":}l0k0L :|l1k0L :|l3k0L- :]l4k0L- :=k0k0 :f1510"
"#]l0j0L #|l1j0L #|l3j0L- #]l4j0L- #=k0j0 #f1510" ":]l0j0L :|l1j0L :|l3j0L- :]l4j0L- :=k0j0 :f1510"
"#-k5k0 #f5120" ":-k5k0 :f5120"
}; };
#define LCR_IMAGE_SIZE 64 ///< one-dimension resolution of bitmap image #define LCR_IMAGE_SIZE 64 ///< one-dimension resolution of bitmap image

18
game.h
View file

@ -224,14 +224,26 @@ void LCR_gameResetRun(void)
LCR_gameSetState(LCR_GAME_STATE_RUN_STARTING); LCR_gameSetState(LCR_GAME_STATE_RUN_STARTING);
} }
void LCR_gameStartRun(const char *mapStr)
int aaaa = 0; // tmp
char aaa(void)
{ {
LCR_mapLoadFromStr(mapStr); return LCR_maps[0][aaaa++];
}
void LCR_gameStartRun(void)
{
LCR_mapLoadFromStr(aaa);
LCR_rendererLoadMap(); LCR_rendererLoadMap();
LCR_gameResetRun(); LCR_gameResetRun();
LCR_racingRestart(); LCR_racingRestart();
} }
void LCR_gameInit(void) void LCR_gameInit(void)
{ {
LCR_LOG0("initializing"); LCR_LOG0("initializing");
@ -247,7 +259,7 @@ void LCR_gameInit(void)
LCR_game.nextRenderFrameTime = 0; LCR_game.nextRenderFrameTime = 0;
LCR_game.nextRacingTickTime = 0; LCR_game.nextRacingTickTime = 0;
LCR_game.controlMode = LCR_CONTROL_MODE_FREECAM; LCR_game.controlMode = LCR_CONTROL_MODE_FREECAM;
LCR_gameStartRun(LCR_maps[0]); LCR_gameStartRun();
} }
void LCR_gameEnd(void) void LCR_gameEnd(void)

110
map.h
View file

@ -17,16 +17,12 @@
The TEXT format serves for editing maps in human readable format, it more or The TEXT format serves for editing maps in human readable format, it more or
less corresponds to the binary storage format (below) with some exceptions. less corresponds to the binary storage format (below) with some exceptions.
It has the following structure: It has the following structure:
- Magic number string: "LM;". - Number specifying environment (0, 1, 2, ...)
- Until next ';': name. - A series of block strings. Blocks may be separated by characters that
- Until next ';': description. aren't ':' (comments may be added this way). Block format
- Until next ';': tags. Currently this may contain the following:
- digit N: set the map environment to N.
- Then a series of block strings follows. Blocks may be separated by
characters that aren't '#' (comments may be added this way). Block format
is following: is following:
#BXYZMT :BXYZMT
where: where:
- B is block type - B is block type
@ -60,6 +56,8 @@
- last if C7 is set, the block is flipped vertically - last if C7 is set, the block is flipped vertically
*/ */
#define LCR_BLOCK_START_CHAR ':'
#define LCR_BLOCK_TRANSFORM_FLIP_H 0x10 #define LCR_BLOCK_TRANSFORM_FLIP_H 0x10
#define LCR_BLOCK_TRANSFORM_ROT_90 0x20 #define LCR_BLOCK_TRANSFORM_ROT_90 0x20
#define LCR_BLOCK_TRANSFORM_ROT_180 0x40 #define LCR_BLOCK_TRANSFORM_ROT_180 0x40
@ -68,12 +66,6 @@
#define LCR_BLOCK_XYZ_TO_COORD(x,y,z) // ??? #define LCR_BLOCK_XYZ_TO_COORD(x,y,z) // ???
#define LCR_MAP_MAGIC_NUMBER1 'L'
#define LCR_MAP_MAGIC_NUMBER2 'M'
#define LCR_MAP_SEPARATOR ';'
#define LCR_MAP_MAGIC_NUMBER LCR_MAP_MAGIC_NUMBER1, LCR_MAP_MAGIC_NUMBER2
#define LCR_MAP_TERMINATOR 0xff
#define LCR_MAP_BLOCK(t,x,y,z,m,r) t,(uint8_t) (x | (y << 6)), \ #define LCR_MAP_BLOCK(t,x,y,z,m,r) t,(uint8_t) (x | (y << 6)), \
(uint8_t) ((y >> 2) | (z << 4)), \ (uint8_t) ((y >> 2) | (z << 4)), \
(uint8_t) ((z >> 4) | (m << 2) | (r)) (uint8_t) ((z >> 4) | (m << 2) | (r))
@ -361,10 +353,12 @@ int _LCR_mapCharToCoord(char c)
return -1; return -1;
} }
uint8_t LCR_mapLoadFromStr(const char *mapStr) uint8_t LCR_mapLoadFromStr(char (*getNextCharFunc)(void))
{ {
LCR_LOG0("loading map string"); LCR_LOG0("loading map string");
char c;
uint8_t prevBlock[LCR_BLOCK_SIZE]; uint8_t prevBlock[LCR_BLOCK_SIZE];
prevBlock[0] = LCR_BLOCK_NONE; prevBlock[0] = LCR_BLOCK_NONE;
@ -375,65 +369,29 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
LCR_currentMap.blockCount = 0; LCR_currentMap.blockCount = 0;
LCR_currentMap.environment = 0; LCR_currentMap.environment = 0;
if (mapStr[0] != LCR_MAP_MAGIC_NUMBER1 || mapStr[1] != LCR_MAP_MAGIC_NUMBER2 c = getNextCharFunc();
|| mapStr[2] != LCR_MAP_SEPARATOR)
if (c < '0' || c > '3')
{ {
LCR_LOG0("bad magic number"); LCR_LOG0("bad environment char");
return 0; return 0;
} }
mapStr += 3; LCR_currentMap.environment = c - '0';
while (*mapStr != LCR_MAP_SEPARATOR) // read map name while (c)
{ {
if (mapStr[0] == 0) if (c == LCR_BLOCK_START_CHAR)
return 0;
// TODO
mapStr++;
}
mapStr++;
while (*mapStr != LCR_MAP_SEPARATOR) // read map description
{
if (mapStr[0] == 0)
return 0;
// TODO
mapStr++;
}
mapStr++;
while (*mapStr != LCR_MAP_SEPARATOR) // read map tags
{
if (mapStr[0] >= '0' && mapStr[0] <= '9')
LCR_currentMap.environment = mapStr[0] - '0';
else if (mapStr[0] == 0)
return 0;
// TODO
mapStr++;
}
mapStr++;
while (*mapStr)
{
if (*mapStr == '#')
{ {
mapStr++; uint8_t block = getNextCharFunc();
uint8_t block = *mapStr;
uint8_t trans = 0; uint8_t trans = 0;
uint8_t mat = 0; uint8_t mat = 0;
int coords[3]; int coords[3];
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
{ {
mapStr++; c = getNextCharFunc();
coords[i] = _LCR_mapCharToCoord(*mapStr); coords[i] = _LCR_mapCharToCoord(c);
if (coords[i] < 0) if (coords[i] < 0)
{ {
@ -442,36 +400,37 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
} }
} }
mapStr++; c = getNextCharFunc();
if (*mapStr >= '0' && *mapStr <= '3') if (c < '0' || c > '3')
mat = *mapStr - '0';
else
{ {
LCR_LOG0("bad material"); LCR_LOG0("bad material");
return 0; return 0;
} }
mapStr++; mat = c - '0';
while (1) while (1)
{ {
if (*mapStr == '|') c = getNextCharFunc();
if (c == '|')
trans |= LCR_BLOCK_TRANSFORM_FLIP_H; trans |= LCR_BLOCK_TRANSFORM_FLIP_H;
else if (*mapStr == '-') else if (c == '-')
trans |= LCR_BLOCK_TRANSFORM_FLIP_V; trans |= LCR_BLOCK_TRANSFORM_FLIP_V;
else if (*mapStr == 'L') else if (c == 'L')
trans |= LCR_BLOCK_TRANSFORM_ROT_90; trans |= LCR_BLOCK_TRANSFORM_ROT_90;
else if (*mapStr == 'I') else if (c == 'I')
trans |= LCR_BLOCK_TRANSFORM_ROT_180; trans |= LCR_BLOCK_TRANSFORM_ROT_180;
else if (*mapStr == 'J') else if (c == 'J')
trans |= LCR_BLOCK_TRANSFORM_ROT_270; trans |= LCR_BLOCK_TRANSFORM_ROT_270;
else else
break; break;
mapStr++;
} }
while (c && c != LCR_BLOCK_START_CHAR)
c = getNextCharFunc();
switch (block) switch (block)
{ {
case LCR_BLOCK_CUBOID_FILL: case LCR_BLOCK_CUBOID_FILL:
@ -527,9 +486,8 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
// TODO: check for invalid blocks? // TODO: check for invalid blocks?
} }
} }
else
if (*mapStr != '#') c = getNextCharFunc();
mapStr++;
} }
LCR_LOG2("clearing map block cache") LCR_LOG2("clearing map block cache")