new compacts, new loading + saving code (not compatible to old one)

svn-id: r9439
This commit is contained in:
Robert Göffringmann 2003-08-03 17:17:24 +00:00
parent d6937ec256
commit 31a143dcd4
8 changed files with 213 additions and 149 deletions

View file

@ -47,8 +47,44 @@
#define MK32_A5(type, item) MK32(type, item[0]), MK32(type, item[1]), \
MK32(type, item[2]), MK32(type, item[3]), MK32(type, item[4])
namespace SkyTalkAnims {
extern bool animTalkTableIsPointer[];
extern uint16 animTalkTableVal[];
extern void *animTalkTablePtr[];
};
namespace SkyCompact {
uint16 *getGrafixPtr(Compact *cpt) {
uint16 *buf;
switch (cpt->grafixProg.ptrType) {
case PTR_NULL:
return NULL;
case AUTOROUTE:
if (!cpt->extCompact)
error("::getGrafixPtr: request for AR pointer, extCompact is NULL, though.");
return (cpt->extCompact->animScratch + cpt->grafixProg.pos);
case COMPACT:
buf = (uint16*)SkyState::fetchCompact(cpt->grafixProg.ptrTarget);
if (buf == NULL)
error("::getGrafixPtr: request for cpt %d pointer. It's NULL.", cpt->grafixProg.ptrTarget);
return (buf + cpt->grafixProg.pos);
case COMPACTELEM:
buf = *(uint16 **)SkyCompact::getCompactElem(cpt, cpt->grafixProg.ptrTarget);
if (buf == NULL)
error("::getGrafixPtr: request for elem ptr %d. It's NULL.", cpt->grafixProg.ptrTarget);
return buf + cpt->grafixProg.pos;
case TALKTABLE:
buf = (uint16 *)SkyTalkAnims::animTalkTablePtr[cpt->grafixProg.ptrTarget];
if (buf == NULL)
warning("::getGrafixPtr: request for TT ptr %d -> NULL", cpt->grafixProg.ptrTarget);
return buf + cpt->grafixProg.pos;
default:
error("::getGrafixPtr: unknown grafixProg type for Compact cpt");
}
return NULL; // never reached
}
/**
* Returns the n'th mega set specified by \a megaSet from Compact \a cpt.
*/

View file

@ -30,6 +30,7 @@ namespace SkyCompact {
MegaSet *getMegaSet(Compact *cpt, uint16 megaSet);
uint16 **getTurnTable(Compact *cpt, uint16 megaSet, uint16 dir);
uint16 *getSub(Compact *cpt, uint16 mode);
uint16 *getGrafixPtr(Compact *cpt);
void *getCompactElem(Compact *cpt, uint32 off);
void patchFor288(void);
@ -3232,24 +3233,25 @@ namespace SkyCompact {
extern uint16 retina_scan_cdt[];
extern Compact forklift_cpt;
extern void *data_0[];
extern uint8 babs_auto[];
extern uint8 burke_auto[];
extern uint8 dan_auto[];
extern uint8 foreman_auto[];
extern uint8 full_ss_auto[];
extern uint8 gal_auto[];
extern uint8 jobs_auto[];
extern uint8 joey_auto[];
extern uint8 ken_auto[];
extern uint8 lamb_auto[];
extern uint8 loader_auto[];
extern uint8 medi_auto[];
extern uint8 monitor_auto[];
extern uint8 radman_auto[];
extern uint8 shades_auto[];
extern uint8 spu_auto[];
extern uint8 ss_auto[];
extern uint8 wit_auto[];
extern uint16 babs_auto[];
extern uint16 burke_auto[];
extern uint16 dan_auto[];
extern uint16 foreman_auto[];
extern uint16 full_ss_auto[];
extern uint16 gal_auto[];
extern uint16 jobs_auto[];
extern uint16 joey_auto[];
extern uint16 ken_auto[];
extern uint16 lamb_auto[];
extern uint16 loader_auto[];
extern uint16 medi_auto[];
extern uint16 monitor_auto[];
extern uint16 radman_auto[];
extern uint16 shades_auto[];
extern uint16 spu_auto[];
extern uint16 ss_auto[];
extern uint16 wit_auto[];
extern uint16 minif_auto[];
};
#endif

View file

@ -1128,37 +1128,13 @@ void SkyControl::stosMegaSet(uint8 **destPos, MegaSet *mega) {
// anims, stands, turnTable
}
void SkyControl::stosGrafStr(uint8 **destPos, Compact *cpt) {
uint16 strLen = 0;
uint16 *src = cpt->grafixProg;
if ((cpt->logic == L_AR_ANIM) || (cpt->logic == L_TURNING)) {
if ((!src[0]) && (!src[2])) {
strLen = 3;
} else {
if (!src[0])
strLen += 2;
while (src[strLen])
strLen += 2;
}
} else if ((cpt->logic == L_MOD_ANIMATE) || (cpt->logic == L_TALK) ||
(cpt->logic == L_LISTEN) || (cpt->logic == L_FRAMES)) {
while (src[strLen])
strLen += 3; // start fx, sendsync and coordinates are all 3 words each.
} else {
while (src[strLen]) // this *could* lead to problems... but I can't think
strLen++; // of a way to find the end of the graphics data if
} // the compact isn't in any special graphic mode.
strLen++;
STOSW(*destPos, strLen);
for (uint16 cnt = 0; cnt < strLen; cnt++) {
STOSW(*destPos, src[cnt]);
}
}
void SkyControl::stosStr(uint8 **destPos, Compact *cpt, uint16 type) {
uint16 strLen = 0;
if (type & SAVE_GRAFX)
stosGrafStr(destPos, cpt);
if (type & SAVE_GRAFX) {
STOSW(*destPos, cpt->grafixProg.ptrType);
STOSW(*destPos, cpt->grafixProg.ptrTarget);
STOSW(*destPos, cpt->grafixProg.pos);
}
if (type & SAVE_TURNP) {
uint16 *src = cpt->extCompact->turnProg;
@ -1182,7 +1158,8 @@ void SkyControl::stosCompact(uint8 **destPos, Compact *cpt) {
if (cpt->extCompact->megaSet3) saveType |= SAVE_MEGA3;
if (cpt->extCompact->turnProg) saveType |= SAVE_TURNP;
}
if (cpt->grafixProg) saveType |= SAVE_GRAFX;
if (cpt->grafixProg.ptrType != PTR_NULL)
saveType |= SAVE_GRAFX;
STOSW(*destPos, saveType);
@ -1279,6 +1256,11 @@ uint32 SkyControl::prepareSaveData(uint8 *destBuf) {
for (cnt = 0; cnt < ARRAYSIZE(_saveLoadCpts); cnt++)
stosCompact(&destPos, _saveLoadCpts[cnt]);
for (cnt = 0; cnt < ARRAYSIZE(_saveLoadARs); cnt++)
for (uint8 elemCnt = 0; elemCnt < 32; elemCnt++) {
STOSW(destPos, _saveLoadARs[cnt][elemCnt]);
}
for (cnt = 0; cnt < 3; cnt++)
STOSW(destPos, SkyCompact::park_table[cnt]);
@ -1339,23 +1321,16 @@ void SkyControl::lodsCompact(uint8 **srcPos, Compact *cpt) {
error("Can't restore! SaveData is SAVE_MEGA3 for Compact");
if (saveType & SAVE_GRAFX) {
uint16 grafxLen;
LODSW(*srcPos, grafxLen);
//cpt->grafixProg = (uint16 *)malloc(grafxLen << 1);
/* hack: there's a theoretical possibility that the saving routine detected the
end of the string incorrectly and forgot the end of the data.
By adding 10 zero-words, the data should at least be correctly terminated
(as all grafixProg data is 0-terminated), so if this condition really can
occur, it should only lead to small graphic glitches, not to crashes.*/
cpt->grafixProg = (uint16 *)malloc((grafxLen << 1) + 20);
memset(cpt->grafixProg + grafxLen, 0, 20);
appendMemList(cpt->grafixProg);
for (cnt = 0; cnt < grafxLen; cnt++) {
LODSW(*srcPos, cpt->grafixProg[cnt]);
uint16 tmp;
LODSW(*srcPos, tmp);
cpt->grafixProg.ptrType = (uint8)tmp;
LODSW(*srcPos, cpt->grafixProg.ptrTarget);
LODSW(*srcPos, cpt->grafixProg.pos);
} else {
cpt->grafixProg.ptrType = PTR_NULL;
cpt->grafixProg.ptrTarget = 0;
cpt->grafixProg.pos = 0;
}
} else
cpt->grafixProg = NULL;
if (saveType & SAVE_TURNP) {
uint16 turnLen;
@ -1435,7 +1410,6 @@ void SkyControl::lodsCompact(uint8 **srcPos, Compact *cpt) {
uint16 SkyControl::parseSaveData(uint8 *srcBuf) {
char loadText[] = "Savegame has an old version. Loading it can lead to errors.";
uint32 reloadList[60];
uint32 oldSection = SkyLogic::_scriptVariables[CUR_SECTION];
@ -1451,9 +1425,12 @@ uint16 SkyControl::parseSaveData(uint8 *srcBuf) {
return RESTORE_FAILED;
}
if (saveRev <= OLD_SAVEGAME_TYPE) {
warning("This savegame version is unsupported.");
return RESTORE_FAILED;
}
uint32 music, mouseType, palette, gameVersion;
if (saveRev >= 3) {
LODSD(srcPos, gameVersion);
if (gameVersion != SkyState::_systemVars.gameVersion) {
if ((!SkyState::isCDVersion()) || (gameVersion < 365)) { // cd versions are compatible
@ -1465,10 +1442,7 @@ uint16 SkyControl::parseSaveData(uint8 *srcBuf) {
LODSW(srcPos, _skySound->_saveSounds[0]);
LODSW(srcPos, _skySound->_saveSounds[1]);
_skySound->restoreSfx();
} else {
if(!getYesNo(loadText))
return RESTORE_FAILED;
}
freeMemList(); // memory from last restore isn't needed anymore
LODSD(srcPos, music);
LODSD(srcPos, _savedCharSet);
@ -1484,6 +1458,11 @@ uint16 SkyControl::parseSaveData(uint8 *srcBuf) {
for (cnt = 0; cnt < ARRAYSIZE(_saveLoadCpts); cnt++)
lodsCompact(&srcPos, _saveLoadCpts[cnt]);
for (cnt = 0; cnt < ARRAYSIZE(_saveLoadARs); cnt++)
for (uint8 elemCnt = 0; elemCnt < 32; elemCnt++) {
LODSW(srcPos, _saveLoadARs[cnt][elemCnt]);
}
for (cnt = 0; cnt < 3; cnt++)
LODSW(srcPos, SkyCompact::park_table[cnt]);
@ -1630,8 +1609,8 @@ uint16 *SkyControl::lz77decode(uint16 *data) {
return outBuf;
}
void SkyControl::applyDiff(uint16 *data, uint16 *diffData) {
for (uint16 cnt = 0; cnt < 206; cnt++) {
void SkyControl::applyDiff(uint16 *data, uint16 *diffData, uint16 len) {
for (uint16 cnt = 0; cnt < len; cnt++) {
data += READ_LE_UINT16(diffData);
diffData++;
*data = *diffData;
@ -1644,25 +1623,24 @@ void SkyControl::restartGame(void) {
if (SkyState::_systemVars.gameVersion <= 267)
return; // no restart for floppy demo
uint16 *resetData;
if (SkyState::isCDVersion())
resetData = lz77decode((uint16 *)_resetDataCd);
else {
resetData = lz77decode((uint16 *)_resetData288);
uint16 *resetData = lz77decode((uint16 *)_resetData288);
switch (SkyState::_systemVars.gameVersion) {
case 303:
applyDiff(resetData, (uint16*)_resetDiff303);
applyDiff(resetData, (uint16*)_resetDiff303, 206);
break;
case 331:
applyDiff(resetData, (uint16*)_resetDiff331);
applyDiff(resetData, (uint16*)_resetDiff331, 206);
break;
case 348:
applyDiff(resetData, (uint16*)_resetDiff348);
applyDiff(resetData, (uint16*)_resetDiff348, 206);
break;
case 365:
case 368:
case 372:
applyDiff(resetData, (uint16*)_resetDiffCd, 214);
default:
break;
}
}
// ok, we finally have our savedata
parseSaveData((uint8*)resetData);

View file

@ -112,7 +112,9 @@ class SkyMouse;
#define SAVE_GRAFX 32
#define SAVE_TURNP 64
#define SAVE_FILE_REVISION 3
#define SAVE_FILE_REVISION 5
// skipping revision 4, that one will be used for messy downward compatibility in 0.5.0 branch
#define OLD_SAVEGAME_TYPE 3
struct AllocedMem {
uint16 *mem;
@ -210,7 +212,6 @@ private:
uint16 saveGameToFile(void);
void stosMegaSet(uint8 **destPos, MegaSet *mega);
void stosCompact(uint8 **destPos, Compact *cpt);
void stosGrafStr(uint8 **destPos, Compact *cpt);
void stosStr(uint8 **destPos, Compact *cpt, uint16 type);
uint32 prepareSaveData(uint8 *destBuf);
@ -223,13 +224,14 @@ private:
const char *_savePath;
uint16 *lz77decode(uint16 *data);
void applyDiff(uint16 *data, uint16 *diffData);
void applyDiff(uint16 *data, uint16 *diffData, uint16 len);
static Compact *_saveLoadCpts[833]; //-----------------
static uint8 _resetData288[0x39F2];
static uint16 *_saveLoadARs[19];
static uint8 _resetData288[0x39B8];
static uint8 _resetDiff303[824]; // moved to sky/compacts/savedata.cpp
static uint8 _resetDiff331[824];
static uint8 _resetDiff348[824];
static uint8 _resetDataCd[0x3FDC]; //-----------------
static uint8 _resetDiffCd[856]; //-----------------
AllocedMem *_memListRoot;
void appendMemList(uint16 *pMem);

View file

@ -146,8 +146,12 @@ void SkyLogic::logicScript() {
void SkyLogic::autoRoute() {
_compact->downFlag = _skyAutoRoute->autoRoute(_compact);
if (!_compact->downFlag) // route ok
_compact->grafixProg = (uint16*)_compact->extCompact->animScratch;
if (!_compact->downFlag) { // route ok
_compact->grafixProg.pos = 0;
_compact->grafixProg.ptrTarget = 0;
_compact->grafixProg.ptrType = AUTOROUTE;
//_compact->grafixProg = (uint16*)_compact->extCompact->animScratch;
}
_compact->logic = L_SCRIPT; // continue the script
@ -289,10 +293,12 @@ void SkyLogic::mainAnim() {
/// Extension of arAnim()
_compact->extCompact->waitingFor = 0; // clear possible zero-zero skip
uint16 *sequence = _compact->grafixProg;
//uint16 *sequence = _compact->grafixProg;
uint16 *sequence = SkyCompact::getGrafixPtr(_compact);
if (!*sequence) {
// ok, move to new anim segment
sequence += 2;
_compact->grafixProg.pos += 2;
if (!*sequence) { // end of route?
// ok, sequence has finished
@ -305,7 +311,6 @@ void SkyLogic::mainAnim() {
return;
}
_compact->grafixProg = sequence;
_compact->extCompact->arAnimIndex = 0; // reset position
}
@ -361,9 +366,11 @@ void SkyLogic::alt() {
void SkyLogic::anim() {
/// Follow an animation sequence
uint16 *grafixProg = _compact->grafixProg;
//uint16 *grafixProg = _compact->grafixProg;
uint16 *grafixProg = SkyCompact::getGrafixPtr(_compact);
while (*grafixProg) {
_compact->grafixProg.pos += 3; // all types are 3 words.
if (*grafixProg == LF_START_FX) { // do fx
grafixProg++;
uint16 sound = *grafixProg++;
@ -382,7 +389,6 @@ void SkyLogic::anim() {
_compact->ycood = *grafixProg++;
_compact->frame = *grafixProg++ | _compact->offset;
_compact->grafixProg = grafixProg;
return;
}
}
@ -486,9 +492,9 @@ void SkyLogic::talk() {
SkyState::fetchCompact(_compact->extCompact->spTextId)->status = 0;
}
if (_compact->grafixProg) {
if (SkyCompact::getGrafixPtr(_compact)) {
_compact->frame = _compact->getToFlag; // set character to stand
_compact->grafixProg = NULL;
_compact->grafixProg.ptrType = PTR_NULL;
}
_compact->logic = L_SCRIPT;
@ -503,16 +509,17 @@ void SkyLogic::talk() {
_compact->logic = L_SCRIPT; // restart character control
if (_compact->grafixProg) {
if (SkyCompact::getGrafixPtr(_compact)) {
_compact->frame = _compact->getToFlag; // set character to stand
_compact->grafixProg = 0;
_compact->grafixProg.ptrType = PTR_NULL;
}
logicScript();
return;
}
uint16 *graphixProg = _compact->grafixProg; // no anim file?
//uint16 *graphixProg = _compact->grafixProg; // no anim file?
uint16 *graphixProg = SkyCompact::getGrafixPtr(_compact);
if (graphixProg) {
if ((*graphixProg) && ((_compact->extCompact->spTime != 3) || (!_skySound->speechFinished()))) {
// we will force the animation to finish 3 game cycles
@ -520,11 +527,11 @@ void SkyLogic::talk() {
_compact->frame = *(graphixProg + 2) + _compact->offset;
graphixProg += 3;
_compact->grafixProg = graphixProg;
_compact->grafixProg.pos += 3;
} else {
// we ran out of frames or finished speech, let actor stand still.
_compact->frame = _compact->getToFlag;
_compact->grafixProg = 0;
_compact->grafixProg.ptrType = PTR_NULL;
}
}
@ -626,10 +633,11 @@ void SkyLogic::waitSync() {
void SkyLogic::simpleAnim() {
/// follow an animation sequence module whilst ignoring the coordinate data
uint16 *grafixProg = _compact->grafixProg;
uint16 *grafixProg = SkyCompact::getGrafixPtr(_compact);
// *grafix_prog: command
while (*grafixProg) {
_compact->grafixProg.pos += 3;
if (*grafixProg != SEND_SYNC) {
grafixProg++;
grafixProg++; // skip coordinates
@ -640,8 +648,6 @@ void SkyLogic::simpleAnim() {
else
_compact->frame = *grafixProg + _compact->offset;
grafixProg++;
_compact->grafixProg = grafixProg;
return;
}
@ -1489,12 +1495,16 @@ bool SkyLogic::fnGetTo(uint32 targetPlaceId, uint32 mode, uint32 c) {
bool SkyLogic::fnSetToStand(uint32 a, uint32 b, uint32 c) {
_compact->mood = 1; // high level stood still
uint16 *standList = *(uint16 **)SkyCompact::getCompactElem(_compact, C_STAND_UP
+ _compact->extCompact->megaSet + _compact->extCompact->dir * 4);
_compact->grafixProg.ptrType = COMPACTELEM;
_compact->grafixProg.pos = 0;
_compact->grafixProg.ptrTarget =
C_STAND_UP + _compact->extCompact->megaSet + _compact->extCompact->dir * 4;
_compact->offset = *standList++; // get frames offset
_compact->grafixProg = standList;
uint16 *standList = SkyCompact::getGrafixPtr(_compact);
_compact->offset = *standList; // get frames offset
_compact->logic = L_SIMPLE_MOD;
_compact->grafixProg.pos++;
simpleAnim();
return false; // drop out of script
}
@ -1981,32 +1991,48 @@ bool SkyLogic::fnPause(uint32 cycles, uint32 b, uint32 c) {
}
bool SkyLogic::fnRunAnimMod(uint32 animNo, uint32 b, uint32 c) {
uint16 *animation = (uint16 *)SkyState::fetchCompact(animNo);
uint16 sprite = *animation++; // get sprite set
_compact->offset = sprite;
_compact->grafixProg = animation;
_compact->grafixProg.ptrType = COMPACT;
_compact->grafixProg.ptrTarget = animNo;
_compact->grafixProg.pos = 0;
//uint16 *animation = (uint16 *)SkyState::fetchCompact(animNo);
//uint16 sprite = *animation++; // get sprite set
//_compact->offset = sprite;
_compact->offset = *SkyCompact::getGrafixPtr(_compact);
//_compact->grafixProg = animation;
_compact->grafixProg.pos++;
_compact->logic = L_MOD_ANIMATE;
anim();
return false; // drop from script
}
bool SkyLogic::fnSimpleMod(uint32 animSeqNo, uint32 b, uint32 c) {
uint16 *animSeq = (uint16 *)SkyState::fetchCompact(animSeqNo);
_compact->offset = *animSeq++;
assert(*animSeq != 0);
_compact->grafixProg = animSeq;
_compact->grafixProg.ptrType = COMPACT;
_compact->grafixProg.ptrTarget = animSeqNo;
_compact->grafixProg.pos = 0;
//uint16 *animSeq = (uint16 *)SkyState::fetchCompact(animSeqNo);
//_compact->offset = *animSeq++;
//assert(*animSeq != 0);
_compact->offset = *SkyCompact::getGrafixPtr(_compact);
//_compact->grafixProg = animSeq;
_compact->grafixProg.pos++;
_compact->logic = L_SIMPLE_MOD;
simpleAnim();
return false;
}
bool SkyLogic::fnRunFrames(uint32 sequenceNo, uint32 b, uint32 c) {
uint16 *sequence = (uint16 *)SkyState::fetchCompact(sequenceNo);
_compact->grafixProg.ptrType = COMPACT;
_compact->grafixProg.ptrTarget = sequenceNo;
_compact->grafixProg.pos = 0;
//uint16 *sequence = (uint16 *)SkyState::fetchCompact(sequenceNo);
_compact->logic = L_FRAMES;
_compact->offset = *sequence++;
_compact->grafixProg = sequence;
//_compact->offset = *sequence++;
_compact->offset = *SkyCompact::getGrafixPtr(_compact);
_compact->grafixProg.pos++;
//_compact->grafixProg = sequence;
simpleAnim();
return false;
}
@ -2417,17 +2443,25 @@ void SkyLogic::stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32
animNum += target->extCompact->megaSet / NEXT_MEGA_SET;
animNum &= 0xFF;
if (SkyTalkAnims::animTalkTableIsPointer[animNum]) //is it a pointer?
animPtr = (uint16 *)SkyTalkAnims::animTalkTablePtr[animNum];
else //then it must be a value
animPtr = (uint16 *)SkyState::fetchCompact(SkyTalkAnims::animTalkTableVal[animNum]);
if (SkyTalkAnims::animTalkTableIsPointer[animNum]) { //is it a pointer?
//animPtr = (uint16 *)SkyTalkAnims::animTalkTablePtr[animNum];
target->grafixProg.ptrType = TALKTABLE;
target->grafixProg.ptrTarget = animNum;
} else { //then it must be a value
//animPtr = (uint16 *)SkyState::fetchCompact(SkyTalkAnims::animTalkTableVal[animNum]);
target->grafixProg.ptrType = COMPACT;
target->grafixProg.ptrTarget = SkyTalkAnims::animTalkTableVal[animNum];
}
target->grafixProg.pos = 0;
animPtr = SkyCompact::getGrafixPtr(target);
if (animPtr) {
target->offset = *animPtr++;
target->getToFlag = *animPtr++;
target->grafixProg = animPtr;
} else
target->grafixProg = 0;
target->grafixProg.pos += 2;
} else {
target->grafixProg.ptrType = PTR_NULL;
}
bool speechUsed = false;
// startSpeech returns false if no speech file exists for that text
@ -2477,13 +2511,11 @@ void SkyLogic::stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32
yPos = TOP_LEFT_Y;
textCompact->ycood = yPos;
//_logicTalkButtonRelease = 1;
} else {
//talking off-screen
target->extCompact->spTextId = 0; //don't kill any text 'cos none was made
textCompact->status = 0; //don't display text
//_logicTalkButtonRelease = 1;
}
// In CD version, we're doing the timing by checking when the VOC has stopped playing.
// Setting spTime to 10 thus means that we're doing a pause of 10 gamecycles between

View file

@ -53,7 +53,7 @@ public:
uint16 giveMouseX(void) { return _mouseX; };
uint16 giveMouseY(void) { return _mouseY; };
uint16 giveCurrentMouseType(void) { return _currentCursor; };
bool wasClicked(void) { return _logicClick; };
bool wasClicked(void) { return _logicClick; _logicClick = false; };
void logicClick(void) { _logicClick = true; };
protected:

View file

@ -26,6 +26,14 @@
//This file is incomplete, several flags still missing.
// grafixProg pointer types:
#define PTR_NULL 0
#define AUTOROUTE 1
#define COMPACT 2
#define COMPACTELEM 3 // needed by fnSetToStand
#define TALKTABLE 4
// language codes:
#define SKY_ENGLISH 0
#define SKY_GERMAN 1
#define SKY_FRENCH 2

View file

@ -48,6 +48,12 @@ struct dataFileHeader {
uint16 s_compressed_size;
};
struct GrafixPtr { // replacement for old grafixProg pointer. More savegame compatible.
uint8 ptrType; // ptr to autoroute / to compact / to turntable
uint16 ptrTarget; // compact / turntable number
uint16 pos; // position
};
struct TurnTable {
uint16 *turnTableUp[5];
uint16 *turnTableDown[5];
@ -106,7 +112,7 @@ struct ExtCompact {
uint16 arTargetX;
uint16 arTargetY;
void *animScratch; // data area for AR
uint16 *animScratch; // data area for AR
uint16 megaSet;
MegaSet *megaSet0;
@ -147,7 +153,7 @@ struct Compact {
uint16 flag; // a use any time flag
uint16 mood; // high level - stood or not
uint16 *grafixProg;
GrafixPtr grafixProg;
uint16 offset;
uint16 mode; // which mcode block