Commit 2b2e53db authored by anotherguest's avatar anotherguest

Initial work to support Scenes better. Most work done through reverse engineering.

parent 630b578a
...@@ -35,11 +35,288 @@ ...@@ -35,11 +35,288 @@
#include "io/sound.h" #include "io/sound.h"
enum
{
ESceneMusic = 0x2A,
ESceneFadeType = 0x3F,
ESceneFontIndex = 0x46,
ESceneTextBlock = 0x40,
ESceneTextColour = 0x41,
ESceneTextPosition = 0x47,
ESceneTextAlign = 0x4A,
ESceneBackground =0x4c,
ESceneTextRect = 0x57,
ESceneFontDefine = 0x58,
ESceneLength = 0x5d,
ESceneTextLine = 0x5e,
ESceneTextVAdjust = 0x5f,
ESceneAnimationIndex = 0xA7,
ESceneAnimationSetting = 0xA6,
ESceneTextShadow = 0xdb
};
void Scene::ParseAni(File* f) {
unsigned short int aniType = f->loadShort();// should be 0x20
unsigned short int aniOffset = f->loadShort();// unknown
unsigned short int type = 0;//
int loop;
while(type != 0x4C50) {
type = f->loadShort();
if(type == 0x4C53) { // SL
unsigned short int offset = f->loadShort();
unsigned char noSounds = f->loadChar();
for(loop = 0;loop<noSounds;loop++) {
char* soundName = f->loadString();
log("Soundname %s", soundName);
free(soundName);
}
}
else if(type == 0x4C50) // PL
{
unsigned short int len = f->loadShort();
unsigned char* buffer = f->loadBlock(len);
for (int count = 0; count < 256; count++) {
// Palette entries are 6-bit
// Shift them upwards to 8-bit, and fill in the lower 2 bits
scenePalette[count].r = (buffer[count * 3] << 2) + (buffer[count * 3] >> 4);
scenePalette[count].g = (buffer[(count * 3) + 1] << 2) +
(buffer[(count * 3) + 1] >> 4);
scenePalette[count].b = (buffer[(count * 3) + 2] << 2) +
(buffer[(count * 3) + 2] >> 4);
}
delete[] buffer;
int pos = f->tell();
unsigned short int value = f->loadShort();
sceneBGs[imageIndex] = f->loadSurface(320, 200, true);
imageIndex++;
pos = f->tell();
}
}
}
void Scene::ParseData(File *f) {
int loop;
for(loop = 0;loop < dataItems; loop++) {
f->seek(dataOffsets[loop], true); // Seek to data start
unsigned short int dataLen = f->loadShort(); // Get get the length of the datablock
if(dataLen == 0x4e41) {
ParseAni(f);
}
else
{
unsigned char type = f->loadChar();
log("Type:", type);
switch(type)
{
case 3:
case 4: // image
case 5:
{
unsigned short int width = f->loadShort(); // get width
unsigned short int height;
if(type == 3)
height = f->loadChar(); // Get height
else
height = f->loadShort(); // Get height
if(imageIndex<100)
{
f->seek(-2, false);
sceneBGs[imageIndex] = f->loadSurface(width, height);
imageIndex++;
}
}break;
default:
{
f->seek(-3, false);
f->loadPalette(scenePalette);
usePalette(scenePalette);
}
break;
}
}
}
}
void Scene::ParseScripts(File *f) {
int loop;
char *string;
for(loop = 0;loop < scriptItems; loop++)
{
f->seek(scriptStarts[loop], true); // Seek to data start
if(f->loadChar() == 0x50) // Script tag
{
signed long int scriptid = f->loadInt();
unsigned char type = 0;
bool breakloop = false;
while(!breakloop)
{
type = f->loadChar();
switch(type)
{
case ESceneAnimationSetting:
{
signed long int something = f->loadInt();
signed long int something2 = f->loadInt();
}break;
case ESceneAnimationIndex:
{
unsigned char aniIndex = f->loadChar();
}break;
case ESceneFadeType:
{
unsigned char fadein = f->loadChar();
}break;
case ESceneBackground:
{
signed long int something = f->loadInt();
unsigned short bgImageIndex = f->loadShort();
}break;
case ESceneMusic:
{
// Music file name
string = f->loadString();
playMusic(string);
delete[] string;
}break;
case ESceneTextRect: // String
{
unsigned short x = f->loadShort();
unsigned short y = f->loadShort();
unsigned short w = f->loadShort();
unsigned short h = f->loadShort();
log("Text rectangle xpos:", x);
}break;
case ESceneFontDefine: // Font defnition
{
unsigned short fontindex = f->loadShort();
char* fontname = f->loadString();
log("Fontname", fontname);
free(fontname);
}break;
case ESceneTextPosition:
{
unsigned short newx = f->loadShort();
unsigned short newy = f->loadShort();
log("TextPosition x*y", newx*newy);
}
break;
case ESceneTextColour:
case ESceneFontIndex:
case ESceneTextVAdjust:
case ESceneTextShadow:
{
unsigned short value = f->loadShort();
}break;
case ESceneTextAlign:
{
unsigned char alignment = f->loadChar();
}break;
case ESceneTextLine:
case ESceneTextBlock:
{
unsigned char datalen = f->loadChar();
unsigned char* block = f->loadBlock(datalen);
unsigned char pos = 0;
// Convert to ascii
while(datalen>0)
{
if(block[pos]>='a'-70 && block[pos]<='z'-70)
{
block[pos]+=70;
}
else if(block[pos]>='A'-64 && block[pos]<='Z'-64)
{
block[pos]+=64;
}
else if(block[pos]>='0'+5 && block[pos]<='9'+5)
{
block[pos]-=5;
}
else if(block[pos] == 0x7f)
{
block[pos]=' ';
}
else if(block[pos] == 0x73)
{
block[pos]='\'';
}
else if(block[pos] == 'r')
{
block[pos]=':';
}
else if(block[pos] == 'o')
{
block[pos]='(';
}
else if(block[pos] == 'p')
{
block[pos]=')';
}
else if(block[pos] == 0x6b)
{
block[pos]='!';
}
else if(block[pos] == 0x68)
{
block[pos]='-';
}
else if(block[pos] == 0x67)
{
block[pos]='?';
}
else if(block[pos] == 0x66)
{
block[pos]='.';
}
else if(block[pos] == 0x65)
{
block[pos]=',';
}
else if(block[pos] == '?')
{
block[pos]='$';
}
pos++;
datalen--;
}
}break;
case ESceneLength:
unsigned short int sceneLength = f->loadShort();
break;
case 0x3e:
case 0x51:
breakloop = true;
f->loadChar();
break;
default:
{
breakloop = true;
}
break;
}
}
}
}
}
Scene::Scene (char * fileName) { Scene::Scene (char * fileName) {
File *file; File *file;
char *string; char *string;
int type; int type;
int loop;
try { try {
...@@ -50,9 +327,32 @@ Scene::Scene (char * fileName) { ...@@ -50,9 +327,32 @@ Scene::Scene (char * fileName) {
throw e; throw e;
} }
imageIndex = 0;
file->seek(0x13, true); // Skip Digital Dimensions header
signed long int dataOffset = file->loadInt(); //get offset pointer to first data block
scriptItems = file->loadShort(); // Get number of script items
scriptStarts = new signed long int[scriptItems];
for(loop = 0;loop < scriptItems; loop++)
{
scriptStarts[loop] = file->loadInt();// Load offset to script
}
// TODO: Correct loading of cutscene data // Seek to datastart now
file->seek(dataOffset, true); // Seek to data offsets
dataItems = file->loadShort()+1; // Get number of data items
dataOffsets = new signed long int[dataItems];
for(loop = 0;loop < dataItems; loop++)
{
dataOffsets[loop] = file->loadInt();// Load offset to script
}
ParseData(file);
ParseScripts(file);
delete []scriptStarts;
delete []dataOffsets;
/*
// Skip to files // Skip to files
file->seek(25, true); file->seek(25, true);
file->seek(file->loadChar(), true); file->seek(file->loadChar(), true);
...@@ -160,7 +460,7 @@ Scene::Scene (char * fileName) { ...@@ -160,7 +460,7 @@ Scene::Scene (char * fileName) {
// log("Pixels", file->tell()); // log("Pixels", file->tell());
sceneBGs[0] = file->loadSurface(320, 200); sceneBGs[0] = file->loadSurface(320, 200);
*/
delete file; delete file;
return; return;
...@@ -181,21 +481,32 @@ Scene::~Scene () { ...@@ -181,21 +481,32 @@ Scene::~Scene () {
int Scene::play () { int Scene::play () {
SDL_Rect dst; SDL_Rect dst;
unsigned int sceneIndex = 0;
while (true) { while (true) {
if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT; if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT;
if (controls.release(C_ENTER) || controls.release(C_ESCAPE)) if (controls.release(C_ESCAPE)) {
return E_NONE; return E_NONE;
// TODO: Display cutscene }
if(controls.release(C_ENTER))
{
sceneIndex++;
if(sceneIndex == scriptItems)
{
return E_NONE;
}
}
// Temporary stuff // Temporary stuff
clearScreen(BLACK); clearScreen(BLACK);
dst.x = (screenW - 320) >> 1; dst.x = (screenW - 320) >> 1;
dst.y = (screenH - 200) >> 1; dst.y = (screenH - 200) >> 1;
SDL_BlitSurface(sceneBGs[0], NULL, screen, &dst); if(sceneBGs[0])
SDL_BlitSurface(sceneBGs[0], NULL, screen, &dst);
SDL_Delay(T_FRAME); SDL_Delay(T_FRAME);
} }
......
...@@ -23,18 +23,25 @@ ...@@ -23,18 +23,25 @@
#ifndef _SCENE_H #ifndef _SCENE_H
#define _SCENE_H #define _SCENE_H
#include <io/file.h>
#include <SDL/SDL.h> #include <sdl.h>
// Class // Class
class Scene { class Scene {
private: private:
SDL_Surface *sceneBGs[1]; SDL_Surface *sceneBGs[100];
SDL_Color scenePalette[256]; SDL_Color scenePalette[256];
unsigned short int scriptItems;
unsigned short int dataItems;
signed long int* scriptStarts;
signed long int* dataOffsets;
int imageIndex;
protected:
void ParseScripts(File *f);
void ParseData(File *f);
void ParseAni(File* f);
public: public:
Scene (char * fileName); Scene (char * fileName);
~Scene (); ~Scene ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment