rockbox/apps/plugins/xworld/resource.h
Franklin Wei 33cb13dee5 Xworld - Another World interpreter for Rockbox
Co-conspirators: Franklin Wei, Benjamin Brown

--------------------------------------------------------------------
This work is based on:
- Fabien Sanglard's "Fabother World" based on
- Piotr Padkowski's newRaw interpreter which was based on
- Gregory Montoir's reverse engineering of
- Eric Chahi's assembly code

--------------------------------------------------------------------
Progress:

* The plugin runs pretty nicely (with sound!) on most color targets
* Keymaps for color LCD targets are complete
* The manual entry is finished
* Grayscale/monochrome support is NOT PLANNED
  - the game looks horrible in grayscale! :p

--------------------------------------------------------------------
Notes:

* The original game strings were built-in to the executable, and
  were copyrighted and could not be used.
* This port ships with an alternate set of strings by default, but
  can load the "official" strings from a file at runtime.

--------------------------------------------------------------------
To be done (in descending order of importance):

* vertical stride compatibility                          <30% done>
* optimization                                           <10% done>

Change-Id: I3155b0d97c2ac470cb8a2040f40d4139ddcebfa5
Reviewed-on: http://gerrit.rockbox.org/1077
Reviewed-by: Michael Giacomelli <giac2000@hotmail.com>
2014-12-23 23:48:12 +01:00

107 lines
3.3 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2014 Franklin Wei, Benjamin Brown
* Copyright (C) 2004 Gregory Montoir
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
***************************************************************************/
#ifndef __RESOURCE_H__
#define __RESOURCE_H__
#include "intern.h"
#define MEMENTRY_STATE_END_OF_MEMLIST 0xFF
#define MEMENTRY_STATE_NOT_NEEDED 0
#define MEMENTRY_STATE_LOADED 1
#define MEMENTRY_STATE_LOAD_ME 2
/*
This is a directory entry. When the game starts, it loads memlist.bin and
populate and array of MemEntry
*/
typedef struct MemEntry {
uint8_t state; /* 0x0 */
uint8_t type; /* 0x1, Resource::ResType */
uint8_t *bufPtr; /* 0x2 */
uint16_t unk4; /* 0x4, unused */
uint8_t rankNum; /* 0x6 */
uint8_t bankId; /* 0x7 */
uint32_t bankOffset; /* 0x8 0xA */
uint16_t unkC; /* 0xC, unused */
uint16_t packedSize; /* 0xE */
/* All ressources are packed (for a gain of 28% according to Chahi) */
uint16_t unk10; /* 0x10, unused */
uint16_t size; /* 0x12 */
} __attribute__((packed)) MemEntry;
/*
Note: state is not a boolean, it can have value 0, 1, 2 or 255, respectively meaning:
0:NOT_NEEDED
1:LOADED
2:LOAD_ME
255:END_OF_MEMLIST
See MEMENTRY_STATE_* #defines above.
*/
struct Serializer;
struct Video;
#define MEM_BLOCK_SIZE (600 * 1024)
#define RT_SOUND 0
#define RT_MUSIC 1
#define RT_POLY_ANIM 2
#define RT_PALETTE 3
#define RT_BYTECODE 4
#define RT_POLY_CINEMATIC 5
struct Resource {
struct Video *video;
struct System *sys;
const char *_dataDir;
struct MemEntry _memList[150];
uint16_t _numMemList;
uint16_t currentPartId, requestedNextPart;
uint8_t *_memPtrStart, *_scriptBakPtr, *_scriptCurPtr, *_vidBakPtr, *_vidCurPtr;
bool _useSegVideo2;
uint8_t *segPalettes;
uint8_t *segBytecode;
uint8_t *segCinematic;
uint8_t *_segVideo2;
};
void res_create(struct Resource*, struct Video*, struct System*, const char* dataDir);
void res_readBank(struct Resource*, const MemEntry *me, uint8_t *dstBuf);
void res_readEntries(struct Resource*);
void res_loadMarkedAsNeeded(struct Resource*);
void res_invalidateAll(struct Resource*);
void res_invalidateRes(struct Resource*);
void res_loadPartsOrMemoryEntry(struct Resource*, uint16_t num);
void res_setupPart(struct Resource*, uint16_t ptrId);
void res_allocMemBlock(struct Resource*);
void res_freeMemBlock(struct Resource*);
void res_saveOrLoad(struct Resource*, struct Serializer *ser);
const char* res_getDataDir(struct Resource*);
#endif