Output replays
This commit is contained in:
parent
17c182f474
commit
2dfad249ad
3 changed files with 100 additions and 18 deletions
49
game.h
49
game.h
|
@ -357,8 +357,8 @@ char LCR_gameGetNextResourceStrChar(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Seeks to the Nth resource string in the global resource file, after its name,
|
Seeks to the Nth resource string in the global resource file, after the magic
|
||||||
so that the pure resource string will now be available for reading.
|
number, so that the name is now available for reading.
|
||||||
*/
|
*/
|
||||||
void LCR_seekResourceByIndex(unsigned int index, char magicNumber)
|
void LCR_seekResourceByIndex(unsigned int index, char magicNumber)
|
||||||
{
|
{
|
||||||
|
@ -368,31 +368,45 @@ void LCR_seekResourceByIndex(unsigned int index, char magicNumber)
|
||||||
|
|
||||||
LCR_gameRewindResourceFile();
|
LCR_gameRewindResourceFile();
|
||||||
|
|
||||||
while (index)
|
do
|
||||||
{
|
{
|
||||||
c = LCR_gameGetNextResourceFileChar();
|
c = LCR_gameGetNextResourceFileChar();
|
||||||
|
|
||||||
if (c == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (c == magicNumber)
|
if (c == magicNumber)
|
||||||
|
{
|
||||||
|
if (index)
|
||||||
index--;
|
index--;
|
||||||
|
else
|
||||||
do
|
return;
|
||||||
c = LCR_gameGetNextResourceFileChar();
|
|
||||||
while (c != LCR_RESOURCE_FILE_SEPARATOR && c != 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do // skip magic number and name
|
while (c != 0 && c != LCR_RESOURCE_FILE_SEPARATOR)
|
||||||
c = LCR_gameGetNextResourceFileChar();
|
c = LCR_gameGetNextResourceFileChar();
|
||||||
while (c != LCR_RESOURCE_FILE_SEPARATOR2 &&
|
|
||||||
c != LCR_RESOURCE_FILE_SEPARATOR && c != 0);
|
} while (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCR_gameStartRun(unsigned int mapIndex)
|
void LCR_gameStartRun(unsigned int mapIndex)
|
||||||
{
|
{
|
||||||
|
char mapName[LCR_MAP_NAME_MAX_LEN];
|
||||||
|
|
||||||
LCR_seekResourceByIndex(mapIndex,'M');
|
LCR_seekResourceByIndex(mapIndex,'M');
|
||||||
LCR_mapLoadFromStr(LCR_gameGetNextResourceStrChar);
|
|
||||||
|
mapName[0] = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < LCR_MAP_NAME_MAX_LEN; ++i)
|
||||||
|
{
|
||||||
|
char c = LCR_gameGetNextResourceFileChar();
|
||||||
|
|
||||||
|
if (c == LCR_RESOURCE_FILE_SEPARATOR2 ||
|
||||||
|
c == LCR_RESOURCE_FILE_SEPARATOR || c == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
mapName[i] = c;
|
||||||
|
mapName[i + 1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LCR_mapLoadFromStr(LCR_gameGetNextResourceStrChar,mapName);
|
||||||
LCR_gameSetState(LCR_GAME_STATE_LOADING_MAP);
|
LCR_gameSetState(LCR_GAME_STATE_LOADING_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,6 +835,11 @@ void LCR_gameHandleInput(void)
|
||||||
LCR_game.menu.selectedTab == 1 ? 'M' : 'R');
|
LCR_game.menu.selectedTab == 1 ? 'M' : 'R');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _LCR_gameResourceCharWrite(char c)
|
||||||
|
{
|
||||||
|
printf("%c",c);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t LCR_gameStep(uint32_t time)
|
uint8_t LCR_gameStep(uint32_t time)
|
||||||
{
|
{
|
||||||
uint32_t sleep = 0;
|
uint32_t sleep = 0;
|
||||||
|
@ -871,6 +890,8 @@ uint8_t LCR_gameStep(uint32_t time)
|
||||||
LCR_game.state != LCR_GAME_STATE_RUN_FINISHED)
|
LCR_game.state != LCR_GAME_STATE_RUN_FINISHED)
|
||||||
{
|
{
|
||||||
LCR_LOG1("finished");
|
LCR_LOG1("finished");
|
||||||
|
LCR_replayOutputStr(_LCR_gameResourceCharWrite);
|
||||||
|
|
||||||
LCR_audioPlaySound(LCR_SOUND_CLICK);
|
LCR_audioPlaySound(LCR_SOUND_CLICK);
|
||||||
LCR_gameSetState(LCR_GAME_STATE_RUN_FINISHED);
|
LCR_gameSetState(LCR_GAME_STATE_RUN_FINISHED);
|
||||||
}
|
}
|
||||||
|
|
17
map.h
17
map.h
|
@ -56,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_MAP_NAME_MAX_LEN 15 /**< Maximum map name length (without
|
||||||
|
terminating zero. */
|
||||||
#define LCR_BLOCK_START_CHAR ':'
|
#define LCR_BLOCK_START_CHAR ':'
|
||||||
|
|
||||||
#define LCR_BLOCK_TRANSFORM_FLIP_H 0x10
|
#define LCR_BLOCK_TRANSFORM_FLIP_H 0x10
|
||||||
|
@ -153,6 +155,8 @@ struct
|
||||||
uint8_t checkpointCount;
|
uint8_t checkpointCount;
|
||||||
|
|
||||||
uint32_t hash; ///< Hash of the processed binary map.
|
uint32_t hash; ///< Hash of the processed binary map.
|
||||||
|
|
||||||
|
char name[LCR_MAP_NAME_MAX_LEN + 1];
|
||||||
} LCR_currentMap;
|
} LCR_currentMap;
|
||||||
|
|
||||||
void LCR_makeMapBlock(uint8_t type, uint8_t x, uint8_t y, uint8_t z,
|
void LCR_makeMapBlock(uint8_t type, uint8_t x, uint8_t y, uint8_t z,
|
||||||
|
@ -373,10 +377,21 @@ void _LCR_mapComputeHash(void)
|
||||||
(LCR_currentMap.hash >> 13)) * 113;
|
(LCR_currentMap.hash >> 13)) * 113;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t LCR_mapLoadFromStr(char (*getNextCharFunc)(void))
|
uint8_t LCR_mapLoadFromStr(char (*getNextCharFunc)(void), const char *name)
|
||||||
{
|
{
|
||||||
LCR_LOG0("loading map string");
|
LCR_LOG0("loading map string");
|
||||||
|
|
||||||
|
for (int i = 0; i < LCR_MAP_NAME_MAX_LEN; ++i)
|
||||||
|
{
|
||||||
|
LCR_currentMap.name[i] = *name;
|
||||||
|
LCR_currentMap.name[i + 1] = 0;
|
||||||
|
|
||||||
|
if (*name == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
name++;
|
||||||
|
}
|
||||||
|
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
uint8_t prevBlock[LCR_BLOCK_SIZE];
|
uint8_t prevBlock[LCR_BLOCK_SIZE];
|
||||||
|
|
46
racing.h
46
racing.h
|
@ -145,6 +145,52 @@ void LCR_replayInitPlaying(void)
|
||||||
LCR_replay.currentFrame = 0;
|
LCR_replay.currentFrame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char _LCR_hexDigit(int i)
|
||||||
|
{
|
||||||
|
return i < 10 ? '0' + i : ('a' - 10 + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Outputs current replay using provided character printing function. The string
|
||||||
|
will be zero terminated.
|
||||||
|
*/
|
||||||
|
void LCR_replayOutputStr(void (*printChar)(char))
|
||||||
|
{
|
||||||
|
LCR_LOG1("outputting replay");
|
||||||
|
|
||||||
|
const char *s = LCR_currentMap.name;
|
||||||
|
|
||||||
|
while (*s)
|
||||||
|
{
|
||||||
|
printChar(*s);
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printChar(';');
|
||||||
|
|
||||||
|
uint32_t hash = LCR_currentMap.hash;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; ++i)
|
||||||
|
{
|
||||||
|
printChar(_LCR_hexDigit(hash % 16));
|
||||||
|
hash /= 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < LCR_replay.eventCount; ++i)
|
||||||
|
{
|
||||||
|
uint16_t e = LCR_replay.events[i];
|
||||||
|
printChar(' ');
|
||||||
|
|
||||||
|
for (int j = 0; j < 4; ++j)
|
||||||
|
{
|
||||||
|
printChar(_LCR_hexDigit(e % 16));
|
||||||
|
e /= 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printChar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
During playing of a replay returns the next input and shifts to next frame.
|
During playing of a replay returns the next input and shifts to next frame.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue