diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/cge/snail.cpp | 1025 | ||||
-rw-r--r-- | engines/cge/snail.h | 1 |
2 files changed, 508 insertions, 518 deletions
diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp index ea8e480b35..ef766b9a4e 100644 --- a/engines/cge/snail.cpp +++ b/engines/cge/snail.cpp @@ -40,7 +40,7 @@ void CGEEngine::snGame(Sprite *spr, int num) { debugC(1, kCGEDebugEngine, "CGEEngine::snGame(spr, %d)", num); switch (num) { - case 1 : { + case 1: { static Sprite *dup[3] = { NULL, NULL, NULL }; int buref = 0; int Stage = 0; @@ -125,10 +125,9 @@ void CGEEngine::snGame(Sprite *spr, int num) { _snail->addCom(kSnSay, buref, 16008, NULL); // zgadnij! _game = true; } - } - break; - //-------------------------------------------------------------------- - case 2 : { + } + break; + case 2: if (_sprTv == NULL) { _sprTv = _vga->_showQ->locate(20700); _sprK1 = _vga->_showQ->locate(20701); @@ -139,105 +138,108 @@ void CGEEngine::snGame(Sprite *spr, int num) { if (!_game) { // init _snail->addCom(kSnGame, 20002, 2, NULL); _game = true; - } else { // 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); - } - ///-------------------- - _snail->addCom(kSnSetZ, 20700, 0, NULL); - bool hit = (_sprK1->_seqPtr + _sprK2->_seqPtr + _sprK3->_seqPtr == 15); - if (hit) { - if (spr->_ref == 1) { - _snail->addCom(kSnSay, 1, 20003, NULL); // hura! - _snail->addCom(kSnSeq, 20011, 2, NULL); // kamera won - _snail->addCom(kSnSend, 20701, -1, NULL); // k1 won - _snail->addCom(kSnSend, 20702, -1, NULL); // k2 won - _snail->addCom(kSnSend, 20703, -1, NULL); // k3 won - _snail->addCom(kSnSend, 20700, -1, NULL); // tv won - _snail->addCom(kSnKeep, 20007, 0, NULL); // do kieszeni - _snail->addCom(kSnSend, 20006, 20, NULL); // bilon - _snail->addCom(kSnSound, 20006, 20002, NULL); // bilon! - _snail->addCom(kSnSay, 20002, 20004, NULL); - _snail->addCom(kSnSend, 20010, 20, NULL); // papier - _snail->addCom(kSnSound, 20010, 20003, NULL); // papier! - _snail->addCom(kSnSay, 20001, 20005, NULL); - _game = false; - return; - } else - _sprK3->step(newRandom(5)); - } - if (_gameCase2Cpt < 100) { - switch (_gameCase2Cpt) { - case 15 : - _snail->addCom(kSnSay, 20003, 20021, NULL); - break; - case 30 : - case 45 : - case 60 : - case 75 : - _snail->addCom(kSnSay, 20003, 20022, NULL); - break; - } - _gameCase2Cpt++; - } - switch (spr->_ref) { - case 1 : - _snail->addCom(kSnSay, 20001, 20011, NULL); // zapro - _snail->addCom(kSnSeq, 20001, 1, NULL); // rzuŤ - _snail->addCom(kSnWait, 20001, 1, NULL); // czekaj - _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k - _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k - _snail->addCom(kSnWait, 20001, 16, NULL); // czekaj - _snail->addCom(kSnSeq, 20007, 1, NULL); // lec† - _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ - _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech - _snail->addCom(kSnWait, 20007, -1, NULL); // koniec - _snail->addCom(kSnGame, 20001, 2, NULL); // again! - break; - case 20001: - _snail->addCom(kSnSay, 20002, 20012, NULL); // zapro - _snail->addCom(kSnSeq, 20002, 1, NULL); // rzuŤ - _snail->addCom(kSnWait, 20002, 3, NULL); // czekaj - _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k - _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k - _snail->addCom(kSnWait, 20002, 10, NULL); // czekaj - _snail->addCom(kSnSeq, 20007, 2, NULL); // lec† - _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ - _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech - _snail->addCom(kSnWait, 20007, -1, NULL); // koniec - _snail->addCom(kSnGame, 20002, 2, NULL); // again! + 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); + } + + _snail->addCom(kSnSetZ, 20700, 0, NULL); + bool hit = (_sprK1->_seqPtr + _sprK2->_seqPtr + _sprK3->_seqPtr == 15); + if (hit) { + if (spr->_ref == 1) { + _snail->addCom(kSnSay, 1, 20003, NULL); // hura! + _snail->addCom(kSnSeq, 20011, 2, NULL); // kamera won + _snail->addCom(kSnSend, 20701, -1, NULL); // k1 won + _snail->addCom(kSnSend, 20702, -1, NULL); // k2 won + _snail->addCom(kSnSend, 20703, -1, NULL); // k3 won + _snail->addCom(kSnSend, 20700, -1, NULL); // tv won + _snail->addCom(kSnKeep, 20007, 0, NULL); // do kieszeni + _snail->addCom(kSnSend, 20006, 20, NULL); // bilon + _snail->addCom(kSnSound, 20006, 20002, NULL); // bilon! + _snail->addCom(kSnSay, 20002, 20004, NULL); + _snail->addCom(kSnSend, 20010, 20, NULL); // papier + _snail->addCom(kSnSound, 20010, 20003, NULL); // papier! + _snail->addCom(kSnSay, 20001, 20005, NULL); + _game = false; + return; + } else + _sprK3->step(newRandom(5)); + } + + if (_gameCase2Cpt < 100) { + switch (_gameCase2Cpt) { + case 15: + _snail->addCom(kSnSay, 20003, 20021, NULL); break; - case 20002: - _snail->addCom(kSnSay, 20002, 20010, NULL); // zapro - _snail->addCom(kSnWalk, 20005, -1, NULL); // do stol - _snail->addCom(kSnWait, 1, -1, NULL); // stoi - _snail->addCom(kSnCover, 1, 20101, NULL); // grasol - _snail->addCom(kSnSeq, 20101, 1, NULL); // rzuŤ - _snail->addCom(kSnWait, 20101, 5, NULL); // czekaj - _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k - _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k - _snail->addCom(kSnWait, 20101, 15, NULL); // czekaj - _snail->addCom(kSnSeq, 20007, 1, NULL); // lec† - _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ - _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech - _snail->addCom(kSnWait, 20101, -1, NULL); // koniec - _snail->addCom(kSnUncover, 1, 20101, NULL); // SDS - _snail->addCom(kSnGame, 1, 2, NULL); // again! + case 30: + case 45: + case 60: + case 75: + _snail->addCom(kSnSay, 20003, 20022, NULL); break; } + _gameCase2Cpt++; + } + + switch (spr->_ref) { + case 1: + _snail->addCom(kSnSay, 20001, 20011, NULL); // zapro + _snail->addCom(kSnSeq, 20001, 1, NULL); // rzuŤ + _snail->addCom(kSnWait, 20001, 1, NULL); // czekaj + _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k + _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k + _snail->addCom(kSnWait, 20001, 16, NULL); // czekaj + _snail->addCom(kSnSeq, 20007, 1, NULL); // lec† + _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ + _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech + _snail->addCom(kSnWait, 20007, -1, NULL); // koniec + _snail->addCom(kSnGame, 20001, 2, NULL); // again! + break; + + case 20001: + _snail->addCom(kSnSay, 20002, 20012, NULL); // zapro + _snail->addCom(kSnSeq, 20002, 1, NULL); // rzuŤ + _snail->addCom(kSnWait, 20002, 3, NULL); // czekaj + _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k + _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k + _snail->addCom(kSnWait, 20002, 10, NULL); // czekaj + _snail->addCom(kSnSeq, 20007, 2, NULL); // lec† + _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ + _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech + _snail->addCom(kSnWait, 20007, -1, NULL); // koniec + _snail->addCom(kSnGame, 20002, 2, NULL); // again! + break; + + case 20002: + _snail->addCom(kSnSay, 20002, 20010, NULL); // zapro + _snail->addCom(kSnWalk, 20005, -1, NULL); // do stol + _snail->addCom(kSnWait, 1, -1, NULL); // stoi + _snail->addCom(kSnCover, 1, 20101, NULL); // grasol + _snail->addCom(kSnSeq, 20101, 1, NULL); // rzuŤ + _snail->addCom(kSnWait, 20101, 5, NULL); // czekaj + _snail->addCom(kSnSetZ, 20700, 2, NULL); // skryj k + _snail->addCom(kSnHide, 20007, 1, NULL); // skryj k + _snail->addCom(kSnWait, 20101, 15, NULL); // czekaj + _snail->addCom(kSnSeq, 20007, 1, NULL); // lec† + _snail->addCom(kSnHide, 20007, 0, NULL); // poka§ + _snail->addCom(kSnSound, 20007, 20001, NULL); // grzech + _snail->addCom(kSnWait, 20101, -1, NULL); // koniec + _snail->addCom(kSnUncover, 1, 20101, NULL); // SDS + _snail->addCom(kSnGame, 1, 2, NULL); // again! + break; } - } - break; } } - void CGEEngine::expandSprite(Sprite *spr) { debugC(5, kCGEDebugEngine, "CGEEngine::expandSprite(spr)"); @@ -245,7 +247,6 @@ void CGEEngine::expandSprite(Sprite *spr) { _vga->_showQ->insert(_vga->_spareQ->remove(spr)); } - void CGEEngine::contractSprite(Sprite *spr) { debugC(1, kCGEDebugEngine, "CGEEngine::contractSprite(spr)"); @@ -257,12 +258,11 @@ int CGEEngine::findPocket(Sprite *spr) { debugC(1, kCGEDebugEngine, "CGEEngine::findPocket(spr)"); for (int i = 0; i < kPocketNX; i++) - if (_pocket[i] == spr) - return i; + if (_pocket[i] == spr) + return i; return -1; } - void CGEEngine::selectPocket(int n) { debugC(1, kCGEDebugEngine, "CGEEngine::selectPocket(%d)", n); @@ -309,76 +309,77 @@ void CGEEngine::snGhost(Bitmap *bmp) { void CGEEngine::feedSnail(Sprite *spr, SnList snq) { debugC(1, kCGEDebugEngine, "CGEEngine::feedSnail(spr, snq)"); - if (spr) - if (spr->active()) { - uint8 ptr = (snq == kTake) ? spr->_takePtr : spr->_nearPtr; - - if (ptr != NO_PTR) { - Snail::Com *comtab = spr->snList(snq); - Snail::Com *c = comtab + ptr; - - if (findPocket(NULL) < 0) { // no empty pockets? - Snail::Com *p; - for (p = c; p->_com != kSnNext; p++) { // find KEEP command - if (p->_com == kSnKeep) { - pocFul(); - return; - } - if (p->_ptr) - 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; - if (*idx != NO_PTR) { - 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; - } - if (v >= 0) - *idx = v; - } - } - if (s == spr) - 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->addCom(c->_com, c->_ref, c->_val, spr); - if (c->_ptr) - break; - else - c++; + if (!spr || !spr->active()) + return; + + uint8 ptr = (snq == kTake) ? spr->_takePtr : spr->_nearPtr; + + if (ptr == NO_PTR) + return; + + Snail::Com *comtab = spr->snList(snq); + Snail::Com *c = comtab + ptr; + + if (findPocket(NULL) < 0) { // no empty pockets? + Snail::Com *p; + for (p = c; p->_com != kSnNext; p++) { // find KEEP command + if (p->_com == kSnKeep) { + pocFul(); + return; + } + if (p->_ptr) + 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; + if (*idx != NO_PTR) { + 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; } + if (v >= 0) + *idx = v; } } + if (s == spr) + 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->addCom(c->_com, c->_ref, c->_val, spr); + if (c->_ptr) + break; + else + c++; } + } } const char *Snail::_comText[] = { @@ -395,7 +396,6 @@ const char *Snail::_comText[] = { "MOUSE", "SOUND", "COUNT", NULL }; - Snail::Snail(CGEEngine *vm, bool turbo) : _turbo(turbo), _busy(false), _textDelay(false), _timerExpiry(0), _talkEnable(true), @@ -490,16 +490,15 @@ void CGEEngine::snRTNext(Sprite *spr, int p) { void CGEEngine::snZTrim(Sprite *spr) { debugC(4, kCGEDebugEngine, "CGEEngine::snZTrim(spr)"); - if (spr) - if (spr->active()) { - Sprite *s; - 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); - } - } + 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); + } } void CGEEngine::snHide(Sprite *spr, int val) { @@ -547,30 +546,31 @@ void CGEEngine::snRSeq(Sprite *spr, int val) { void CGEEngine::snSend(Sprite *spr, int val) { debugC(1, kCGEDebugEngine, "CGEEngine::snSend(spr, %d)", val); - if (spr) { - int was = spr->_cave; - bool was1 = (was == 0 || was == _now); - bool val1 = (val == 0 || val == _now); - spr->_cave = val; - if (val1 != was1) { - if (was1) { - if (spr->_flags._kept) { - int n = findPocket(spr); - if (n >= 0) - _pocket[n] = NULL; - } - hide1(spr); - contractSprite(spr); - spr->_flags._slav = false; - } else { - if (spr->_ref % 1000 == 0) - Bitmap::_pal = Vga::_sysPal; - if (spr->_flags._back) - spr->backShow(true); - else - expandSprite(spr); - Bitmap::_pal = NULL; + if (!spr) + return; + + int was = spr->_cave; + bool was1 = (was == 0 || was == _now); + bool val1 = (val == 0 || val == _now); + spr->_cave = val; + if (val1 != was1) { + if (was1) { + if (spr->_flags._kept) { + int n = findPocket(spr); + if (n >= 0) + _pocket[n] = NULL; } + hide1(spr); + contractSprite(spr); + spr->_flags._slav = false; + } else { + if (spr->_ref % 1000 == 0) + Bitmap::_pal = Vga::_sysPal; + if (spr->_flags._back) + spr->backShow(true); + else + expandSprite(spr); + Bitmap::_pal = NULL; } } } @@ -579,77 +579,77 @@ void CGEEngine::snSwap(Sprite *spr, int xref) { debugC(1, kCGEDebugEngine, "CGEEngine::snSwap(spr, %d)", xref); Sprite *xspr = locate(xref); - if (spr && xspr) { - int was = spr->_cave; - int xwas = xspr->_cave; - bool was1 = (was == 0 || was == _now); - bool xwas1 = (xwas == 0 || xwas == _now); - - swap(spr->_cave, xspr->_cave); - swap(spr->_x, xspr->_x); - swap(spr->_y, xspr->_y); - swap(spr->_z, xspr->_z); - 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); - } + if (!spr || !xspr) + return; + + int was = spr->_cave; + int xwas = xspr->_cave; + bool was1 = (was == 0 || was == _now); + bool xwas1 = (xwas == 0 || xwas == _now); + + swap(spr->_cave, xspr->_cave); + swap(spr->_x, xspr->_x); + swap(spr->_y, xspr->_y); + swap(spr->_z, xspr->_z); + 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); } } - void CGEEngine::snCover(Sprite *spr, int xref) { debugC(1, kCGEDebugEngine, "CGEEngine::snCover(spr, %d)", xref); Sprite *xspr = locate(xref); - if (spr && xspr) { - spr->_flags._hide = true; - xspr->_z = spr->_z; - xspr->_cave = spr->_cave; - 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; - } - feedSnail(xspr, kNear); + if (!spr || !xspr) + return; + + spr->_flags._hide = true; + xspr->_z = spr->_z; + xspr->_cave = spr->_cave; + 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; } + feedSnail(xspr, kNear); } - void CGEEngine::snUncover(Sprite *spr, Sprite *xspr) { debugC(1, kCGEDebugEngine, "CGEEngine::snUncover(spr, xspr)"); - if (spr && xspr) { - spr->_flags._hide = false; - spr->_cave = xspr->_cave; - 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; - } - spr->_z = xspr->_z; - snSend(xspr, -1); - if (spr->_time == 0) - spr->_time++; + if (!spr || !xspr) + return; + + spr->_flags._hide = false; + spr->_cave = xspr->_cave; + 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; } + spr->_z = xspr->_z; + snSend(xspr, -1); + if (spr->_time == 0) + spr->_time++; } - void CGEEngine::snSetX0(int cav, int x0) { debugC(1, kCGEDebugEngine, "CGEEngine::snSetX0(%d, %d)", cav, x0); @@ -683,7 +683,6 @@ void CGEEngine::snRelY(Sprite *spr, int y) { spr->gotoxy(spr->_x, _hero->_y + y); } - void CGEEngine::snRelZ(Sprite *spr, int z) { debugC(1, kCGEDebugEngine, "CGEEngine::snRelZ(spr, %d)", z); @@ -693,7 +692,6 @@ void CGEEngine::snRelZ(Sprite *spr, int z) { } } - void CGEEngine::snSetX(Sprite *spr, int x) { debugC(1, kCGEDebugEngine, "CGEEngine::snSetX(spr, %d)", x); @@ -701,7 +699,6 @@ void CGEEngine::snSetX(Sprite *spr, int x) { spr->gotoxy(x, spr->_y); } - void CGEEngine::snSetY(Sprite *spr, int y) { debugC(1, kCGEDebugEngine, "CGEEngine::snSetY(spr, %d)", y); @@ -709,7 +706,6 @@ void CGEEngine::snSetY(Sprite *spr, int y) { spr->gotoxy(spr->_x, y); } - void CGEEngine::snSetZ(Sprite *spr, int z) { debugC(1, kCGEDebugEngine, "CGEEngine::snSetZ(spr, %d)", z); @@ -720,7 +716,6 @@ void CGEEngine::snSetZ(Sprite *spr, int z) { } } - void CGEEngine::snSlave(Sprite *spr, int ref) { debugC(1, kCGEDebugEngine, "CGEEngine::snSlave(spr, %d)", ref); @@ -735,7 +730,6 @@ void CGEEngine::snSlave(Sprite *spr, int ref) { } } - void CGEEngine::snTrans(Sprite *spr, int trans) { debugC(1, kCGEDebugEngine, "CGEEngine::snTrans(spr, %d)", trans); @@ -753,30 +747,30 @@ void CGEEngine::snPort(Sprite *spr, int port) { void CGEEngine::snKill(Sprite *spr) { debugC(1, kCGEDebugEngine, "CGEEngine::snKill(spr)"); - if (spr) { - 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 { - spr->_cave = -1; - _vga->_spareQ->append(spr); - } - if (nx) { - if (nx->_flags._slav) - snKill(nx); - } + 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 { + spr->_cave = -1; + _vga->_spareQ->append(spr); + } + if (nx) { + if (nx->_flags._slav) + snKill(nx); } } - void CGEEngine::snSound(Sprite *spr, int wav, int cnt) { debugC(1, kCGEDebugEngine, "CGEEngine::snSound(spr, %d, %d)", wav, cnt); @@ -786,7 +780,6 @@ void CGEEngine::snSound(Sprite *spr, int wav, int cnt) { _sound->play((*_fx)[wav], (spr) ? ((spr->_x + spr->_w / 2) / (kScrWidth / 16)) : 8, cnt); } - void CGEEngine::snKeep(Sprite *spr, int stp) { debugC(1, kCGEDebugEngine, "CGEEngine::snKeep(spr, %d)", stp); @@ -846,7 +839,6 @@ void CGEEngine::snLevel(Sprite *spr, int lev) { spr->_flags._hide = false; } - void CGEEngine::snFlag(int indx, bool v) { _flag[indx] = v; } @@ -881,7 +873,6 @@ void CGEEngine::snFlash(bool on) { _dark = false; } - void CGEEngine::snLight(bool in) { debugC(1, kCGEDebugEngine, "CGEEngine::snLight(%s)", in ? "true" : "false"); @@ -889,7 +880,7 @@ void CGEEngine::snLight(bool in) { _vga->sunrise(Vga::_sysPal); else _vga->sunset(); - _dark = ! in; + _dark = !in; } void CGEEngine::snBarrier(int cav, int bar, bool horz) { @@ -925,254 +916,254 @@ void CGEEngine::snMouse(bool on) { _mouse->off(); } - void Snail::runCom() { static int count = 1; - if (!_busy) { - _busy = true; - uint8 tmpHead = _head; - while (_tail != tmpHead) { - Com *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) { - killText(); - _textDelay = false; - } - } - if (_talk && snc->_com != kSnPause) + if (_busy) + return; + + _busy = true; + uint8 tmpHead = _head; + while (_tail != tmpHead) { + Com *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; - } - Sprite *spr = ((snc->_ref >= 0) ? locate(snc->_ref) : ((Sprite *) snc->_ptr)); - switch (snc->_com) { - case kSnLabel: - break; - case kSnPause : - _timerExpiry = g_system->getMillis() + snc->_val * kSnailFrameDelay; - if (_talk) - _textDelay = true; - break; - case kSnWait: - if (spr) { - if (spr->seqTest(snc->_val) && - (snc->_val >= 0 || spr != _hero || _hero->_tracePtr < 0)) { - _timerExpiry = g_system->getMillis() + spr->_time * kSnailFrameDelay; - } else - goto xit; - } - break; - case kSnLevel: - _vm->snLevel(spr, snc->_val); - break; - case kSnHide: - _vm->snHide(spr, snc->_val); - break; - case kSnSay: - if (spr && _talkEnable) { - if (spr == _hero && spr->seqTest(-1)) - spr->step(kSeqHTalk); - _text->say(_text->getText(snc->_val), spr); - _sys->_funDel = kHeroFun0; - } - break; - case kSnInf: - if (_talkEnable) { - _vm->inf(_text->getText(snc->_val)); - _sys->_funDel = kHeroFun0; - } - break; - case kSnTime: - if (spr && _talkEnable) { - if (spr == _hero && spr->seqTest(-1)) - spr->step(kSeqHTalk); - _text->sayTime(spr); + // Delay is finished + _timerExpiry = 0; + } else { + if (_textDelay) { + killText(); + _textDelay = false; } + } + if (_talk && snc->_com != kSnPause) break; - case kSnCave: - _vm->switchCave(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) ? locate(snc->_val) : ((Sprite *) snc->_ptr)); - 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->snBarrier(snc->_ref, snc->_val, true); - break; - case kSnSetVBarrier: - _vm->snBarrier(snc->_ref, snc->_val, false); - 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, count); - count = 1; - break; - case kSnCount: - count = snc->_val; + } + + Sprite *spr = ((snc->_ref >= 0) ? locate(snc->_ref) : ((Sprite *) snc->_ptr)); + switch (snc->_com) { + case kSnLabel: + break; + case kSnPause : + _timerExpiry = g_system->getMillis() + snc->_val * kSnailFrameDelay; + if (_talk) + _textDelay = true; + break; + case kSnWait: + if (spr) { + if (spr->seqTest(snc->_val) && + (snc->_val >= 0 || spr != _hero || _hero->_tracePtr < 0)) { + _timerExpiry = g_system->getMillis() + spr->_time * kSnailFrameDelay; + } else + goto xit; + } + break; + case kSnLevel: + _vm->snLevel(spr, snc->_val); + break; + case kSnHide: + _vm->snHide(spr, snc->_val); + break; + case kSnSay: + if (spr && _talkEnable) { + if (spr == _hero && spr->seqTest(-1)) + spr->step(kSeqHTalk); + _text->say(_text->getText(snc->_val), spr); + _sys->_funDel = kHeroFun0; + } + break; + case kSnInf: + if (_talkEnable) { + _vm->inf(_text->getText(snc->_val)); + _sys->_funDel = kHeroFun0; + } + break; + case kSnTime: + if (spr && _talkEnable) { + if (spr == _hero && spr->seqTest(-1)) + spr->step(kSeqHTalk); + _text->sayTime(spr); + } + break; + case kSnCave: + _vm->switchCave(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) ? locate(snc->_val) : ((Sprite *) snc->_ptr)); + 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->snBarrier(snc->_ref, snc->_val, true); + break; + case kSnSetVBarrier: + _vm->snBarrier(snc->_ref, snc->_val, false); + 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, count); + count = 1; + break; + case kSnCount: + count = snc->_val; + break; + case kSnExec: + switch (snc->_cbType) { + case kQGame: + _vm->qGame(); break; - case kSnExec: - switch (snc->_cbType) { - case kQGame: - _vm->qGame(); - break; - case kMiniStep: - _vm->miniStep(snc->_val); - break; - case kXCave: - _vm->xCave(); - break; - case kSelectSound: - warning("TODO: Select sound card"); - break; - case kSnSelect: - warning("TODO: Sound card selection"); - break; - case kSndSetVolume: - sndSetVolume(); - break; - default: - error("Unknown Callback Type in SNEXEC"); - } + case kMiniStep: + _vm->miniStep(snc->_val); break; - case kSnStep: - spr->step(); + case kXCave: + _vm->xCave(); break; - case kSnZTrim: - _vm->snZTrim(spr); + case kSelectSound: + warning("TODO: Select sound card"); break; - case kSnGhost: - _vm->snGhost((Bitmap *) snc->_ptr); + case kSnSelect: + warning("TODO: Sound card selection"); break; - default : - warning("Unhandled snc->_com in SNMouse(bool)"); + case kSndSetVolume: + sndSetVolume(); break; + default: + error("Unknown Callback Type in SNEXEC"); } - _tail++; - if (!_turbo) - break; + break; + case kSnStep: + spr->step(); + break; + case kSnZTrim: + _vm->snZTrim(spr); + break; + case kSnGhost: + _vm->snGhost((Bitmap *) snc->_ptr); + break; + default: + warning("Unhandled snc->_com in SNMouse(bool)"); + break; } -xit: - _busy = false; + _tail++; + if (!_turbo) + break; } +xit: + _busy = false; } - bool Snail::idle() { return (_head == _tail); } diff --git a/engines/cge/snail.h b/engines/cge/snail.h index 2d12963f2c..e478ad95ff 100644 --- a/engines/cge/snail.h +++ b/engines/cge/snail.h @@ -80,7 +80,6 @@ private: CGEEngine *_vm; }; - } // End of namespace CGE #endif |