Modified the new ZMV format to have variable sized Author as per Bisqwit's request.
This commit is contained in:
@@ -74,7 +74,7 @@ Header
|
|||||||
4 bytes - Number of frames with slow down
|
4 bytes - Number of frames with slow down
|
||||||
4 bytes - Number of key combos
|
4 bytes - Number of key combos
|
||||||
2 bytes - Number of internal chapters
|
2 bytes - Number of internal chapters
|
||||||
20 bytes - Author name
|
2 bytes - Length of author name
|
||||||
3 bytes - ZST size
|
3 bytes - ZST size
|
||||||
1 byte - Flag Byte
|
1 byte - Flag Byte
|
||||||
2 bits - Start from ZST/Power On/Reset
|
2 bits - Start from ZST/Power On/Reset
|
||||||
@@ -155,6 +155,11 @@ enum zmv_video_modes { zmv_vm_ntsc, zmv_vm_pal };
|
|||||||
#define INT_CHAP_INDEX_SIZE (zmv_vars.header.internal_chapters*4)
|
#define INT_CHAP_INDEX_SIZE (zmv_vars.header.internal_chapters*4)
|
||||||
#define EXT_CHAP_BLOCK_SIZE (zmv_open_vars.external_chapter_count*EXT_CHAP_SIZE + 2)
|
#define EXT_CHAP_BLOCK_SIZE (zmv_open_vars.external_chapter_count*EXT_CHAP_SIZE + 2)
|
||||||
|
|
||||||
|
#define EXT_CHAP_END_DIST (EXT_CHAP_BLOCK_SIZE + (size_t)zmv_vars.header.author_len)
|
||||||
|
#define INT_CHAP_END_DIST (INT_CHAP_INDEX_SIZE + EXT_CHAP_END_DIST)
|
||||||
|
|
||||||
|
#define EXT_CHAP_COUNT_END_DIST ((size_t)zmv_vars.header.author_len + 2)
|
||||||
|
|
||||||
struct zmv_header
|
struct zmv_header
|
||||||
{
|
{
|
||||||
char magic[3];
|
char magic[3];
|
||||||
@@ -166,7 +171,7 @@ struct zmv_header
|
|||||||
unsigned int slow_frames;
|
unsigned int slow_frames;
|
||||||
unsigned int key_combos;
|
unsigned int key_combos;
|
||||||
unsigned short internal_chapters;
|
unsigned short internal_chapters;
|
||||||
char author[20];
|
unsigned short author_len;
|
||||||
unsigned int zst_size; //We only read/write 3 bytes for this
|
unsigned int zst_size; //We only read/write 3 bytes for this
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@@ -188,7 +193,7 @@ static void zmv_header_write(struct zmv_header *zmv_head, FILE *fp)
|
|||||||
fwrite4(zmv_head->slow_frames, fp);
|
fwrite4(zmv_head->slow_frames, fp);
|
||||||
fwrite4(zmv_head->key_combos, fp);
|
fwrite4(zmv_head->key_combos, fp);
|
||||||
fwrite2(zmv_head->internal_chapters, fp);
|
fwrite2(zmv_head->internal_chapters, fp);
|
||||||
fwrite(zmv_head->author, 20, 1, fp);
|
fwrite2(zmv_head->author_len, fp);
|
||||||
fwrite3(zmv_head->zst_size, fp);
|
fwrite3(zmv_head->zst_size, fp);
|
||||||
|
|
||||||
switch (zmv_head->zmv_flag.start_method)
|
switch (zmv_head->zmv_flag.start_method)
|
||||||
@@ -244,7 +249,7 @@ static bool zmv_header_read(struct zmv_header *zmv_head, FILE *fp)
|
|||||||
zmv_head->slow_frames = fread4(fp);
|
zmv_head->slow_frames = fread4(fp);
|
||||||
zmv_head->key_combos = fread4(fp);
|
zmv_head->key_combos = fread4(fp);
|
||||||
zmv_head->internal_chapters = fread2(fp);
|
zmv_head->internal_chapters = fread2(fp);
|
||||||
fread(zmv_head->author, 20, 1, fp);
|
zmv_head->author_len = fread2(fp);
|
||||||
zmv_head->zst_size = fread3(fp);
|
zmv_head->zst_size = fread3(fp);
|
||||||
fread(&flag, 1, 1, fp);
|
fread(&flag, 1, 1, fp);
|
||||||
|
|
||||||
@@ -514,6 +519,7 @@ static void flush_input_buffer()
|
|||||||
fwrite(zmv_vars.write_buffer, zmv_vars.write_buffer_loc, 1, zmv_vars.fp);
|
fwrite(zmv_vars.write_buffer, zmv_vars.write_buffer_loc, 1, zmv_vars.fp);
|
||||||
zmv_vars.write_buffer_loc = 0;
|
zmv_vars.write_buffer_loc = 0;
|
||||||
}
|
}
|
||||||
|
zmv_vars.header.author_len = 0; //If we're writing, then author is erased if there
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -689,10 +695,10 @@ static bool zmv_open(char *filename)
|
|||||||
zst_load(zmv_vars.fp);
|
zst_load(zmv_vars.fp);
|
||||||
zmv_open_vars.input_start_pos = ftell(zmv_vars.fp);
|
zmv_open_vars.input_start_pos = ftell(zmv_vars.fp);
|
||||||
|
|
||||||
fseek(zmv_vars.fp, -2, SEEK_END);
|
fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END);
|
||||||
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
|
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
|
||||||
|
|
||||||
fseek(zmv_vars.fp, -(INT_CHAP_INDEX_SIZE + EXT_CHAP_BLOCK_SIZE), SEEK_END);
|
fseek(zmv_vars.fp, -(INT_CHAP_END_DIST), SEEK_END);
|
||||||
|
|
||||||
internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters);
|
internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters);
|
||||||
|
|
||||||
@@ -796,7 +802,7 @@ static bool zmv_next_chapter()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t ext_chapter_loc = EXT_CHAP_BLOCK_SIZE - internal_chapter_pos(&zmv_open_vars.external_chapters, next)*EXT_CHAP_SIZE;
|
size_t ext_chapter_loc = EXT_CHAP_END_DIST - internal_chapter_pos(&zmv_open_vars.external_chapters, next)*EXT_CHAP_SIZE;
|
||||||
fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END);
|
fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END);
|
||||||
zst_load(zmv_vars.fp);
|
zst_load(zmv_vars.fp);
|
||||||
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
|
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
|
||||||
@@ -881,7 +887,7 @@ static void zmv_prev_chapter()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t ext_chapter_loc = EXT_CHAP_BLOCK_SIZE - internal_chapter_pos(&zmv_open_vars.external_chapters, prev)*EXT_CHAP_SIZE;
|
size_t ext_chapter_loc = EXT_CHAP_END_DIST - internal_chapter_pos(&zmv_open_vars.external_chapters, prev)*EXT_CHAP_SIZE;
|
||||||
fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END);
|
fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END);
|
||||||
zst_load(zmv_vars.fp);
|
zst_load(zmv_vars.fp);
|
||||||
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
|
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
|
||||||
@@ -908,10 +914,21 @@ static void zmv_add_chapter()
|
|||||||
|
|
||||||
if (!(flag & BIT(2)))
|
if (!(flag & BIT(2)))
|
||||||
{
|
{
|
||||||
|
char *author = 0;
|
||||||
|
|
||||||
internal_chapter_add_offset(&zmv_open_vars.external_chapters, current_loc);
|
internal_chapter_add_offset(&zmv_open_vars.external_chapters, current_loc);
|
||||||
zmv_open_vars.external_chapter_count++;
|
zmv_open_vars.external_chapter_count++;
|
||||||
|
|
||||||
fseek(zmv_vars.fp, -2, SEEK_END);
|
if (zmv_vars.header.author_len)
|
||||||
|
{
|
||||||
|
if ((author = (char *)malloc(zmv_vars.header.author_len)))
|
||||||
|
{
|
||||||
|
fseek(zmv_vars.fp, -(zmv_vars.header.author_len), SEEK_END);
|
||||||
|
fread(author, zmv_vars.header.author_len, 1, zmv_vars.fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END);
|
||||||
zst_save(zmv_vars.fp, false);
|
zst_save(zmv_vars.fp, false);
|
||||||
fwrite4(zmv_open_vars.frames_replayed, zmv_vars.fp);
|
fwrite4(zmv_open_vars.frames_replayed, zmv_vars.fp);
|
||||||
write_last_joy_state(zmv_vars.fp);
|
write_last_joy_state(zmv_vars.fp);
|
||||||
@@ -919,6 +936,12 @@ static void zmv_add_chapter()
|
|||||||
|
|
||||||
fwrite2(zmv_open_vars.external_chapter_count, zmv_vars.fp);
|
fwrite2(zmv_open_vars.external_chapter_count, zmv_vars.fp);
|
||||||
|
|
||||||
|
if (author)
|
||||||
|
{
|
||||||
|
fwrite(author, zmv_vars.header.author_len, 1, zmv_vars.fp);
|
||||||
|
free(author);
|
||||||
|
}
|
||||||
|
|
||||||
fseek(zmv_vars.fp, current_loc, SEEK_SET);
|
fseek(zmv_vars.fp, current_loc, SEEK_SET);
|
||||||
}
|
}
|
||||||
else //Just skip the internal
|
else //Just skip the internal
|
||||||
@@ -970,6 +993,7 @@ void mzt_chdir()
|
|||||||
chdir(zmv_vars.filename);
|
chdir(zmv_vars.filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Currently this doesn't work right in playback
|
||||||
bool mzt_save(char *statename, bool thumb, bool playback)
|
bool mzt_save(char *statename, bool thumb, bool playback)
|
||||||
{
|
{
|
||||||
size_t filename_len = strlen(zmv_vars.filename);
|
size_t filename_len = strlen(zmv_vars.filename);
|
||||||
|
|||||||
Reference in New Issue
Block a user