Fix adding blocks

This commit is contained in:
Miloslav Ciz 2024-12-16 20:17:58 +01:00
parent 9fc88a91af
commit 30c9a55cb5
3 changed files with 25 additions and 41 deletions

View file

@ -1,17 +1,12 @@
=========== GENERAL ============== =========== GENERAL ==============
- rework the code for special blocks, we have to literally remember the last
block, not the pointer, now it won't work e.g. if wanting to repeat an
empty block
- allow stopping car rotation in air like in Trackmania
- maybe allow some more air control, like slowing down with brakes, like in TM
- sound engine: probably all SFX will be procedurally generated, ok? - sound engine: probably all SFX will be procedurally generated, ok?
- allow slowing down in air like in TM?
- music? - music?
- probably just make one long track, literally OGG or something, then make - probably just make one long track, literally OGG or something, then make
that be played by the frontend just ALL the time (maybe with the option in that be played by the frontend just ALL the time (maybe with the option in
menu to just turn music off) -- simple frontends can just ignore music menu to just turn music off) -- simple frontends can just ignore music
- allow car to be flipped upside down on start? with start block transform - allow car to be flipped upside down on start? with start block transform
- map actually in ASCII format? how will humans edit it?
- make a simple rendering setting: - make a simple rendering setting:
- will exclude images and only draw solid colors, let's say only 16, so that - will exclude images and only draw solid colors, let's say only 16, so that
memory usage is reduced, CPU rendering is relieved, executable is smaller memory usage is reduced, CPU rendering is relieved, executable is smaller
@ -28,11 +23,6 @@
floor texture? pretty KISS. SKY DOESN'T HAVE TO BE SPHERICALLY MAPPED, it floor texture? pretty KISS. SKY DOESN'T HAVE TO BE SPHERICALLY MAPPED, it
can simply rotate horizontally and shift vertically (camera will never can simply rotate horizontally and shift vertically (camera will never
roll) -- not accurate but good enough. <-- YES roll) -- not accurate but good enough. <-- YES
- How to visually represent checkpoints (and finish)?
- Could be kind of an arrow made of single tri above the block?
(try how it looks in Blender)
- Probably just a literal block (or pyramid) DRAWN WITH DITHERING and/or
blinking <-- PROBABLY THIS
- replay format - replay format
=========== BUGS ================= =========== BUGS =================
@ -42,8 +32,19 @@
=========== HANDLED ============== =========== HANDLED ==============
- allow stopping car rotation in air like in Trackmania
- drifting: passing some upper threshold on steering force should reduce - drifting: passing some upper threshold on steering force should reduce
steering friction until reaching some some lower threshold again probably steering friction until reaching some some lower threshold again probably
- maybe allow some more air control, like slowing down with brakes, like in TM
- map actually in ASCII format? how will humans edit it?
- rework the code for special blocks, we have to literally remember the last
block, not the pointer, now it won't work e.g. if wanting to repeat an
empty block
- How to visually represent checkpoints (and finish)?
- Could be kind of an arrow made of single tri above the block?
(try how it looks in Blender)
- Probably just a literal block (or pyramid) DRAWN WITH DITHERING and/or
blinking <-- PROBABLY THIS
- EFFICINT MAP DRAWING: - EFFICINT MAP DRAWING:
- map will be subdivided into subblocks (probably 16x16x16 or 8x8x8), only - map will be subdivided into subblocks (probably 16x16x16 or 8x8x8), only
nearest subblocks (and possibly only those in viewing direction will be nearest subblocks (and possibly only those in viewing direction will be

View file

@ -21,6 +21,7 @@ static const char *LCR_maps[] =
"LM;;;0;#*H1k0J" "LM;;;0;#*H1k0J"
"#=s0s0 #fd190" // big concrete "#=s0s0 #fd190" // big concrete
"#=s0B0 #fd910" // concrete wall "#=s0B0 #fd910" // concrete wall
"#^s1A0 #fk110" // ramps before wall "#^s1A0 #fk110" // ramps before wall

42
map.h
View file

@ -110,8 +110,6 @@
#define LCR_BLOCK_CORNER_CONVEX 'n' #define LCR_BLOCK_CORNER_CONVEX 'n'
#define LCR_BLOCK_CORNER_CONCAVE 'l' #define LCR_BLOCK_CORNER_CONCAVE 'l'
#define LCR_BLOCK_CHECKPOINT_0 '+' ///< checkpoint, not taken #define LCR_BLOCK_CHECKPOINT_0 '+' ///< checkpoint, not taken
#define LCR_BLOCK_CHECKPOINT_1 '\'' ///< checkpoint, taken #define LCR_BLOCK_CHECKPOINT_1 '\'' ///< checkpoint, taken
@ -259,14 +257,14 @@ uint8_t *LCR_getMapBlockAtCoordNumber(uint32_t coord)
adding LCR_BLOCK_NONE. The function handles sorting the block to the right adding LCR_BLOCK_NONE. The function handles sorting the block to the right
position. Returns pointer to the block on success, else 0. position. Returns pointer to the block on success, else 0.
*/ */
uint8_t *_LCR_mapAddBlock(const uint8_t block[LCR_BLOCK_SIZE]) void _LCR_mapAddBlock(const uint8_t block[LCR_BLOCK_SIZE])
{ {
LCR_LOG2("adding map block"); LCR_LOG2("adding map block");
if (LCR_currentMap.blockCount >= LCR_SETTING_MAP_MAX_BLOCKS) if (LCR_currentMap.blockCount >= LCR_SETTING_MAP_MAX_BLOCKS)
{ {
LCR_LOG0("couldn't add block"); LCR_LOG0("couldn't add block");
return 0; return;
} }
uint32_t coord = LCR_mapBlockGetCoordNumber(block); uint32_t coord = LCR_mapBlockGetCoordNumber(block);
@ -277,8 +275,6 @@ uint8_t *_LCR_mapAddBlock(const uint8_t block[LCR_BLOCK_SIZE])
insertAt * LCR_BLOCK_SIZE)) insertAt * LCR_BLOCK_SIZE))
insertAt++; insertAt++;
uint8_t *result = LCR_currentMap.blocks + insertAt * LCR_BLOCK_SIZE;
if (block[0] == LCR_BLOCK_NONE) if (block[0] == LCR_BLOCK_NONE)
{ {
if (insertAt < LCR_currentMap.blockCount && if (insertAt < LCR_currentMap.blockCount &&
@ -286,14 +282,15 @@ uint8_t *_LCR_mapAddBlock(const uint8_t block[LCR_BLOCK_SIZE])
insertAt * LCR_BLOCK_SIZE)) insertAt * LCR_BLOCK_SIZE))
{ {
// shift all left (remove the block): // shift all left (remove the block):
for (uint16_t i = insertAt * LCR_BLOCK_SIZE;
i < LCR_currentMap.blockCount * LCR_BLOCK_SIZE - 1; ++i) for (int i = insertAt * LCR_BLOCK_SIZE;
LCR_currentMap.blocks[i] = LCR_currentMap.blocks[i + 1]; i < (LCR_currentMap.blockCount - 1) * LCR_BLOCK_SIZE; ++i)
LCR_currentMap.blocks[i] = LCR_currentMap.blocks[i + LCR_BLOCK_SIZE];
LCR_currentMap.blockCount--; LCR_currentMap.blockCount--;
} }
return result; return;
} }
if (insertAt == LCR_currentMap.blockCount || if (insertAt == LCR_currentMap.blockCount ||
@ -315,8 +312,6 @@ uint8_t *_LCR_mapAddBlock(const uint8_t block[LCR_BLOCK_SIZE])
for (uint8_t j = 0; j < LCR_BLOCK_SIZE; ++j) for (uint8_t j = 0; j < LCR_BLOCK_SIZE; ++j)
LCR_currentMap.blocks[insertAt + j] = block[j]; LCR_currentMap.blocks[insertAt + j] = block[j];
return result;
} }
/** /**
@ -355,7 +350,8 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
{ {
LCR_LOG0("loading map string"); LCR_LOG0("loading map string");
const uint8_t *prevBlock = 0; uint8_t prevBlock[LCR_BLOCK_SIZE];
prevBlock[0] = LCR_BLOCK_NONE;
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
LCR_currentMap.startPos[i] = 0; LCR_currentMap.startPos[i] = 0;
@ -469,12 +465,6 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
uint8_t x, y, z, mat, transform; uint8_t x, y, z, mat, transform;
uint8_t tmpBlock[LCR_BLOCK_SIZE]; uint8_t tmpBlock[LCR_BLOCK_SIZE];
if (prevBlock == 0 || LCR_currentMap.blockCount == 0)
{
LCR_LOG0("no previous block");
return 0;
}
mat = LCR_mapBlockGetMaterial(prevBlock); mat = LCR_mapBlockGetMaterial(prevBlock);
transform = LCR_mapBlockGetTransform(prevBlock); transform = LCR_mapBlockGetTransform(prevBlock);
LCR_mapBlockGetCoords(prevBlock,&x,&y,&z); LCR_mapBlockGetCoords(prevBlock,&x,&y,&z);
@ -493,10 +483,7 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
LCR_makeMapBlock(prevBlock[0],x + i,y + j,z + k,mat,transform, LCR_makeMapBlock(prevBlock[0],x + i,y + j,z + k,mat,transform,
tmpBlock); tmpBlock);
prevBlock = _LCR_mapAddBlock(tmpBlock); _LCR_mapAddBlock(tmpBlock);
if (!prevBlock)
return 0;
} }
break; break;
@ -514,15 +501,10 @@ uint8_t LCR_mapLoadFromStr(const char *mapStr)
// fall through // fall through
default: // normal block default: // normal block
{ {
uint8_t tmpBlock[LCR_BLOCK_SIZE];
LCR_makeMapBlock(block,coords[0],coords[1],coords[2],mat,trans, LCR_makeMapBlock(block,coords[0],coords[1],coords[2],mat,trans,
tmpBlock); prevBlock);
prevBlock = _LCR_mapAddBlock(tmpBlock); _LCR_mapAddBlock(prevBlock);
if (prevBlock == 0)
return 0;
break; break;
} }