ZMV: Improved format. Fixed some bugs, improvements. Finished new ZMV load and replay code. External chapter support completed.

This commit is contained in:
n-a-c-h
2005-03-13 23:49:09 +00:00
parent bfb6d316e6
commit ac02517d50

View File

@@ -183,6 +183,7 @@ Key input - Repeated for all input / internal chapters
-If Chapter- -If Chapter-
ZST size - ZST ZST size - ZST
4 bytes - Frame #
-Else- -Else-
@@ -197,7 +198,7 @@ variable - Input
Internal chapter offsets - Repeated for all internal chapters Internal chapter offsets - Repeated for all internal chapters
----------------------------------------------------------------- -----------------------------------------------------------------
4 bytes - Offset to chapter from beginning of file 4 bytes - Offset to chapter from beginning of file (after input flag byte for ZST)
----------------------------------------------------------------- -----------------------------------------------------------------
@@ -205,6 +206,7 @@ External chapters - Repeated for all external chapters
----------------------------------------------------------------- -----------------------------------------------------------------
ZST Size - ZST ZST Size - ZST
4 bytes - Frame #
4 bytes - Offset to input for current chapter from beginning of file 4 bytes - Offset to input for current chapter from beginning of file
@@ -416,6 +418,30 @@ void internal_chapter_write(struct internal_chapter_buf *icb, FILE *fp)
} }
} }
void internal_chapter_read(struct internal_chapter_buf *icb, FILE *fp, size_t count)
{
while (count--)
{
interal_chapter_add_offset(icb, fread4(fp));
}
}
size_t internal_chapter_pos(struct internal_chapter_buf *icb, size_t offset)
{
size_t pos = 0;
do
{
unsigned char i;
for (i = 0; i < icb->used; i++, pos++)
{
if (icb->offsets[i] == offset)
{
return(pos);
}
}
} while ((icb = icb->next));
return(0);
}
/* /*
@@ -524,7 +550,7 @@ void zmv_record()
void zmv_insert_chapter() void zmv_insert_chapter()
{ {
if ((zmv_vars.header.internal_chapters < 65535) && if ((zmv_vars.header.internal_chapters < 65535) && zmv_vars.header.frames &&
(zmv_vars.last_internal_chapter_offset != ftell(zmv_vars.fp))) (zmv_vars.last_internal_chapter_offset != ftell(zmv_vars.fp)))
{ {
unsigned char flag = BIT(2); unsigned char flag = BIT(2);
@@ -542,6 +568,7 @@ void zmv_insert_chapter()
zmv_vars.last_internal_chapter_offset = ftell(zmv_vars.fp); zmv_vars.last_internal_chapter_offset = ftell(zmv_vars.fp);
zst_save(zmv_vars.fp, false); zst_save(zmv_vars.fp, false);
fwrite4(zmv_vars.header.frames, zmv_vars.fp);
} }
} }
@@ -553,7 +580,7 @@ void zmv_record_finish()
zmv_vars.write_buffer_loc = 0; zmv_vars.write_buffer_loc = 0;
} }
internal_chapter_write(&(zmv_vars.internal_chapters), zmv_vars.fp); internal_chapter_write(&zmv_vars.internal_chapters, zmv_vars.fp);
internal_chapter_free_chain(zmv_vars.internal_chapters.next); internal_chapter_free_chain(zmv_vars.internal_chapters.next);
fwrite2(0, zmv_vars.fp); //External chapter count fwrite2(0, zmv_vars.fp); //External chapter count
@@ -570,13 +597,28 @@ Open and replay ZMV
*/ */
typedef struct internal_chapter_buf external_chapter_buf;
struct
{
external_chapter_buf external_chapters;
unsigned short external_chapter_count;
unsigned int frames_replayed;
} zmv_open_vars; //Additional vars for open/replay of a ZMV
bool zmv_open(char *filename) bool zmv_open(char *filename)
{ {
memset(&zmv_vars, 0, sizeof(zmv_vars)); memset(&zmv_vars, 0, sizeof(zmv_vars));
memset(&zmv_open_vars, 0, sizeof(zmv_open_vars));
zmv_vars.fp = fopen(filename,"r+b"); zmv_vars.fp = fopen(filename,"r+b");
if (zmv_vars.fp && zmv_header_read(&zmv_vars.header, zmv_vars.fp) && if (zmv_vars.fp && zmv_header_read(&zmv_vars.header, zmv_vars.fp) &&
!strncpy(zmv_vars.header.magic, "ZMV", 3)) !strncpy(zmv_vars.header.magic, "ZMV", 3))
{ {
size_t input_start_pos;
unsigned short i;
if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF)) if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF))
{ {
@@ -588,6 +630,21 @@ bool zmv_open(char *filename)
} }
zst_load(zmv_vars.fp); zst_load(zmv_vars.fp);
input_start_pos = ftell(zmv_vars.fp);
fseek(zmv_vars.fp, -2, SEEK_END);
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
fseek(zmv_vars.fp, -(zmv_open_vars.external_chapter_count*(cur_zst_size+8) + 2), SEEK_END);
internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters);
for (i = 0; i < zmv_open_vars.external_chapter_count; i++)
{
fseek(zmv_vars.fp, cur_zst_size+4, SEEK_CUR);
interal_chapter_add_offset(&zmv_open_vars.external_chapters, fread4(zmv_vars.fp));
}
fseek(zmv_vars.fp, input_start_pos, SEEK_SET);
return(true); return(true);
} }
@@ -616,23 +673,28 @@ bool zmv_open(char *filename)
void zmv_replay() void zmv_replay()
{ {
unsigned char flag = 0; if (zmv_open_vars.frames_replayed < zmv_vars.header.frames)
bool mid_byte = false;
unsigned char byte;
fread(&flag, 1, 1, zmv_vars.fp);
if (flag & BIT(2))
{ {
fseek(zmv_vars.fp, cur_zst_size, SEEK_CUR); unsigned char flag = 0;
fread(&flag, 1, 1, zmv_vars.fp); bool mid_byte = false;
} unsigned char byte;
REPLAY_PAD(PJoyAOrig, 7); fread(&flag, 1, 1, zmv_vars.fp);
REPLAY_PAD(PJoyBOrig, 6);
REPLAY_PAD(PJoyCOrig, 5); if (flag & BIT(2))
REPLAY_PAD(PJoyDOrig, 4); {
REPLAY_PAD(PJoyEOrig, 3); fseek(zmv_vars.fp, cur_zst_size+4, SEEK_CUR);
fread(&flag, 1, 1, zmv_vars.fp);
}
REPLAY_PAD(PJoyAOrig, 7);
REPLAY_PAD(PJoyBOrig, 6);
REPLAY_PAD(PJoyCOrig, 5);
REPLAY_PAD(PJoyDOrig, 4);
REPLAY_PAD(PJoyEOrig, 3);
zmv_open_vars.frames_replayed++;
}
} }
void zmv_next_chapter() void zmv_next_chapter()
@@ -647,9 +709,39 @@ void zmv_prev_chapter()
void zmv_add_chapter() void zmv_add_chapter()
{ {
if ((zmv_open_vars.external_chapter_count < 65535) && zmv_open_vars.frames_replayed)
{
size_t current_loc = ftell(zmv_vars.fp);
if (!internal_chapter_pos(&zmv_vars.internal_chapters, current_loc-(cur_zst_size+4)) &&
!internal_chapter_pos(&zmv_open_vars.external_chapters, current_loc))
{
unsigned char flag;
fread(&flag, 1, 1, zmv_vars.fp);
if (!(flag & BIT(2)))
{
interal_chapter_add_offset(&zmv_open_vars.external_chapters, current_loc);
zmv_open_vars.external_chapter_count++;
fseek(zmv_vars.fp, -2, SEEK_END);
zst_save(zmv_vars.fp, false);
fwrite4(zmv_open_vars.frames_replayed, zmv_vars.fp);
fwrite4(current_loc, zmv_vars.fp);
fwrite2(zmv_open_vars.external_chapter_count, zmv_vars.fp);
fseek(zmv_vars.fp, current_loc, SEEK_SET);
}
else
{
fseek(zmv_vars.fp, cur_zst_size+4, SEEK_CUR);
}
}
}
} }
///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////