mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-31 16:03:24 +00:00
plenty of bugfixes
svn-id: r7264
This commit is contained in:
parent
160c7f2a08
commit
52ee054c4d
@ -155,7 +155,7 @@ void *getCompactElem(Compact *cpt, uint32 off) {
|
||||
|
||||
off -= MEGASET_SIZE;
|
||||
if (off < TURNTABLE_SIZE)
|
||||
return ((uint8 *)(cpt->extCompact->megaSet0->turnTable) + turnTableOffsets[off]);
|
||||
return ((uint8 *)(cpt->extCompact->megaSet1->turnTable) + turnTableOffsets[off]);
|
||||
|
||||
off -= TURNTABLE_SIZE;
|
||||
if (off < MEGASET_SIZE)
|
||||
@ -163,7 +163,7 @@ void *getCompactElem(Compact *cpt, uint32 off) {
|
||||
|
||||
off -= MEGASET_SIZE;
|
||||
if (off < TURNTABLE_SIZE)
|
||||
return ((uint8 *)(cpt->extCompact->megaSet0->turnTable) + turnTableOffsets[off]);
|
||||
return ((uint8 *)(cpt->extCompact->megaSet2->turnTable) + turnTableOffsets[off]);
|
||||
|
||||
off -= TURNTABLE_SIZE;
|
||||
if (off < MEGASET_SIZE)
|
||||
@ -171,10 +171,10 @@ void *getCompactElem(Compact *cpt, uint32 off) {
|
||||
|
||||
off -= MEGASET_SIZE;
|
||||
if (off < TURNTABLE_SIZE)
|
||||
return ((uint8 *)(cpt->extCompact->megaSet0->turnTable) + turnTableOffsets[off]);
|
||||
return ((uint8 *)(cpt->extCompact->megaSet3->turnTable) + turnTableOffsets[off]);
|
||||
off -= TURNTABLE_SIZE;
|
||||
|
||||
error("Offset %X out of bounds of compact", off + COMPACT_SIZE + EXTCOMPACT_SIZE + 4 * MEGASET_SIZE + 4 * 5*5*4);
|
||||
error("Offset %X out of bounds of compact", off + COMPACT_SIZE + EXTCOMPACT_SIZE + 4 * MEGASET_SIZE + 4 * TURNTABLE_SIZE);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -62,7 +62,7 @@ SkyLogic::SkyLogic(SkyDisk *skyDisk, SkyGrid *skyGrid, SkyText *skyText) {
|
||||
}
|
||||
|
||||
void SkyLogic::engine() {
|
||||
Compact *compact2 = SkyState::fetchCompact(141); // logic list
|
||||
Compact *compact2 = SkyState::fetchCompact(_scriptVariables[LOGIC_LIST_NO]);
|
||||
|
||||
while (compact2->logic) { // 0 means end of list
|
||||
if (compact2->logic == 0xffff) {
|
||||
@ -172,7 +172,7 @@ void SkyLogic::arAnim() {
|
||||
// fine because the later collision will almost certainly
|
||||
// take longer to clear than the earlier one.
|
||||
|
||||
if (!collide(SkyState::fetchCompact(_compact->extCompact->waitingFor)))
|
||||
if (collide(SkyState::fetchCompact(_compact->extCompact->waitingFor)))
|
||||
error("stop_and_wait not implemented\n");
|
||||
|
||||
// we are not in fact hitting this person so clr & continue
|
||||
@ -183,14 +183,11 @@ void SkyLogic::arAnim() {
|
||||
|
||||
// ok, our turn to check for collisions
|
||||
|
||||
#define logic_list_no 141
|
||||
uint16 *logicList = (uint16 *)SkyState::fetchCompact(logic_list_no);
|
||||
uint16 *logicList = (uint16 *)SkyState::fetchCompact(_scriptVariables[LOGIC_LIST_NO]);
|
||||
Compact *cpt = 0;
|
||||
|
||||
for (;;) {
|
||||
uint16 id = *logicList++; // get an id
|
||||
if (!id) // 0 is list end
|
||||
break;
|
||||
uint16 id;
|
||||
while ((id = *logicList++) != 0) { // get an id
|
||||
|
||||
if (id == 0xffff) { // address change?
|
||||
logicList = (uint16 *)SkyState::fetchCompact(*logicList); // get new logic list
|
||||
@ -241,6 +238,7 @@ void SkyLogic::arAnim() {
|
||||
if (_compact->extCompact->request) {
|
||||
_compact->mode = C_ACTION_MODE; // put into action mode
|
||||
_compact->extCompact->actionSub = _compact->extCompact->request;
|
||||
_compact->extCompact->actionSub_off = 0;
|
||||
_compact->extCompact->request = 0; // trash request
|
||||
_compact->logic = L_SCRIPT;
|
||||
logicScript();
|
||||
@ -251,7 +249,7 @@ void SkyLogic::arAnim() {
|
||||
// if change then re-run the current script, which must be
|
||||
// a position independent get-to ----
|
||||
|
||||
if (_compact->extCompact->atWatch) { // any flag set?
|
||||
if (!_compact->extCompact->atWatch) { // any flag set?
|
||||
mainAnim();
|
||||
return;
|
||||
}
|
||||
@ -281,7 +279,9 @@ void SkyLogic::mainAnim() {
|
||||
if (!*sequence) { // end of route?
|
||||
// ok, sequence has finished
|
||||
|
||||
_compact->extCompact->arAnimIndex = 0; // will start afresh if new sequence continues in last direction
|
||||
// will start afresh if new sequence continues in last direction
|
||||
_compact->extCompact->arAnimIndex = 0;
|
||||
|
||||
_compact->downFlag = 0; // pass back ok to script
|
||||
_compact->logic = L_SCRIPT;
|
||||
logicScript();
|
||||
@ -307,21 +307,21 @@ void SkyLogic::mainAnim() {
|
||||
}
|
||||
};
|
||||
|
||||
uint16 *animUp = (uint16 *)SkyCompact::getCompactElem(_compact,
|
||||
C_ANIM_UP + _compact->extCompact->megaSet + (dir << 4));
|
||||
uint16 **anim = (uint16 **)SkyCompact::getCompactElem(_compact,
|
||||
C_ANIM_UP + _compact->extCompact->megaSet + dir * 4);
|
||||
|
||||
uint16 arAnimIndex = _compact->extCompact->arAnimIndex;
|
||||
if (!animUp[arAnimIndex/2]) {
|
||||
if (!(*anim)[arAnimIndex/2]) {
|
||||
arAnimIndex = 0;
|
||||
_compact->extCompact->arAnimIndex = 0; // reset
|
||||
}
|
||||
|
||||
_compact->extCompact->arAnimIndex += S_LENGTH;
|
||||
|
||||
*sequence -= animUp[(S_COUNT + arAnimIndex)/2]; // reduce the distance to travel
|
||||
_compact->frame = animUp[(S_FRAME + arAnimIndex)/2]; // new graphic frame
|
||||
_compact->xcood += animUp[(S_AR_X + arAnimIndex)/2]; // update x coordinate
|
||||
_compact->ycood += animUp[(S_AR_Y + arAnimIndex)/2]; // update y coordinate
|
||||
*sequence -= (*anim)[(S_COUNT + arAnimIndex)/2]; // reduce the distance to travel
|
||||
_compact->frame = (*anim)[(S_FRAME + arAnimIndex)/2]; // new graphic frame
|
||||
_compact->xcood += (*anim)[(S_AR_X + arAnimIndex)/2]; // update x coordinate
|
||||
_compact->ycood += (*anim)[(S_AR_Y + arAnimIndex)/2]; // update y coordinate
|
||||
}
|
||||
|
||||
void SkyLogic::arTurn() {
|
||||
@ -1320,18 +1320,15 @@ uint32 SkyLogic::fnClearRequest(uint32 a, uint32 b, uint32 c) {
|
||||
uint32 SkyLogic::fnCheckRequest(uint32 a, uint32 b, uint32 c) {
|
||||
// check for interaction request
|
||||
|
||||
a = (a & 0xffffff00) | 1; // assume script continue
|
||||
|
||||
ExtCompact *ecpt = _compact->extCompact;
|
||||
|
||||
if (!ecpt->request)
|
||||
return a;
|
||||
if (!_compact->extCompact->request)
|
||||
return 1;
|
||||
|
||||
_compact->mode = C_ACTION_MODE; // into action mode
|
||||
|
||||
ecpt->actionSub = ecpt->request;
|
||||
_compact->extCompact->actionSub = _compact->extCompact->request;
|
||||
_compact->extCompact->actionSub_off = 0;
|
||||
|
||||
ecpt->request = 0; // trash request
|
||||
_compact->extCompact->request = 0; // trash request
|
||||
return 0; // drop from script
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
|
||||
// scriptVariable offsets
|
||||
#define RESULT 1
|
||||
#define LOGIC_LIST_NO 3
|
||||
#define CUR_ID 13
|
||||
#define HIT_ID 38
|
||||
#define THE_CHOSEN_ONE 52
|
||||
|
Loading…
x
Reference in New Issue
Block a user