From a1f8dcd9b05e1d32a78016f7a996e06e6fdc2347 Mon Sep 17 00:00:00 2001 From: yakui-lover Date: Thu, 28 Jul 2016 17:38:33 +0100 Subject: [PATCH] 16_vrs now operates on files in far memory Untested (again) Also, added MM vars in global variables struct --- src/lib/16_vrs.c | 42 +++++++++++++++++++----------------------- src/lib/16_vrs.h | 17 ++++------------- src/lib/typdefst.h | 2 ++ 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/lib/16_vrs.c b/src/lib/16_vrs.c index b3c217ca..054702f3 100755 --- a/src/lib/16_vrs.c +++ b/src/lib/16_vrs.c @@ -20,38 +20,32 @@ * */ #include "src/lib/16_vrs.h" +#include "src/lib/typedefst.h" -//TODO: USE 16_MM! AND 16_CA! -// Read .vrs file into memory +extern global_game_variables_t gvar; + +// Read .vrs file into far memory int read_vrs(char *filename, struct vrs_container *vrs_cont){ - // Initialise a local copy of becessary variables - // so vrs_cont won't be dirty on error int fd; dword size; - byte *buffer; + byte huge *buffer; // Open filename, get size of file, // populate the vrs_container if all tests pass fd = open(filename, O_RDONLY|O_BINARY); + size = filelength(fd); + close(fd); // Insert sanity cheks later - size = lseek(fd, 0, SEEK_END); - buffer = malloc(size); - lseek(fd, 0, SEEK_SET); - read(fd, buffer, size); + CA_LoadFile(filename, buffer, gvar->mm, gvar->mmi); vrs_cont->size = size; vrs_cont->buffer = buffer; - // 0 is an invalid value for ids under vrs specifications, - // so it is safe to flush ids to this value - vrs_cont->anchor_sprite_id = 0; - vrs_cont->current_sprite_id = 0; return 0; } -//TODO: USE 16_MM! AND 16_CA! -// Seek and return a specified .vrl blob from .vrs blob in memory -struct vrl_container* get_vrl_by_id(struct vrs_container *vrs_cont, uint16_t id){ - uint16_t *ids; - uint32_t *vrl_list; - struct vrl_container *vrl_cont; +// Seek and return a specified .vrl blob from .vrs blob in far memory +struct vrl_container get_vrl_by_id(struct vrs_container huge *vrs_cont, uint16_t id){ + uint16_t huge *ids; + uint32_t huge *vrl_list; + struct vrl_container huge *vrl_cont; int counter = 0; // If id is invalid, return null if(id == 0){ @@ -59,7 +53,8 @@ struct vrl_container* get_vrl_by_id(struct vrs_container *vrs_cont, uint16_t id) return 0; } // Get id list from .vrs blob (base + offset) - ids = (uint16_t*)vrs_cont->buffer + (dword)vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]; + ids = (uint16_t huge*)vrs_cont->buffer + + (dword)vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]; // Loop through the id list until we found the right one or hit the end of the list // Counter is keeping track of the offset(in ids/vrl blobs) while(ids[counter] != id && ids[counter]){ @@ -71,12 +66,13 @@ struct vrl_container* get_vrl_by_id(struct vrs_container *vrs_cont, uint16_t id) return 0; } // Get vrl list from .vrs blob (base + offset) - vrl_list = (uint32_t *)(vrs_cont->buffer + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); + vrl_list = (uint32_t huge *)(vrs_cont->buffer + + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); // Allocate memory for vrl_cont - vrl_cont = (struct vrl_container*)malloc(sizeof(struct vrl_container)); + vrl_cont = (struct vrl_container)malloc(sizeof(struct vrl_container)); // Get vrl_header from .vrs (base + offset from vrl_list) // Counter is number of vrls to skip (ids and vrls are aligned according to the .vrs specification) - vrl_cont->vrl_header = (struct vrl1_vgax_header*)(vrs_cont->buffer + vrl_list[counter]); + vrl_cont->vrl_header = (struct vrl1_vgax_header huge *)(vrs_cont->buffer + vrl_list[counter]); // Get .vrl size by integer arithmetics (next vrl - current vrl) // Untested. May be an incorrect way to do so vrl_cont->size = vrl_list[counter+1] - vrl_list[counter]; diff --git a/src/lib/16_vrs.h b/src/lib/16_vrs.h index dacc606b..8e489964 100755 --- a/src/lib/16_vrs.h +++ b/src/lib/16_vrs.h @@ -34,29 +34,20 @@ // Includes: // + size of the .vrs blob in memory // + pointer to the blob/vrs header -// + id of the curent (shown) animation -// + id of the first sprite of the curret animation (supplementary) -// + id of the current (shown) sprite struct vrs_container{ dword size; union{ - byte *buffer; - struct vrs_header *vrs_hdr; + byte huge *buffer; + struct vrs_header huge *vrs_hdr; }; - uint16_t anchor_sprite_id; - uint16_t current_sprite_id; }; -// Container for .vrl files loaded in memory with useful info -// Includes: -// + size of the .vrl blob in memory -// + pointer to the blob/vrl header struct vrl_container{ dword size; union{ - byte *buffer; - struct vrl1_vgax_header *vrl_header; + byte huge *buffer; + struct vrl1_vgax_header huge *vrl_header; }; }; diff --git a/src/lib/typdefst.h b/src/lib/typdefst.h index cc174f31..6dbfa213 100755 --- a/src/lib/typdefst.h +++ b/src/lib/typdefst.h @@ -139,6 +139,8 @@ typedef struct byte *pee; // message for fps handle_t handle; //handles for file logging kurokku_t kurokku; //clock struct + mminfo_t mm; + mminfotype mmi; } global_game_variables_t; #endif /* _TYPEDEFSTRUCT_H_ */ -- 2.39.2