2011-06-10 07:45:18 +02:00
|
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
|
*
|
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
|
*
|
|
|
|
|
* 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 program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This code is based on original Soltys source code
|
|
|
|
|
* Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
|
|
|
|
|
*/
|
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
#include "cge/general.h"
|
|
|
|
|
#include "cge/sound.h"
|
|
|
|
|
#include "cge/snail.h"
|
|
|
|
|
#include "cge/vga13h.h"
|
|
|
|
|
#include "cge/text.h"
|
|
|
|
|
#include "cge/cge_main.h"
|
2011-07-02 16:19:36 +10:00
|
|
|
|
#include "cge/events.h"
|
2011-07-13 21:04:44 +10:00
|
|
|
|
#include "cge/walk.h"
|
2011-06-09 08:20:53 +02:00
|
|
|
|
|
2011-06-10 22:57:09 +02:00
|
|
|
|
namespace CGE {
|
|
|
|
|
|
2011-09-17 23:03:37 +02:00
|
|
|
|
const char *Snail::_comText[] = {
|
|
|
|
|
"LABEL", "PAUSE", "WAIT", "LEVEL", "HIDE",
|
|
|
|
|
"SAY", "INF", "TIME", "CAVE", "KILL",
|
|
|
|
|
"RSEQ", "SEQ", "SEND", "SWAP", "KEEP",
|
|
|
|
|
"GIVE", "IF", "GAME", "SETX0", "SETY0",
|
|
|
|
|
"SLAVE", "SETXY", "RELX", "RELY", "RELZ",
|
|
|
|
|
"SETX", "SETY", "SETZ", "TRANS", "PORT",
|
|
|
|
|
"NEXT", "NNEXT", "TNEXT", "RNNEXT", "RTNEXT",
|
|
|
|
|
"RMNEAR", "RMTAKE", "FLAG", "SETREF", "BACKPT",
|
|
|
|
|
"FLASH", "LIGHT", "SETHB", "SETVB", "WALK",
|
|
|
|
|
"REACH", "COVER", "UNCOVER", "CLEAR", "TALK",
|
|
|
|
|
"MOUSE", "SOUND", "COUNT", NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Snail::Snail(CGEEngine *vm, bool turbo)
|
|
|
|
|
: _turbo(turbo), _busy(false), _textDelay(false),
|
|
|
|
|
_timerExpiry(0), _talkEnable(true),
|
|
|
|
|
_head(0), _tail(0), _snList((Command *)malloc(sizeof(Command) * 256)), _vm(vm) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Snail::~Snail() {
|
|
|
|
|
free(_snList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a Command on the head of _snList
|
|
|
|
|
* @param com Command
|
|
|
|
|
* @param ref Reference
|
|
|
|
|
* @param val Value
|
|
|
|
|
* @param ptr Sprite pointer
|
|
|
|
|
*/
|
|
|
|
|
void Snail::addCommand(SnCom com, int ref, int val, void *ptr) {
|
|
|
|
|
Command *snc = &_snList[_head++];
|
|
|
|
|
snc->_com = com;
|
|
|
|
|
snc->_ref = ref;
|
|
|
|
|
snc->_val = val;
|
|
|
|
|
snc->_spritePtr = ptr;
|
|
|
|
|
snc->_cbType = kNullCB;
|
|
|
|
|
if (com == kSnClear) {
|
|
|
|
|
_tail = _head;
|
|
|
|
|
_vm->killText();
|
|
|
|
|
_timerExpiry = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a Callback on the head of _snList
|
|
|
|
|
* @param com Command
|
|
|
|
|
* @param ref Reference
|
|
|
|
|
* @param val Value
|
|
|
|
|
* @param CallbackType Callback type
|
|
|
|
|
*/
|
|
|
|
|
void Snail::addCallback(SnCom com, int ref, int val, CallbackType cbType) {
|
|
|
|
|
Command *snc = &_snList[_head++];
|
|
|
|
|
snc->_com = com;
|
|
|
|
|
snc->_ref = ref;
|
|
|
|
|
snc->_val = val;
|
|
|
|
|
snc->_spritePtr = NULL;
|
|
|
|
|
snc->_cbType = cbType;
|
|
|
|
|
if (com == kSnClear) {
|
|
|
|
|
_tail = _head;
|
|
|
|
|
_vm->killText();
|
|
|
|
|
_timerExpiry = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a Command on the tail of _snList
|
|
|
|
|
* @param com Command
|
|
|
|
|
* @param ref Reference
|
|
|
|
|
* @param val Value
|
|
|
|
|
* @param ptr Sprite pointer
|
|
|
|
|
*/
|
|
|
|
|
void Snail::insertCommand(SnCom com, int ref, int val, void *ptr) {
|
|
|
|
|
Command *snc;
|
|
|
|
|
|
|
|
|
|
if (_busy) {
|
|
|
|
|
_snList[(_tail - 1) & 0xFF] = _snList[_tail];
|
|
|
|
|
snc = &_snList[_tail];
|
|
|
|
|
} else
|
|
|
|
|
snc = &_snList[(_tail - 1) & 0xFF];
|
|
|
|
|
_tail--;
|
|
|
|
|
snc->_com = com;
|
|
|
|
|
snc->_ref = ref;
|
|
|
|
|
snc->_val = val;
|
|
|
|
|
snc->_spritePtr = ptr;
|
|
|
|
|
snc->_cbType = kNullCB;
|
|
|
|
|
if (com == kSnClear) {
|
|
|
|
|
_tail = _head;
|
|
|
|
|
_vm->killText();
|
|
|
|
|
_timerExpiry = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Snail::runCommand() {
|
|
|
|
|
if (_busy)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_busy = true;
|
|
|
|
|
uint8 tmpHead = _head;
|
|
|
|
|
while (_tail != tmpHead) {
|
|
|
|
|
Command *snc = &_snList[_tail];
|
|
|
|
|
|
|
|
|
|
if (!_turbo) { // only for the slower one
|
|
|
|
|
if (_timerExpiry) {
|
|
|
|
|
// Delay in progress
|
|
|
|
|
if (_timerExpiry > g_system->getMillis())
|
|
|
|
|
// Delay not yet ended
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// Delay is finished
|
|
|
|
|
_timerExpiry = 0;
|
|
|
|
|
} else {
|
|
|
|
|
if (_textDelay) {
|
|
|
|
|
_vm->killText();
|
|
|
|
|
_textDelay = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (_vm->_talk && snc->_com != kSnPause)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Sprite *spr = ((snc->_ref >= 0) ? _vm->locate(snc->_ref) : ((Sprite *) snc->_spritePtr));
|
|
|
|
|
switch (snc->_com) {
|
|
|
|
|
case kSnLabel:
|
|
|
|
|
break;
|
|
|
|
|
case kSnPause :
|
|
|
|
|
_timerExpiry = g_system->getMillis() + snc->_val * kSnailFrameDelay;
|
|
|
|
|
if (_vm->_talk)
|
|
|
|
|
_textDelay = true;
|
|
|
|
|
break;
|
|
|
|
|
case kSnWait:
|
|
|
|
|
if (spr) {
|
|
|
|
|
if (spr->seqTest(snc->_val) &&
|
|
|
|
|
(snc->_val >= 0 || spr != _vm->_hero || _vm->_hero->_tracePtr < 0)) {
|
|
|
|
|
_timerExpiry = g_system->getMillis() + spr->_time * kSnailFrameDelay;
|
|
|
|
|
} else {
|
|
|
|
|
_busy = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kSnLevel:
|
|
|
|
|
_vm->snLevel(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnHide:
|
|
|
|
|
_vm->snHide(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSay:
|
|
|
|
|
if (spr && _talkEnable) {
|
|
|
|
|
if (spr == _vm->_hero && spr->seqTest(-1))
|
|
|
|
|
spr->step(kSeqHTalk);
|
|
|
|
|
_vm->_text->say(_vm->_text->getText(snc->_val), spr);
|
|
|
|
|
_vm->_sys->_funDel = kHeroFun0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kSnInf:
|
|
|
|
|
if (_talkEnable) {
|
|
|
|
|
_vm->inf(_vm->_text->getText(snc->_val));
|
|
|
|
|
_vm->_sys->_funDel = kHeroFun0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kSnTime:
|
|
|
|
|
if (spr && _talkEnable) {
|
|
|
|
|
if (spr == _vm->_hero && spr->seqTest(-1))
|
|
|
|
|
spr->step(kSeqHTalk);
|
|
|
|
|
_vm->_text->sayTime(spr);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kSnCave:
|
|
|
|
|
_vm->switchScene(snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnKill:
|
|
|
|
|
_vm->snKill(spr);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSeq:
|
|
|
|
|
_vm->snSeq(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRSeq:
|
|
|
|
|
_vm->snRSeq(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSend:
|
|
|
|
|
_vm->snSend(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSwap:
|
|
|
|
|
_vm->snSwap(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnCover:
|
|
|
|
|
_vm->snCover(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnUncover:
|
|
|
|
|
_vm->snUncover(spr, (snc->_val >= 0) ? _vm->locate(snc->_val) : ((Sprite *) snc->_spritePtr));
|
|
|
|
|
break;
|
|
|
|
|
case kSnKeep:
|
|
|
|
|
_vm->snKeep(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnGive:
|
|
|
|
|
_vm->snGive(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnGame:
|
|
|
|
|
_vm->snGame(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetX0:
|
|
|
|
|
_vm->snSetX0(snc->_ref, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetY0:
|
|
|
|
|
_vm->snSetY0(snc->_ref, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetXY:
|
|
|
|
|
_vm->snSetXY(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRelX:
|
|
|
|
|
_vm->snRelX(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRelY:
|
|
|
|
|
_vm->snRelY(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRelZ:
|
|
|
|
|
_vm->snRelZ(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetX:
|
|
|
|
|
_vm->snSetX(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetY:
|
|
|
|
|
_vm->snSetY(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetZ:
|
|
|
|
|
_vm->snSetZ(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSlave:
|
|
|
|
|
_vm->snSlave(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnTrans:
|
|
|
|
|
_vm->snTrans(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnPort:
|
|
|
|
|
_vm->snPort(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnNext:
|
|
|
|
|
case kSnIf:
|
|
|
|
|
case kSnTalk:
|
|
|
|
|
break;
|
|
|
|
|
case kSnMouse:
|
|
|
|
|
_vm->snMouse(snc->_val != 0);
|
|
|
|
|
break;
|
|
|
|
|
case kSnNNext:
|
|
|
|
|
_vm->snNNext(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnTNext:
|
|
|
|
|
_vm->snTNext(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRNNext:
|
|
|
|
|
_vm->snRNNext(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRTNext:
|
|
|
|
|
_vm->snRTNext(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRMNear:
|
|
|
|
|
_vm->snRmNear(spr);
|
|
|
|
|
break;
|
|
|
|
|
case kSnRmTake:
|
|
|
|
|
_vm->snRmTake(spr);
|
|
|
|
|
break;
|
|
|
|
|
case kSnFlag:
|
|
|
|
|
_vm->snFlag(snc->_ref & 3, snc->_val != 0);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetRef:
|
|
|
|
|
_vm->snSetRef(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnBackPt:
|
|
|
|
|
_vm->snBackPt(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnFlash:
|
|
|
|
|
_vm->snFlash(snc->_val != 0);
|
|
|
|
|
break;
|
|
|
|
|
case kSnLight:
|
|
|
|
|
_vm->snLight(snc->_val != 0);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetHBarrier:
|
|
|
|
|
_vm->snHBarrier(snc->_ref, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSetVBarrier:
|
|
|
|
|
_vm->snVBarrier(snc->_ref, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnWalk:
|
|
|
|
|
_vm->snWalk(spr, snc->_ref, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnReach:
|
|
|
|
|
_vm->snReach(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnSound:
|
|
|
|
|
_vm->snSound(spr, snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnCount:
|
|
|
|
|
_vm->_sound->setRepeat(snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kSnExec:
|
|
|
|
|
switch (snc->_cbType) {
|
|
|
|
|
case kQGame:
|
|
|
|
|
_vm->qGame();
|
|
|
|
|
break;
|
|
|
|
|
case kMiniStep:
|
|
|
|
|
_vm->miniStep(snc->_val);
|
|
|
|
|
break;
|
|
|
|
|
case kXScene:
|
|
|
|
|
_vm->xScene();
|
|
|
|
|
break;
|
|
|
|
|
case kSndSetVolume:
|
|
|
|
|
_vm->sndSetVolume();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
error("Unknown Callback Type in SNEXEC");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kSnStep:
|
|
|
|
|
spr->step();
|
|
|
|
|
break;
|
|
|
|
|
case kSnZTrim:
|
|
|
|
|
_vm->snZTrim(spr);
|
|
|
|
|
break;
|
|
|
|
|
case kSnGhost:
|
|
|
|
|
_vm->snGhost((Bitmap *) snc->_spritePtr);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
warning("Unhandled snc->_com in SNMouse(bool)");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_tail++;
|
|
|
|
|
if (!_turbo)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_busy = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Snail::idle() {
|
|
|
|
|
return (_head == _tail);
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snGame(Sprite *spr, int num) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snGame(spr, %d)", num);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
switch (num) {
|
2011-08-20 00:11:30 +02:00
|
|
|
|
case 1: {
|
2011-06-29 00:35:21 +02:00
|
|
|
|
static Sprite *dup[3] = { NULL, NULL, NULL };
|
2011-06-13 11:57:24 +02:00
|
|
|
|
int buref = 0;
|
|
|
|
|
int Stage = 0;
|
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
for (dup[0] = _vga->_showQ->first(); dup[0]; dup[0] = dup[0]->_next) {
|
2011-06-29 00:35:21 +02:00
|
|
|
|
buref = dup[0]->_ref;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (buref / 1000 == 16 && buref % 100 == 6) {
|
|
|
|
|
Stage = (buref / 100) % 10;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (dup[1] == NULL) {
|
2011-07-03 16:22:26 +02:00
|
|
|
|
dup[1] = _vga->_showQ->locate(16003); // pan
|
|
|
|
|
dup[2] = _vga->_showQ->locate(16004); // pani
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-06-13 11:57:24 +02:00
|
|
|
|
|
2011-07-02 18:20:41 +02:00
|
|
|
|
if (_game) { // continue game
|
2011-08-02 21:47:56 +02:00
|
|
|
|
int i = newRandom(3), hand = (dup[0]->_shpCnt == 6);
|
2011-06-29 16:13:17 +02:00
|
|
|
|
Stage++;
|
2011-07-23 14:31:39 +02:00
|
|
|
|
if (hand && Stage > kDressed)
|
2011-06-13 11:57:24 +02:00
|
|
|
|
++hand;
|
2011-08-02 21:47:56 +02:00
|
|
|
|
if (i >= 0 || (dup[i] == spr && newRandom(3) == 0)) {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSeq, -1, 3, dup[0]); // yes
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 3, dup[1]); // yes
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 3, dup[2]); // yes
|
|
|
|
|
_snail->addCommand(kSnTNext, -1, 0, dup[0]); // reset Take
|
|
|
|
|
_snail->addCommand(kSnTNext, -1, 0, dup[1]); // reset Take
|
|
|
|
|
_snail->addCommand(kSnTNext, -1, 0, dup[2]); // reset Take
|
|
|
|
|
_snail->addCommand(kSnNNext, -1, 0, dup[0]); // reset Near
|
|
|
|
|
_snail->addCommand(kSnPause, -1, 72, NULL); // little rest
|
|
|
|
|
_snail->addCommand(kSnSay, 1, 16009, NULL); // hura
|
|
|
|
|
_snail->addCommand(kSnSay, buref, 16010, NULL); // siadaj
|
|
|
|
|
_snail->addCommand(kSnSay, 1, 16011, NULL); // postoj<6F>
|
2011-06-13 11:57:24 +02:00
|
|
|
|
|
|
|
|
|
if (hand) {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSend, 16060 + hand, 16, NULL); // dawaj r<>k<EFBFBD>
|
|
|
|
|
_snail->addCommand(kSnSeq, buref, 4, NULL); // zdejmowanie
|
|
|
|
|
_snail->addCommand(kSnSeq, 16060 + hand, 1, NULL); // ruch
|
|
|
|
|
_snail->addCommand(kSnSound, 16060 + hand, 16002, NULL); // szelest
|
|
|
|
|
_snail->addCommand(kSnWait, 16060 + hand, 3, NULL); // podniesie
|
|
|
|
|
_snail->addCommand(kSnSwap, buref, buref + 100, NULL); // rozdziana
|
|
|
|
|
_snail->addCommand(kSnSeq, 16016, Stage, NULL); // ro<72>nie kupa
|
|
|
|
|
_snail->addCommand(kSnSend, 16060 + hand, -1, NULL); // chowaj r<>k<EFBFBD>
|
|
|
|
|
_snail->addCommand(kSnWait, 16060 + hand, -1, NULL); // r<>ka zamar<61>a
|
2011-06-13 11:57:24 +02:00
|
|
|
|
} else {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSeq, buref, 4, NULL); // zdejmowanie
|
|
|
|
|
_snail->addCommand(kSnSound, 16060 + hand, 16002, NULL); // szelest
|
|
|
|
|
_snail->addCommand(kSnWait, buref, -1, NULL); // zdejmie
|
|
|
|
|
_snail->addCommand(kSnSwap, buref, buref + 100, NULL); // rozdziana
|
|
|
|
|
_snail->addCommand(kSnSeq, 16016, Stage, NULL); // ro<72>nie kupa
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
|
|
|
|
//SNPOST(SNSEQ, buref+100, 0, NULL); // reset
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnPause, -1, 72, NULL); // chwilk<6C>...
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 0, dup[1]); // odstaw Go
|
|
|
|
|
_snail->addCommand(kSnSetXY, -1, 203 + kScrWidth * 49, dup[1]);
|
|
|
|
|
_snail->addCommand(kSnSetZ, -1, 7, dup[1]);
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 0, dup[2]); // odstaw J<>
|
|
|
|
|
_snail->addCommand(kSnSetXY, -1, 182 + kScrWidth * 62, dup[2]);
|
|
|
|
|
_snail->addCommand(kSnSetZ, -1, 9, dup[2]);
|
2011-07-02 18:20:41 +02:00
|
|
|
|
_game = 0;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
return;
|
|
|
|
|
} else {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSeq, -1, 2, dup[0]); // no
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 2, dup[1]); // no
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, 2, dup[2]); // no
|
|
|
|
|
_snail->addCommand(kSnPause, -1, 72, NULL); // 1 sec
|
2011-06-13 13:07:45 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnWalk, 198, 134, NULL); // na miejsce
|
|
|
|
|
_snail->addCommand(kSnWait, 1, -1, NULL); // stoi
|
|
|
|
|
_snail->addCommand(kSnCover, 1, 16101, NULL); // ch<63>op do bicia
|
|
|
|
|
_snail->addCommand(kSnSeq, 16101, 1, NULL); // wystaw
|
|
|
|
|
_snail->addCommand(kSnWait, 16101, 5, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnPause, 16101, 24, NULL); // czekaj chwil<69>
|
|
|
|
|
_snail->addCommand(kSnSeq, 16040, 1, NULL); // plask
|
|
|
|
|
_snail->addCommand(kSnSound, 16101, 16001, NULL); // plask!
|
|
|
|
|
_snail->addCommand(kSnPause, 16101, 24, NULL); // czekaj chwil<69>
|
|
|
|
|
_snail->addCommand(kSnSeq, 16040, 0, NULL); // schowaj plask
|
|
|
|
|
_snail->addCommand(kSnWait, 16101, -1, NULL); // stoi
|
|
|
|
|
_snail->addCommand(kSnUncover, 1, 16101, NULL); // SDS
|
2011-07-02 18:20:41 +02:00
|
|
|
|
if (!_game) {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, buref, 16008, NULL); // zgadnij!
|
2011-07-02 18:20:41 +02:00
|
|
|
|
_game = true;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
2011-07-30 12:52:04 +02:00
|
|
|
|
if (_sprTv == NULL) {
|
|
|
|
|
_sprTv = _vga->_showQ->locate(20700);
|
|
|
|
|
_sprK1 = _vga->_showQ->locate(20701);
|
|
|
|
|
_sprK2 = _vga->_showQ->locate(20702);
|
|
|
|
|
_sprK3 = _vga->_showQ->locate(20703);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-06-13 11:57:24 +02:00
|
|
|
|
|
2011-07-02 18:20:41 +02:00
|
|
|
|
if (!_game) { // init
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnGame, 20002, 2, NULL);
|
2011-07-02 18:20:41 +02:00
|
|
|
|
_game = true;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// cont
|
|
|
|
|
_sprK1->step(newRandom(6));
|
|
|
|
|
_sprK2->step(newRandom(6));
|
|
|
|
|
_sprK3->step(newRandom(6));
|
|
|
|
|
|
|
|
|
|
if (spr->_ref == 1 && _keyboard->_key[kKeyAlt]) {
|
|
|
|
|
_sprK1->step(5);
|
|
|
|
|
_sprK2->step(5);
|
|
|
|
|
_sprK3->step(5);
|
|
|
|
|
}
|
|
|
|
|
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSetZ, 20700, 0, NULL);
|
2011-08-20 00:11:30 +02:00
|
|
|
|
bool hit = (_sprK1->_seqPtr + _sprK2->_seqPtr + _sprK3->_seqPtr == 15);
|
|
|
|
|
if (hit) {
|
|
|
|
|
if (spr->_ref == 1) {
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 1, 20003, NULL); // hura!
|
|
|
|
|
_snail->addCommand(kSnSeq, 20011, 2, NULL); // kamera won
|
|
|
|
|
_snail->addCommand(kSnSend, 20701, -1, NULL); // k1 won
|
|
|
|
|
_snail->addCommand(kSnSend, 20702, -1, NULL); // k2 won
|
|
|
|
|
_snail->addCommand(kSnSend, 20703, -1, NULL); // k3 won
|
|
|
|
|
_snail->addCommand(kSnSend, 20700, -1, NULL); // tv won
|
|
|
|
|
_snail->addCommand(kSnKeep, 20007, 0, NULL); // do kieszeni
|
|
|
|
|
_snail->addCommand(kSnSend, 20006, 20, NULL); // bilon
|
|
|
|
|
_snail->addCommand(kSnSound, 20006, 20002, NULL); // bilon!
|
|
|
|
|
_snail->addCommand(kSnSay, 20002, 20004, NULL);
|
|
|
|
|
_snail->addCommand(kSnSend, 20010, 20, NULL); // papier
|
|
|
|
|
_snail->addCommand(kSnSound, 20010, 20003, NULL); // papier!
|
|
|
|
|
_snail->addCommand(kSnSay, 20001, 20005, NULL);
|
2011-08-20 00:11:30 +02:00
|
|
|
|
_game = false;
|
|
|
|
|
return;
|
|
|
|
|
} else
|
|
|
|
|
_sprK3->step(newRandom(5));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_gameCase2Cpt < 100) {
|
|
|
|
|
switch (_gameCase2Cpt) {
|
|
|
|
|
case 15:
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 20003, 20021, NULL);
|
2011-06-13 13:07:45 +02:00
|
|
|
|
break;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
case 30:
|
|
|
|
|
case 45:
|
|
|
|
|
case 60:
|
|
|
|
|
case 75:
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 20003, 20022, NULL);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
_gameCase2Cpt++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (spr->_ref) {
|
|
|
|
|
case 1:
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 20001, 20011, NULL); // zapro
|
|
|
|
|
_snail->addCommand(kSnSeq, 20001, 1, NULL); // rzu<7A>
|
|
|
|
|
_snail->addCommand(kSnWait, 20001, 1, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSetZ, 20700, 2, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 1, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnWait, 20001, 16, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSeq, 20007, 1, NULL); // lec<65>
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 0, NULL); // poka<6B>
|
|
|
|
|
_snail->addCommand(kSnSound, 20007, 20001, NULL); // grzech
|
|
|
|
|
_snail->addCommand(kSnWait, 20007, -1, NULL); // koniec
|
|
|
|
|
_snail->addCommand(kSnGame, 20001, 2, NULL); // again!
|
2011-08-20 00:11:30 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 20001:
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 20002, 20012, NULL); // zapro
|
|
|
|
|
_snail->addCommand(kSnSeq, 20002, 1, NULL); // rzu<7A>
|
|
|
|
|
_snail->addCommand(kSnWait, 20002, 3, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSetZ, 20700, 2, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 1, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnWait, 20002, 10, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSeq, 20007, 2, NULL); // lec<65>
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 0, NULL); // poka<6B>
|
|
|
|
|
_snail->addCommand(kSnSound, 20007, 20001, NULL); // grzech
|
|
|
|
|
_snail->addCommand(kSnWait, 20007, -1, NULL); // koniec
|
|
|
|
|
_snail->addCommand(kSnGame, 20002, 2, NULL); // again!
|
2011-08-20 00:11:30 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 20002:
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnSay, 20002, 20010, NULL); // zapro
|
|
|
|
|
_snail->addCommand(kSnWalk, 20005, -1, NULL); // do stol
|
|
|
|
|
_snail->addCommand(kSnWait, 1, -1, NULL); // stoi
|
|
|
|
|
_snail->addCommand(kSnCover, 1, 20101, NULL); // grasol
|
|
|
|
|
_snail->addCommand(kSnSeq, 20101, 1, NULL); // rzu<7A>
|
|
|
|
|
_snail->addCommand(kSnWait, 20101, 5, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSetZ, 20700, 2, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 1, NULL); // skryj k
|
|
|
|
|
_snail->addCommand(kSnWait, 20101, 15, NULL); // czekaj
|
|
|
|
|
_snail->addCommand(kSnSeq, 20007, 1, NULL); // lec<65>
|
|
|
|
|
_snail->addCommand(kSnHide, 20007, 0, NULL); // poka<6B>
|
|
|
|
|
_snail->addCommand(kSnSound, 20007, 20001, NULL); // grzech
|
|
|
|
|
_snail->addCommand(kSnWait, 20101, -1, NULL); // koniec
|
|
|
|
|
_snail->addCommand(kSnUncover, 1, 20101, NULL); // SDS
|
|
|
|
|
_snail->addCommand(kSnGame, 1, 2, NULL); // again!
|
2011-08-20 00:11:30 +02:00
|
|
|
|
break;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::expandSprite(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(5, kCGEDebugEngine, "CGEEngine::expandSprite(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr)
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_vga->_showQ->insert(_vga->_spareQ->remove(spr));
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::contractSprite(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::contractSprite(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr)
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_vga->_spareQ->append(_vga->_showQ->remove(spr));
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
int CGEEngine::findPocket(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::findPocket(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-21 01:56:40 +02:00
|
|
|
|
for (int i = 0; i < kPocketNX; i++)
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (_pocket[i] == spr)
|
|
|
|
|
return i;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
return -1;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-04 08:15:56 +02:00
|
|
|
|
void CGEEngine::selectPocket(int n) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::selectPocket(%d)", n);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 11:28:22 +02:00
|
|
|
|
if (n < 0 || (_pocLight->_seqPtr && _pocPtr == n)) {
|
2011-07-02 01:02:14 +02:00
|
|
|
|
_pocLight->step(0);
|
2011-07-02 18:20:41 +02:00
|
|
|
|
n = findPocket(NULL);
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (n >= 0)
|
2011-07-03 11:28:22 +02:00
|
|
|
|
_pocPtr = n;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
} else {
|
2011-06-29 00:35:21 +02:00
|
|
|
|
if (_pocket[n] != NULL) {
|
2011-07-03 11:28:22 +02:00
|
|
|
|
_pocPtr = n;
|
2011-07-02 01:02:14 +02:00
|
|
|
|
_pocLight->step(1);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-07-21 01:56:40 +02:00
|
|
|
|
_pocLight->gotoxy(kPocketX + _pocPtr * kPocketDX + kPocketSX, kPocketY + kPocketSY);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::pocFul() {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::pocFul()");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_hero->park();
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail->addCommand(kSnWait, -1, -1, _hero);
|
|
|
|
|
_snail->addCommand(kSnSeq, -1, kSeqPocketFull, _hero);
|
|
|
|
|
_snail->addCommand(kSnSound, -1, 2, _hero);
|
|
|
|
|
_snail->addCommand(kSnWait, -1, -1, _hero);
|
|
|
|
|
_snail->addCommand(kSnSay, 1, kPocketFull, _hero);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::hide1(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::hide1(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-09-17 23:03:37 +02:00
|
|
|
|
_snail_->addCommand(kSnGhost, -1, 0, spr->ghost());
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snGhost(Bitmap *bmp) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snGhost(bmp)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-12 07:24:20 +02:00
|
|
|
|
bmp->hide(bmp->_map & 0xFFFF, bmp->_map >> 16);
|
2011-06-29 16:13:17 +02:00
|
|
|
|
bmp->_m = NULL;
|
2011-07-12 07:24:20 +02:00
|
|
|
|
bmp->_map = 0;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
delete bmp;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-13 08:44:58 +02:00
|
|
|
|
void CGEEngine::feedSnail(Sprite *spr, SnList snq) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::feedSnail(spr, snq)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr || !spr->active())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
uint8 ptr = (snq == kTake) ? spr->_takePtr : spr->_nearPtr;
|
|
|
|
|
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (ptr == kNoPtr)
|
2011-08-20 00:11:30 +02:00
|
|
|
|
return;
|
|
|
|
|
|
2011-09-17 23:03:37 +02:00
|
|
|
|
Snail::Command *comtab = spr->snList(snq);
|
|
|
|
|
Snail::Command *c = comtab + ptr;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
|
|
|
|
|
if (findPocket(NULL) < 0) { // no empty pockets?
|
2011-09-17 23:03:37 +02:00
|
|
|
|
Snail::Command *p;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
for (p = c; p->_com != kSnNext; p++) { // find KEEP command
|
|
|
|
|
if (p->_com == kSnKeep) {
|
|
|
|
|
pocFul();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-09-17 23:03:37 +02:00
|
|
|
|
if (p->_spritePtr)
|
2011-08-20 00:11:30 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
while (true) {
|
|
|
|
|
if (c->_com == kSnTalk) {
|
|
|
|
|
if ((_snail->_talkEnable = (c->_val != 0)) == false)
|
|
|
|
|
killText();
|
|
|
|
|
}
|
|
|
|
|
if (c->_com == kSnNext) {
|
|
|
|
|
Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
|
|
|
|
|
if (s) {
|
|
|
|
|
uint8 *idx = (snq == kTake) ? &s->_takePtr : &s->_nearPtr;
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (*idx != kNoPtr) {
|
2011-08-20 00:11:30 +02:00
|
|
|
|
int v;
|
|
|
|
|
switch (c->_val) {
|
|
|
|
|
case -1 :
|
|
|
|
|
v = c - comtab + 1;
|
|
|
|
|
break;
|
|
|
|
|
case -2 :
|
|
|
|
|
v = c - comtab;
|
|
|
|
|
break;
|
|
|
|
|
case -3 :
|
|
|
|
|
v = -1;
|
|
|
|
|
break;
|
|
|
|
|
default :
|
|
|
|
|
v = c->_val;
|
|
|
|
|
break;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (v >= 0)
|
|
|
|
|
*idx = v;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (s == spr)
|
2011-09-17 23:03:37 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (c->_com == kSnIf) {
|
|
|
|
|
Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
|
|
|
|
|
if (s) { // sprite extsts
|
|
|
|
|
if (! s->seqTest(-1))
|
|
|
|
|
c = comtab + c->_val; // not parked
|
|
|
|
|
else
|
|
|
|
|
++c;
|
|
|
|
|
} else
|
|
|
|
|
++c;
|
|
|
|
|
} else {
|
|
|
|
|
_snail->addCommand(c->_com, c->_ref, c->_val, spr);
|
|
|
|
|
if (c->_spritePtr)
|
|
|
|
|
break;
|
|
|
|
|
else
|
|
|
|
|
c++;
|
|
|
|
|
}
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-19 07:13:41 +02:00
|
|
|
|
void CGEEngine::snNNext(Sprite *spr, int p) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snNNext(spr, %d)", p);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (spr->_nearPtr != kNoPtr)
|
2011-07-19 07:13:41 +02:00
|
|
|
|
spr->_nearPtr = p;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-19 07:13:41 +02:00
|
|
|
|
void CGEEngine::snTNext(Sprite *spr, int p) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snTNext(spr, %d)", p);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (spr->_takePtr != kNoPtr)
|
2011-07-19 07:13:41 +02:00
|
|
|
|
spr->_takePtr = p;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-19 07:13:41 +02:00
|
|
|
|
void CGEEngine::snRNNext(Sprite *spr, int p) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRNNext(spr, %d)", p);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (spr->_nearPtr != kNoPtr)
|
2011-07-19 07:13:41 +02:00
|
|
|
|
spr->_nearPtr += p;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-07-19 07:13:41 +02:00
|
|
|
|
void CGEEngine::snRTNext(Sprite *spr, int p) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRTNext(spr, %d)", p);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
if (spr->_takePtr != kNoPtr)
|
2011-07-19 07:13:41 +02:00
|
|
|
|
spr->_takePtr += p;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snZTrim(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(4, kCGEDebugEngine, "CGEEngine::snZTrim(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr || !spr->active())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Sprite *s = (spr->_flags._shad) ? spr->_prev : NULL;
|
|
|
|
|
_vga->_showQ->insert(_vga->_showQ->remove(spr));
|
|
|
|
|
if (s) {
|
|
|
|
|
s->_z = spr->_z;
|
|
|
|
|
_vga->_showQ->insert(_vga->_showQ->remove(s), spr);
|
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snHide(Sprite *spr, int val) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snHide(spr, %d)", val);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-08-19 20:36:43 +10:00
|
|
|
|
spr->_flags._hide = (val >= 0) ? (val != 0) : (!spr->_flags._hide);
|
|
|
|
|
if (spr->_flags._shad)
|
|
|
|
|
spr->_prev->_flags._hide = spr->_flags._hide;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRmNear(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRmNear(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
spr->_nearPtr = kNoPtr;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRmTake(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRmTake(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr)
|
2011-08-21 11:15:28 +02:00
|
|
|
|
spr->_takePtr = kNoPtr;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSeq(Sprite *spr, int val) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSeq(spr, %d)", val);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (spr == _hero && val == 0)
|
|
|
|
|
_hero->park();
|
2011-06-13 13:07:45 +02:00
|
|
|
|
else
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->step(val);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRSeq(Sprite *spr, int val) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRSeq(spr, %d)", val);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr)
|
2011-07-05 23:13:12 +02:00
|
|
|
|
snSeq(spr, spr->_seqPtr + val);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSend(Sprite *spr, int val) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSend(spr, %d)", val);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr)
|
|
|
|
|
return;
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
int was = spr->_scene;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
bool was1 = (was == 0 || was == _now);
|
|
|
|
|
bool val1 = (val == 0 || val == _now);
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = val;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (val1 != was1) {
|
|
|
|
|
if (was1) {
|
|
|
|
|
if (spr->_flags._kept) {
|
|
|
|
|
int n = findPocket(spr);
|
|
|
|
|
if (n >= 0)
|
|
|
|
|
_pocket[n] = NULL;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
hide1(spr);
|
|
|
|
|
contractSprite(spr);
|
|
|
|
|
spr->_flags._slav = false;
|
|
|
|
|
} else {
|
|
|
|
|
if (spr->_ref % 1000 == 0)
|
2011-09-17 17:17:22 +02:00
|
|
|
|
_bitmapPalette = _vga->_sysPal;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (spr->_flags._back)
|
|
|
|
|
spr->backShow(true);
|
|
|
|
|
else
|
|
|
|
|
expandSprite(spr);
|
2011-09-17 17:17:22 +02:00
|
|
|
|
_bitmapPalette = NULL;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSwap(Sprite *spr, int xref) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSwap(spr, %d)", xref);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
Sprite *xspr = locate(xref);
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr || !xspr)
|
|
|
|
|
return;
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
int was = spr->_scene;
|
|
|
|
|
int xwas = xspr->_scene;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
bool was1 = (was == 0 || was == _now);
|
|
|
|
|
bool xwas1 = (xwas == 0 || xwas == _now);
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
SWAP(spr->_scene, xspr->_scene);
|
2011-09-06 00:16:07 +02:00
|
|
|
|
SWAP(spr->_x, xspr->_x);
|
|
|
|
|
SWAP(spr->_y, xspr->_y);
|
|
|
|
|
SWAP(spr->_z, xspr->_z);
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (spr->_flags._kept) {
|
|
|
|
|
int n = findPocket(spr);
|
|
|
|
|
if (n >= 0)
|
|
|
|
|
_pocket[n] = xspr;
|
|
|
|
|
xspr->_flags._kept = true;
|
|
|
|
|
xspr->_flags._port = false;
|
|
|
|
|
}
|
|
|
|
|
if (xwas1 != was1) {
|
|
|
|
|
if (was1) {
|
|
|
|
|
hide1(spr);
|
|
|
|
|
contractSprite(spr);
|
|
|
|
|
} else
|
|
|
|
|
expandSprite(spr);
|
|
|
|
|
if (xwas1) {
|
|
|
|
|
hide1(xspr);
|
|
|
|
|
contractSprite(xspr);
|
|
|
|
|
} else
|
|
|
|
|
expandSprite(xspr);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snCover(Sprite *spr, int xref) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snCover(spr, %d)", xref);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
Sprite *xspr = locate(xref);
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr || !xspr)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
spr->_flags._hide = true;
|
|
|
|
|
xspr->_z = spr->_z;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
xspr->_scene = spr->_scene;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
xspr->gotoxy(spr->_x, spr->_y);
|
|
|
|
|
expandSprite(xspr);
|
|
|
|
|
if ((xspr->_flags._shad = spr->_flags._shad) == 1) {
|
|
|
|
|
_vga->_showQ->insert(_vga->_showQ->remove(spr->_prev), xspr);
|
|
|
|
|
spr->_flags._shad = false;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
feedSnail(xspr, kNear);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snUncover(Sprite *spr, Sprite *xspr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snUncover(spr, xspr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr || !xspr)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
spr->_flags._hide = false;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = xspr->_scene;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
spr->gotoxy(xspr->_x, xspr->_y);
|
|
|
|
|
if ((spr->_flags._shad = xspr->_flags._shad) == 1) {
|
|
|
|
|
_vga->_showQ->insert(_vga->_showQ->remove(xspr->_prev), spr);
|
|
|
|
|
xspr->_flags._shad = false;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-08-20 00:11:30 +02:00
|
|
|
|
spr->_z = xspr->_z;
|
|
|
|
|
snSend(xspr, -1);
|
|
|
|
|
if (spr->_time == 0)
|
|
|
|
|
spr->_time++;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
void CGEEngine::snSetX0(int scene, int x0) {
|
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetX0(%d, %d)", scene, x0);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
_heroXY[scene - 1].x = x0;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
void CGEEngine::snSetY0(int scene, int y0) {
|
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetY0(%d, %d)", scene, y0);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
_heroXY[scene - 1].y = y0;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSetXY(Sprite *spr, uint16 xy) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetXY(spr, %d)", xy);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-07-21 01:56:40 +02:00
|
|
|
|
spr->gotoxy(xy % kScrWidth, xy / kScrWidth);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRelX(Sprite *spr, int x) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRelX(spr, %d)", x);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (spr && _hero)
|
|
|
|
|
spr->gotoxy(_hero->_x + x, spr->_y);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRelY(Sprite *spr, int y) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRelY(spr, %d)", y);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (spr && _hero)
|
|
|
|
|
spr->gotoxy(spr->_x, _hero->_y + y);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snRelZ(Sprite *spr, int z) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snRelZ(spr, %d)", z);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (spr && _hero) {
|
|
|
|
|
spr->_z = _hero->_z + z;
|
2011-07-05 23:13:12 +02:00
|
|
|
|
snZTrim(spr);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSetX(Sprite *spr, int x) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetX(spr, %d)", x);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->gotoxy(x, spr->_y);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSetY(Sprite *spr, int y) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetY(spr, %d)", y);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->gotoxy(spr->_x, y);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSetZ(Sprite *spr, int z) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetZ(spr, %d)", z);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-06-29 16:13:17 +02:00
|
|
|
|
spr->_z = z;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
//SNPOST_(SNZTRIM, -1, 0, spr);
|
2011-07-05 23:13:12 +02:00
|
|
|
|
snZTrim(spr);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSlave(Sprite *spr, int ref) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSlave(spr, %d)", ref);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
Sprite *slv = locate(ref);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr && slv) {
|
2011-07-02 01:02:14 +02:00
|
|
|
|
if (spr->active()) {
|
2011-09-14 08:15:30 +02:00
|
|
|
|
snSend(slv, spr->_scene);
|
2011-08-19 20:36:43 +10:00
|
|
|
|
slv->_flags._slav = true;
|
2011-06-29 16:13:17 +02:00
|
|
|
|
slv->_z = spr->_z;
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_vga->_showQ->insert(_vga->_showQ->remove(slv), spr->_next);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snTrans(Sprite *spr, int trans) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snTrans(spr, %d)", trans);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-08-19 20:36:43 +10:00
|
|
|
|
spr->_flags._tran = (trans < 0) ? !spr->_flags._tran : (trans != 0);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snPort(Sprite *spr, int port) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snPort(spr, %d)", port);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-08-19 20:36:43 +10:00
|
|
|
|
spr->_flags._port = (port < 0) ? !spr->_flags._port : (port != 0);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snKill(Sprite *spr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snKill(spr)");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-08-20 00:11:30 +02:00
|
|
|
|
if (!spr)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (spr->_flags._kept) {
|
|
|
|
|
int n = findPocket(spr);
|
|
|
|
|
if (n >= 0)
|
|
|
|
|
_pocket[n] = NULL;
|
|
|
|
|
}
|
|
|
|
|
Sprite *nx = spr->_next;
|
|
|
|
|
hide1(spr);
|
|
|
|
|
_vga->_showQ->remove(spr);
|
|
|
|
|
_eventManager->clearEvent(spr);
|
|
|
|
|
if (spr->_flags._kill) {
|
|
|
|
|
delete spr;
|
|
|
|
|
} else {
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = -1;
|
2011-08-20 00:11:30 +02:00
|
|
|
|
_vga->_spareQ->append(spr);
|
|
|
|
|
}
|
|
|
|
|
if (nx) {
|
|
|
|
|
if (nx->_flags._slav)
|
|
|
|
|
snKill(nx);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-09-06 19:56:47 +02:00
|
|
|
|
void CGEEngine::snSound(Sprite *spr, int wav) {
|
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSound(spr, %d)", wav);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-24 23:42:03 +02:00
|
|
|
|
if (wav == -1)
|
2011-07-29 10:02:32 +02:00
|
|
|
|
_sound->stop();
|
2011-07-24 23:42:03 +02:00
|
|
|
|
else
|
2011-09-06 19:56:47 +02:00
|
|
|
|
_sound->play((*_fx)[wav], (spr) ? ((spr->_x + spr->_w / 2) / (kScrWidth / 16)) : 8);
|
|
|
|
|
|
|
|
|
|
_sound->setRepeat(1);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snKeep(Sprite *spr, int stp) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snKeep(spr, %d)", stp);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-02 18:20:41 +02:00
|
|
|
|
selectPocket(-1);
|
2011-08-19 20:36:43 +10:00
|
|
|
|
if (spr && ! spr->_flags._kept && _pocket[_pocPtr] == NULL) {
|
2011-09-06 19:56:47 +02:00
|
|
|
|
int16 oldRepeat = _sound->getRepeat();
|
|
|
|
|
_sound->setRepeat(1);
|
|
|
|
|
snSound(spr, 3);
|
|
|
|
|
_sound->setRepeat(oldRepeat);
|
2011-07-03 11:28:22 +02:00
|
|
|
|
_pocket[_pocPtr] = spr;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = 0;
|
2011-08-19 20:36:43 +10:00
|
|
|
|
spr->_flags._kept = true;
|
2011-07-21 01:56:40 +02:00
|
|
|
|
spr->gotoxy(kPocketX + kPocketDX * _pocPtr + kPocketDX / 2 - spr->_w / 2,
|
|
|
|
|
kPocketY + kPocketDY / 2 - spr->_h / 2);
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (stp >= 0)
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->step(stp);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-07-02 18:20:41 +02:00
|
|
|
|
selectPocket(-1);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snGive(Sprite *spr, int stp) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snGive(spr, %d)", stp);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-07-02 18:20:41 +02:00
|
|
|
|
int p = findPocket(spr);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (p >= 0) {
|
2011-06-29 00:35:21 +02:00
|
|
|
|
_pocket[p] = NULL;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = _now;
|
2011-08-19 20:36:43 +10:00
|
|
|
|
spr->_flags._kept = false;
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (stp >= 0)
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->step(stp);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-07-02 18:20:41 +02:00
|
|
|
|
selectPocket(-1);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snBackPt(Sprite *spr, int stp) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snBackPt(spr, %d)", stp);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (stp >= 0)
|
2011-07-02 01:02:14 +02:00
|
|
|
|
spr->step(stp);
|
|
|
|
|
spr->backShow(true);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snLevel(Sprite *spr, int lev) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snLevel(spr, %d)", lev);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-09-01 00:22:20 +02:00
|
|
|
|
assert((lev >= 0) && (lev < 5));
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
|
spr = _vga->_spareQ->locate(100 + i);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr) {
|
2011-09-01 00:22:20 +02:00
|
|
|
|
if (i <= lev) {
|
|
|
|
|
spr->backShow(true);
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = 0;
|
2011-09-01 00:22:20 +02:00
|
|
|
|
spr->_flags._hide = false;
|
|
|
|
|
} else {
|
|
|
|
|
spr->_flags._hide = true;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
spr->_scene = -1;
|
2011-09-01 00:22:20 +02:00
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
warning("SPR not found! ref: %d", 100 + i);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
2011-09-01 00:22:20 +02:00
|
|
|
|
|
|
|
|
|
_lev = lev;
|
2011-09-14 08:15:30 +02:00
|
|
|
|
_maxScene = _maxSceneArr[_lev];
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-19 07:13:41 +02:00
|
|
|
|
void CGEEngine::snFlag(int indx, bool v) {
|
|
|
|
|
_flag[indx] = v;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snSetRef(Sprite *spr, int nr) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snSetRef(spr, %d)", nr);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (spr)
|
2011-06-29 00:35:21 +02:00
|
|
|
|
spr->_ref = nr;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snFlash(bool on) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snFlash(%s)", on ? "true" : "false");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (on) {
|
2011-09-06 00:43:40 +02:00
|
|
|
|
Dac *pal = (Dac *)malloc(sizeof(Dac) * kPalCount);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (pal) {
|
2011-08-27 19:09:13 +02:00
|
|
|
|
memcpy(pal, _vga->_sysPal, kPalSize);
|
2011-07-31 00:52:35 +02:00
|
|
|
|
for (int i = 0; i < kPalCount; i++) {
|
2011-06-13 11:57:24 +02:00
|
|
|
|
register int c;
|
2011-07-01 08:37:40 +02:00
|
|
|
|
c = pal[i]._r << 1;
|
|
|
|
|
pal[i]._r = (c < 64) ? c : 63;
|
|
|
|
|
c = pal[i]._g << 1;
|
|
|
|
|
pal[i]._g = (c < 64) ? c : 63;
|
|
|
|
|
c = pal[i]._b << 1;
|
|
|
|
|
pal[i]._b = (c < 64) ? c : 63;
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_vga->setColors(pal, 64);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-13 13:07:45 +02:00
|
|
|
|
} else
|
2011-08-27 19:09:13 +02:00
|
|
|
|
_vga->setColors(_vga->_sysPal, 64);
|
2011-07-02 18:20:41 +02:00
|
|
|
|
_dark = false;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snLight(bool in) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snLight(%s)", in ? "true" : "false");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (in)
|
2011-08-27 19:09:13 +02:00
|
|
|
|
_vga->sunrise(_vga->_sysPal);
|
2011-06-13 11:57:24 +02:00
|
|
|
|
else
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_vga->sunset();
|
2011-08-20 00:11:30 +02:00
|
|
|
|
_dark = !in;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
void CGEEngine::snHBarrier(const int scene, const int barX) {
|
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snHBarrier(%d, %d)", scene, barX);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
_barriers[(scene > 0) ? scene : _now]._horz = barX;
|
2011-09-07 22:37:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
void CGEEngine::snVBarrier(const int scene, const int barY) {
|
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snVBarrier(%d, %d)", scene, barY);
|
2011-09-07 22:37:03 +02:00
|
|
|
|
|
2011-09-14 08:15:30 +02:00
|
|
|
|
_barriers[(scene > 0) ? scene : _now]._vert = barY;
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snWalk(Sprite *spr, int x, int y) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snWalk(spr, %d, %d)", x, y);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (_hero) {
|
2011-06-13 13:07:45 +02:00
|
|
|
|
if (spr && y < 0)
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_hero->findWay(spr);
|
2011-06-13 13:07:45 +02:00
|
|
|
|
else
|
2011-07-03 16:22:26 +02:00
|
|
|
|
_hero->findWay(XZ(x, y));
|
2011-06-13 11:57:24 +02:00
|
|
|
|
}
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snReach(Sprite *spr, int mode) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snReach(spr, %d)", mode);
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-07-03 16:22:26 +02:00
|
|
|
|
if (_hero)
|
|
|
|
|
_hero->reach(spr, mode);
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-05 23:13:12 +02:00
|
|
|
|
void CGEEngine::snMouse(bool on) {
|
2011-07-20 14:22:56 +02:00
|
|
|
|
debugC(1, kCGEDebugEngine, "CGEEngine::snMouse(%s)", on ? "true" : "false");
|
2011-07-19 07:13:41 +02:00
|
|
|
|
|
2011-06-13 11:57:24 +02:00
|
|
|
|
if (on)
|
2011-07-08 08:21:35 +02:00
|
|
|
|
_mouse->on();
|
2011-06-13 11:57:24 +02:00
|
|
|
|
else
|
2011-07-08 08:21:35 +02:00
|
|
|
|
_mouse->off();
|
2011-06-09 08:20:53 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-06-10 22:57:09 +02:00
|
|
|
|
} // End of namespace CGE
|