From a7e49f294502c4c2efa2b37eb2c5b0ae3d1b66f7 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Thu, 21 Jul 2011 15:00:04 +0200 Subject: TOON: Grow size of path finding heap dynamically --- engines/toon/path.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp index 785b84a78e..60ca007930 100644 --- a/engines/toon/path.cpp +++ b/engines/toon/path.cpp @@ -33,15 +33,15 @@ PathFindingHeap::PathFindingHeap() { } PathFindingHeap::~PathFindingHeap() { - delete[] _data; + free(_data); } void PathFindingHeap::init(int32 size) { debugC(1, kDebugPath, "init(%d)", size); _size = size; - delete[] _data; - _data = new HeapDataGrid[_size]; + free(_data); + _data = (HeapDataGrid *)malloc(sizeof(HeapDataGrid) * _size); memset(_data, 0, sizeof(HeapDataGrid) * _size); _count = 0; } @@ -49,7 +49,7 @@ void PathFindingHeap::init(int32 size) { void PathFindingHeap::unload() { _count = 0; _size = 0; - delete[] _data; + free(_data); _data = NULL; } @@ -64,8 +64,19 @@ void PathFindingHeap::push(int32 x, int32 y, int32 weight) { debugC(2, kDebugPath, "push(%d, %d, %d)", x, y, weight); if (_count == _size) { - warning("Aborting attempt to push onto PathFindingHeap at maximum size: %d", _count); - return; + // Increase size by 50% + int newSize = _size + (_size >> 1) + 1; + HeapDataGrid *newData; + + newData = (HeapDataGrid *)realloc(_data, sizeof(HeapDataGrid) * newSize); + if (newData == NULL) { + warning("Aborting attempt to push onto PathFindingHeap at maximum size: %d", _count); + return; + } + + memset(newData + _size, 0, sizeof(HeapDataGrid) * (newSize - _size)); + _data = newData; + _size = newSize; } _data[_count]._x = x; @@ -427,11 +438,7 @@ void PathFinding::init(Picture *mask) { _height = mask->getHeight(); _currentMask = mask; _heap->unload(); - // In order to reduce memory fragmentation on small devices, we use the maximum - // possible size here which is TOON_BACKBUFFER_WIDTH. Even though this is - // 1280 as opposed to the possible 640, it actually helps memory allocation on - // those devices. - _heap->init(TOON_BACKBUFFER_WIDTH * _height); // should really be _width + _heap->init(500); delete[] _gridTemp; _gridTemp = new int32[_width*_height]; } -- cgit v1.2.3 From d1812fda52615f62d24b467e5a9c8784ab9e1dfd Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Mon, 25 Jul 2011 22:08:06 +0200 Subject: DREAMWEB: Fix (underlined object names) in 'printchar' parameter interpretation --- engines/dreamweb/stubs.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index ec94ffc40c..28c52e17d5 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -309,7 +309,8 @@ void DreamGenContext::printchar(uint16 dst, uint16 src, uint16* x, uint16 y, uin push(di); if (data.byte(kForeignrelease) != 0) y -= 3; - showframe(dst, src, *x, y, c - 32 + data.word(kCharshift), 0, width, height); + uint16 tmp = c - 32 + data.word(kCharshift); + showframe(dst, src, *x, y, tmp & 0xff, tmp >> 8, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); -- cgit v1.2.3 From fcd698c289a801e6e6b1e9fb76d22c3753c3ca41 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Mon, 25 Jul 2011 10:46:35 +0200 Subject: DREAMWEB: Fixed what is very probably a typo in original code and regenerated the source --- devtools/tasmrecover/dreamweb/sprite.asm | 2 +- engines/dreamweb/dreamgen.cpp | 34 +------------------------------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/devtools/tasmrecover/dreamweb/sprite.asm b/devtools/tasmrecover/dreamweb/sprite.asm index 45f807da3f..9b214eaa0a 100644 --- a/devtools/tasmrecover/dreamweb/sprite.asm +++ b/devtools/tasmrecover/dreamweb/sprite.asm @@ -4226,7 +4226,7 @@ botofdoor2: sub ah,ch opendoor2: cmp throughdoor,1 jz mustbeopen cmp lockstatus,1 - jz shutdoor + jz shutdoor2 mustbeopen: mov cl,[es:bx+19] cmp cl,1 jnz notdoorsound4 diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index c05cab5238..1aac7311d5 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -3023,7 +3023,7 @@ opendoor2: goto mustbeopen; _cmp(data.byte(kLockstatus), 1); if (flags.z()) - goto shutdoor; + goto shutdoor2; mustbeopen: cl = es.byte(bx+19); _cmp(cl, 1); @@ -3104,38 +3104,6 @@ atlast4: bx = pop(); es = pop(); data.byte(kLockstatus) = 1; - return; -/*continuing to unbounded code: shutdoor from dodoor:60-87*/ -shutdoor: - cl = es.byte(bx+19); - _cmp(cl, 5); - if (!flags.z()) - goto notdoorsound1; - al = 1; - _cmp(data.byte(kReallocation), 5); - if (!flags.z()) - goto nothoteldoor1; - al = 13; -nothoteldoor1: - playchannel1(); -notdoorsound1: - _cmp(cl, 0); - if (flags.z()) - goto atlast2; - _dec(cl); - es.byte(bx+19) = cl; -atlast2: - ch = 0; - push(di); - _add(di, cx); - al = ds.byte(di+18); - di = pop(); - es.byte(bx+15) = al; - ds.byte(di+17) = al; - _cmp(cl, 5); - if (!flags.z()) - return /* (notnearly) */; - data.byte(kThroughdoor) = 0; } void DreamGenContext::updatepeople() { -- cgit v1.2.3 From a101204422db7928aafcea1ff1e110979aa82c1b Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Mon, 25 Jul 2011 10:50:00 +0200 Subject: DREAMWEB: Ported 'lockeddoorway' --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 123 -------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/stubs.cpp | 82 ++++++++++++++++++++++++- engines/dreamweb/stubs.h | 2 + 5 files changed, 85 insertions(+), 126 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 413be6caf1..f09e2d186d 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -67,6 +67,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'walking', 'spriteupdate', 'dodoor', + 'lockeddoorway', 'liftsprite', 'frameoutv', 'modifychar', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 1aac7311d5..7ec64263da 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2984,128 +2984,6 @@ void DreamGenContext::widedoor() { dodoor(); } -void DreamGenContext::lockeddoorway() { - STACK_CHECK; - al = data.byte(kRyanx); - ah = data.byte(kRyany); - cl = es.byte(bx+10); - ch = es.byte(bx+11); - _cmp(al, cl); - if (!flags.c()) - goto rtofdoor2; - _sub(al, cl); - _cmp(al, -24); - if (!flags.c()) - goto upordown2; - goto shutdoor2; -rtofdoor2: - _sub(al, cl); - _cmp(al, 10); - if (!flags.c()) - goto shutdoor2; -upordown2: - _cmp(ah, ch); - if (!flags.c()) - goto botofdoor2; - _sub(ah, ch); - _cmp(ah, -30); - if (flags.c()) - goto shutdoor2; - goto opendoor2; -botofdoor2: - _sub(ah, ch); - _cmp(ah, 12); - if (!flags.c()) - goto shutdoor2; -opendoor2: - _cmp(data.byte(kThroughdoor), 1); - if (flags.z()) - goto mustbeopen; - _cmp(data.byte(kLockstatus), 1); - if (flags.z()) - goto shutdoor2; -mustbeopen: - cl = es.byte(bx+19); - _cmp(cl, 1); - if (!flags.z()) - goto notdoorsound4; - al = 0; - playchannel1(); -notdoorsound4: - _cmp(cl, 6); - if (!flags.z()) - goto noturnonyet; - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathon(); - bx = pop(); - es = pop(); -noturnonyet: - cl = es.byte(bx+19); - _cmp(data.byte(kThroughdoor), 1); - if (!flags.z()) - goto notthrough2; - _cmp(cl, 0); - if (!flags.z()) - goto notthrough2; - cl = 6; -notthrough2: - _inc(cl); - ch = 0; - push(di); - _add(di, cx); - al = ds.byte(di+18); - _cmp(al, 255); - if (!flags.z()) - goto atlast3; - _dec(di); - _dec(cl); -atlast3: - es.byte(bx+19) = cl; - al = ds.byte(di+18); - di = pop(); - es.byte(bx+15) = al; - ds.byte(di+17) = al; - _cmp(cl, 5); - if (!flags.z()) - return /* (justshutting) */; - data.byte(kThroughdoor) = 1; - return; -shutdoor2: - cl = es.byte(bx+19); - _cmp(cl, 5); - if (!flags.z()) - goto notdoorsound3; - al = 1; - playchannel1(); -notdoorsound3: - _cmp(cl, 0); - if (flags.z()) - goto atlast4; - _dec(cl); - es.byte(bx+19) = cl; -atlast4: - ch = 0; - data.byte(kThroughdoor) = 0; - push(di); - _add(di, cx); - al = ds.byte(di+18); - di = pop(); - es.byte(bx+15) = al; - ds.byte(di+17) = al; - _cmp(cl, 0); - if (!flags.z()) - return /* (notlocky) */; - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathoff(); - bx = pop(); - es = pop(); - data.byte(kLockstatus) = 1; -} - void DreamGenContext::updatepeople() { STACK_CHECK; es = data.word(kBuffers); @@ -21048,7 +20926,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_constant: constant(); break; case addr_doorway: doorway(); break; case addr_widedoor: widedoor(); break; - case addr_lockeddoorway: lockeddoorway(); break; case addr_updatepeople: updatepeople(); break; case addr_getreelframeax: getreelframeax(); break; case addr_reelsonscreen: reelsonscreen(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index c2aa204942..037fd2ad2a 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -657,7 +657,6 @@ public: static const uint16 addr_reelsonscreen = 0xc1a0; static const uint16 addr_getreelframeax = 0xc19c; static const uint16 addr_updatepeople = 0xc198; - static const uint16 addr_lockeddoorway = 0xc194; static const uint16 addr_widedoor = 0xc18c; static const uint16 addr_doorway = 0xc188; static const uint16 addr_constant = 0xc184; @@ -1338,7 +1337,7 @@ public: void clearbuffers(); void neterror(); void storeit(); - void lockeddoorway(); + //void lockeddoorway(); void isitworn(); //void putundertimed(); void dumpmap(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 28c52e17d5..dff3756745 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -1273,7 +1273,7 @@ void DreamGenContext::backobject(Sprite *sprite) { else if (objData->type == 5) random(sprite, objData); else if (objData->type == 4) - lockeddoorway(); + lockeddoorway(sprite, objData); else if (objData->type == 3) liftsprite(sprite, objData); else if (objData->type == 2) @@ -1402,6 +1402,86 @@ void DreamGenContext::turnpathoffCPP(uint8 param) { es = pop(); } +void DreamGenContext::lockeddoorway() { + Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + ObjData *objData = (ObjData *)ds.ptr(di, 0); + lockeddoorway(sprite, objData); +} + +void DreamGenContext::lockeddoorway(Sprite *sprite, ObjData *objData) { + if (data.byte(kRyanx) < sprite->x) { + if (sprite->x - data.byte(kRyanx) > 24) + goto shutdoor2; + } else { + if (data.byte(kRyanx) - sprite->x >= 10) + goto shutdoor2; + } + + if (data.byte(kRyany) < sprite->y) { + if (sprite->y - data.byte(kRyany) > 30) + goto shutdoor2; + } else { + if (data.byte(kRyany) - sprite->y >= 12) + goto shutdoor2; + } + + if (data.byte(kThroughdoor) != 1) { + if (data.byte(kLockstatus) == 1) + goto shutdoor2; + } + + if (sprite->frame == 1) { + al = 0; + playchannel1(); + } + + if (sprite->frame == 6) { + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathon(); + bx = pop(); + es = pop(); + } + + if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) { + sprite->frame = 6; + } + + ++sprite->frame; + if (objData->b18[sprite->frame] == 255) { + --sprite->frame; + } + + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + if (sprite->frame == 5) + data.byte(kThroughdoor) = 1; + return; + +shutdoor2: + if (sprite->frame == 5) { + al = 1; + playchannel1(); + } + + if (sprite->frame != 0) { + --sprite->frame; + } + + data.byte(kThroughdoor) = 0; + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + + if (sprite->frame == 0) { + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathoff(); + bx = pop(); + es = pop(); + data.byte(kLockstatus) = 1; + } +} + void DreamGenContext::liftsprite() { Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); ObjData *objData = (ObjData *)ds.ptr(di, 0); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 20d987d374..f173a84b83 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -80,6 +80,8 @@ void dodoor(Sprite *sprite, ObjData *objData); void doorway(Sprite *sprite, ObjData *objData); void widedoor(Sprite *sprite, ObjData *objData); + void lockeddoorway(); + void lockeddoorway(Sprite *sprite, ObjData *objData); void liftsprite(); void liftsprite(Sprite *sprite, ObjData *objData); void turnpathonCPP(uint8 param); -- cgit v1.2.3 From c0795b4b43e31d791e1e29dda02e18d4336a36e3 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Mon, 25 Jul 2011 23:54:54 +0200 Subject: DREAMWEB: Less register pollution --- engines/dreamweb/stubs.cpp | 20 +++++++------------- engines/dreamweb/stubs.h | 1 + 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index dff3756745..27c58bcf7b 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -1155,12 +1155,12 @@ void DreamGenContext::mainmanCPP(Sprite *sprite) { ++sprite->b29; if (sprite->b29 == 11) sprite->b29 = 1; - walking(); + walking(sprite); if (data.byte(kLinepointer) != 254) { if ((data.byte(kFacing) & 1) == 0) - walking(); + walking(sprite); else if ((sprite->b29 != 2) && (sprite->b29 != 7)) - walking(); + walking(sprite); } if (data.byte(kLinepointer) == 254) { if (data.byte(kTurntoface) == data.byte(kFacing)) { @@ -1180,9 +1180,13 @@ void DreamGenContext::mainmanCPP(Sprite *sprite) { es = pop(); } + void DreamGenContext::walking() { Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + walking(sprite); +} +void DreamGenContext::walking(Sprite *sprite) { uint8 comp; if (data.byte(kLinedirection) != 0) { --data.byte(kLinepointer); @@ -1246,16 +1250,8 @@ void DreamGenContext::aboutturn(Sprite *sprite) { } void DreamGenContext::backobject(Sprite *sprite) { - push(es); push(ds); - // Recover es:bx from sprite - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); - bx += 32 * (sprite - sprites); - // - ds = data.word(kSetdat); di = READ_LE_UINT16(&sprite->obj_data); ObjData *objData = (ObjData *)ds.ptr(di, 0); @@ -1263,7 +1259,6 @@ void DreamGenContext::backobject(Sprite *sprite) { if (sprite->delay != 0) { --sprite->delay; ds = pop(); - es = pop(); return; } @@ -1284,7 +1279,6 @@ void DreamGenContext::backobject(Sprite *sprite) { steady(sprite, objData); ds = pop(); - es = pop(); } void DreamGenContext::constant(Sprite *sprite, ObjData *objData) { diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index f173a84b83..fcf72e0727 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -71,6 +71,7 @@ void initman(); void mainmanCPP(Sprite *sprite); void walking(); + void walking(Sprite *sprite); void aboutturn(Sprite *sprite); void backobject(Sprite *sprite); void constant(Sprite *sprite, ObjData *objData); -- cgit v1.2.3 From 8233a37b4a17ff6a5b0e722b4dcdedb7d748da5e Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 26 Jul 2011 00:04:14 +0200 Subject: DREAMWEB: Extraction of sprite.cpp from stubs.cpp --- engines/dreamweb/module.mk | 1 + engines/dreamweb/sprite.cpp | 558 ++++++++++++++++++++++++++++++++++++++++++++ engines/dreamweb/stubs.cpp | 529 ----------------------------------------- 3 files changed, 559 insertions(+), 529 deletions(-) create mode 100644 engines/dreamweb/sprite.cpp diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk index 3b0c7f3325..fcda4fd6f4 100644 --- a/engines/dreamweb/module.mk +++ b/engines/dreamweb/module.mk @@ -5,6 +5,7 @@ MODULE_OBJS := \ detection.o \ dreamweb.o \ dreamgen.o \ + sprite.o \ stubs.o # This module can be built as a plugin diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp new file mode 100644 index 0000000000..5b0449f5b2 --- /dev/null +++ b/engines/dreamweb/sprite.cpp @@ -0,0 +1,558 @@ +/* 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. + * + */ + +#include "dreamweb/dreamweb.h" +#include "engines/util.h" +#include "graphics/surface.h" + +namespace DreamGen { + +Sprite *DreamGenContext::spritetable() { + push(es); + push(bx); + + es = data.word(kBuffers); + bx = kSpritetable; + Sprite *sprite = (Sprite *)es.ptr(bx, 16 * sizeof(Sprite)); + + bx = pop(); + es = pop(); + + return sprite; +} + +void DreamGenContext::printsprites() { + for (size_t priority = 0; priority < 7; ++priority) { + Sprite *sprites = spritetable(); + for (size_t j = 0; j < 16; ++j) { + const Sprite &sprite = sprites[j]; + if (READ_LE_UINT16(&sprite.updateCallback) == 0x0ffff) + continue; + if (priority != sprite.priority) + continue; + if (sprite.hidden == 1) + continue; + printasprite(&sprite); + } + } +} + +void DreamGenContext::printasprite(const Sprite *sprite) { + push(es); + push(bx); + ds = READ_LE_UINT16(&sprite->w6); + ax = sprite->y; + if (al >= 220) { + bx = data.word(kMapady) - (256 - al); + } else { + bx = ax + data.word(kMapady); + } + + ax = sprite->x; + if (al >= 220) { + di = data.word(kMapadx) - (256 - al); + } else { + di = ax + data.word(kMapadx); + } + + uint8 c; + if (sprite->b29 != 0) + c = 8; + else + c = 0; + uint8 width, height; + showframe(es, ds, di, bx, sprite->b15, c, &width, &height); + cl = width; + ch = height; + + bx = pop(); + es = pop(); +} + +void DreamGenContext::clearsprites() { + memset(spritetable(), 0xff, sizeof(Sprite) * 16); +} + +Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 somethingInDx, uint16 somethingInDi) { + Sprite *sprite = spritetable(); + while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either + ++sprite; + } + + WRITE_LE_UINT16(&sprite->updateCallback, updateCallback); + sprite->x = x; + sprite->y = y; + WRITE_LE_UINT16(&sprite->w6, somethingInDx); + WRITE_LE_UINT16(&sprite->w8, somethingInDi); + sprite->w2 = 0xffff; + sprite->b15 = 0; + sprite->delay = 0; + return sprite; +} + +void DreamGenContext::makesprite() { // NB: returns new sprite in es:bx + Sprite *sprite = makesprite(si & 0xff, si >> 8, cx, dx, di); + + // Recover es:bx from sprite + es = data.word(kBuffers); + bx = kSpritetable; + Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); + bx += sizeof(Sprite) * (sprite - sprites); + // +} + +void DreamGenContext::spriteupdate() { + Sprite *sprites = spritetable(); + sprites[0].hidden = data.byte(kRyanon); + + Sprite *sprite = sprites; + for (size_t i=0; i < 16; ++i) { + uint16 updateCallback = READ_LE_UINT16(&sprite->updateCallback); + if (updateCallback != 0xffff) { + sprite->w24 = sprite->w2; + if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++ + mainmanCPP(sprite); + else { + assert(updateCallback == addr_backobject); + backobject(sprite); + } + } + + if (data.byte(kNowinnewroom) == 1) + break; + ++sprite; + } +} + +void DreamGenContext::initman() { + Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0); + sprite->priority = 4; + sprite->b22 = 0; + sprite->b29 = 0; + + // Recover es:bx from sprite + es = data.word(kBuffers); + bx = kSpritetable; + Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); + bx += 32 * (sprite - sprites); + // +} + +void DreamGenContext::mainmanCPP(Sprite *sprite) { + push(es); + push(ds); + + // Recover es:bx from sprite + es = data.word(kBuffers); + bx = kSpritetable; + Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); + bx += 32 * (sprite - sprites); + // + + if (data.byte(kResetmanxy) == 1) { + data.byte(kResetmanxy) = 0; + sprite->x = data.byte(kRyanx); + sprite->y = data.byte(kRyany); + sprite->b29 = 0; + } + --sprite->b22; + if (sprite->b22 != 0xff) { + ds = pop(); + es = pop(); + return; + } + sprite->b22 = 0; + if (data.byte(kTurntoface) != data.byte(kFacing)) { + aboutturn(sprite); + } else { + if ((data.byte(kTurndirection) != 0) && (data.byte(kLinepointer) == 254)) { + data.byte(kReasseschanges) = 1; + if (data.byte(kFacing) == data.byte(kLeavedirection)) + checkforexit(); + } + data.byte(kTurndirection) = 0; + if (data.byte(kLinepointer) == 254) { + sprite->b29 = 0; + } else { + ++sprite->b29; + if (sprite->b29 == 11) + sprite->b29 = 1; + walking(sprite); + if (data.byte(kLinepointer) != 254) { + if ((data.byte(kFacing) & 1) == 0) + walking(sprite); + else if ((sprite->b29 != 2) && (sprite->b29 != 7)) + walking(sprite); + } + if (data.byte(kLinepointer) == 254) { + if (data.byte(kTurntoface) == data.byte(kFacing)) { + data.byte(kReasseschanges) = 1; + if (data.byte(kFacing) == data.byte(kLeavedirection)) + checkforexit(); + } + } + } + } + static const uint8 facelist[] = { 0,60,33,71,11,82,22,93 }; + sprite->b15 = sprite->b29 + facelist[data.byte(kFacing)]; + data.byte(kRyanx) = sprite->x; + data.byte(kRyany) = sprite->y; + + ds = pop(); + es = pop(); +} + +void DreamGenContext::walking() { + Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + walking(sprite); +} + +void DreamGenContext::walking(Sprite *sprite) { + uint8 comp; + if (data.byte(kLinedirection) != 0) { + --data.byte(kLinepointer); + comp = 200; + } else { + ++data.byte(kLinepointer); + comp = data.byte(kLinelength); + } + if (data.byte(kLinepointer) < comp) { + sprite->x = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 0); + sprite->y = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 1); + return; + } + + data.byte(kLinepointer) = 254; + data.byte(kManspath) = data.byte(kDestination); + if (data.byte(kDestination) == data.byte(kFinaldest)) { + facerightway(); + return; + } + data.byte(kDestination) = data.byte(kFinaldest); + push(es); + push(bx); + autosetwalk(); + bx = pop(); + es = pop(); +} + +void DreamGenContext::aboutturn(Sprite *sprite) { + bool incdir = true; + + if (data.byte(kTurndirection) == 1) + incdir = true; + else if ((int8)data.byte(kTurndirection) == -1) + incdir = false; + else { + if (data.byte(kFacing) < data.byte(kTurntoface)) { + uint8 delta = data.byte(kTurntoface) - data.byte(kFacing); + if (delta >= 4) + incdir = false; + else + incdir = true; + } else { + uint8 delta = data.byte(kFacing) - data.byte(kTurntoface); + if (delta >= 4) + incdir = true; + else + incdir = false; + } + } + + if (incdir) { + data.byte(kTurndirection) = 1; + data.byte(kFacing) = (data.byte(kFacing) + 1) & 7; + sprite->b29 = 0; + } else { + data.byte(kTurndirection) = -1; + data.byte(kFacing) = (data.byte(kFacing) - 1) & 7; + sprite->b29 = 0; + } +} + +void DreamGenContext::backobject(Sprite *sprite) { + push(ds); + + ds = data.word(kSetdat); + di = READ_LE_UINT16(&sprite->obj_data); + ObjData *objData = (ObjData *)ds.ptr(di, 0); + + if (sprite->delay != 0) { + --sprite->delay; + ds = pop(); + return; + } + + sprite->delay = objData->delay; + if (objData->type == 6) + widedoor(sprite, objData); + else if (objData->type == 5) + random(sprite, objData); + else if (objData->type == 4) + lockeddoorway(sprite, objData); + else if (objData->type == 3) + liftsprite(sprite, objData); + else if (objData->type == 2) + doorway(sprite, objData); + else if (objData->type == 1) + constant(sprite, objData); + else + steady(sprite, objData); + + ds = pop(); +} + +void DreamGenContext::constant(Sprite *sprite, ObjData *objData) { + ++sprite->frame; + if (objData->b18[sprite->frame] == 255) { + sprite->frame = 0; + } + uint8 b18 = objData->b18[sprite->frame]; + objData->b17 = b18; + sprite->b15 = b18; +} + +void DreamGenContext::random(Sprite *sprite, ObjData *objData) { + randomnum1(); + uint16 r = ax; + sprite->b15 = objData->b18[r&7]; +} + +void DreamGenContext::doorway(Sprite *sprite, ObjData *objData) { + data.byte(kDoorcheck1) = -24; + data.byte(kDoorcheck2) = 10; + data.byte(kDoorcheck3) = -30; + data.byte(kDoorcheck4) = 10; + dodoor(sprite, objData); +} + +void DreamGenContext::widedoor(Sprite *sprite, ObjData *objData) { + data.byte(kDoorcheck1) = -24; + data.byte(kDoorcheck2) = 24; + data.byte(kDoorcheck3) = -30; + data.byte(kDoorcheck4) = 24; + dodoor(sprite, objData); +} + +void DreamGenContext::dodoor() { + Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + ObjData *objData = (ObjData *)ds.ptr(di, 0); + dodoor(sprite, objData); +} + +void DreamGenContext::dodoor(Sprite *sprite, ObjData *objData) { + uint8 ryanx = data.byte(kRyanx); + uint8 ryany = data.byte(kRyany); + int8 deltax = ryanx - sprite->x; + int8 deltay = ryany - sprite->y; + if (ryanx < sprite->x) { + if (deltax < (int8)data.byte(kDoorcheck1)) + goto shutdoor; + } else { + if (deltax >= data.byte(kDoorcheck2)) + goto shutdoor; + } + if (ryany < sprite->y) { + if (deltay < (int8)data.byte(kDoorcheck3)) + goto shutdoor; + } else { + if (deltay >= data.byte(kDoorcheck4)) + goto shutdoor; + } +//opendoor: + if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) + sprite->frame = 6; + + ++sprite->frame; + if (sprite->frame == 1) { //doorsound2 + if (data.byte(kReallocation) == 5) //hoteldoor2 + al = 13; + else + al = 0; + playchannel1(); + } + if (objData->b18[sprite->frame] == 255) { + --sprite->frame; + } + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + data.byte(kThroughdoor) = 1; + return; +shutdoor: + if (sprite->frame == 5) { //doorsound1; + if (data.byte(kReallocation) == 5) //hoteldoor1 + al = 13; + else + al = 1; + playchannel1(); + } + if (sprite->frame != 0) { + --sprite->frame; + } + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + if (sprite->frame == 5) //nearly + data.byte(kThroughdoor) = 0; +} + +void DreamGenContext::steady(Sprite *sprite, ObjData *objData) { + uint8 b18 = objData->b18[0]; + objData->b17 = b18; + sprite->b15 = b18; +} + +void DreamGenContext::lockeddoorway() { + Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + ObjData *objData = (ObjData *)ds.ptr(di, 0); + lockeddoorway(sprite, objData); +} + +void DreamGenContext::lockeddoorway(Sprite *sprite, ObjData *objData) { + if (data.byte(kRyanx) < sprite->x) { + if (sprite->x - data.byte(kRyanx) > 24) + goto shutdoor2; + } else { + if (data.byte(kRyanx) - sprite->x >= 10) + goto shutdoor2; + } + + if (data.byte(kRyany) < sprite->y) { + if (sprite->y - data.byte(kRyany) > 30) + goto shutdoor2; + } else { + if (data.byte(kRyany) - sprite->y >= 12) + goto shutdoor2; + } + + if (data.byte(kThroughdoor) != 1) { + if (data.byte(kLockstatus) == 1) + goto shutdoor2; + } + + if (sprite->frame == 1) { + al = 0; + playchannel1(); + } + + if (sprite->frame == 6) { + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathon(); + bx = pop(); + es = pop(); + } + + if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) { + sprite->frame = 6; + } + + ++sprite->frame; + if (objData->b18[sprite->frame] == 255) { + --sprite->frame; + } + + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + if (sprite->frame == 5) + data.byte(kThroughdoor) = 1; + return; + +shutdoor2: + if (sprite->frame == 5) { + al = 1; + playchannel1(); + } + + if (sprite->frame != 0) { + --sprite->frame; + } + + data.byte(kThroughdoor) = 0; + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + + if (sprite->frame == 0) { + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathoff(); + bx = pop(); + es = pop(); + data.byte(kLockstatus) = 1; + } +} + +void DreamGenContext::liftsprite() { + Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); + ObjData *objData = (ObjData *)ds.ptr(di, 0); + liftsprite(sprite, objData); +} + +void DreamGenContext::liftsprite(Sprite *sprite, ObjData *objData) { + uint8 liftFlag = data.byte(kLiftflag); + if (liftFlag == 0) { //liftclosed + turnpathoffCPP(data.byte(kLiftpath)); + + if (data.byte(kCounttoopen) != 0) { + _dec(data.byte(kCounttoopen)); + if (data.byte(kCounttoopen) == 0) + data.byte(kLiftflag) = 3; + } + sprite->frame = 0; + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + } + else if (liftFlag == 1) { //liftopen + turnpathonCPP(data.byte(kLiftpath)); + + if (data.byte(kCounttoclose) != 0) { + _dec(data.byte(kCounttoclose)); + if (data.byte(kCounttoclose) == 0) + data.byte(kLiftflag) = 2; + } + sprite->frame = 12; + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + } + else if (liftFlag == 3) { //openlift + if (sprite->frame == 12) { + data.byte(kLiftflag) = 1; + return; + } + ++sprite->frame; + if (sprite->frame == 1) { + al = 2; + liftnoise(); + } + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + } else { //closeLift + assert(liftFlag == 2); + if (sprite->frame == 0) { + data.byte(kLiftflag) = 0; + return; + } + --sprite->frame; + if (sprite->frame == 11) { + al = 3; + liftnoise(); + } + sprite->b15 = objData->b17 = objData->b18[sprite->frame]; + } +} + +} /*namespace dreamgen */ + diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 27c58bcf7b..b5373649ef 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -898,20 +898,6 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint } } -Sprite *DreamGenContext::spritetable() { - push(es); - push(bx); - - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprite = (Sprite *)es.ptr(bx, 16 * sizeof(Sprite)); - - bx = pop(); - es = pop(); - - return sprite; -} - void DreamGenContext::showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { es = dst; ds = src; @@ -986,54 +972,6 @@ void DreamGenContext::showframe() { ch = height; } -void DreamGenContext::printsprites() { - for (size_t priority = 0; priority < 7; ++priority) { - Sprite *sprites = spritetable(); - for (size_t j = 0; j < 16; ++j) { - const Sprite &sprite = sprites[j]; - if (READ_LE_UINT16(&sprite.updateCallback) == 0x0ffff) - continue; - if (priority != sprite.priority) - continue; - if (sprite.hidden == 1) - continue; - printasprite(&sprite); - } - } -} - -void DreamGenContext::printasprite(const Sprite *sprite) { - push(es); - push(bx); - ds = READ_LE_UINT16(&sprite->w6); - ax = sprite->y; - if (al >= 220) { - bx = data.word(kMapady) - (256 - al); - } else { - bx = ax + data.word(kMapady); - } - - ax = sprite->x; - if (al >= 220) { - di = data.word(kMapadx) - (256 - al); - } else { - di = ax + data.word(kMapadx); - } - - uint8 c; - if (sprite->b29 != 0) - c = 8; - else - c = 0; - uint8 width, height; - showframe(es, ds, di, bx, sprite->b15, c, &width, &height); - cl = width; - ch = height; - - bx = pop(); - es = pop(); -} - void DreamGenContext::eraseoldobs() { if (data.byte(kNewobs) == 0) return; @@ -1047,337 +985,6 @@ void DreamGenContext::eraseoldobs() { } } -void DreamGenContext::clearsprites() { - memset(spritetable(), 0xff, sizeof(Sprite) * 16); -} - -Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 somethingInDx, uint16 somethingInDi) { - Sprite *sprite = spritetable(); - while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either - ++sprite; - } - - WRITE_LE_UINT16(&sprite->updateCallback, updateCallback); - sprite->x = x; - sprite->y = y; - WRITE_LE_UINT16(&sprite->w6, somethingInDx); - WRITE_LE_UINT16(&sprite->w8, somethingInDi); - sprite->w2 = 0xffff; - sprite->b15 = 0; - sprite->delay = 0; - return sprite; -} - -void DreamGenContext::makesprite() { // NB: returns new sprite in es:bx - Sprite *sprite = makesprite(si & 0xff, si >> 8, cx, dx, di); - - // Recover es:bx from sprite - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); - bx += sizeof(Sprite) * (sprite - sprites); - // -} - -void DreamGenContext::spriteupdate() { - Sprite *sprites = spritetable(); - sprites[0].hidden = data.byte(kRyanon); - - Sprite *sprite = sprites; - for (size_t i=0; i < 16; ++i) { - uint16 updateCallback = READ_LE_UINT16(&sprite->updateCallback); - if (updateCallback != 0xffff) { - sprite->w24 = sprite->w2; - if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++ - mainmanCPP(sprite); - else { - assert(updateCallback == addr_backobject); - backobject(sprite); - } - } - - if (data.byte(kNowinnewroom) == 1) - break; - ++sprite; - } -} - -void DreamGenContext::initman() { - Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0); - sprite->priority = 4; - sprite->b22 = 0; - sprite->b29 = 0; - - // Recover es:bx from sprite - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); - bx += 32 * (sprite - sprites); - // -} - -void DreamGenContext::mainmanCPP(Sprite *sprite) { - push(es); - push(ds); - - // Recover es:bx from sprite - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); - bx += 32 * (sprite - sprites); - // - - if (data.byte(kResetmanxy) == 1) { - data.byte(kResetmanxy) = 0; - sprite->x = data.byte(kRyanx); - sprite->y = data.byte(kRyany); - sprite->b29 = 0; - } - --sprite->b22; - if (sprite->b22 != 0xff) { - ds = pop(); - es = pop(); - return; - } - sprite->b22 = 0; - if (data.byte(kTurntoface) != data.byte(kFacing)) { - aboutturn(sprite); - } else { - if ((data.byte(kTurndirection) != 0) && (data.byte(kLinepointer) == 254)) { - data.byte(kReasseschanges) = 1; - if (data.byte(kFacing) == data.byte(kLeavedirection)) - checkforexit(); - } - data.byte(kTurndirection) = 0; - if (data.byte(kLinepointer) == 254) { - sprite->b29 = 0; - } else { - ++sprite->b29; - if (sprite->b29 == 11) - sprite->b29 = 1; - walking(sprite); - if (data.byte(kLinepointer) != 254) { - if ((data.byte(kFacing) & 1) == 0) - walking(sprite); - else if ((sprite->b29 != 2) && (sprite->b29 != 7)) - walking(sprite); - } - if (data.byte(kLinepointer) == 254) { - if (data.byte(kTurntoface) == data.byte(kFacing)) { - data.byte(kReasseschanges) = 1; - if (data.byte(kFacing) == data.byte(kLeavedirection)) - checkforexit(); - } - } - } - } - static const uint8 facelist[] = { 0,60,33,71,11,82,22,93 }; - sprite->b15 = sprite->b29 + facelist[data.byte(kFacing)]; - data.byte(kRyanx) = sprite->x; - data.byte(kRyany) = sprite->y; - - ds = pop(); - es = pop(); -} - - -void DreamGenContext::walking() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - walking(sprite); -} - -void DreamGenContext::walking(Sprite *sprite) { - uint8 comp; - if (data.byte(kLinedirection) != 0) { - --data.byte(kLinepointer); - comp = 200; - } else { - ++data.byte(kLinepointer); - comp = data.byte(kLinelength); - } - if (data.byte(kLinepointer) < comp) { - sprite->x = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 0); - sprite->y = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 1); - return; - } - - data.byte(kLinepointer) = 254; - data.byte(kManspath) = data.byte(kDestination); - if (data.byte(kDestination) == data.byte(kFinaldest)) { - facerightway(); - return; - } - data.byte(kDestination) = data.byte(kFinaldest); - push(es); - push(bx); - autosetwalk(); - bx = pop(); - es = pop(); -} - -void DreamGenContext::aboutturn(Sprite *sprite) { - bool incdir = true; - - if (data.byte(kTurndirection) == 1) - incdir = true; - else if ((int8)data.byte(kTurndirection) == -1) - incdir = false; - else { - if (data.byte(kFacing) < data.byte(kTurntoface)) { - uint8 delta = data.byte(kTurntoface) - data.byte(kFacing); - if (delta >= 4) - incdir = false; - else - incdir = true; - } else { - uint8 delta = data.byte(kFacing) - data.byte(kTurntoface); - if (delta >= 4) - incdir = true; - else - incdir = false; - } - } - - if (incdir) { - data.byte(kTurndirection) = 1; - data.byte(kFacing) = (data.byte(kFacing) + 1) & 7; - sprite->b29 = 0; - } else { - data.byte(kTurndirection) = -1; - data.byte(kFacing) = (data.byte(kFacing) - 1) & 7; - sprite->b29 = 0; - } -} - -void DreamGenContext::backobject(Sprite *sprite) { - push(ds); - - ds = data.word(kSetdat); - di = READ_LE_UINT16(&sprite->obj_data); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - - if (sprite->delay != 0) { - --sprite->delay; - ds = pop(); - return; - } - - sprite->delay = objData->delay; - if (objData->type == 6) - widedoor(sprite, objData); - else if (objData->type == 5) - random(sprite, objData); - else if (objData->type == 4) - lockeddoorway(sprite, objData); - else if (objData->type == 3) - liftsprite(sprite, objData); - else if (objData->type == 2) - doorway(sprite, objData); - else if (objData->type == 1) - constant(sprite, objData); - else - steady(sprite, objData); - - ds = pop(); -} - -void DreamGenContext::constant(Sprite *sprite, ObjData *objData) { - ++sprite->frame; - if (objData->b18[sprite->frame] == 255) { - sprite->frame = 0; - } - uint8 b18 = objData->b18[sprite->frame]; - objData->b17 = b18; - sprite->b15 = b18; -} - -void DreamGenContext::random(Sprite *sprite, ObjData *objData) { - randomnum1(); - uint16 r = ax; - sprite->b15 = objData->b18[r&7]; -} - -void DreamGenContext::doorway(Sprite *sprite, ObjData *objData) { - data.byte(kDoorcheck1) = -24; - data.byte(kDoorcheck2) = 10; - data.byte(kDoorcheck3) = -30; - data.byte(kDoorcheck4) = 10; - dodoor(sprite, objData); -} - -void DreamGenContext::widedoor(Sprite *sprite, ObjData *objData) { - data.byte(kDoorcheck1) = -24; - data.byte(kDoorcheck2) = 24; - data.byte(kDoorcheck3) = -30; - data.byte(kDoorcheck4) = 24; - dodoor(sprite, objData); -} - -void DreamGenContext::dodoor() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - dodoor(sprite, objData); -} - -void DreamGenContext::dodoor(Sprite *sprite, ObjData *objData) { - uint8 ryanx = data.byte(kRyanx); - uint8 ryany = data.byte(kRyany); - int8 deltax = ryanx - sprite->x; - int8 deltay = ryany - sprite->y; - if (ryanx < sprite->x) { - if (deltax < (int8)data.byte(kDoorcheck1)) - goto shutdoor; - } else { - if (deltax >= data.byte(kDoorcheck2)) - goto shutdoor; - } - if (ryany < sprite->y) { - if (deltay < (int8)data.byte(kDoorcheck3)) - goto shutdoor; - } else { - if (deltay >= data.byte(kDoorcheck4)) - goto shutdoor; - } -//opendoor: - if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) - sprite->frame = 6; - - ++sprite->frame; - if (sprite->frame == 1) { //doorsound2 - if (data.byte(kReallocation) == 5) //hoteldoor2 - al = 13; - else - al = 0; - playchannel1(); - } - if (objData->b18[sprite->frame] == 255) { - --sprite->frame; - } - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - data.byte(kThroughdoor) = 1; - return; -shutdoor: - if (sprite->frame == 5) { //doorsound1; - if (data.byte(kReallocation) == 5) //hoteldoor1 - al = 13; - else - al = 1; - playchannel1(); - } - if (sprite->frame != 0) { - --sprite->frame; - } - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - if (sprite->frame == 5) //nearly - data.byte(kThroughdoor) = 0; -} - -void DreamGenContext::steady(Sprite *sprite, ObjData *objData) { - uint8 b18 = objData->b18[0]; - objData->b17 = b18; - sprite->b15 = b18; -} - void DreamGenContext::turnpathonCPP(uint8 param) { al = param; push(es); @@ -1396,142 +1003,6 @@ void DreamGenContext::turnpathoffCPP(uint8 param) { es = pop(); } -void DreamGenContext::lockeddoorway() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - lockeddoorway(sprite, objData); -} - -void DreamGenContext::lockeddoorway(Sprite *sprite, ObjData *objData) { - if (data.byte(kRyanx) < sprite->x) { - if (sprite->x - data.byte(kRyanx) > 24) - goto shutdoor2; - } else { - if (data.byte(kRyanx) - sprite->x >= 10) - goto shutdoor2; - } - - if (data.byte(kRyany) < sprite->y) { - if (sprite->y - data.byte(kRyany) > 30) - goto shutdoor2; - } else { - if (data.byte(kRyany) - sprite->y >= 12) - goto shutdoor2; - } - - if (data.byte(kThroughdoor) != 1) { - if (data.byte(kLockstatus) == 1) - goto shutdoor2; - } - - if (sprite->frame == 1) { - al = 0; - playchannel1(); - } - - if (sprite->frame == 6) { - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathon(); - bx = pop(); - es = pop(); - } - - if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) { - sprite->frame = 6; - } - - ++sprite->frame; - if (objData->b18[sprite->frame] == 255) { - --sprite->frame; - } - - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - if (sprite->frame == 5) - data.byte(kThroughdoor) = 1; - return; - -shutdoor2: - if (sprite->frame == 5) { - al = 1; - playchannel1(); - } - - if (sprite->frame != 0) { - --sprite->frame; - } - - data.byte(kThroughdoor) = 0; - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - - if (sprite->frame == 0) { - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathoff(); - bx = pop(); - es = pop(); - data.byte(kLockstatus) = 1; - } -} - -void DreamGenContext::liftsprite() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - liftsprite(sprite, objData); -} - -void DreamGenContext::liftsprite(Sprite *sprite, ObjData *objData) { - uint8 liftFlag = data.byte(kLiftflag); - if (liftFlag == 0) { //liftclosed - turnpathoffCPP(data.byte(kLiftpath)); - - if (data.byte(kCounttoopen) != 0) { - _dec(data.byte(kCounttoopen)); - if (data.byte(kCounttoopen) == 0) - data.byte(kLiftflag) = 3; - } - sprite->frame = 0; - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - } - else if (liftFlag == 1) { //liftopen - turnpathonCPP(data.byte(kLiftpath)); - - if (data.byte(kCounttoclose) != 0) { - _dec(data.byte(kCounttoclose)); - if (data.byte(kCounttoclose) == 0) - data.byte(kLiftflag) = 2; - } - sprite->frame = 12; - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - } - else if (liftFlag == 3) { //openlift - if (sprite->frame == 12) { - data.byte(kLiftflag) = 1; - return; - } - ++sprite->frame; - if (sprite->frame == 1) { - al = 2; - liftnoise(); - } - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - } else { //closeLift - assert(liftFlag == 2); - if (sprite->frame == 0) { - data.byte(kLiftflag) = 0; - return; - } - --sprite->frame; - if (sprite->frame == 11) { - al = 3; - liftnoise(); - } - sprite->b15 = objData->b17 = objData->b18[sprite->frame]; - } -} - void DreamGenContext::modifychar() { al = engine->modifyChar(al); } -- cgit v1.2.3 From 521ffc5b5627fd3894c4088c0a69cae8c56784cf Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 26 Jul 2011 00:34:41 +0200 Subject: DREAMWEB: Extraction of print.cpp from stubs.cpp --- engines/dreamweb/module.mk | 1 + engines/dreamweb/print.cpp | 251 +++++++++++++++++++++++++++++++++++++++++++++ engines/dreamweb/stubs.cpp | 221 --------------------------------------- 3 files changed, 252 insertions(+), 221 deletions(-) create mode 100644 engines/dreamweb/print.cpp diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk index fcda4fd6f4..9c8106db90 100644 --- a/engines/dreamweb/module.mk +++ b/engines/dreamweb/module.mk @@ -5,6 +5,7 @@ MODULE_OBJS := \ detection.o \ dreamweb.o \ dreamgen.o \ + print.o \ sprite.o \ stubs.o diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp new file mode 100644 index 0000000000..f2a7450cc1 --- /dev/null +++ b/engines/dreamweb/print.cpp @@ -0,0 +1,251 @@ +/* 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. + * + */ + +#include "dreamweb/dreamweb.h" +#include "engines/util.h" +#include "graphics/surface.h" + +namespace DreamGen { + +void DreamGenContext::printboth() { + uint16 x = di; + printboth(es, ds, &x, bx, al); + di = x; +} + +void DreamGenContext::printboth(uint16 dst, uint16 src, uint16 *x, uint16 y, uint8 c) { + uint16 newX = *x; + uint8 width, height; + printchar(dst, src, &newX, y, c, &width, &height); + multidump(*x, y, width, height); + *x = newX; +} + +uint8 DreamGenContext::getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount) { + *totalWidth = 0; + *charCount = 0; + while(true) { + uint8 firstChar = *string; + ++string; + ++*charCount; + if ((firstChar == ':') || (firstChar == 0)) { //endall + *totalWidth += 6; + return 1; + } + if (firstChar == 32) { //endword + *totalWidth += 6; + return 0; + } + firstChar = engine->modifyChar(firstChar); + if (firstChar != 255) { + uint8 secondChar = *string; + uint8 width = ds.byte(6*(firstChar - 32 + data.word(kCharshift))); + width = kernchars(firstChar, secondChar, width); + *totalWidth += width; + } + } +} + +void DreamGenContext::getnextword() { + uint8 totalWidth, charCount; + al = getnextword(es.ptr(di, 0), &totalWidth, &charCount); + bl = totalWidth; + bh = charCount; + di += charCount; +} + +void DreamGenContext::printchar() { + uint16 x = di; + uint8 width, height; + printchar(es, ds, &x, bx, al, &width, &height); + di = x; + cl = width; + ch = height; +} + +void DreamGenContext::printchar(uint16 dst, uint16 src, uint16* x, uint16 y, uint8 c, uint8 *width, uint8 *height) { + if (c == 255) + return; + push(si); + push(di); + if (data.byte(kForeignrelease) != 0) + y -= 3; + uint16 tmp = c - 32 + data.word(kCharshift); + showframe(dst, src, *x, y, tmp & 0xff, tmp >> 8, width, height); + di = pop(); + si = pop(); + _cmp(data.byte(kKerning), 0); + if (flags.z()) + kernchars(); + (*x) += *width; +} + +void DreamGenContext::printslow() { + al = printslow(di, bx, dl, (bool)(dl & 1)); +} + +uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool centered) { + data.byte(kPointerframe) = 1; + data.byte(kPointermode) = 3; + ds = data.word(kCharset1); + do { + uint16 offset = x; + uint16 charCount = getnumber(si, maxWidth, centered, &offset); + do { + push(si); + push(es); + uint8 c0 = es.byte(si); + push(es); + push(ds); + c0 = engine->modifyChar(c0); + printboth(es, ds, &offset, y, c0); + ds = pop(); + es = pop(); + uint8 c1 = es.byte(si+1); + ++si; + if ((c1 == 0) || (c1 == ':')) { + es = pop(); + si = pop(); + return 0; + } + if (charCount != 1) { + push(ds); + push(es); + c1 = engine->modifyChar(c1); + data.word(kCharshift) = 91; + uint16 offset2 = offset; + printboth(es, ds, &offset2, y, c1); + data.word(kCharshift) = 0; + es = pop(); + ds = pop(); + for (int i=0; i<2; ++i) { + waitframes(); + if (ax == 0) + continue; + if (ax != data.word(kOldbutton)) { + es = pop(); + si = pop(); + return 1; + } + } + } + + es = pop(); + si = pop(); + ++si; + --charCount; + } while (charCount); + y += 10; + } while (true); +} + +void DreamGenContext::printdirect() { + uint16 y = bx; + printdirect(di, &y, dl, (bool)(dl & 1)); + bx = y; +} + +void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered) { + data.word(kLastxpos) = x; + ds = data.word(kCurrentset); + while (true) { + uint16 offset = x; + uint8 charCount = getnumber(si, maxWidth, centered, &offset); + uint16 i = offset; + do { + uint8 c = es.byte(si); + ++si; + if ((c == 0) || (c == ':')) { + return; + } + c = engine->modifyChar(c); + uint8 width, height; + push(es); + printchar(es, ds, &i, *y, c, &width, &height); + es = pop(); + data.word(kLastxpos) = i; + --charCount; + } while(charCount); + *y += data.word(kLinespacing); + } +} + +void DreamGenContext::getnumber() { + uint16 offset = di; + cl = getnumber(si, dl, (bool)(dl & 1), &offset); + di = offset; +} + +uint8 DreamGenContext::getnumber(uint16 index, uint16 maxWidth, bool centered, uint16* offset) { + uint8 totalWidth = 0; + uint8 charCount = 0; + while (true) { + uint8 wordTotalWidth, wordCharCount; + uint8 done = getnextword(es.ptr(index, 0), &wordTotalWidth, &wordCharCount); + index += wordCharCount; + + if (done == 1) { //endoftext + ax = totalWidth + wordTotalWidth - 10; + if (ax < maxWidth) { + totalWidth += wordTotalWidth; + charCount += wordCharCount; + } + + if (centered) { + ax = (maxWidth & 0xfe) + 2 + 20 - totalWidth; + ax /= 2; + } else { + ax = 0; + } + *offset += ax; + return charCount; + } + ax = totalWidth + wordTotalWidth - 10; + if (ax >= maxWidth) { //gotoverend + if (centered) { + ax = (maxWidth & 0xfe) - totalWidth + 20; + ax /= 2; + } else { + ax = 0; + } + *offset += ax; + return charCount; + } + totalWidth += wordTotalWidth; + charCount += wordCharCount; + } +} + +uint8 DreamGenContext::kernchars(uint8 firstChar, uint8 secondChar, uint8 width) { + if ((firstChar == 'a') || (al == 'u')) { + if ((secondChar == 'n') || (secondChar == 't') || (secondChar == 'r') || (secondChar == 'i') || (secondChar == 'l')) + return width-1; + } + return width; +} + +void DreamGenContext::kernchars() { + cl = kernchars(al, ah, cl); +} + +} /*namespace dreamgen */ + diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index b5373649ef..0eb2d6de1f 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -246,83 +246,6 @@ void DreamGenContext::setmouse() { data.word(kOldpointerx) = 0xffff; } -void DreamGenContext::printboth() { - uint16 x = di; - printboth(es, ds, &x, bx, al); - di = x; -} - -void DreamGenContext::printboth(uint16 dst, uint16 src, uint16 *x, uint16 y, uint8 c) { - uint16 newX = *x; - uint8 width, height; - printchar(dst, src, &newX, y, c, &width, &height); - multidump(*x, y, width, height); - *x = newX; -} - -uint8 DreamGenContext::getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount) { - *totalWidth = 0; - *charCount = 0; - while(true) { - uint8 firstChar = *string; - ++string; - ++*charCount; - if ((firstChar == ':') || (firstChar == 0)) { //endall - *totalWidth += 6; - return 1; - } - if (firstChar == 32) { //endword - *totalWidth += 6; - return 0; - } - firstChar = engine->modifyChar(firstChar); - if (firstChar != 255) { - uint8 secondChar = *string; - uint8 width = ds.byte(6*(firstChar - 32 + data.word(kCharshift))); - width = kernchars(firstChar, secondChar, width); - *totalWidth += width; - } - } -} - -void DreamGenContext::getnextword() { - uint8 totalWidth, charCount; - al = getnextword(es.ptr(di, 0), &totalWidth, &charCount); - bl = totalWidth; - bh = charCount; - di += charCount; -} - -void DreamGenContext::printchar() { - uint16 x = di; - uint8 width, height; - printchar(es, ds, &x, bx, al, &width, &height); - di = x; - cl = width; - ch = height; -} - -void DreamGenContext::printchar(uint16 dst, uint16 src, uint16* x, uint16 y, uint8 c, uint8 *width, uint8 *height) { - if (c == 255) - return; - push(si); - push(di); - if (data.byte(kForeignrelease) != 0) - y -= 3; - uint16 tmp = c - 32 + data.word(kCharshift); - showframe(dst, src, *x, y, tmp & 0xff, tmp >> 8, width, height); - di = pop(); - si = pop(); - _cmp(data.byte(kKerning), 0); - if (flags.z()) - kernchars(); - (*x) += *width; -} - -void DreamGenContext::printslow() { - al = printslow(di, bx, dl, (bool)(dl & 1)); -} - void DreamGenContext::dumptextline() { if (data.byte(kNewtextline) != 1) return; @@ -334,92 +257,6 @@ void DreamGenContext::dumptextline() { multidump(x, y, 228, 13); } -uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool centered) { - data.byte(kPointerframe) = 1; - data.byte(kPointermode) = 3; - ds = data.word(kCharset1); - do { - uint16 offset = x; - uint16 charCount = getnumber(si, maxWidth, centered, &offset); - do { - push(si); - push(es); - uint8 c0 = es.byte(si); - push(es); - push(ds); - c0 = engine->modifyChar(c0); - printboth(es, ds, &offset, y, c0); - ds = pop(); - es = pop(); - uint8 c1 = es.byte(si+1); - ++si; - if ((c1 == 0) || (c1 == ':')) { - es = pop(); - si = pop(); - return 0; - } - if (charCount != 1) { - push(ds); - push(es); - c1 = engine->modifyChar(c1); - data.word(kCharshift) = 91; - uint16 offset2 = offset; - printboth(es, ds, &offset2, y, c1); - data.word(kCharshift) = 0; - es = pop(); - ds = pop(); - for (int i=0; i<2; ++i) { - waitframes(); - if (ax == 0) - continue; - if (ax != data.word(kOldbutton)) { - es = pop(); - si = pop(); - return 1; - } - } - } - - es = pop(); - si = pop(); - ++si; - --charCount; - } while (charCount); - y += 10; - } while (true); -} - -void DreamGenContext::printdirect() { - uint16 y = bx; - printdirect(di, &y, dl, (bool)(dl & 1)); - bx = y; -} - -void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered) { - data.word(kLastxpos) = x; - ds = data.word(kCurrentset); - while (true) { - uint16 offset = x; - uint8 charCount = getnumber(si, maxWidth, centered, &offset); - uint16 i = offset; - do { - uint8 c = es.byte(si); - ++si; - if ((c == 0) || (c == ':')) { - return; - } - c = engine->modifyChar(c); - uint8 width, height; - push(es); - printchar(es, ds, &i, *y, c, &width, &height); - es = pop(); - data.word(kLastxpos) = i; - --charCount; - } while(charCount); - *y += data.word(kLinespacing); - } -} - void DreamGenContext::getundertimed() { uint16 y = data.byte(kTimedy); if (data.byte(kForeignrelease)) @@ -460,64 +297,6 @@ void DreamGenContext::usetimedtext() { data.byte(kNeedtodumptimed) = 1; } -void DreamGenContext::getnumber() { - uint16 offset = di; - cl = getnumber(si, dl, (bool)(dl & 1), &offset); - di = offset; -} - -uint8 DreamGenContext::getnumber(uint16 index, uint16 maxWidth, bool centered, uint16* offset) { - uint8 totalWidth = 0; - uint8 charCount = 0; - while (true) { - uint8 wordTotalWidth, wordCharCount; - uint8 done = getnextword(es.ptr(index, 0), &wordTotalWidth, &wordCharCount); - index += wordCharCount; - - if (done == 1) { //endoftext - ax = totalWidth + wordTotalWidth - 10; - if (ax < maxWidth) { - totalWidth += wordTotalWidth; - charCount += wordCharCount; - } - - if (centered) { - ax = (maxWidth & 0xfe) + 2 + 20 - totalWidth; - ax /= 2; - } else { - ax = 0; - } - *offset += ax; - return charCount; - } - ax = totalWidth + wordTotalWidth - 10; - if (ax >= maxWidth) { //gotoverend - if (centered) { - ax = (maxWidth & 0xfe) - totalWidth + 20; - ax /= 2; - } else { - ax = 0; - } - *offset += ax; - return charCount; - } - totalWidth += wordTotalWidth; - charCount += wordCharCount; - } -} - -uint8 DreamGenContext::kernchars(uint8 firstChar, uint8 secondChar, uint8 width) { - if ((firstChar == 'a') || (al == 'u')) { - if ((secondChar == 'n') || (secondChar == 't') || (secondChar == 'r') || (secondChar == 'i') || (secondChar == 'l')) - return width-1; - } - return width; -} - -void DreamGenContext::kernchars() { - cl = kernchars(al, ah, cl); -} - void DreamGenContext::gettime() { TimeDate t; g_system->getTimeAndDate(t); -- cgit v1.2.3 From dfec38c615279dad5f6bc41ad7843e20bcd27d22 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 26 Jul 2011 00:56:24 +0200 Subject: DREAMWEB: Misc. register usage cleaning --- engines/dreamweb/sprite.cpp | 48 ++++++++++++++------------------------------- engines/dreamweb/stubs.h | 3 ++- 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 5b0449f5b2..6ed0421a93 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -28,19 +28,17 @@ namespace DreamGen { Sprite *DreamGenContext::spritetable() { push(es); - push(bx); - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprite = (Sprite *)es.ptr(bx, 16 * sizeof(Sprite)); - - bx = pop(); + Sprite *sprite = (Sprite *)es.ptr(kSpritetable, 16 * sizeof(Sprite)); es = pop(); - return sprite; } void DreamGenContext::printsprites() { + printsprites(es); +} + +void DreamGenContext::printsprites(uint16 dst) { for (size_t priority = 0; priority < 7; ++priority) { Sprite *sprites = spritetable(); for (size_t j = 0; j < 16; ++j) { @@ -51,27 +49,23 @@ void DreamGenContext::printsprites() { continue; if (sprite.hidden == 1) continue; - printasprite(&sprite); + printasprite(dst, &sprite); } } } -void DreamGenContext::printasprite(const Sprite *sprite) { - push(es); - push(bx); - ds = READ_LE_UINT16(&sprite->w6); - ax = sprite->y; - if (al >= 220) { - bx = data.word(kMapady) - (256 - al); +void DreamGenContext::printasprite(uint16 dst, const Sprite *sprite) { + uint16 x, y; + if (sprite->y >= 220) { + y = data.word(kMapady) - (256 - sprite->y); } else { - bx = ax + data.word(kMapady); + y = sprite->y + data.word(kMapady); } - ax = sprite->x; - if (al >= 220) { - di = data.word(kMapadx) - (256 - al); + if (sprite->x >= 220) { + x = data.word(kMapadx) - (256 - sprite->x); } else { - di = ax + data.word(kMapadx); + x = sprite->x + data.word(kMapadx); } uint8 c; @@ -80,12 +74,7 @@ void DreamGenContext::printasprite(const Sprite *sprite) { else c = 0; uint8 width, height; - showframe(es, ds, di, bx, sprite->b15, c, &width, &height); - cl = width; - ch = height; - - bx = pop(); - es = pop(); + showframe(es, READ_LE_UINT16(&sprite->w6), x, y, sprite->b15, c, &width, &height); } void DreamGenContext::clearsprites() { @@ -148,13 +137,6 @@ void DreamGenContext::initman() { sprite->priority = 4; sprite->b22 = 0; sprite->b29 = 0; - - // Recover es:bx from sprite - es = data.word(kBuffers); - bx = kSpritetable; - Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); - bx += 32 * (sprite - sprites); - // } void DreamGenContext::mainmanCPP(Sprite *sprite) { diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index fcf72e0727..b1e4be5f06 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -32,6 +32,7 @@ void convertkey(); void cls(); void printsprites(); + void printsprites(uint16 dst); void quickquit(); void readoneblock(); void printundermon(); @@ -59,7 +60,7 @@ Sprite *spritetable(); void showframe(); void showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); - void printasprite(const Sprite *sprite); + void printasprite(uint16 dst, const Sprite *sprite); void width160(); void multiput(uint16 x, uint16 y, uint8 width, uint8 height); void multiput(); -- cgit v1.2.3 From 5fc6a6e385813bb2b060e79f7853cd6ad112cad7 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 26 Jul 2011 07:54:25 +0200 Subject: DREAMWEB: 'getroomspaths' and 'facerightway' ported to C++ --- devtools/tasmrecover/tasm-recover | 4 +++- engines/dreamweb/dreamgen.cpp | 31 ------------------------------- engines/dreamweb/dreamgen.h | 6 ++---- engines/dreamweb/sprite.cpp | 7 +++++++ engines/dreamweb/stubs.cpp | 13 +++++++++++++ engines/dreamweb/stubs.h | 3 +++ 6 files changed, 28 insertions(+), 36 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index f09e2d186d..e0b0e21394 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -73,6 +73,8 @@ generator = cpp(context, "DreamGen", blacklist = [ 'modifychar', 'lockmon', 'cancelch0', - 'cancelch1' + 'cancelch1', + 'getroomspaths', + 'facerightway', ]) generator.generate('dreamweb') #start routine diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 7ec64263da..182a4411dd 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2395,24 +2395,6 @@ decdir: es.byte(bx+29) = 0; } -void DreamGenContext::facerightway() { - STACK_CHECK; - push(es); - push(bx); - getroomspaths(); - al = data.byte(kManspath); - ah = 0; - _add(ax, ax); - _add(ax, ax); - _add(ax, ax); - _add(bx, ax); - al = es.byte(bx+7); - data.byte(kTurntoface) = al; - data.byte(kLeavedirection) = al; - bx = pop(); - es = pop(); -} - void DreamGenContext::checkforexit() { STACK_CHECK; cl = data.byte(kRyanx); @@ -18566,17 +18548,6 @@ success: data.byte(kTurndirection) = 0; } -void DreamGenContext::getroomspaths() { - STACK_CHECK; - al = data.byte(kRoomnum); - ah = 0; - cx = 144; - _mul(cx); - es = data.word(kReels); - bx = (0); - _add(bx, ax); -} - void DreamGenContext::copyname() { STACK_CHECK; push(di); @@ -20908,7 +20879,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_findsource: findsource(); break; case addr_mainman: mainman(); break; case addr_aboutturn: aboutturn(); break; - case addr_facerightway: facerightway(); break; case addr_checkforexit: checkforexit(); break; case addr_adjustdown: adjustdown(); break; case addr_adjustup: adjustup(); break; @@ -21457,7 +21427,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_checkdest: checkdest(); break; case addr_bresenhams: bresenhams(); break; case addr_workoutframes: workoutframes(); break; - case addr_getroomspaths: getroomspaths(); break; case addr_copyname: copyname(); break; case addr_findobname: findobname(); break; case addr_showicon: showicon(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 037fd2ad2a..130e0f0b5b 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -123,7 +123,6 @@ public: static const uint16 addr_showicon = 0xca64; static const uint16 addr_findobname = 0xca60; static const uint16 addr_copyname = 0xca5c; - static const uint16 addr_getroomspaths = 0xca58; static const uint16 addr_workoutframes = 0xca54; static const uint16 addr_bresenhams = 0xca50; static const uint16 addr_checkdest = 0xca4c; @@ -674,7 +673,6 @@ public: static const uint16 addr_adjustup = 0xc150; static const uint16 addr_adjustdown = 0xc14c; static const uint16 addr_checkforexit = 0xc148; - static const uint16 addr_facerightway = 0xc144; static const uint16 addr_aboutturn = 0xc13c; static const uint16 addr_mainman = 0xc138; static const uint16 addr_findsource = 0xc130; @@ -1513,7 +1511,7 @@ public: void fillopen(); //void usetimedtext(); void delsprite(); - void getroomspaths(); + //void getroomspaths(); //void dumptextline(); void fadescreendownhalf(); void useplate(); @@ -1902,7 +1900,7 @@ public: void checkdest(); //void initman(); void loadpalfromiff(); - void facerightway(); + //void facerightway(); void startup1(); void findlen(); void showsymbol(); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 6ed0421a93..ed54ea12f7 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -536,5 +536,12 @@ void DreamGenContext::liftsprite(Sprite *sprite, ObjData *objData) { } } +void DreamGenContext::facerightway() { + uint8 *paths = getroomspathsCPP(); + uint8 dir = paths[8 * data.byte(kManspath) + 7]; + data.byte(kTurntoface) = dir; + data.byte(kLeavedirection) = dir; +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 0eb2d6de1f..dc9d60082b 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -825,5 +825,18 @@ void DreamGenContext::cancelch1() { engine->stopSound(1); } +void DreamGenContext::getroomspaths() { + es = data.word(kReels); + bx = data.byte(kRoomnum) * 144; +} + +uint8 *DreamGenContext::getroomspathsCPP() { + push(es); + es = data.word(kReels); + void *result = es.ptr(data.byte(kRoomnum) * 144, 144); + es = pop(); + return (uint8 *)result; +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index b1e4be5f06..6c12ce4807 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -71,6 +71,7 @@ void spriteupdate(); void initman(); void mainmanCPP(Sprite *sprite); + void facerightway(); void walking(); void walking(Sprite *sprite); void aboutturn(Sprite *sprite); @@ -88,6 +89,8 @@ void liftsprite(Sprite *sprite, ObjData *objData); void turnpathonCPP(uint8 param); void turnpathoffCPP(uint8 param); + void getroomspaths(); + uint8 *getroomspathsCPP(); void modifychar(); void lockmon(); void cancelch0(); -- cgit v1.2.3 From f657d4800a93d6111d723f702aebf42d98ccbf0f Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 27 Jul 2011 14:56:02 +0200 Subject: DREAMWEB: Cleanings and less register use --- engines/dreamweb/sprite.cpp | 14 ++-------- engines/dreamweb/stubs.cpp | 64 ++++++++++++++++++--------------------------- engines/dreamweb/stubs.h | 2 +- 3 files changed, 29 insertions(+), 51 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index ed54ea12f7..00d778c477 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -434,12 +434,7 @@ void DreamGenContext::lockeddoorway(Sprite *sprite, ObjData *objData) { } if (sprite->frame == 6) { - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathon(); - bx = pop(); - es = pop(); + turnpathonCPP(data.byte(kDoorpath)); } if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) { @@ -470,12 +465,7 @@ shutdoor2: sprite->b15 = objData->b17 = objData->b18[sprite->frame]; if (sprite->frame == 0) { - al = data.byte(kDoorpath); - push(es); - push(bx); - turnpathoff(); - bx = pop(); - es = pop(); + turnpathoffCPP(data.byte(kDoorpath)); data.byte(kLockstatus) = 1; } } diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index dc9d60082b..bf649aeb02 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -35,6 +35,14 @@ Common::String getFilename(Context &context) { return name; } +uint8 *DreamGenContext::workspace() { + push(es); + es = data.word(kWorkspace); + uint8 *result = es.ptr(0, 0); + es = pop(); + return result; +} + void DreamGenContext::multiget() { multiget(di, bx, cl, ch); } @@ -97,9 +105,8 @@ void DreamGenContext::multidump() { } void DreamGenContext::worktoscreen() { - ds = data.word(kWorkspace); uint size = 320 * 200; - engine->blit(ds.ptr(0, size), 320, 0, 0, 320, 200); + engine->blit(workspace(), 320, 0, 0, 320, 200); di = si = size; cx = 0; } @@ -634,19 +641,6 @@ void DreamGenContext::showpcx() { pcxFile.close(); } -/* -void DreamGenContext::frameoutv() { - uint16 pitch = dx; - uint16 width = cx & 0xff; - uint16 height = cx >> 8; - - const uint8 *src = ds.ptr(si, width * height); - uint8 *dst = es.ptr(0, pitch * height); - - frameoutv(dst, src, pitch, width, height, di, bx); -} -*/ - void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { // NB : These resilience checks were not in the original engine, but did they result in undefined behaviour // or was something broken during porting to C++? @@ -680,8 +674,6 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint void DreamGenContext::showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { es = dst; ds = src; - di = x; - bx = y; al = frameNumber; ah = effectsFlag; @@ -694,53 +686,49 @@ void DreamGenContext::showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint //notblankshow: if ((effectsFlag & 128) == 0) { - di += ds.byte(si + 4); - bx += ds.byte(si + 5); + x += ds.byte(si + 4); + y += ds.byte(si + 5); } //skipoffsets: - cx = ds.word(si + 0); - *width = cl; - *height = ch; + + *width = ds.byte(si + 0); + *height = ds.byte(si + 1); si = ds.word(si+2) + 2080; + const uint8 *pSrc = ds.ptr(si, *width * *height); if (effectsFlag) { if (effectsFlag & 128) { //centred - di -= *width / 2; - bx -= *height / 2; + x -= *width / 2; + y -= *height / 2; } if (effectsFlag & 64) { //diffdest - frameoutfx(es.ptr(0, dx * *height), ds.ptr(si, *width * *height), dx, *width, *height, di, bx); + frameoutfx(es.ptr(0, dx * *height), pSrc, dx, *width, *height, x, y); return; } if (effectsFlag & 8) { //printlist + /* push(ax); - ax = di - data.word(kMapadx); - push(bx); - bx -= data.word(kMapady); - ah = bl; - bx = pop(); + al = x - data.word(kMapadx); + ah = y - data.word(kMapady); //addtoprintlist(); // NB: Commented in the original asm ax = pop(); + */ } if (effectsFlag & 4) { //flippedx - es = data.word(kWorkspace); - frameoutfx(es.ptr(0, 320 * *height), ds.ptr(si, *width * *height), 320, *width, *height, di, bx); + frameoutfx(workspace(), pSrc, 320, *width, *height, x, y); return; } if (effectsFlag & 2) { //nomask - es = data.word(kWorkspace); - frameoutnm(es.ptr(0, 320 * *height), ds.ptr(si, *width * *height), 320, *width, *height, di, bx); + frameoutnm(workspace(), pSrc, 320, *width, *height, x, y); return; } if (effectsFlag & 32) { - es = data.word(kWorkspace); - frameoutbh(es.ptr(0, 320 * *height), ds.ptr(si, *width * *height), 320, *width, *height, di, bx); + frameoutbh(workspace(), pSrc, 320, *width, *height, x, y); return; } } //noeffects: - es = data.word(kWorkspace); - frameoutv(es.ptr(0, 65536), ds.ptr(si, *width * *height), 320, *width, *height, di, bx); + frameoutv(workspace(), pSrc, 320, *width, *height, x, y); return; } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 6c12ce4807..d48d634371 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ - + uint8 *workspace(); void multidump(); void multidump(uint16 x, uint16 y, uint8 width, uint8 height); void frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y); -- cgit v1.2.3 From b5c6ac150b81d49dad0a9d2f6327cb85a7c525ff Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 27 Jul 2011 17:42:11 +0200 Subject: DREAMWEB: diffDest blitting in 'showframe' doesn't pollute the interface any more --- engines/dreamweb/print.cpp | 20 +++++++++----------- engines/dreamweb/sprite.cpp | 10 +++------- engines/dreamweb/stubs.cpp | 5 ++--- engines/dreamweb/stubs.h | 11 +++++------ 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index f2a7450cc1..a73e9f0792 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -28,14 +28,14 @@ namespace DreamGen { void DreamGenContext::printboth() { uint16 x = di; - printboth(es, ds, &x, bx, al); + printboth(ds, &x, bx, al); di = x; } -void DreamGenContext::printboth(uint16 dst, uint16 src, uint16 *x, uint16 y, uint8 c) { +void DreamGenContext::printboth(uint16 src, uint16 *x, uint16 y, uint8 c) { uint16 newX = *x; uint8 width, height; - printchar(dst, src, &newX, y, c, &width, &height); + printchar(src, &newX, y, c, &width, &height); multidump(*x, y, width, height); *x = newX; } @@ -76,13 +76,13 @@ void DreamGenContext::getnextword() { void DreamGenContext::printchar() { uint16 x = di; uint8 width, height; - printchar(es, ds, &x, bx, al, &width, &height); + printchar(ds, &x, bx, al, &width, &height); di = x; cl = width; ch = height; } -void DreamGenContext::printchar(uint16 dst, uint16 src, uint16* x, uint16 y, uint8 c, uint8 *width, uint8 *height) { +void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 *width, uint8 *height) { if (c == 255) return; push(si); @@ -90,7 +90,7 @@ void DreamGenContext::printchar(uint16 dst, uint16 src, uint16* x, uint16 y, uin if (data.byte(kForeignrelease) != 0) y -= 3; uint16 tmp = c - 32 + data.word(kCharshift); - showframe(dst, src, *x, y, tmp & 0xff, tmp >> 8, width, height); + showframe(src, *x, y, tmp & 0xff, tmp >> 8, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); @@ -117,7 +117,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center push(es); push(ds); c0 = engine->modifyChar(c0); - printboth(es, ds, &offset, y, c0); + printboth(ds, &offset, y, c0); ds = pop(); es = pop(); uint8 c1 = es.byte(si+1); @@ -133,7 +133,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center c1 = engine->modifyChar(c1); data.word(kCharshift) = 91; uint16 offset2 = offset; - printboth(es, ds, &offset2, y, c1); + printboth(ds, &offset2, y, c1); data.word(kCharshift) = 0; es = pop(); ds = pop(); @@ -179,9 +179,7 @@ void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool cent } c = engine->modifyChar(c); uint8 width, height; - push(es); - printchar(es, ds, &i, *y, c, &width, &height); - es = pop(); + printchar(ds, &i, *y, c, &width, &height); data.word(kLastxpos) = i; --charCount; } while(charCount); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 00d778c477..d6347b62bf 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -35,10 +35,6 @@ Sprite *DreamGenContext::spritetable() { } void DreamGenContext::printsprites() { - printsprites(es); -} - -void DreamGenContext::printsprites(uint16 dst) { for (size_t priority = 0; priority < 7; ++priority) { Sprite *sprites = spritetable(); for (size_t j = 0; j < 16; ++j) { @@ -49,12 +45,12 @@ void DreamGenContext::printsprites(uint16 dst) { continue; if (sprite.hidden == 1) continue; - printasprite(dst, &sprite); + printasprite(&sprite); } } } -void DreamGenContext::printasprite(uint16 dst, const Sprite *sprite) { +void DreamGenContext::printasprite(const Sprite *sprite) { uint16 x, y; if (sprite->y >= 220) { y = data.word(kMapady) - (256 - sprite->y); @@ -74,7 +70,7 @@ void DreamGenContext::printasprite(uint16 dst, const Sprite *sprite) { else c = 0; uint8 width, height; - showframe(es, READ_LE_UINT16(&sprite->w6), x, y, sprite->b15, c, &width, &height); + showframe(READ_LE_UINT16(&sprite->w6), x, y, sprite->b15, c, &width, &height); } void DreamGenContext::clearsprites() { diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index bf649aeb02..140e278d1d 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -671,8 +671,7 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint } } -void DreamGenContext::showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { - es = dst; +void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { ds = src; al = frameNumber; ah = effectsFlag; @@ -734,7 +733,7 @@ void DreamGenContext::showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint void DreamGenContext::showframe() { uint8 width, height; - showframe(es, ds, di, bx, al, ah, &width, &height); + showframe(ds, di, bx, al, ah, &width, &height); cl = width; ch = height; } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index d48d634371..559c95625d 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -32,7 +32,6 @@ void convertkey(); void cls(); void printsprites(); - void printsprites(uint16 dst); void quickquit(); void readoneblock(); void printundermon(); @@ -42,9 +41,9 @@ void getnextword(); uint8 getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount); void printboth(); - void printboth(uint16 dst, uint16 src, uint16 *x, uint16 y, uint8 c); + void printboth(uint16 src, uint16 *x, uint16 y, uint8 c); void printchar(); - void printchar(uint16 dst, uint16 src, uint16 *x, uint16 y, uint8 c, uint8 *width, uint8 *height); + void printchar(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 *width, uint8 *height); void printdirect(); void printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); @@ -54,13 +53,13 @@ void printslow(); void dumptextline(); void getnumber(); - uint8 getnumber(uint16 index, uint16 maxWidth, bool centered, uint16* offset); + uint8 getnumber(uint16 index, uint16 maxWidth, bool centered, uint16 *offset); void kernchars(); uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); Sprite *spritetable(); void showframe(); - void showframe(uint16 dst, uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); - void printasprite(uint16 dst, const Sprite *sprite); + void showframe(uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); + void printasprite(const Sprite *sprite); void width160(); void multiput(uint16 x, uint16 y, uint8 width, uint8 height); void multiput(); -- cgit v1.2.3 From fe73a2407820000d0321173a50e0d98dbcfc213f Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 27 Jul 2011 17:53:50 +0200 Subject: DREAMWEB: 'makebackob' ported --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 35 ----------------------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/structs.h | 3 ++- engines/dreamweb/stubs.cpp | 23 +++++++++++++++++++++++ engines/dreamweb/stubs.h | 1 + 6 files changed, 28 insertions(+), 38 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index e0b0e21394..f550cb0826 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -75,6 +75,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'cancelch0', 'cancelch1', 'getroomspaths', + 'makebackob', 'facerightway', ]) generator.generate('dreamweb') #start routine diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 182a4411dd..9fa7f16995 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -7476,40 +7476,6 @@ blankframe: goto showobsloop; } -void DreamGenContext::makebackob() { - STACK_CHECK; - _cmp(data.byte(kNewobs), 0); - if (flags.z()) - return /* (nomake) */; - al = es.byte(si+5); - ah = es.byte(si+8); - push(si); - push(ax); - push(si); - ax = data.word(kObjectx); - bx = data.word(kObjecty); - ah = bl; - si = ax; - cx = 49520; - dx = data.word(kSetframes); - di = (0); - makesprite(); - ax = pop(); - es.word(bx+20) = ax; - ax = pop(); - _cmp(al, 255); - if (!flags.z()) - goto usedpriority; - al = 0; -usedpriority: - es.byte(bx+23) = al; - es.byte(bx+30) = ah; - es.byte(bx+16) = 0; - es.byte(bx+18) = 0; - es.byte(bx+19) = 0; - si = pop(); -} - void DreamGenContext::showallfree() { STACK_CHECK; es = data.word(kBuffers); @@ -21046,7 +21012,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_addlength: addlength(); break; case addr_drawflags: drawflags(); break; case addr_showallobs: showallobs(); break; - case addr_makebackob: makebackob(); break; case addr_showallfree: showallfree(); break; case addr_showallex: showallex(); break; case addr_calcfrframe: calcfrframe(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 130e0f0b5b..2b7149621b 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -505,7 +505,6 @@ public: static const uint16 addr_calcfrframe = 0xc454; static const uint16 addr_showallex = 0xc450; static const uint16 addr_showallfree = 0xc44c; - static const uint16 addr_makebackob = 0xc448; static const uint16 addr_showallobs = 0xc444; static const uint16 addr_drawflags = 0xc43c; static const uint16 addr_addlength = 0xc438; @@ -1559,7 +1558,7 @@ public: void discops(); //void printdirect(); void delthisone(); - void makebackob(); + //void makebackob(); void middlepanel(); void dumpwatch(); void saveload(); diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index e274375cf4..ac304ae2c2 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -31,7 +31,8 @@ struct Sprite { uint16 w12; uint8 b14; uint8 b15; - uint16 w16; + uint8 b16; + uint8 b17; uint8 delay; uint8 frame; uint16 obj_data; diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 140e278d1d..8c278b5990 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -825,5 +825,28 @@ uint8 *DreamGenContext::getroomspathsCPP() { return (uint8 *)result; } +void DreamGenContext::makebackob() { + if (data.byte(kNewobs) == 0) + return; + uint8 priority = es.byte(si+5); + uint8 type = es.byte(si+8); + Sprite *sprite = makesprite(data.word(kObjectx), data.word(kObjecty), addr_backobject, data.word(kSetframes), 0); + + // Recover es:bx from sprite + es = data.word(kBuffers); + bx = kSpritetable; + Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); + bx += sizeof(Sprite) * (sprite - sprites); + // + WRITE_LE_UINT16(&sprite->obj_data, si); + if (priority == 255) + priority = 0; + sprite->priority = priority; + sprite->type = type; + sprite->b16 = 0; + sprite->delay = 0; + sprite->frame = 0; +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 559c95625d..e72229639b 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -90,6 +90,7 @@ void turnpathoffCPP(uint8 param); void getroomspaths(); uint8 *getroomspathsCPP(); + void makebackob(); void modifychar(); void lockmon(); void cancelch0(); -- cgit v1.2.3 From 27482d2de2d2112526e70123febd1527902913be Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Fri, 29 Jul 2011 00:00:45 +0200 Subject: DREAMWEB: Fixed showframe ABI to conform to wjp's patch c626394f2b6566bc310f7fb02b9449acc2e8f00f --- engines/dreamweb/print.cpp | 2 +- engines/dreamweb/stubs.cpp | 7 +++---- engines/dreamweb/stubs.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index a73e9f0792..46d7d45b1a 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -90,7 +90,7 @@ void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 if (data.byte(kForeignrelease) != 0) y -= 3; uint16 tmp = c - 32 + data.word(kCharshift); - showframe(src, *x, y, tmp & 0xff, tmp >> 8, width, height); + showframe(src, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 8c278b5990..688ad82d92 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -671,12 +671,11 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint } } -void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { +void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { ds = src; - al = frameNumber; ah = effectsFlag; - si = (ax & 0x1ff) * 6; + si = frameNumber * 6; if (ds.word(si) == 0) { *width = 0; *height = 0; @@ -733,7 +732,7 @@ void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint8 frameNumbe void DreamGenContext::showframe() { uint8 width, height; - showframe(ds, di, bx, al, ah, &width, &height); + showframe(ds, di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); cl = width; ch = height; } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index e72229639b..33b272efc6 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -58,7 +58,7 @@ uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); Sprite *spritetable(); void showframe(); - void showframe(uint16 src, uint16 x, uint16 y, uint8 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); + void showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); void printasprite(const Sprite *sprite); void width160(); void multiput(uint16 x, uint16 y, uint8 width, uint8 height); -- cgit v1.2.3 From d6ed3ed013b75f05c7e2ba8195b08e537a82c972 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Fri, 29 Jul 2011 00:05:43 +0200 Subject: DREAMWEB: 'kernchar' fix --- engines/dreamweb/print.cpp | 22 ++++++++++++---------- engines/dreamweb/stubs.h | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 46d7d45b1a..882b4578ce 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -28,14 +28,14 @@ namespace DreamGen { void DreamGenContext::printboth() { uint16 x = di; - printboth(ds, &x, bx, al); + printboth(ds, &x, bx, al, ah); di = x; } -void DreamGenContext::printboth(uint16 src, uint16 *x, uint16 y, uint8 c) { +void DreamGenContext::printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { uint16 newX = *x; uint8 width, height; - printchar(src, &newX, y, c, &width, &height); + printchar(src, &newX, y, c, nextChar, &width, &height); multidump(*x, y, width, height); *x = newX; } @@ -76,13 +76,13 @@ void DreamGenContext::getnextword() { void DreamGenContext::printchar() { uint16 x = di; uint8 width, height; - printchar(ds, &x, bx, al, &width, &height); + printchar(ds, &x, bx, al, ah, &width, &height); di = x; cl = width; ch = height; } -void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 *width, uint8 *height) { +void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { if (c == 255) return; push(si); @@ -95,7 +95,7 @@ void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 si = pop(); _cmp(data.byte(kKerning), 0); if (flags.z()) - kernchars(); + *width = kernchars(c, nextChar, *width); (*x) += *width; } @@ -114,13 +114,14 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center push(si); push(es); uint8 c0 = es.byte(si); + uint8 c1 = es.byte(si+1); + uint8 c2 = es.byte(si+2); push(es); push(ds); c0 = engine->modifyChar(c0); - printboth(ds, &offset, y, c0); + printboth(ds, &offset, y, c0, c1); ds = pop(); es = pop(); - uint8 c1 = es.byte(si+1); ++si; if ((c1 == 0) || (c1 == ':')) { es = pop(); @@ -133,7 +134,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center c1 = engine->modifyChar(c1); data.word(kCharshift) = 91; uint16 offset2 = offset; - printboth(ds, &offset2, y, c1); + printboth(ds, &offset2, y, c1, c2); data.word(kCharshift) = 0; es = pop(); ds = pop(); @@ -173,13 +174,14 @@ void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool cent uint16 i = offset; do { uint8 c = es.byte(si); + uint8 nextChar = es.byte(si+1); ++si; if ((c == 0) || (c == ':')) { return; } c = engine->modifyChar(c); uint8 width, height; - printchar(ds, &i, *y, c, &width, &height); + printchar(ds, &i, *y, c, nextChar, &width, &height); data.word(kLastxpos) = i; --charCount; } while(charCount); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 33b272efc6..3a00c16d4d 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -41,9 +41,9 @@ void getnextword(); uint8 getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount); void printboth(); - void printboth(uint16 src, uint16 *x, uint16 y, uint8 c); + void printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); - void printchar(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 *width, uint8 *height); + void printchar(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); void printdirect(); void printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); -- cgit v1.2.3 From 5de064f1e4416d03daf9728a7f552c8a270424dd Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Fri, 29 Jul 2011 01:12:29 +0200 Subject: DREAMWEB: Use of the new feature of the generator to stop generating code for 'backobject' and 'mainman' (because addr_backobject is used) --- devtools/tasmrecover/tasm-recover | 4 +- engines/dreamweb/dreamgen.cpp | 152 -------------------------------------- engines/dreamweb/sprite.cpp | 12 ++- engines/dreamweb/stubs.h | 2 +- 4 files changed, 14 insertions(+), 156 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 278e4465d5..4ad926f241 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -80,6 +80,8 @@ generator = cpp(context, "DreamGen", blacklist = [ 'facerightway', ], skip_output = [ # These functions are processed but not output - 'dreamweb' + 'dreamweb', + 'backobject', + 'mainman', ]) generator.generate('dreamweb') #start routine diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index fbd7c079e0..ed9481fb13 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2258,104 +2258,6 @@ over1001: data.word(kTakeoff) = 320; } -void DreamGenContext::mainman() { - STACK_CHECK; - _cmp(data.byte(kResetmanxy), 1); - if (!flags.z()) - goto notinnewroom; - data.byte(kResetmanxy) = 0; - al = data.byte(kRyanx); - ah = data.byte(kRyany); - es.word(bx+10) = ax; - es.byte(bx+29) = 0; - goto executewalk; -notinnewroom: - _dec(es.byte(bx+22)); - _cmp(es.byte(bx+22), -1); - if (flags.z()) - goto executewalk; - return; -executewalk: - es.byte(bx+22) = 0; - al = data.byte(kTurntoface); - _cmp(al, data.byte(kFacing)); - if (flags.z()) - goto facingok; - aboutturn(); - goto notwalk; -facingok: - _cmp(data.byte(kTurndirection), 0); - if (flags.z()) - goto alreadyturned; - _cmp(data.byte(kLinepointer), 254); - if (!flags.z()) - goto alreadyturned; - data.byte(kReasseschanges) = 1; - al = data.byte(kFacing); - _cmp(al, data.byte(kLeavedirection)); - if (!flags.z()) - goto alreadyturned; - checkforexit(); -alreadyturned: - data.byte(kTurndirection) = 0; - _cmp(data.byte(kLinepointer), 254); - if (!flags.z()) - goto walkman; - es.byte(bx+29) = 0; - goto notwalk; -walkman: - al = es.byte(bx+29); - _inc(al); - _cmp(al, 11); - if (!flags.z()) - goto notanimend1; - al = 1; -notanimend1: - es.byte(bx+29) = al; - walking(); - _cmp(data.byte(kLinepointer), 254); - if (flags.z()) - goto afterwalk; - al = data.byte(kFacing); - _and(al, 1); - if (flags.z()) - goto isdouble; - al = es.byte(bx+29); - _cmp(al, 2); - if (flags.z()) - goto afterwalk; - _cmp(al, 7); - if (flags.z()) - goto afterwalk; -isdouble: - walking(); -afterwalk: - _cmp(data.byte(kLinepointer), 254); - if (!flags.z()) - goto notwalk; - al = data.byte(kTurntoface); - _cmp(al, data.byte(kFacing)); - if (!flags.z()) - goto notwalk; - data.byte(kReasseschanges) = 1; - al = data.byte(kFacing); - _cmp(al, data.byte(kLeavedirection)); - if (!flags.z()) - goto notwalk; - checkforexit(); -notwalk: - al = data.byte(kFacing); - ah = 0; - di = 1105; - _add(di, ax); - al = cs.byte(di); - _add(al, es.byte(bx+29)); - es.byte(bx+15) = al; - ax = es.word(bx+10); - data.byte(kRyanx) = al; - data.byte(kRyany) = ah; -} - void DreamGenContext::aboutturn() { STACK_CHECK; _cmp(data.byte(kTurndirection), 1); @@ -2841,60 +2743,6 @@ isthunder1: playchannel1(); } -void DreamGenContext::backobject() { - STACK_CHECK; - ds = data.word(kSetdat); - di = es.word(bx+20); - al = es.byte(bx+18); - _cmp(al, 0); - if (flags.z()) - goto _tmp48z; - _dec(al); - es.byte(bx+18) = al; - return /* (finishback) */; -_tmp48z: - al = ds.byte(di+7); - es.byte(bx+18) = al; - al = ds.byte(di+8); - _cmp(al, 6); - if (!flags.z()) - goto notwidedoor; - widedoor(); - return /* (finishback) */; -notwidedoor: - _cmp(al, 5); - if (!flags.z()) - goto notrandom; - random(); - return /* (finishback) */; -notrandom: - _cmp(al, 4); - if (!flags.z()) - goto notlockdoor; - lockeddoorway(); - return /* (finishback) */; -notlockdoor: - _cmp(al, 3); - if (!flags.z()) - goto notlift; - liftsprite(); - return /* (finishback) */; -notlift: - _cmp(al, 2); - if (!flags.z()) - goto notdoor; - doorway(); - return /* (finishback) */; -notdoor: - _cmp(al, 1); - if (!flags.z()) - goto steadyob; - constant(); - return /* (finishback) */; -steadyob: - steady(); -} - void DreamGenContext::liftnoise() { STACK_CHECK; _cmp(data.byte(kReallocation), 5); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index d6347b62bf..76755a007e 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -115,7 +115,7 @@ void DreamGenContext::spriteupdate() { if (updateCallback != 0xffff) { sprite->w24 = sprite->w2; if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++ - mainmanCPP(sprite); + mainman(sprite); else { assert(updateCallback == addr_backobject); backobject(sprite); @@ -135,7 +135,11 @@ void DreamGenContext::initman() { sprite->b29 = 0; } -void DreamGenContext::mainmanCPP(Sprite *sprite) { +void DreamGenContext::mainman() { + assert(false); +} + +void DreamGenContext::mainman(Sprite *sprite) { push(es); push(ds); @@ -267,6 +271,10 @@ void DreamGenContext::aboutturn(Sprite *sprite) { } } +void DreamGenContext::backobject() { + assert(false); +} + void DreamGenContext::backobject(Sprite *sprite) { push(ds); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 3a00c16d4d..0ae76419e9 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -69,7 +69,7 @@ Sprite *makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 somethingInDx, uint16 somethingInDi); void spriteupdate(); void initman(); - void mainmanCPP(Sprite *sprite); + void mainman(Sprite *sprite); void facerightway(); void walking(); void walking(Sprite *sprite); -- cgit v1.2.3 From 69f7a6bcdf7b7667894b6167fb5b3fbc9be116d6 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 15:52:28 +0200 Subject: DREAMWEB: Encapsulated some endian conversions in accessors --- engines/dreamweb/sprite.cpp | 8 ++++---- engines/dreamweb/structs.h | 10 ++++++++-- engines/dreamweb/stubs.cpp | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 76755a007e..9987224cd7 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -39,7 +39,7 @@ void DreamGenContext::printsprites() { Sprite *sprites = spritetable(); for (size_t j = 0; j < 16; ++j) { const Sprite &sprite = sprites[j]; - if (READ_LE_UINT16(&sprite.updateCallback) == 0x0ffff) + if (sprite.updateCallback() == 0x0ffff) continue; if (priority != sprite.priority) continue; @@ -83,7 +83,7 @@ Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uin ++sprite; } - WRITE_LE_UINT16(&sprite->updateCallback, updateCallback); + sprite->setUpdateCallback(updateCallback); sprite->x = x; sprite->y = y; WRITE_LE_UINT16(&sprite->w6, somethingInDx); @@ -111,7 +111,7 @@ void DreamGenContext::spriteupdate() { Sprite *sprite = sprites; for (size_t i=0; i < 16; ++i) { - uint16 updateCallback = READ_LE_UINT16(&sprite->updateCallback); + uint16 updateCallback = sprite->updateCallback(); if (updateCallback != 0xffff) { sprite->w24 = sprite->w2; if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++ @@ -279,7 +279,7 @@ void DreamGenContext::backobject(Sprite *sprite) { push(ds); ds = data.word(kSetdat); - di = READ_LE_UINT16(&sprite->obj_data); + di = sprite->objData(); ObjData *objData = (ObjData *)ds.ptr(di, 0); if (sprite->delay != 0) { diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index ac304ae2c2..b4d8c7e1c9 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -20,8 +20,12 @@ * */ +#include "common/endian.h" + struct Sprite { - uint16 updateCallback; + uint16 _updateCallback; + uint16 updateCallback() const { return READ_LE_UINT16(&_updateCallback); } + void setUpdateCallback(uint16 v) { WRITE_LE_UINT16(&_updateCallback, v); } uint16 w2; uint16 w4; uint16 w6; @@ -35,7 +39,9 @@ struct Sprite { uint8 b17; uint8 delay; uint8 frame; - uint16 obj_data; + uint16 _objData; + uint16 objData() const { return READ_LE_UINT16(&_objData); } + void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); } uint8 b22; uint8 priority; uint16 w24; diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 3aebe02a43..2051b5299d 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -892,7 +892,7 @@ void DreamGenContext::eraseoldobs() { Sprite *sprites = spritetable(); for (size_t i=0; i < 16; ++i) { Sprite &sprite = sprites[i]; - if (READ_LE_UINT16(&sprite.obj_data) != 0xffff) { + if (sprite.objData() != 0xffff) { memset(&sprite, 0xff, sizeof(Sprite)); } } @@ -985,7 +985,7 @@ void DreamGenContext::makebackob() { Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16); bx += sizeof(Sprite) * (sprite - sprites); // - WRITE_LE_UINT16(&sprite->obj_data, si); + sprite->setObjData(si); if (priority == 255) priority = 0; sprite->priority = priority; -- cgit v1.2.3 From 8b0ac65f68e4fd2829b6c0205f72ef53d7a888b0 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 14:13:34 +0200 Subject: DREAMWEB: Extracted vgagrafx.cpp from stubs.cpp --- engines/dreamweb/module.mk | 3 +- engines/dreamweb/stubs.cpp | 350 +------------------------------------- engines/dreamweb/vgagrafx.cpp | 387 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 390 insertions(+), 350 deletions(-) create mode 100644 engines/dreamweb/vgagrafx.cpp diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk index 9c8106db90..6c4c506695 100644 --- a/engines/dreamweb/module.mk +++ b/engines/dreamweb/module.mk @@ -7,7 +7,8 @@ MODULE_OBJS := \ dreamgen.o \ print.o \ sprite.o \ - stubs.o + stubs.o \ + vgagrafx.o # This module can be built as a plugin ifeq ($(ENABLE_DREAMWEB), DYNAMIC_PLUGIN) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 2051b5299d..dfb1a4a8c1 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -174,7 +174,7 @@ void DreamGenContext::dreamweb() { } } -Common::String getFilename(Context &context) { +static Common::String getFilename(Context &context) { uint16 name_ptr = context.dx; Common::String name; uint8 c; @@ -183,133 +183,6 @@ Common::String getFilename(Context &context) { return name; } -uint8 *DreamGenContext::workspace() { - push(es); - es = data.word(kWorkspace); - uint8 *result = es.ptr(0, 0); - es = pop(); - return result; -} - -void DreamGenContext::multiget() { - multiget(di, bx, cl, ch); -} - -void DreamGenContext::multiget(uint16 x, uint16 y, uint8 w, uint8 h) { - unsigned src = x + y * kScreenwidth; - unsigned dst = (uint16)si; - es = ds; - ds = data.word(kWorkspace); - if (y + h > 200) - h = 200 - y; - if (x + w > 320) - w = 320 - x; - //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); - for(unsigned l = 0; l < h; ++l) { - uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); - uint8 *dst_p = es.ptr(dst + w * l, w); - memcpy(dst_p, src_p, w); - } - si += w * h; - di = src + kScreenwidth * h; - cx = 0; -} - -void DreamGenContext::multiput() { - multiput(di, bx, cl, ch); -} - -void DreamGenContext::multiput(uint16 x, uint16 y, uint8 w, uint8 h) { - unsigned src = (uint16)si; - unsigned dst = x + y * kScreenwidth; - es = data.word(kWorkspace); - if (y + h > 200) - h = 200 - y; - if (x + w > 320) - w = 320 - x; - //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); - for(unsigned l = 0; l < h; ++l) { - uint8 *src_p = ds.ptr(src + w * l, w); - uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w); - memcpy(dst_p, src_p, w); - } - si += w * h; - di = dst + kScreenwidth * h; - cx = 0; -} - -void DreamGenContext::multidump(uint16 x, uint16 y, uint8 width, uint8 height) { - ds = data.word(kWorkspace); - unsigned offset = x + y * kScreenwidth; - //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset); - engine->blit(ds.ptr(offset, width * height), kScreenwidth, x, y, width, height); -} - -void DreamGenContext::multidump() { - multidump(di, bx, cl, ch); - unsigned offset = di + bx * kScreenwidth; - si = di = offset + ch * kScreenwidth; - cx = 0; -} - -void DreamGenContext::worktoscreen() { - uint size = 320 * 200; - engine->blit(workspace(), 320, 0, 0, 320, 200); - di = si = size; - cx = 0; -} - -void DreamGenContext::printundermon() { - engine->printUnderMonitor(); -} - -void DreamGenContext::cls() { - engine->cls(); -} - -void DreamGenContext::frameoutnm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { - dst += pitch * y + x; - - for (uint16 j = 0; j < height; ++j) { - memcpy(dst, src, width); - dst += pitch; - src += width; - } -} - -void DreamGenContext::frameoutbh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { - uint16 stride = pitch - width; - dst += y * pitch + x; - - for (uint16 i = 0; i < height; ++i) { - for (uint16 j = 0; j < width; ++j) { - if (*dst == 0xff) { - *dst = *src; - } - ++src; - ++dst; - } - dst += stride; - } -} - -void DreamGenContext::frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { - uint16 stride = pitch - width; - dst += y * pitch + x; - dst -= width; - - for (uint16 j = 0; j < height; ++j) { - for (uint16 i = 0; i < width; ++i) { - uint8 pixel = src[width - i - 1]; - if (pixel) - *dst = pixel; - ++dst; - } - src += width; - dst += stride; - } -} - void DreamGenContext::seecommandtail() { data.word(kSoundbaseadd) = 0x220; data.byte(kSoundint) = 5; @@ -664,227 +537,6 @@ void DreamGenContext::fadedos() { engine->fadeDos(); } -void DreamGenContext::doshake() { - uint8 &counter = data.byte(kShakecounter); - _cmp(counter, 48); - if (flags.z()) - return; - - _add(counter, 1); - static const int shakeTable[] = { - 0, -2, 3, -2, 0, 2, 4, -1, - 1, -3, 3, 2, 0, -2, 3, -2, - 0, 2, 4, -1, 1, -3, 3, 2, - 0, -2, 3, -2, 0, 2, 4, -1, - - 1, -3, 3, 2, 0, -2, 3, -2, - 0, 2, 4, -1, 1, -3, 3, 2, - 0, -2, 3, -2, 0, 2, 4, -1, - 1, -3, 3, 2, 0, -2, 3, -2, - - 0, 2, 4, -1, 1, -3, 3, 2, - 0, -2, 3, -2, 0, 2, 4, -1, - 1, -3, 3, 2, 0, -2, 3, -2, - 0, 2, 4, -1, 1, -3, 3, 2, - - 0, -2, 3, -2, 0, 2, 4, -1, - 1, -3, 3, 0, - }; - int offset = shakeTable[counter]; - engine->setShakePos(offset >= 0 ? offset : -offset); -} - -void DreamGenContext::vsync() { - push(ax); - push(bx); - push(cx); - push(dx); - push(si); - push(di); - push(es); - push(ds); - engine->waitForVSync(); - ds = pop(); - es = pop(); - di = pop(); - si = pop(); - dx = pop(); - cx = pop(); - bx = pop(); - ax = pop(); -} - -void DreamGenContext::setmode() { - vsync(); - initGraphics(320, 200, false); -} - -void DreamGenContext::showpcx() { - Common::String name = getFilename(*this); - Common::File pcxFile; - - if (!pcxFile.open(name)) { - warning("showpcx: Could not open '%s'", name.c_str()); - return; - } - - uint8 *maingamepal; - int i, j; - - // Read the 16-color palette into the 'maingamepal' buffer. Note that - // the color components have to be adjusted from 8 to 6 bits. - - pcxFile.seek(16, SEEK_SET); - es = data.word(kBuffers); - maingamepal = es.ptr(kMaingamepal, 768); - pcxFile.read(maingamepal, 48); - - memset(maingamepal + 48, 0xff, 720); - for (i = 0; i < 48; i++) { - maingamepal[i] >>= 2; - } - - // Decode the image data. - - Graphics::Surface *s = g_system->lockScreen(); - Common::Rect rect(640, 480); - - s->fillRect(rect, 0); - pcxFile.seek(128, SEEK_SET); - - for (int y = 0; y < 480; y++) { - byte *dst = (byte *)s->getBasePtr(0, y); - int decoded = 0; - - while (decoded < 320) { - byte col = pcxFile.readByte(); - byte len; - - if ((col & 0xc0) == 0xc0) { - len = col & 0x3f; - col = pcxFile.readByte(); - } else { - len = 1; - } - - // The image uses 16 colors and is stored as four bit - // planes, one for each bit of the color, least - // significant bit plane first. - - for (i = 0; i < len; i++) { - int plane = decoded / 80; - int pos = decoded % 80; - - for (j = 0; j < 8; j++) { - byte bit = (col >> (7 - j)) & 1; - dst[8 * pos + j] |= (bit << plane); - } - - decoded++; - } - } - } - - g_system->unlockScreen(); - pcxFile.close(); -} - -void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { - // NB : These resilience checks were not in the original engine, but did they result in undefined behaviour - // or was something broken during porting to C++? - assert(pitch == 320); - - if(x >= 320) - return; - if(y >= 200) - return; - if(x + width > 320) { - width = 320 - x; - } - if(y + height > 200) { - height = 200 - y; - } - - uint16 stride = pitch - width; - dst += pitch * y + x; - - for (uint16 j = 0; j < height; ++j) { - for (uint16 i = 0; i < width; ++i) { - uint8 pixel = *src++; - if (pixel) - *dst = pixel; - ++dst; - } - dst += stride; - } -} - -void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { - ds = src; - ah = effectsFlag; - - si = frameNumber * 6; - if (ds.word(si) == 0) { - *width = 0; - *height = 0; - return; - } - -//notblankshow: - if ((effectsFlag & 128) == 0) { - x += ds.byte(si + 4); - y += ds.byte(si + 5); - } -//skipoffsets: - - *width = ds.byte(si + 0); - *height = ds.byte(si + 1); - si = ds.word(si+2) + 2080; - const uint8 *pSrc = ds.ptr(si, *width * *height); - - if (effectsFlag) { - if (effectsFlag & 128) { //centred - x -= *width / 2; - y -= *height / 2; - } - if (effectsFlag & 64) { //diffdest - frameoutfx(es.ptr(0, dx * *height), pSrc, dx, *width, *height, x, y); - return; - } - if (effectsFlag & 8) { //printlist - /* - push(ax); - al = x - data.word(kMapadx); - ah = y - data.word(kMapady); - //addtoprintlist(); // NB: Commented in the original asm - ax = pop(); - */ - } - if (effectsFlag & 4) { //flippedx - frameoutfx(workspace(), pSrc, 320, *width, *height, x, y); - return; - } - if (effectsFlag & 2) { //nomask - frameoutnm(workspace(), pSrc, 320, *width, *height, x, y); - return; - } - if (effectsFlag & 32) { - frameoutbh(workspace(), pSrc, 320, *width, *height, x, y); - return; - } - } -//noeffects: - frameoutv(workspace(), pSrc, 320, *width, *height, x, y); - return; -} - -void DreamGenContext::showframe() { - uint8 width, height; - showframe(ds, di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); - cl = width; - ch = height; -} - void DreamGenContext::eraseoldobs() { if (data.byte(kNewobs) == 0) return; diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp new file mode 100644 index 0000000000..25e5a93ebf --- /dev/null +++ b/engines/dreamweb/vgagrafx.cpp @@ -0,0 +1,387 @@ +/* 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. + * + */ + +#include "dreamweb/dreamweb.h" +#include "engines/util.h" +#include "graphics/surface.h" + +namespace DreamGen { + +uint8 *DreamGenContext::workspace() { + push(es); + es = data.word(kWorkspace); + uint8 *result = es.ptr(0, 0); + es = pop(); + return result; +} + +void DreamGenContext::multiget() { + multiget(di, bx, cl, ch); +} + +void DreamGenContext::multiget(uint16 x, uint16 y, uint8 w, uint8 h) { + unsigned src = x + y * kScreenwidth; + unsigned dst = (uint16)si; + es = ds; + ds = data.word(kWorkspace); + if (y + h > 200) + h = 200 - y; + if (x + w > 320) + w = 320 - x; + //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); + for(unsigned l = 0; l < h; ++l) { + uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); + uint8 *dst_p = es.ptr(dst + w * l, w); + memcpy(dst_p, src_p, w); + } + si += w * h; + di = src + kScreenwidth * h; + cx = 0; +} + +void DreamGenContext::multiput() { + multiput(di, bx, cl, ch); +} + +void DreamGenContext::multiput(uint16 x, uint16 y, uint8 w, uint8 h) { + unsigned src = (uint16)si; + unsigned dst = x + y * kScreenwidth; + es = data.word(kWorkspace); + if (y + h > 200) + h = 200 - y; + if (x + w > 320) + w = 320 - x; + //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); + for(unsigned l = 0; l < h; ++l) { + uint8 *src_p = ds.ptr(src + w * l, w); + uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w); + memcpy(dst_p, src_p, w); + } + si += w * h; + di = dst + kScreenwidth * h; + cx = 0; +} + +void DreamGenContext::multidump(uint16 x, uint16 y, uint8 width, uint8 height) { + ds = data.word(kWorkspace); + unsigned offset = x + y * kScreenwidth; + //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset); + engine->blit(ds.ptr(offset, width * height), kScreenwidth, x, y, width, height); +} + +void DreamGenContext::multidump() { + multidump(di, bx, cl, ch); + unsigned offset = di + bx * kScreenwidth; + si = di = offset + ch * kScreenwidth; + cx = 0; +} + +void DreamGenContext::worktoscreen() { + uint size = 320 * 200; + engine->blit(workspace(), 320, 0, 0, 320, 200); + di = si = size; + cx = 0; +} + +void DreamGenContext::printundermon() { + engine->printUnderMonitor(); +} + +void DreamGenContext::cls() { + engine->cls(); +} + +void DreamGenContext::frameoutnm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { + dst += pitch * y + x; + + for (uint16 j = 0; j < height; ++j) { + memcpy(dst, src, width); + dst += pitch; + src += width; + } +} + +void DreamGenContext::frameoutbh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { + uint16 stride = pitch - width; + dst += y * pitch + x; + + for (uint16 i = 0; i < height; ++i) { + for (uint16 j = 0; j < width; ++j) { + if (*dst == 0xff) { + *dst = *src; + } + ++src; + ++dst; + } + dst += stride; + } +} + +void DreamGenContext::frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { + uint16 stride = pitch - width; + dst += y * pitch + x; + dst -= width; + + for (uint16 j = 0; j < height; ++j) { + for (uint16 i = 0; i < width; ++i) { + uint8 pixel = src[width - i - 1]; + if (pixel) + *dst = pixel; + ++dst; + } + src += width; + dst += stride; + } +} + +void DreamGenContext::doshake() { + uint8 &counter = data.byte(kShakecounter); + _cmp(counter, 48); + if (flags.z()) + return; + + _add(counter, 1); + static const int shakeTable[] = { + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 0, + }; + int offset = shakeTable[counter]; + engine->setShakePos(offset >= 0 ? offset : -offset); +} + +void DreamGenContext::vsync() { + push(ax); + push(bx); + push(cx); + push(dx); + push(si); + push(di); + push(es); + push(ds); + engine->waitForVSync(); + ds = pop(); + es = pop(); + di = pop(); + si = pop(); + dx = pop(); + cx = pop(); + bx = pop(); + ax = pop(); +} + +void DreamGenContext::setmode() { + vsync(); + initGraphics(320, 200, false); +} + +static Common::String getFilename(Context &context) { + uint16 name_ptr = context.dx; + Common::String name; + uint8 c; + while((c = context.cs.byte(name_ptr++)) != 0) + name += (char)c; + return name; +} + +void DreamGenContext::showpcx() { + Common::String name = getFilename(*this); + Common::File pcxFile; + + if (!pcxFile.open(name)) { + warning("showpcx: Could not open '%s'", name.c_str()); + return; + } + + uint8 *maingamepal; + int i, j; + + // Read the 16-color palette into the 'maingamepal' buffer. Note that + // the color components have to be adjusted from 8 to 6 bits. + + pcxFile.seek(16, SEEK_SET); + es = data.word(kBuffers); + maingamepal = es.ptr(kMaingamepal, 768); + pcxFile.read(maingamepal, 48); + + memset(maingamepal + 48, 0xff, 720); + for (i = 0; i < 48; i++) { + maingamepal[i] >>= 2; + } + + // Decode the image data. + + Graphics::Surface *s = g_system->lockScreen(); + Common::Rect rect(640, 480); + + s->fillRect(rect, 0); + pcxFile.seek(128, SEEK_SET); + + for (int y = 0; y < 480; y++) { + byte *dst = (byte *)s->getBasePtr(0, y); + int decoded = 0; + + while (decoded < 320) { + byte col = pcxFile.readByte(); + byte len; + + if ((col & 0xc0) == 0xc0) { + len = col & 0x3f; + col = pcxFile.readByte(); + } else { + len = 1; + } + + // The image uses 16 colors and is stored as four bit + // planes, one for each bit of the color, least + // significant bit plane first. + + for (i = 0; i < len; i++) { + int plane = decoded / 80; + int pos = decoded % 80; + + for (j = 0; j < 8; j++) { + byte bit = (col >> (7 - j)) & 1; + dst[8 * pos + j] |= (bit << plane); + } + + decoded++; + } + } + } + + g_system->unlockScreen(); + pcxFile.close(); +} + +void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y) { + // NB : These resilience checks were not in the original engine, but did they result in undefined behaviour + // or was something broken during porting to C++? + assert(pitch == 320); + + if(x >= 320) + return; + if(y >= 200) + return; + if(x + width > 320) { + width = 320 - x; + } + if(y + height > 200) { + height = 200 - y; + } + + uint16 stride = pitch - width; + dst += pitch * y + x; + + for (uint16 j = 0; j < height; ++j) { + for (uint16 i = 0; i < width; ++i) { + uint8 pixel = *src++; + if (pixel) + *dst = pixel; + ++dst; + } + dst += stride; + } +} + +void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { + ds = src; + ah = effectsFlag; + + si = frameNumber * 6; + if (ds.word(si) == 0) { + *width = 0; + *height = 0; + return; + } + +//notblankshow: + if ((effectsFlag & 128) == 0) { + x += ds.byte(si + 4); + y += ds.byte(si + 5); + } +//skipoffsets: + + *width = ds.byte(si + 0); + *height = ds.byte(si + 1); + si = ds.word(si+2) + 2080; + const uint8 *pSrc = ds.ptr(si, *width * *height); + + if (effectsFlag) { + if (effectsFlag & 128) { //centred + x -= *width / 2; + y -= *height / 2; + } + if (effectsFlag & 64) { //diffdest + frameoutfx(es.ptr(0, dx * *height), pSrc, dx, *width, *height, x, y); + return; + } + if (effectsFlag & 8) { //printlist + /* + push(ax); + al = x - data.word(kMapadx); + ah = y - data.word(kMapady); + //addtoprintlist(); // NB: Commented in the original asm + ax = pop(); + */ + } + if (effectsFlag & 4) { //flippedx + frameoutfx(workspace(), pSrc, 320, *width, *height, x, y); + return; + } + if (effectsFlag & 2) { //nomask + frameoutnm(workspace(), pSrc, 320, *width, *height, x, y); + return; + } + if (effectsFlag & 32) { + frameoutbh(workspace(), pSrc, 320, *width, *height, x, y); + return; + } + } +//noeffects: + frameoutv(workspace(), pSrc, 320, *width, *height, x, y); + return; +} + +void DreamGenContext::showframe() { + uint8 width, height; + showframe(ds, di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); + cl = width; + ch = height; +} + +} /*namespace dreamgen */ + -- cgit v1.2.3 From 2d0dfffe00628125da8aa43ebe188377ab9331f7 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 14:32:19 +0200 Subject: DREAMWEB: Introduced the Frame struct --- engines/dreamweb/structs.h | 11 +++++++++++ engines/dreamweb/vgagrafx.cpp | 14 +++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index b4d8c7e1c9..0e0215f126 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -73,3 +73,14 @@ struct ObjData { uint8 b17; uint8 b18[256]; // NB: Don't know the size yet }; + +struct Frame { + uint8 width; + uint8 height; + uint16 _ptr; + uint16 ptr() const { return READ_LE_UINT16(&_ptr); } + void setPtr(uint16 v) { WRITE_LE_UINT16(&_ptr, v); } + uint8 x; + uint8 y; +}; + diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index 25e5a93ebf..b10ef811b3 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -321,8 +321,8 @@ void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumb ds = src; ah = effectsFlag; - si = frameNumber * 6; - if (ds.word(si) == 0) { + const Frame *frame = (const Frame *)ds.ptr(frameNumber * sizeof(Frame), 6); + if ((frame->width == 0) && (frame->height == 0)) { *width = 0; *height = 0; return; @@ -330,14 +330,14 @@ void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumb //notblankshow: if ((effectsFlag & 128) == 0) { - x += ds.byte(si + 4); - y += ds.byte(si + 5); + x += frame->x; + y += frame->y; } //skipoffsets: - *width = ds.byte(si + 0); - *height = ds.byte(si + 1); - si = ds.word(si+2) + 2080; + *width = frame->width; + *height = frame->height; + si = frame->ptr() + 2080; const uint8 *pSrc = ds.ptr(si, *width * *height); if (effectsFlag) { -- cgit v1.2.3 From b2748740dbf5c9a8d7b648428d005e102ae41d7e Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 15:04:25 +0200 Subject: DREAMWEB: Better API for 'showframe' and no more registers used (expect es:bx for diffdest blitting) --- engines/dreamweb/print.cpp | 3 ++- engines/dreamweb/sprite.cpp | 7 ++++--- engines/dreamweb/structs.h | 4 +++- engines/dreamweb/stubs.h | 4 ++-- engines/dreamweb/vgagrafx.cpp | 12 ++++-------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 882b4578ce..d29a073960 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -90,7 +90,8 @@ void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 if (data.byte(kForeignrelease) != 0) y -= 3; uint16 tmp = c - 32 + data.word(kCharshift); - showframe(src, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); + ds = src; + showframe(ds.ptr(0, 0), *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 9987224cd7..9b8b060475 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -70,14 +70,15 @@ void DreamGenContext::printasprite(const Sprite *sprite) { else c = 0; uint8 width, height; - showframe(READ_LE_UINT16(&sprite->w6), x, y, sprite->b15, c, &width, &height); + ds = sprite->frameData(); + showframe(ds.ptr(0, 0), x, y, sprite->b15, c, &width, &height); } void DreamGenContext::clearsprites() { memset(spritetable(), 0xff, sizeof(Sprite) * 16); } -Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 somethingInDx, uint16 somethingInDi) { +Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) { Sprite *sprite = spritetable(); while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either ++sprite; @@ -86,7 +87,7 @@ Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uin sprite->setUpdateCallback(updateCallback); sprite->x = x; sprite->y = y; - WRITE_LE_UINT16(&sprite->w6, somethingInDx); + sprite->setFrameData(frameData); WRITE_LE_UINT16(&sprite->w8, somethingInDi); sprite->w2 = 0xffff; sprite->b15 = 0; diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index 0e0215f126..917c83b745 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -28,7 +28,9 @@ struct Sprite { void setUpdateCallback(uint16 v) { WRITE_LE_UINT16(&_updateCallback, v); } uint16 w2; uint16 w4; - uint16 w6; + uint16 _frameData; + uint16 frameData() const { return READ_LE_UINT16(&_frameData); } + void setFrameData(uint16 v) { WRITE_LE_UINT16(&_frameData, v); } uint16 w8; uint8 x; uint8 y; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 0ae76419e9..cb0a87c22e 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -58,7 +58,7 @@ uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); Sprite *spritetable(); void showframe(); - void showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); + void showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); void printasprite(const Sprite *sprite); void width160(); void multiput(uint16 x, uint16 y, uint8 width, uint8 height); @@ -66,7 +66,7 @@ void eraseoldobs(); void clearsprites(); void makesprite(); - Sprite *makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 somethingInDx, uint16 somethingInDi); + Sprite *makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi); void spriteupdate(); void initman(); void mainman(Sprite *sprite); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index b10ef811b3..e1622d69af 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -317,11 +317,8 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint } } -void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { - ds = src; - ah = effectsFlag; - - const Frame *frame = (const Frame *)ds.ptr(frameNumber * sizeof(Frame), 6); +void DreamGenContext::showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { + const Frame *frame = ((const Frame *)frameData) + frameNumber; if ((frame->width == 0) && (frame->height == 0)) { *width = 0; *height = 0; @@ -337,8 +334,7 @@ void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumb *width = frame->width; *height = frame->height; - si = frame->ptr() + 2080; - const uint8 *pSrc = ds.ptr(si, *width * *height); + const uint8 *pSrc = ((const uint8 *)frameData) + frame->ptr() + 2080; if (effectsFlag) { if (effectsFlag & 128) { //centred @@ -378,7 +374,7 @@ void DreamGenContext::showframe(uint16 src, uint16 x, uint16 y, uint16 frameNumb void DreamGenContext::showframe() { uint8 width, height; - showframe(ds, di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); + showframe(ds.ptr(0, 0), di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); cl = width; ch = height; } -- cgit v1.2.3 From 1f0eccb296b0177775dd3cba2fc58961b743e819 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 15:12:50 +0200 Subject: DREAMWEB: 'aboutturn' does not need to be generated now --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 40 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +-- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 4ad926f241..2ec64933dd 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -65,6 +65,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'makesprite', 'showframe', 'initman', + 'aboutturn', 'walking', 'spriteupdate', 'dodoor', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index ed9481fb13..5b0ed0975b 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2258,45 +2258,6 @@ over1001: data.word(kTakeoff) = 320; } -void DreamGenContext::aboutturn() { - STACK_CHECK; - _cmp(data.byte(kTurndirection), 1); - if (flags.z()) - goto incdir; - _cmp(data.byte(kTurndirection), -1); - if (flags.z()) - goto decdir; - al = data.byte(kFacing); - _sub(al, data.byte(kTurntoface)); - if (!flags.c()) - goto higher; - _neg(al); - _cmp(al, 4); - if (!flags.c()) - goto decdir; - goto incdir; -higher: - _cmp(al, 4); - if (!flags.c()) - goto incdir; - goto decdir; -incdir: - data.byte(kTurndirection) = 1; - al = data.byte(kFacing); - _inc(al); - _and(al, 7); - data.byte(kFacing) = al; - es.byte(bx+29) = 0; - return; -decdir: - data.byte(kTurndirection) = -1; - al = data.byte(kFacing); - _dec(al); - _and(al, 7); - data.byte(kFacing) = al; - es.byte(bx+29) = 0; -} - void DreamGenContext::checkforexit() { STACK_CHECK; cl = data.byte(kRyanx); @@ -20560,7 +20521,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_checkone: checkone(); break; case addr_findsource: findsource(); break; case addr_mainman: mainman(); break; - case addr_aboutturn: aboutturn(); break; case addr_checkforexit: checkforexit(); break; case addr_adjustdown: adjustdown(); break; case addr_adjustup: adjustup(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 2b7149621b..400e5a6898 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -672,7 +672,6 @@ public: static const uint16 addr_adjustup = 0xc150; static const uint16 addr_adjustdown = 0xc14c; static const uint16 addr_checkforexit = 0xc148; - static const uint16 addr_aboutturn = 0xc13c; static const uint16 addr_mainman = 0xc138; static const uint16 addr_findsource = 0xc130; static const uint16 addr_checkone = 0xc12c; @@ -1470,7 +1469,7 @@ public: void loadold(); void loadtempcharset(); void useslab(); - void aboutturn(); + //void aboutturn(); void usealtar(); void createpanel2(); void turnonpower(); -- cgit v1.2.3 From 95fa7451d63ad674308f1134e954387c967fb9c8 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 15:19:22 +0200 Subject: DREAMWEB: 'findsource' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 22 ---------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/sprite.cpp | 14 ++++++++++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 17 insertions(+), 24 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 2ec64933dd..86e9b4cd91 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -66,6 +66,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'showframe', 'initman', 'aboutturn', + 'findsource', 'walking', 'spriteupdate', 'dodoor', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 5b0ed0975b..2157d4e9de 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2237,27 +2237,6 @@ void DreamGenContext::checkone() { dx = pop(); } -void DreamGenContext::findsource() { - STACK_CHECK; - ax = data.word(kCurrentframe); - _cmp(ax, 160); - if (!flags.c()) - goto over1000; - ds = data.word(kReel1); - data.word(kTakeoff) = 0; - return; -over1000: - _cmp(ax, 320); - if (!flags.c()) - goto over1001; - ds = data.word(kReel2); - data.word(kTakeoff) = 160; - return; -over1001: - ds = data.word(kReel3); - data.word(kTakeoff) = 320; -} - void DreamGenContext::checkforexit() { STACK_CHECK; cl = data.byte(kRyanx); @@ -20519,7 +20498,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_checkspeed: checkspeed(); break; case addr_delsprite: delsprite(); break; case addr_checkone: checkone(); break; - case addr_findsource: findsource(); break; case addr_mainman: mainman(); break; case addr_checkforexit: checkforexit(); break; case addr_adjustdown: adjustdown(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 400e5a6898..ec4199856b 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -673,7 +673,6 @@ public: static const uint16 addr_adjustdown = 0xc14c; static const uint16 addr_checkforexit = 0xc148; static const uint16 addr_mainman = 0xc138; - static const uint16 addr_findsource = 0xc130; static const uint16 addr_checkone = 0xc12c; static const uint16 addr_delsprite = 0xc11c; static const uint16 addr_checkspeed = 0xc110; @@ -1382,7 +1381,7 @@ public: void fadeupmonfirst(); void drawfloor(); void loadkeypad(); - void findsource(); + //void findsource(); void clearendpal(); void findtext1(); void isryanholding(); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 9b8b060475..72c8c1299e 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -538,5 +538,19 @@ void DreamGenContext::facerightway() { data.byte(kLeavedirection) = dir; } +void DreamGenContext::findsource() { + uint16 currentFrame = data.word(kCurrentframe); + if (currentFrame < 160) { + ds = data.word(kReel1); + data.word(kTakeoff) = 0; + } else if (currentFrame < 320) { + ds = data.word(kReel2); + data.word(kTakeoff) = 160; + } else { + ds = data.word(kReel3); + data.word(kTakeoff) = 320; + } +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index cb0a87c22e..0c2f4389e0 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -86,6 +86,7 @@ void lockeddoorway(Sprite *sprite, ObjData *objData); void liftsprite(); void liftsprite(Sprite *sprite, ObjData *objData); + void findsource(); void turnpathonCPP(uint8 param); void turnpathoffCPP(uint8 param); void getroomspaths(); -- cgit v1.2.3 From 92938f810fc4da74ef4872728ccf19833ad12773 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 15:25:28 +0200 Subject: DREAMWEB: 'showreelframe' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 19 ------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/sprite.cpp | 10 ++++++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 13 insertions(+), 21 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 86e9b4cd91..ab0a5651b4 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -66,6 +66,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'showframe', 'initman', 'aboutturn', + 'showreelframe', 'findsource', 'walking', 'spriteupdate', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 2157d4e9de..fd497a3567 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -3025,24 +3025,6 @@ void DreamGenContext::getreelstart() { _add(si, (0+(36*144))); } -void DreamGenContext::showreelframe() { - STACK_CHECK; - al = es.byte(si+2); - ah = 0; - di = ax; - _add(di, data.word(kMapadx)); - al = es.byte(si+3); - bx = ax; - _add(bx, data.word(kMapady)); - ax = es.word(si); - data.word(kCurrentframe) = ax; - findsource(); - ax = data.word(kCurrentframe); - _sub(ax, data.word(kTakeoff)); - ah = 8; - showframe(); -} - void DreamGenContext::deleverything() { STACK_CHECK; al = data.byte(kMapysize); @@ -20525,7 +20507,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_dealwithspecial: dealwithspecial(); break; case addr_movemap: movemap(); break; case addr_getreelstart: getreelstart(); break; - case addr_showreelframe: showreelframe(); break; case addr_deleverything: deleverything(); break; case addr_dumpeverything: dumpeverything(); break; case addr_allocatework: allocatework(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index ec4199856b..84f8759381 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -645,7 +645,6 @@ public: static const uint16 addr_allocatework = 0xc1c8; static const uint16 addr_dumpeverything = 0xc1c4; static const uint16 addr_deleverything = 0xc1c0; - static const uint16 addr_showreelframe = 0xc1bc; static const uint16 addr_getreelstart = 0xc1b8; static const uint16 addr_movemap = 0xc1b4; static const uint16 addr_dealwithspecial = 0xc1b0; @@ -1684,7 +1683,7 @@ public: void playguitar(); void lastfolder(); void transfermap(); - void showreelframe(); + //void showreelframe(); void showmonk(); void diarykeyn(); void set16colpalette(); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 72c8c1299e..a438356e1c 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -552,5 +552,15 @@ void DreamGenContext::findsource() { } } +void DreamGenContext::showreelframe() { + uint16 x = es.byte(si+2) + data.word(kMapadx); + uint16 y = es.byte(si+3) + data.word(kMapady); + data.word(kCurrentframe) = es.word(si); + findsource(); + uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff); + uint8 width, height; + showframe(ds.ptr(0, 0), x, y, frame, 8, &width, &height); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 0c2f4389e0..6dafdc9e14 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -87,6 +87,7 @@ void liftsprite(); void liftsprite(Sprite *sprite, ObjData *objData); void findsource(); + void showreelframe(); void turnpathonCPP(uint8 param); void turnpathoffCPP(uint8 param); void getroomspaths(); -- cgit v1.2.3 From 031651e996a7e072a49f9c9bb653b3b54f2fc4f4 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 16:01:52 +0200 Subject: DREAMWEB: Introduction of a Reel struct --- engines/dreamweb/sprite.cpp | 11 ++++++++--- engines/dreamweb/structs.h | 9 +++++++++ engines/dreamweb/stubs.h | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index a438356e1c..3e9914a71f 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -553,9 +553,14 @@ void DreamGenContext::findsource() { } void DreamGenContext::showreelframe() { - uint16 x = es.byte(si+2) + data.word(kMapadx); - uint16 y = es.byte(si+3) + data.word(kMapady); - data.word(kCurrentframe) = es.word(si); + Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); + showreelframe(reel); +} + +void DreamGenContext::showreelframe(Reel *reel) { + uint16 x = reel->x + data.word(kMapadx); + uint16 y = reel->y + data.word(kMapady); + data.word(kCurrentframe) = reel->frame(); findsource(); uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff); uint8 width, height; diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index 917c83b745..2af2788c0c 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -86,3 +86,12 @@ struct Frame { uint8 y; }; +struct Reel { + uint16 _frame; + uint16 frame() const { return READ_LE_UINT16(&_frame); } + void setFrame(uint16 v) { WRITE_LE_UINT16(&_frame, v); } + uint8 x; + uint8 y; + uint8 b4; +}; + diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 6dafdc9e14..ee8fe70109 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -88,6 +88,7 @@ void liftsprite(Sprite *sprite, ObjData *objData); void findsource(); void showreelframe(); + void showreelframe(Reel *reel); void turnpathonCPP(uint8 param); void turnpathoffCPP(uint8 param); void getroomspaths(); -- cgit v1.2.3 From 74a943667fc612639f48d39926bf6e7e8121d4b8 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 19:54:53 +0200 Subject: DREAMWEB: 'getroomdata' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 10 ---------- engines/dreamweb/dreamgen.h | 9 ++++----- engines/dreamweb/structs.h | 26 ++++++++++++++++++++++++++ engines/dreamweb/stubs.cpp | 8 ++++++++ engines/dreamweb/stubs.h | 2 ++ 6 files changed, 41 insertions(+), 15 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index ab0a5651b4..e04621e852 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -66,6 +66,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'showframe', 'initman', 'aboutturn', + 'getroomdata', 'showreelframe', 'findsource', 'walking', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index fd497a3567..36bede22f7 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -19699,15 +19699,6 @@ lookx: data.byte(kRoomnum) = cl; } -void DreamGenContext::getroomdata() { - STACK_CHECK; - ah = 0; - cx = 32; - _mul(cx); - bx = 6187; - _add(bx, ax); -} - void DreamGenContext::readheader() { STACK_CHECK; ds = cs; @@ -21088,7 +21079,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_disablepath: disablepath(); break; case addr_findxyfrompath: findxyfrompath(); break; case addr_findroominloc: findroominloc(); break; - case addr_getroomdata: getroomdata(); break; case addr_readheader: readheader(); break; case addr_dontloadseg: dontloadseg(); break; case addr_allocateload: allocateload(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 84f8759381..e1d7e4c7b8 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -61,7 +61,6 @@ public: static const uint16 addr_allocateload = 0xcb68; static const uint16 addr_dontloadseg = 0xcb64; static const uint16 addr_readheader = 0xcb60; - static const uint16 addr_getroomdata = 0xcb5c; static const uint16 addr_findroominloc = 0xcb58; static const uint16 addr_findxyfrompath = 0xcb54; static const uint16 addr_disablepath = 0xcb50; @@ -1504,7 +1503,6 @@ public: void showrain(); void openpoolboss(); void buttontwo(); - void fillopen(); //void usetimedtext(); void delsprite(); //void getroomspaths(); @@ -1539,6 +1537,7 @@ public: //void printchar(); void showkeypad(); void obtoinv(); + //void getroomdata(); void removeobfrominv(); void usecoveredbox(); void openyourneighbour(); @@ -1844,13 +1843,13 @@ public: void useopened(); void inventory(); void powerlightoff(); - void getroomdata(); + void fillopen(); void showoutermenu(); void signon(); void deleteextext(); void foghornsound(); void showrightpage(); - void openhoteldoor2(); + void showloadops(); void examicon(); void showgun(); void switchryanon(); @@ -2027,7 +2026,7 @@ public: void intro(); void hangonp(); void fadescreendowns(); - void showloadops(); + void openhoteldoor2(); void getridoftempsp(); void scanfornames(); void setallchanges(); diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index 2af2788c0c..23f3dcad80 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -95,3 +95,29 @@ struct Reel { uint8 b4; }; +struct Room { + uint8 name[10]; + uint8 b10; + uint8 b11; + uint8 b12; + uint8 b13; + uint8 b14; + uint8 b15; + uint8 b16; + uint8 b17; + uint8 b18; + uint8 b19; + uint8 b20; + uint8 b21; + uint8 b22; + uint8 b23; + uint8 b24; + uint8 b25; + uint8 b26; + uint8 b27; + uint8 b28; + uint8 b29; + uint8 b30; + uint8 b31; +}; + diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index dfb1a4a8c1..947854ac9f 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -647,5 +647,13 @@ void DreamGenContext::makebackob() { sprite->frame = 0; } +void DreamGenContext::getroomdata() { + bx = kRoomdata + sizeof(Room) * al; +} + +void DreamGenContext::getroomdata(uint8 roomIndex) { + getroomdata(roomIndex); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index ee8fe70109..bf49b2edf2 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -56,6 +56,8 @@ uint8 getnumber(uint16 index, uint16 maxWidth, bool centered, uint16 *offset); void kernchars(); uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); + void getroomdata(); + void getroomdata(uint8 roomIndex); Sprite *spritetable(); void showframe(); void showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); -- cgit v1.2.3 From 0cbc291cbd0266a6522568dea9950ee35c234c55 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 21:46:59 +0200 Subject: DREAMWEB: 'startloading' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 137 -------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/structs.h | 14 ++-- engines/dreamweb/stubs.cpp | 132 ++++++++++++++++++++++++++++++++++++ engines/dreamweb/stubs.h | 2 + 6 files changed, 143 insertions(+), 146 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index e04621e852..57890688b7 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -67,6 +67,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'initman', 'aboutturn', 'getroomdata', + 'startloading', 'showreelframe', 'findsource', 'walking', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 36bede22f7..9436480b53 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -19494,142 +19494,6 @@ blimey: es = pop(); } -void DreamGenContext::startloading() { - STACK_CHECK; - data.byte(kCombatcount) = 0; - al = cs.byte(bx+13); - data.byte(kRoomssample) = al; - al = cs.byte(bx+15); - data.byte(kMapx) = al; - al = cs.byte(bx+16); - data.byte(kMapy) = al; - al = cs.byte(bx+20); - data.byte(kLiftflag) = al; - al = cs.byte(bx+21); - data.byte(kManspath) = al; - data.byte(kDestination) = al; - data.byte(kFinaldest) = al; - al = cs.byte(bx+22); - data.byte(kFacing) = al; - data.byte(kTurntoface) = al; - al = cs.byte(bx+23); - data.byte(kCounttoopen) = al; - al = cs.byte(bx+24); - data.byte(kLiftpath) = al; - al = cs.byte(bx+25); - data.byte(kDoorpath) = al; - data.byte(kLastweapon) = -1; - al = cs.byte(bx+27); - push(ax); - al = cs.byte(bx+31); - ah = data.byte(kReallocation); - data.byte(kReallocation) = al; - dx = bx; - openfile(); - readheader(); - allocateload(); - ds = ax; - data.word(kBackdrop) = ax; - dx = (0); - loadseg(); - ds = data.word(kWorkspace); - dx = (0); - cx = 132*66; - al = 0; - fillspace(); - loadseg(); - sortoutmap(); - allocateload(); - data.word(kSetframes) = ax; - ds = ax; - dx = (0); - loadseg(); - ds = data.word(kSetdat); - dx = 0; - cx = (64*128); - al = 255; - fillspace(); - loadseg(); - allocateload(); - data.word(kReel1) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kReel2) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kReel3) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kReels) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kPeople) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kSetdesc) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kBlockdesc) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kRoomdesc) = ax; - ds = ax; - dx = 0; - loadseg(); - allocateload(); - data.word(kFreeframes) = ax; - ds = ax; - dx = 0; - loadseg(); - ds = data.word(kFreedat); - dx = 0; - cx = (16*80); - al = 255; - fillspace(); - loadseg(); - allocateload(); - data.word(kFreedesc) = ax; - ds = ax; - dx = (0); - loadseg(); - closefile(); - findroominloc(); - deletetaken(); - setallchanges(); - autoappear(); - al = data.byte(kNewlocation); - getroomdata(); - data.byte(kLastweapon) = -1; - data.byte(kMandead) = 0; - data.word(kLookcounter) = 160; - data.byte(kNewlocation) = 255; - data.byte(kLinepointer) = 254; - ax = pop(); - _cmp(al, 255); - if (flags.z()) - goto dontwalkin; - data.byte(kManspath) = al; - push(bx); - autosetwalk(); - bx = pop(); -dontwalkin: - findxyfrompath(); -} - void DreamGenContext::disablepath() { STACK_CHECK; push(cx); @@ -21075,7 +20939,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_restorereels: restorereels(); break; case addr_restoreall: restoreall(); break; case addr_sortoutmap: sortoutmap(); break; - case addr_startloading: startloading(); break; case addr_disablepath: disablepath(); break; case addr_findxyfrompath: findxyfrompath(); break; case addr_findroominloc: findroominloc(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index e1d7e4c7b8..83e0a3f005 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -64,7 +64,6 @@ public: static const uint16 addr_findroominloc = 0xcb58; static const uint16 addr_findxyfrompath = 0xcb54; static const uint16 addr_disablepath = 0xcb50; - static const uint16 addr_startloading = 0xcb4c; static const uint16 addr_sortoutmap = 0xcb48; static const uint16 addr_restoreall = 0xcb44; static const uint16 addr_restorereels = 0xcb40; @@ -1480,7 +1479,7 @@ public: void endgame(); void monprint(); void usepipe(); - void startloading(); + //void startloading(); void getunderzoom(); void candles(); void backobject(); diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index 23f3dcad80..a54c42d79d 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -100,19 +100,19 @@ struct Room { uint8 b10; uint8 b11; uint8 b12; - uint8 b13; + uint8 roomsSample; uint8 b14; - uint8 b15; - uint8 b16; + uint8 mapX; + uint8 mapY; uint8 b17; uint8 b18; uint8 b19; - uint8 b20; + uint8 liftFlag; uint8 b21; uint8 b22; - uint8 b23; - uint8 b24; - uint8 b25; + uint8 countToOpen; + uint8 liftPath; + uint8 doorPath; uint8 b26; uint8 b27; uint8 b28; diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 947854ac9f..e16795c6db 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -655,5 +655,137 @@ void DreamGenContext::getroomdata(uint8 roomIndex) { getroomdata(roomIndex); } +void DreamGenContext::startloading() { + const Room *room = (Room *)cs.ptr(bx, sizeof(Room)); + startloading(room); +} + +void DreamGenContext::startloading(const Room *room) { + data.byte(kCombatcount) = 0; + data.byte(kRoomssample) = room->roomsSample; + data.byte(kMapx) = room->mapX; + data.byte(kMapy) = room->mapY; + data.byte(kLiftflag) = room->liftFlag; + data.byte(kManspath) = room->b21; + data.byte(kDestination) = room->b21; + data.byte(kFinaldest) = room->b21; + data.byte(kFacing) = room->b22; + data.byte(kTurntoface) = room->b22; + data.byte(kCounttoopen) = room->countToOpen; + data.byte(kLiftpath) = room->liftPath; + data.byte(kDoorpath) = room->doorPath; + data.byte(kLastweapon) = -1; + al = room->b27; + push(ax); + al = room->b31; + ah = data.byte(kReallocation); + data.byte(kReallocation) = al; + dx = bx; + Common::String name = getFilename(*this); + engine->openFile(name); + cs.word(kHandle) = 1; //only one handle + flags._c = false; + readheader(); + allocateload(); + ds = ax; + data.word(kBackdrop) = ax; + dx = (0); + loadseg(); + ds = data.word(kWorkspace); + dx = (0); + cx = 132*66; + al = 0; + fillspace(); + loadseg(); + sortoutmap(); + allocateload(); + data.word(kSetframes) = ax; + ds = ax; + dx = (0); + loadseg(); + ds = data.word(kSetdat); + dx = 0; + cx = (64*128); + al = 255; + fillspace(); + loadseg(); + allocateload(); + data.word(kReel1) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel2) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel3) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReels) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kPeople) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kSetdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kBlockdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kRoomdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kFreeframes) = ax; + ds = ax; + dx = 0; + loadseg(); + ds = data.word(kFreedat); + dx = 0; + cx = (16*80); + al = 255; + fillspace(); + loadseg(); + allocateload(); + data.word(kFreedesc) = ax; + ds = ax; + dx = (0); + loadseg(); + closefile(); + findroominloc(); + deletetaken(); + setallchanges(); + autoappear(); + al = data.byte(kNewlocation); + getroomdata(); + data.byte(kLastweapon) = -1; + data.byte(kMandead) = 0; + data.word(kLookcounter) = 160; + data.byte(kNewlocation) = 255; + data.byte(kLinepointer) = 254; + ax = pop(); + if (al != 255) { + data.byte(kManspath) = al; + push(bx); + autosetwalk(); + bx = pop(); + } + findxyfrompath(); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index bf49b2edf2..29b73acb47 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -58,6 +58,8 @@ uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); void getroomdata(); void getroomdata(uint8 roomIndex); + void startloading(); + void startloading(const Room *room); Sprite *spritetable(); void showframe(); void showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); -- cgit v1.2.3 From a607b78ec0fda1bb029dc9e215b397eadc408eca Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 21:56:33 +0200 Subject: DREAMWEB: 'readheader' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 11 ----------- engines/dreamweb/dreamgen.h | 7 +++---- engines/dreamweb/stubs.cpp | 6 ++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 57890688b7..7f7947a9f6 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -66,6 +66,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'showframe', 'initman', 'aboutturn', + 'readheader', 'getroomdata', 'startloading', 'showreelframe', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 9436480b53..43a1ee3ee8 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -19563,16 +19563,6 @@ lookx: data.byte(kRoomnum) = cl; } -void DreamGenContext::readheader() { - STACK_CHECK; - ds = cs; - dx = 6091; - cx = (6187-6091); - readfromfile(); - es = cs; - di = 6141; -} - void DreamGenContext::allocateload() { STACK_CHECK; push(es); @@ -20942,7 +20932,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_disablepath: disablepath(); break; case addr_findxyfrompath: findxyfrompath(); break; case addr_findroominloc: findroominloc(); break; - case addr_readheader: readheader(); break; case addr_dontloadseg: dontloadseg(); break; case addr_allocateload: allocateload(); break; case addr_fillspace: fillspace(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 83e0a3f005..75ca47e460 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -60,7 +60,6 @@ public: static const uint16 addr_fillspace = 0xcb6c; static const uint16 addr_allocateload = 0xcb68; static const uint16 addr_dontloadseg = 0xcb64; - static const uint16 addr_readheader = 0xcb60; static const uint16 addr_findroominloc = 0xcb58; static const uint16 addr_findxyfrompath = 0xcb54; static const uint16 addr_disablepath = 0xcb50; @@ -1314,7 +1313,7 @@ public: void bothchannels(); void usewire(); void getnamepos(); - void drawitall(); + void loadtemptext(); void clearstartpal(); void femalefan(); void showgamereel(); @@ -1702,7 +1701,7 @@ public: void getridofpit(); void convnum(); void nothelderror(); - void readheader(); + //void readheader(); void getsetad(); void getyad(); void reconstruct(); @@ -1804,7 +1803,7 @@ public: void printmessage(); void reexfromopen(); void fillryan(); - void loadtemptext(); + void drawitall(); void usestereo(); void showcurrentfile(); void copyname(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index e16795c6db..2b330c831f 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -660,6 +660,12 @@ void DreamGenContext::startloading() { startloading(room); } +void DreamGenContext::readheader() { + ax = engine->readFromFile(cs.ptr(kFileheader, kHeaderlen), kHeaderlen); + es = cs; + di = kFiledata; +} + void DreamGenContext::startloading(const Room *room) { data.byte(kCombatcount) = 0; data.byte(kRoomssample) = room->roomsSample; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 29b73acb47..fc3b7c9127 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -58,6 +58,7 @@ uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); void getroomdata(); void getroomdata(uint8 roomIndex); + void readheader(); void startloading(); void startloading(const Room *room); Sprite *spritetable(); -- cgit v1.2.3 From fa232d93b1e7530ba07067533412cc5e84b7c41e Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 22:03:28 +0200 Subject: DREAMWEB: 'allocatemem' has a nicer API --- engines/dreamweb/stubs.cpp | 11 ++++++++--- engines/dreamweb/stubs.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 2b330c831f..8c3086aebb 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -338,12 +338,17 @@ void DreamGenContext::gettime() { } void DreamGenContext::allocatemem() { - uint size = (bx + 2) * 16; + ax = allocatemem(bx); +} + +uint16 DreamGenContext::allocatemem(uint16 paragraphs) { + uint size = (paragraphs + 2) * 16; debug(1, "allocate mem, %u bytes", size); flags._c = false; SegmentRef seg = allocateSegment(size); - ax = (uint16)seg; - debug(1, "\tsegment address -> %04x", (uint16)ax); + uint16 result = (uint16)seg; + debug(1, "\tsegment address -> %04x", result); + return result; } void DreamGenContext::deallocatemem() { diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index fc3b7c9127..35f54b6c6e 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ + uint16 allocatemem(uint16 paragraphs); uint8 *workspace(); void multidump(); void multidump(uint16 x, uint16 y, uint8 width, uint8 height); -- cgit v1.2.3 From a4f05b36e4a866bf686ba1810f6aea8b584a9f7c Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 22:56:29 +0200 Subject: DREAMWEB: 'fillspace' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 18 ------------------ engines/dreamweb/dreamgen.h | 7 +++---- engines/dreamweb/stubs.cpp | 4 ++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 9 insertions(+), 22 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 7f7947a9f6..e6748a4196 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -67,6 +67,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'initman', 'aboutturn', 'readheader', + 'fillspace', 'getroomdata', 'startloading', 'showreelframe', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 43a1ee3ee8..15a48df484 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -19575,23 +19575,6 @@ void DreamGenContext::allocateload() { es = pop(); } -void DreamGenContext::fillspace() { - STACK_CHECK; - push(es); - push(ds); - push(dx); - push(di); - push(bx); - di = dx; - es = ds; - _stosb(cx, true); - bx = pop(); - di = pop(); - dx = pop(); - ds = pop(); - es = pop(); -} - void DreamGenContext::getridoftemp() { STACK_CHECK; es = data.word(kTempgraphics); @@ -20934,7 +20917,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_findroominloc: findroominloc(); break; case addr_dontloadseg: dontloadseg(); break; case addr_allocateload: allocateload(); break; - case addr_fillspace: fillspace(); break; case addr_getridoftemp: getridoftemp(); break; case addr_getridoftemptext: getridoftemptext(); break; case addr_getridoftemp2: getridoftemp2(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 75ca47e460..9f987893fe 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -57,7 +57,6 @@ public: static const uint16 addr_getridoftemp2 = 0xcb78; static const uint16 addr_getridoftemptext = 0xcb74; static const uint16 addr_getridoftemp = 0xcb70; - static const uint16 addr_fillspace = 0xcb6c; static const uint16 addr_allocateload = 0xcb68; static const uint16 addr_dontloadseg = 0xcb64; static const uint16 addr_findroominloc = 0xcb58; @@ -1373,6 +1372,7 @@ public: //void worktoscreen(); void getexpos(); void fadedos(); + //void fillspace(); //void multiget(); void fadeupmonfirst(); void drawfloor(); @@ -1661,7 +1661,7 @@ public: void steady(); void pixelcheckset(); void reexfrominv(); - void fillspace(); + void examinventory(); void talk(); void usedryer(); void dumpeverything(); @@ -1873,7 +1873,6 @@ public: void turnanypathon(); void restorereels(); void setwalk(); - //void printboth(); void useroutine(); void zoomicon(); void hotelcontrol(); @@ -2029,7 +2028,7 @@ public: void scanfornames(); void setallchanges(); void newgame(); - void examinventory(); + //void printboth(); void standardload(); void undertextline(); void findroominloc(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 8c3086aebb..5ef8b18317 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -798,5 +798,9 @@ void DreamGenContext::startloading(const Room *room) { findxyfrompath(); } +void DreamGenContext::fillspace() { + memset(ds.ptr(dx, cx), al, cx); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 35f54b6c6e..c218707d9b 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -60,6 +60,7 @@ void getroomdata(); void getroomdata(uint8 roomIndex); void readheader(); + void fillspace(); void startloading(); void startloading(const Room *room); Sprite *spritetable(); -- cgit v1.2.3 From 5d13e2f837f897e46a8a574c9a3b3c992151b9c2 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 23:11:48 +0200 Subject: DREAMWEB: Ported 'clearwork' --- devtools/tasmrecover/tasm-recover | 3 ++- engines/dreamweb/dreamgen.cpp | 13 ------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.h | 1 + engines/dreamweb/vgagrafx.cpp | 4 ++++ 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index e6748a4196..453dba1e7d 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -40,7 +40,8 @@ generator = cpp(context, "DreamGen", blacklist = [ 'frameoutnm', 'frameoutbh', 'frameoutfx', - 'cls', + 'cls', + 'clearwork', 'printundermon', 'kernchars', 'getnextword', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 15a48df484..41a249942c 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -3267,18 +3267,6 @@ void DreamGenContext::createpanel2() { showframe(); } -void DreamGenContext::clearwork() { - STACK_CHECK; - ax = 0x0; - es = data.word(kWorkspace); - di = 0; - cx = (200*320)/64; -clearloop: - _stosw(32); - if (--cx) - goto clearloop; -} - void DreamGenContext::zoom() { STACK_CHECK; _cmp(data.word(kWatchingtime), 0); @@ -20347,7 +20335,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_pixelcheckset: pixelcheckset(); break; case addr_createpanel: createpanel(); break; case addr_createpanel2: createpanel2(); break; - case addr_clearwork: clearwork(); break; case addr_vsync: vsync(); break; case addr_doshake: doshake(); break; case addr_zoom: zoom(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 9f987893fe..e2caf43107 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -628,7 +628,6 @@ public: static const uint16 addr_zoom = 0xc210; static const uint16 addr_doshake = 0xc20c; static const uint16 addr_vsync = 0xc208; - static const uint16 addr_clearwork = 0xc204; static const uint16 addr_createpanel2 = 0xc200; static const uint16 addr_createpanel = 0xc1fc; static const uint16 addr_pixelcheckset = 0xc1f8; @@ -1367,7 +1366,7 @@ public: void turnanypathoff(); void openfilefromc(); void gettime(); - void clearwork(); + //void clearwork(); void loadtraveltext(); //void worktoscreen(); void getexpos(); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index c218707d9b..01dcbde349 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -21,6 +21,7 @@ */ uint16 allocatemem(uint16 paragraphs); uint8 *workspace(); + void clearwork(); void multidump(); void multidump(uint16 x, uint16 y, uint8 width, uint8 height); void frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index e1622d69af..b0bfd12a8f 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -379,5 +379,9 @@ void DreamGenContext::showframe() { ch = height; } +void DreamGenContext::clearwork() { + memset(workspace(), 0, 320*200); +} + } /*namespace dreamgen */ -- cgit v1.2.3 From 7c40d798de8f650f6178ea94c62042a850c1d604 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 23:21:43 +0200 Subject: DREAMWEB: 'dealwithspecial' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 59 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/stubs.cpp | 31 ++++++++++++++++++++ engines/dreamweb/stubs.h | 2 ++ 5 files changed, 35 insertions(+), 61 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 453dba1e7d..e4d070703d 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -85,6 +85,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'cancelch1', 'getroomspaths', 'makebackob', + 'dealwithspecial', 'facerightway', ], skip_output = [ # These functions are processed but not output diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 41a249942c..f448fb2d84 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2923,64 +2923,6 @@ notfudge: data.byte(kHavedoneobs) = 0; } -void DreamGenContext::dealwithspecial() { - STACK_CHECK; - _sub(al, 220); - _cmp(al, 0); - if (!flags.z()) - goto notplset; - al = ah; - placesetobject(); - data.byte(kHavedoneobs) = 1; - return; -notplset: - _cmp(al, 1); - if (!flags.z()) - goto notremset; - al = ah; - removesetobject(); - data.byte(kHavedoneobs) = 1; - return; -notremset: - _cmp(al, 2); - if (!flags.z()) - goto notplfree; - al = ah; - placefreeobject(); - data.byte(kHavedoneobs) = 1; - return; -notplfree: - _cmp(al, 3); - if (!flags.z()) - goto notremfree; - al = ah; - removefreeobject(); - data.byte(kHavedoneobs) = 1; - return; -notremfree: - _cmp(al, 4); - if (!flags.z()) - goto notryanoff; - switchryanoff(); - return; -notryanoff: - _cmp(al, 5); - if (!flags.z()) - goto notryanon; - data.byte(kTurntoface) = ah; - data.byte(kFacing) = ah; - switchryanon(); - return; -notryanon: - _cmp(al, 6); - if (!flags.z()) - goto notchangeloc; - data.byte(kNewlocation) = ah; - return; -notchangeloc: - movemap(); -} - void DreamGenContext::movemap() { STACK_CHECK; _cmp(ah, 32); @@ -20320,7 +20262,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_plotreel: plotreel(); break; case addr_soundonreels: soundonreels(); break; case addr_reconstruct: reconstruct(); break; - case addr_dealwithspecial: dealwithspecial(); break; case addr_movemap: movemap(); break; case addr_getreelstart: getreelstart(); break; case addr_deleverything: deleverything(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index e2caf43107..fc141fa5d3 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -642,7 +642,6 @@ public: static const uint16 addr_deleverything = 0xc1c0; static const uint16 addr_getreelstart = 0xc1b8; static const uint16 addr_movemap = 0xc1b4; - static const uint16 addr_dealwithspecial = 0xc1b0; static const uint16 addr_reconstruct = 0xc1ac; static const uint16 addr_soundonreels = 0xc1a8; static const uint16 addr_plotreel = 0xc1a4; @@ -1449,7 +1448,7 @@ public: void printcurs(); //void convertkey(); void outofopen(); - void dealwithspecial(); + //void dealwithspecial(); //void eraseoldobs(); void dircom(); //void liftsprite(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 5ef8b18317..a9e0ef5929 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -802,5 +802,36 @@ void DreamGenContext::fillspace() { memset(ds.ptr(dx, cx), al, cx); } +void DreamGenContext::dealwithspecial() { + uint8 type = al - 220; + if (type == 0) { + al = ah; + placesetobject(); + data.byte(kHavedoneobs) = 1; + } else if (type == 1) { + al = ah; + removesetobject(); + data.byte(kHavedoneobs) = 1; + } else if (type == 2) { + al = ah; + placefreeobject(); + data.byte(kHavedoneobs) = 1; + } else if (type == 3) { + al = ah; + removefreeobject(); + data.byte(kHavedoneobs) = 1; + } else if (type == 4) { + switchryanoff(); + } else if (type == 5) { + data.byte(kTurntoface) = ah; + data.byte(kFacing) = ah; + switchryanon(); + } else if (type == 6) { + data.byte(kNewlocation) = ah; + } else { + movemap(); + } +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 01dcbde349..4d35a597c4 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -106,3 +106,5 @@ void lockmon(); void cancelch0(); void cancelch1(); + void dealwithspecial(); + -- cgit v1.2.3 From 52fef5a59949e915d1785c094dda64e2db5edea2 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Sat, 30 Jul 2011 23:37:18 +0200 Subject: DREAMWEB: 'plotreel' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 43 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.cpp | 34 +++++++++++++++++++++++++++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 37 insertions(+), 45 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index e4d070703d..4e110bec04 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -86,6 +86,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'getroomspaths', 'makebackob', 'dealwithspecial', + 'plotreel', 'facerightway', ], skip_output = [ # These functions are processed but not output diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index f448fb2d84..12126fce78 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2816,48 +2816,6 @@ void DreamGenContext::reelsonscreen() { usetimedtext(); } -void DreamGenContext::plotreel() { - STACK_CHECK; - getreelstart(); -retryreel: - push(es); - push(si); - ax = es.word(si+2); - _cmp(al, 220); - if (flags.c()) - goto normalreel; - _cmp(al, 255); - if (flags.z()) - goto normalreel; - dealwithspecial(); - _inc(data.word(kReelpointer)); - si = pop(); - es = pop(); - _add(si, 40); - goto retryreel; -normalreel: - cx = 8; -plotloop: - push(cx); - push(es); - push(si); - ax = es.word(si); - _cmp(ax, 0x0ffff); - if (flags.z()) - goto notplot; - showreelframe(); -notplot: - si = pop(); - es = pop(); - cx = pop(); - _add(si, 5); - if (--cx) - goto plotloop; - soundonreels(); - bx = pop(); - es = pop(); -} - void DreamGenContext::soundonreels() { STACK_CHECK; bl = data.byte(kReallocation); @@ -20259,7 +20217,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_updatepeople: updatepeople(); break; case addr_getreelframeax: getreelframeax(); break; case addr_reelsonscreen: reelsonscreen(); break; - case addr_plotreel: plotreel(); break; case addr_soundonreels: soundonreels(); break; case addr_reconstruct: reconstruct(); break; case addr_movemap: movemap(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index fc141fa5d3..264fece0b0 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -644,7 +644,6 @@ public: static const uint16 addr_movemap = 0xc1b4; static const uint16 addr_reconstruct = 0xc1ac; static const uint16 addr_soundonreels = 0xc1a8; - static const uint16 addr_plotreel = 0xc1a4; static const uint16 addr_reelsonscreen = 0xc1a0; static const uint16 addr_getreelframeax = 0xc19c; static const uint16 addr_updatepeople = 0xc198; @@ -1857,7 +1856,7 @@ public: void opentvdoor(); void triggermessage(); void finalframe(); - void plotreel(); + //void plotreel(); void swapwithopen(); //void makesprite(); void dreamweb(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index a9e0ef5929..0dcaa9e72b 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -833,5 +833,39 @@ void DreamGenContext::dealwithspecial() { } } +void DreamGenContext::plotreel() { + getreelstart(); + while (true) { + push(es); + push(si); + ax = es.word(si+2); + if (al < 220) + break; + if (al == 255) + break; + dealwithspecial(); + _inc(data.word(kReelpointer)); + si = pop(); + es = pop(); + _add(si, 40); + } + + for (size_t i = 0; i < 8; ++i) { + push(cx); + push(es); + push(si); + ax = es.word(si); + if (ax != 0xffff) + showreelframe(); + si = pop(); + es = pop(); + cx = pop(); + _add(si, 5); + } + soundonreels(); + bx = pop(); + es = pop(); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 4d35a597c4..a8bcd019c5 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -106,5 +106,6 @@ void lockmon(); void cancelch0(); void cancelch1(); + void plotreel(); void dealwithspecial(); -- cgit v1.2.3 From 7fd8895de62ad0421d8038cdb0618b493aecec1c Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 12:21:46 +0200 Subject: DREAMWEB: 'allocatework' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 8 -------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.h | 1 + engines/dreamweb/vgagrafx.cpp | 4 ++++ 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 4e110bec04..f279473f34 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -80,6 +80,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'liftsprite', 'frameoutv', 'modifychar', + 'allocatework', 'lockmon', 'cancelch0', 'cancelch1', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 12126fce78..a43816153e 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2999,13 +2999,6 @@ dumpevery2: goto dumpevery2; } -void DreamGenContext::allocatework() { - STACK_CHECK; - bx = 0x1000; - allocatemem(); - data.word(kWorkspace) = ax; -} - void DreamGenContext::loadpalfromiff() { STACK_CHECK; dx = 2481; @@ -20223,7 +20216,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_getreelstart: getreelstart(); break; case addr_deleverything: deleverything(); break; case addr_dumpeverything: dumpeverything(); break; - case addr_allocatework: allocatework(); break; case addr_showpcx: showpcx(); break; case addr_loadpalfromiff: loadpalfromiff(); break; case addr_setmode: setmode(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 264fece0b0..026ba1c3aa 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -637,7 +637,6 @@ public: static const uint16 addr_setmode = 0xc1dc; static const uint16 addr_loadpalfromiff = 0xc1d8; static const uint16 addr_showpcx = 0xc1cc; - static const uint16 addr_allocatework = 0xc1c8; static const uint16 addr_dumpeverything = 0xc1c4; static const uint16 addr_deleverything = 0xc1c0; static const uint16 addr_getreelstart = 0xc1b8; @@ -1819,7 +1818,7 @@ public: void afterintroroom(); void blockget(); void usetrainer(); - void allocatework(); + //void allocatework(); void addtopresslist(); void walkandexamine(); void dmaend(); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index a8bcd019c5..ddcde72da6 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -21,6 +21,7 @@ */ uint16 allocatemem(uint16 paragraphs); uint8 *workspace(); + void allocatework(); void clearwork(); void multidump(); void multidump(uint16 x, uint16 y, uint8 width, uint8 height); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index b0bfd12a8f..e61532fdb9 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -34,6 +34,10 @@ uint8 *DreamGenContext::workspace() { return result; } +void DreamGenContext::allocatework() { + data.word(kWorkspace) = allocatemem(0x1000); +} + void DreamGenContext::multiget() { multiget(di, bx, cl, ch); } -- cgit v1.2.3 From 4e39a41e6218c7206e706734eb608e9706e2678a Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 12:24:06 +0200 Subject: DREAWMEB: Ported 'zoom' to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 51 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.h | 1 + engines/dreamweb/vgagrafx.cpp | 28 +++++++++++++++++++++ 5 files changed, 31 insertions(+), 53 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index f279473f34..4774dc564d 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -89,6 +89,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'dealwithspecial', 'plotreel', 'facerightway', + 'zoom', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index a43816153e..99ad3b36a9 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -3160,56 +3160,6 @@ void DreamGenContext::createpanel2() { showframe(); } -void DreamGenContext::zoom() { - STACK_CHECK; - _cmp(data.word(kWatchingtime), 0); - if (!flags.z()) - return /* (inwatching) */; - _cmp(data.byte(kZoomon), 1); - if (flags.z()) - goto zoomswitch; - return; -zoomswitch: - _cmp(data.byte(kCommandtype), 199); - if (flags.c()) - goto zoomit; - putunderzoom(); - return; -zoomit: - ax = data.word(kOldpointery); - _sub(ax, 9); - cx = (320); - _mul(cx); - _add(ax, data.word(kOldpointerx)); - _sub(ax, 11); - si = ax; - ax = (132)+4; - cx = (320); - _mul(cx); - _add(ax, (8)+5); - di = ax; - es = data.word(kWorkspace); - ds = data.word(kWorkspace); - cx = 20; -zoomloop: - push(cx); - cx = 23; -zoomloop2: - _lodsb(); - ah = al; - _stosw(); - es.word(di+(320)-2) = ax; - if (--cx) - goto zoomloop2; - _add(si, (320)-23); - _add(di, (320)-46+(320)); - cx = pop(); - if (--cx) - goto zoomloop; - crosshair(); - data.byte(kDidzoom) = 1; -} - void DreamGenContext::delthisone() { STACK_CHECK; push(ax); @@ -20227,7 +20177,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_createpanel2: createpanel2(); break; case addr_vsync: vsync(); break; case addr_doshake: doshake(); break; - case addr_zoom: zoom(); break; case addr_delthisone: delthisone(); break; case addr_doblocks: doblocks(); break; case addr_transferinv: transferinv(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 026ba1c3aa..3e6a720a15 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -625,7 +625,6 @@ public: static const uint16 addr_transferinv = 0xc240; static const uint16 addr_doblocks = 0xc228; static const uint16 addr_delthisone = 0xc214; - static const uint16 addr_zoom = 0xc210; static const uint16 addr_doshake = 0xc20c; static const uint16 addr_vsync = 0xc208; static const uint16 addr_createpanel2 = 0xc200; @@ -1662,7 +1661,7 @@ public: void usedryer(); void dumpeverything(); void usehatch(); - void zoom(); + //void zoom(); void outofinv(); void viewfolder(); //void walking(); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index ddcde72da6..0f2202d28b 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -109,4 +109,5 @@ void cancelch1(); void plotreel(); void dealwithspecial(); + void zoom(); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index e61532fdb9..5acd2ec01f 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -387,5 +387,33 @@ void DreamGenContext::clearwork() { memset(workspace(), 0, 320*200); } +void DreamGenContext::zoom() { + if (data.word(kWatchingtime) != 0) + return; + if (data.byte(kZoomon) != 1) + return; + if (data.byte(kCommandtype) >= 199) { + putunderzoom(); + return; + } + uint16 srcOffset = (data.word(kOldpointery) - 9) * 320 + (data.word(kOldpointerx) - 11); + uint16 dstOffset = (kZoomy + 4) * 320 + (kZoomx + 5); + const uint8 *src = workspace() + srcOffset; + uint8 *dst = workspace() + dstOffset; + for(size_t i=0; i<20; ++i) { + for(size_t j=0; j<23; ++j) { + uint8 v = src[j]; + dst[2*j+0] = v; + dst[2*j+1] = v; + dst[2*j+320] = v; + dst[2*j+321] = v; + } + src += 320; + dst += 320*2; + } + crosshair(); + data.byte(kDidzoom) = 1; +} + } /*namespace dreamgen */ -- cgit v1.2.3 From c6049ac0c49c83d6367c77c23aafec0369d0e335 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 13:54:03 +0200 Subject: DREAMWEB: 'crosshair' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 27 --------------------------- engines/dreamweb/dreamgen.h | 7 +++---- engines/dreamweb/stubs.cpp | 15 +++++++++++++++ engines/dreamweb/stubs.h | 2 ++ 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 4774dc564d..48301c6e84 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -90,6 +90,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'plotreel', 'facerightway', 'zoom', + 'crosshair', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 99ad3b36a9..e619dcae13 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -18632,32 +18632,6 @@ void DreamGenContext::putunderzoom() { multiput(); } -void DreamGenContext::crosshair() { - STACK_CHECK; - _cmp(data.byte(kCommandtype), 3); - if (flags.z()) - goto nocross; - _cmp(data.byte(kCommandtype), 10); - if (!flags.c()) - goto nocross; - es = data.word(kWorkspace); - ds = data.word(kIcons1); - di = (8)+24; - bx = (132)+19; - al = 9; - ah = 0; - showframe(); - return; -nocross: - es = data.word(kWorkspace); - ds = data.word(kIcons1); - di = (8)+24; - bx = (132)+19; - al = 29; - ah = 0; - showframe(); -} - void DreamGenContext::showpointer() { STACK_CHECK; showblink(); @@ -20706,7 +20680,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_getunderzoom: getunderzoom(); break; case addr_dumpzoom: dumpzoom(); break; case addr_putunderzoom: putunderzoom(); break; - case addr_crosshair: crosshair(); break; case addr_showpointer: showpointer(); break; case addr_delpointer: delpointer(); break; case addr_dumppointer: dumppointer(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 3e6a720a15..3642627763 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -93,7 +93,6 @@ public: static const uint16 addr_dumppointer = 0xcacc; static const uint16 addr_delpointer = 0xcac8; static const uint16 addr_showpointer = 0xcac4; - static const uint16 addr_crosshair = 0xcac0; static const uint16 addr_putunderzoom = 0xcabc; static const uint16 addr_dumpzoom = 0xcab8; static const uint16 addr_getunderzoom = 0xcab4; @@ -1343,7 +1342,7 @@ public: void getreelstart(); void buttonenter(); void checkinput(); - void crosshair(); + //void crosshair(); void bresenhams(); void getbackfromops(); //void frameoutv(); @@ -1458,6 +1457,7 @@ public: void fadescreenup(); void loadold(); void loadtempcharset(); + void showbyte(); void useslab(); //void aboutturn(); void usealtar(); @@ -1563,7 +1563,7 @@ public: void wearwatch(); void runintroseq(); void doblocks(); - void showbyte(); + void opensarters(); void allpalette(); void findormake(); void nextsymbol(); @@ -1933,7 +1933,6 @@ public: //void dodoor(); void greyscalesum(); void buttoneight(); - void opensarters(); void findexobject(); void errormessage2(); void usechurchhole(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 0dcaa9e72b..c1cef6c79b 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -867,5 +867,20 @@ void DreamGenContext::plotreel() { es = pop(); } +void DreamGenContext::crosshair() { + uint8 frame; + if ((data.byte(kCommandtype) != 3) && (data.byte(kCommandtype) < 10)) { + frame = 9; + } else { + frame = 29; + } + push(ds); + ds = data.word(kIcons1); + uint8 *src = ds.ptr(0, 0); + ds = pop(); + uint8 width, height; + showframe(src, kZoomx + 24, kZoomy + 19, frame, 0, &width, &height); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 0f2202d28b..466a486e7b 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -110,4 +110,6 @@ void plotreel(); void dealwithspecial(); void zoom(); + void crosshair(); + -- cgit v1.2.3 From f7752243196e83b9191735634a764c26f24d7427 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 14:16:09 +0200 Subject: DREAMWEB: Ported 'showrain' to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 88 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/sprite.cpp | 44 ++++++++++++++++++++ engines/dreamweb/structs.h | 11 +++++ engines/dreamweb/stubs.h | 1 + 6 files changed, 58 insertions(+), 90 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 48301c6e84..aedb20f197 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -91,6 +91,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'facerightway', 'zoom', 'crosshair', + 'showrain', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index e619dcae13..f25bff3995 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -2596,93 +2596,6 @@ failrain: al = 0; } -void DreamGenContext::showrain() { - STACK_CHECK; - ds = data.word(kMainsprites); - si = 6*58; - ax = ds.word(si+2); - si = ax; - _add(si, 2080); - bx = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30)); - es = data.word(kBuffers); - _cmp(es.byte(bx), 255); - if (flags.z()) - return /* (nothunder) */; -morerain: - es = data.word(kBuffers); - _cmp(es.byte(bx), 255); - if (flags.z()) - goto finishrain; - al = es.byte(bx+1); - ah = 0; - _add(ax, data.word(kMapady)); - _add(ax, data.word(kMapystart)); - cx = 320; - _mul(cx); - cl = es.byte(bx); - ch = 0; - _add(ax, cx); - _add(ax, data.word(kMapadx)); - _add(ax, data.word(kMapxstart)); - di = ax; - cl = es.byte(bx+2); - ch = 0; - ax = es.word(bx+3); - dl = es.byte(bx+5); - dh = 0; - _sub(ax, dx); - _and(ax, 511); - es.word(bx+3) = ax; - _add(bx, 6); - push(si); - _add(si, ax); - es = data.word(kWorkspace); - ah = 0; - dx = 320-2; -rainloop: - _lodsb(); - _cmp(al, ah); - if (flags.z()) - goto noplot; - _stosb(); - _add(di, dx); - if (--cx) - goto rainloop; - si = pop(); - goto morerain; -noplot: - _add(di, 320-1); - if (--cx) - goto rainloop; - si = pop(); - goto morerain; -finishrain: - _cmp(data.word(kCh1blockstocopy), 0); - if (!flags.z()) - return /* (nothunder) */; - _cmp(data.byte(kReallocation), 2); - if (!flags.z()) - goto notlouisthund; - _cmp(data.byte(kBeenmugged), 1); - if (!flags.z()) - return /* (nothunder) */; -notlouisthund: - _cmp(data.byte(kReallocation), 55); - if (flags.z()) - return /* (nothunder) */; - randomnum1(); - _cmp(al, 1); - if (!flags.c()) - return /* (nothunder) */; - al = 7; - _cmp(data.byte(kCh0playing), 6); - if (flags.z()) - goto isthunder1; - al = 4; -isthunder1: - playchannel1(); -} - void DreamGenContext::liftnoise() { STACK_CHECK; _cmp(data.byte(kReallocation), 5); @@ -20123,7 +20036,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_initrain: initrain(); break; case addr_splitintolines: splitintolines(); break; case addr_getblockofpixel: getblockofpixel(); break; - case addr_showrain: showrain(); break; case addr_backobject: backobject(); break; case addr_liftnoise: liftnoise(); break; case addr_random: random(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 3642627763..1995858a03 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -651,7 +651,6 @@ public: static const uint16 addr_random = 0xc17c; static const uint16 addr_liftnoise = 0xc178; static const uint16 addr_backobject = 0xc170; - static const uint16 addr_showrain = 0xc16c; static const uint16 addr_getblockofpixel = 0xc168; static const uint16 addr_splitintolines = 0xc164; static const uint16 addr_initrain = 0xc160; @@ -1493,7 +1492,7 @@ public: void disablesoundint(); void checkifset(); void showallex(); - void showrain(); + //void showrain(); void openpoolboss(); void buttontwo(); //void usetimedtext(); diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 3e9914a71f..42c1b70d3a 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -567,5 +567,49 @@ void DreamGenContext::showreelframe(Reel *reel) { showframe(ds.ptr(0, 0), x, y, frame, 8, &width, &height); } +void DreamGenContext::showrain() { + ds = data.word(kMainsprites); + si = 6*58; + ax = ds.word(si+2); + si = ax + 2080; + es = data.word(kBuffers); + Rain *rain = (Rain *)es.ptr(kRainlist, 0); + if (rain->x == 255) + return; + while (true) { + if (rain->x == 255) { + if (data.word(kCh1blockstocopy) != 0) + return; + if ((data.byte(kReallocation) == 2) && (data.byte(kBeenmugged) != 1)) + return; + if (data.byte(kReallocation) == 55) + return; + randomnum1(); + if (al >= 1) + return; + if (data.byte(kCh0playing) != 6) + al = 4; + else + al = 7; + playchannel1(); + return; + } + uint16 y = rain->y + data.word(kMapady) + data.word(kMapystart); + uint16 x = rain->x + data.word(kMapadx) + data.word(kMapxstart); + uint16 size = rain->size; + ax = ((uint16)(rain->w3() - rain->b5)) & 511; + rain->setW3(ax); + ++rain; + const uint8 *src = ds.ptr(si, 0) + ax; + uint8 *dst = workspace() + y * 320 + x; + for(uint16 i = 0; i < size; ++i) { + uint8 v = src[i]; + if (v != 0) + *dst = v; + dst += 320-1; + } + } +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index a54c42d79d..a567384c00 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -121,3 +121,14 @@ struct Room { uint8 b31; }; +struct Rain { + uint8 x; + uint8 y; + uint8 size; + uint8 w3_lo; + uint8 w3_hi; + uint16 w3() const { return READ_LE_UINT16(&w3_lo); } + void setW3(uint16 v) { WRITE_LE_UINT16(&w3_lo, v); } + uint8 b5; +}; + diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 466a486e7b..635d6c733a 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -111,5 +111,6 @@ void dealwithspecial(); void zoom(); void crosshair(); + void showrain(); -- cgit v1.2.3 From c04a250c936b7de73215cd99e0476992cb3216d7 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 15:58:18 +0200 Subject: DREAMWEB: 'findsource' has a new C++ flavour --- engines/dreamweb/sprite.cpp | 12 ++++++++++-- engines/dreamweb/stubs.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 42c1b70d3a..00cbd2c4dc 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -552,6 +552,14 @@ void DreamGenContext::findsource() { } } +void *DreamGenContext::findsourceCPP() { + push(ds); + findsource(); + void *result = ds.ptr(0, 0); + ds = pop(); + return result; +} + void DreamGenContext::showreelframe() { Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); showreelframe(reel); @@ -561,10 +569,10 @@ void DreamGenContext::showreelframe(Reel *reel) { uint16 x = reel->x + data.word(kMapadx); uint16 y = reel->y + data.word(kMapady); data.word(kCurrentframe) = reel->frame(); - findsource(); + void *source = findsourceCPP(); uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff); uint8 width, height; - showframe(ds.ptr(0, 0), x, y, frame, 8, &width, &height); + showframe(source, x, y, frame, 8, &width, &height); } void DreamGenContext::showrain() { diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 635d6c733a..c2b1172eef 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -96,6 +96,7 @@ void liftsprite(); void liftsprite(Sprite *sprite, ObjData *objData); void findsource(); + void *findsourceCPP(); void showreelframe(); void showreelframe(Reel *reel); void turnpathonCPP(uint8 param); -- cgit v1.2.3 From 095689ab49ae9aa93b3e675576a2ab16afbd9bb1 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 16:14:39 +0200 Subject: DREAMWEB: Some sound mixing was not needed anymore --- devtools/tasmrecover/tasm-recover | 5 + engines/dreamweb/dreamgen.cpp | 279 -------------------------------------- engines/dreamweb/dreamgen.h | 15 +- 3 files changed, 10 insertions(+), 289 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index aedb20f197..100e4e510e 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -92,6 +92,11 @@ generator = cpp(context, "DreamGen", blacklist = [ 'zoom', 'crosshair', 'showrain', + 'domix', + 'channel0tran', + 'makenextblock', + 'loopchannel0', + 'parseblaster', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index f25bff3995..f61bd282c6 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -15445,46 +15445,6 @@ notsecondbank1: es = pop(); } -void DreamGenContext::makenextblock() { - STACK_CHECK; - volumeadjust(); - loopchannel0(); - _cmp(data.word(kCh1blockstocopy), 0); - if (flags.z()) - goto mightbeonlych0; - _cmp(data.word(kCh0blockstocopy), 0); - if (flags.z()) - goto mightbeonlych1; - _dec(data.word(kCh0blockstocopy)); - _dec(data.word(kCh1blockstocopy)); - bothchannels(); - return; -mightbeonlych1: - data.byte(kCh0playing) = 255; - _cmp(data.word(kCh1blockstocopy), 0); - if (flags.z()) - return /* (notch1only) */; - _dec(data.word(kCh1blockstocopy)); - channel1only(); - return; -mightbeonlych0: - data.byte(kCh1playing) = 255; - _cmp(data.word(kCh0blockstocopy), 0); - if (flags.z()) - goto notch0only; - _dec(data.word(kCh0blockstocopy)); - channel0only(); - return; -notch0only: - es = data.word(kSoundbuffer); - di = data.word(kSoundbufferwrite); - cx = 1024; - ax = 0x7f7f; - _stosw(cx, true); - _and(di, 16384-1); - data.word(kSoundbufferwrite) = di; -} - void DreamGenContext::volumeadjust() { STACK_CHECK; al = data.byte(kVolumedirection); @@ -15506,162 +15466,6 @@ volfinish: data.byte(kVolumedirection) = 0; } -void DreamGenContext::loopchannel0() { - STACK_CHECK; - _cmp(data.word(kCh0blockstocopy), 0); - if (!flags.z()) - return /* (notloop) */; - _cmp(data.byte(kCh0repeat), 0); - if (flags.z()) - return /* (notloop) */; - _cmp(data.byte(kCh0repeat), 255); - if (flags.z()) - goto endlessloop; - _dec(data.byte(kCh0repeat)); -endlessloop: - ax = data.word(kCh0oldemmpage); - data.word(kCh0emmpage) = ax; - ax = data.word(kCh0oldoffset); - data.word(kCh0offset) = ax; - ax = data.word(kCh0blockstocopy); - _add(ax, data.word(kCh0oldblockstocopy)); - data.word(kCh0blockstocopy) = ax; -} - -void DreamGenContext::channel0tran() { - STACK_CHECK; - _cmp(data.byte(kVolume), 0); - if (!flags.z()) - goto lowvolumetran; - cx = 1024; - _movsw(cx, true); - return; -lowvolumetran: - cx = 1024; - bh = data.byte(kVolume); - bl = 0; - _add(bx, 16384-256); -volloop: - _lodsw(); - bl = al; - al = es.byte(bx); - bl = ah; - ah = es.byte(bx); - _stosw(); - if (--cx) - goto volloop; -} - -void DreamGenContext::domix() { - STACK_CHECK; - _cmp(data.byte(kVolume), 0); - if (!flags.z()) - goto lowvolumemix; -slow: - _lodsb(); - ah = ds.byte(bx); - _inc(bx); - _cmp(al, dh); - if (!flags.c()) - goto toplot; - _cmp(ah, dh); - if (!flags.c()) - goto nodistort; - _add(al, ah); - if (flags.s()) - goto botok; - _xor(al, al); - _stosb(); - if (--cx) - goto slow; - return /* (doneit) */; -botok: - _xor(al, dh); - _stosb(); - if (--cx) - goto slow; - return /* (doneit) */; -toplot: - _cmp(ah, dh); - if (flags.c()) - goto nodistort; - _add(al, ah); - if (!flags.s()) - goto topok; - al = dl; - _stosb(); - if (--cx) - goto slow; - return /* (doneit) */; -topok: - _xor(al, dh); - _stosb(); - if (--cx) - goto slow; - return /* (doneit) */; -nodistort: - _add(al, ah); - _xor(al, dh); - _stosb(); - if (--cx) - goto slow; - return /* (doneit) */; -lowvolumemix: - _lodsb(); - push(bx); - bh = data.byte(kVolume); - _add(bh, 63); - bl = al; - al = es.byte(bx); - bx = pop(); - ah = ds.byte(bx); - _inc(bx); - _cmp(al, dh); - if (!flags.c()) - goto toplotv; - _cmp(ah, dh); - if (!flags.c()) - goto nodistortv; - _add(al, ah); - if (flags.s()) - goto botokv; - _xor(al, al); - _stosb(); - if (--cx) - goto lowvolumemix; - return /* (doneit) */; -botokv: - _xor(al, dh); - _stosb(); - if (--cx) - goto lowvolumemix; - return /* (doneit) */; -toplotv: - _cmp(ah, dh); - if (flags.c()) - goto nodistortv; - _add(al, ah); - if (!flags.s()) - goto topokv; - al = dl; - _stosb(); - if (--cx) - goto lowvolumemix; - return /* (doneit) */; -topokv: - _xor(al, dh); - _stosb(); - if (--cx) - goto lowvolumemix; - return /* (doneit) */; -nodistortv: - _add(al, ah); - _xor(al, dh); - _stosb(); - if (--cx) - goto lowvolumemix; -} - void DreamGenContext::entrytexts() { STACK_CHECK; _cmp(data.byte(kLocation), 21); @@ -16084,84 +15888,6 @@ void DreamGenContext::clearrest() { deallocatemem(); } -void DreamGenContext::parseblaster() { - STACK_CHECK; -lookattail: - al = es.byte(bx); - _cmp(al, 0); - if (flags.z()) - return /* (endtail) */; - _cmp(al, 13); - if (flags.z()) - return /* (endtail) */; - _cmp(al, 'i'); - if (flags.z()) - goto issoundint; - _cmp(al, 'I'); - if (flags.z()) - goto issoundint; - _cmp(al, 'b'); - if (flags.z()) - goto isbright; - _cmp(al, 'B'); - if (flags.z()) - goto isbright; - _cmp(al, 'a'); - if (flags.z()) - goto isbaseadd; - _cmp(al, 'A'); - if (flags.z()) - goto isbaseadd; - _cmp(al, 'n'); - if (flags.z()) - goto isnosound; - _cmp(al, 'N'); - if (flags.z()) - goto isnosound; - _cmp(al, 'd'); - if (flags.z()) - goto isdma; - _cmp(al, 'D'); - if (flags.z()) - goto isdma; - _inc(bx); - if (--cx) - goto lookattail; - return; -issoundint: - al = es.byte(bx+1); - _sub(al, '0'); - data.byte(kSoundint) = al; - _inc(bx); - goto lookattail; -isdma: - al = es.byte(bx+1); - _sub(al, '0'); - data.byte(kSounddmachannel) = al; - _inc(bx); - goto lookattail; -isbaseadd: - push(cx); - al = es.byte(bx+2); - _sub(al, '0'); - ah = 0; - cl = 4; - _shl(ax, cl); - _add(ax, 0x200); - data.word(kSoundbaseadd) = ax; - cx = pop(); - _inc(bx); - goto lookattail; -isbright: - data.byte(kBrightness) = 1; - _inc(bx); - goto lookattail; -isnosound: - data.byte(kSoundint) = 255; - _inc(bx); - goto lookattail; -} - void DreamGenContext::startup() { STACK_CHECK; data.byte(kCurrentkey) = 0; @@ -20485,16 +20211,12 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_out22c: out22c(); break; case addr_playchannel0: playchannel0(); break; case addr_playchannel1: playchannel1(); break; - case addr_makenextblock: makenextblock(); break; case addr_volumeadjust: volumeadjust(); break; - case addr_loopchannel0: loopchannel0(); break; case addr_channel0only: channel0only(); break; case addr_channel1only: channel1only(); break; - case addr_channel0tran: channel0tran(); break; case addr_bothchannels: bothchannels(); break; case addr_saveems: saveems(); break; case addr_restoreems: restoreems(); break; - case addr_domix: domix(); break; case addr_dmaend: dmaend(); break; case addr_startdmablock: startdmablock(); break; case addr_setuppit: setuppit(); break; @@ -20517,7 +20239,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_clearrest: clearrest(); break; case addr_deallocatemem: deallocatemem(); break; case addr_allocatemem: allocatemem(); break; - case addr_parseblaster: parseblaster(); break; case addr_startup: startup(); break; case addr_startup1: startup1(); break; case addr_screenupdate: screenupdate(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 1995858a03..92fee38f27 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -168,7 +168,6 @@ public: static const uint16 addr_screenupdate = 0xc99c; static const uint16 addr_startup1 = 0xc998; static const uint16 addr_startup = 0xc994; - static const uint16 addr_parseblaster = 0xc990; static const uint16 addr_allocatemem = 0xc988; static const uint16 addr_deallocatemem = 0xc984; static const uint16 addr_clearrest = 0xc980; @@ -190,16 +189,12 @@ public: static const uint16 addr_setuppit = 0xc93c; static const uint16 addr_startdmablock = 0xc938; static const uint16 addr_dmaend = 0xc934; - static const uint16 addr_domix = 0xc930; static const uint16 addr_restoreems = 0xc92c; static const uint16 addr_saveems = 0xc928; static const uint16 addr_bothchannels = 0xc924; - static const uint16 addr_channel0tran = 0xc920; static const uint16 addr_channel1only = 0xc91c; static const uint16 addr_channel0only = 0xc918; - static const uint16 addr_loopchannel0 = 0xc90c; static const uint16 addr_volumeadjust = 0xc908; - static const uint16 addr_makenextblock = 0xc904; static const uint16 addr_playchannel1 = 0xc900; static const uint16 addr_playchannel0 = 0xc8fc; static const uint16 addr_out22c = 0xc8f8; @@ -1480,7 +1475,7 @@ public: void reminders(); void selectslot2(); void runtap(); - void domix(); + //void domix(); void priesttext(); void paneltomap(); void obname(); @@ -1584,7 +1579,7 @@ public: void nextcolon(); void placefreeobject(); void delpointer(); - void loopchannel0(); + //void loopchannel0(); void initrain(); void showleftpage(); void rockstar(); @@ -1924,7 +1919,7 @@ public: void quitkey(); void openfile(); void usecharset1(); - void makenextblock(); + //void makenextblock(); void showpuztext(); void addalong(); //void width160(); @@ -1980,9 +1975,9 @@ public: void redrawmainscrn(); void finishedwalking(); void findallryan(); - void channel0tran(); + //void channel0tran(); void buttonpress(); - void parseblaster(); + //void parseblaster(); void callhotellift(); void makemainscreen(); void intromonks2(); -- cgit v1.2.3 From 2b03076149535d29c83b5ab5f165456a6238e57c Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 16:19:27 +0200 Subject: DREAMWEB: 'deltextline' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 17 ----------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.cpp | 10 ++++++++++ engines/dreamweb/stubs.h | 2 +- 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 100e4e510e..1c02417cfd 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -97,6 +97,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'makenextblock', 'loopchannel0', 'parseblaster', + 'deltextline', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index f61bd282c6..410abff178 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -18443,22 +18443,6 @@ _tmp1: multiget(); } -void DreamGenContext::deltextline() { - STACK_CHECK; - di = data.word(kTextaddressx); - bx = data.word(kTextaddressy); - _cmp(data.byte(kForeignrelease), 0); - if (flags.z()) - goto _tmp1; - _sub(bx, 3); -_tmp1: - ds = data.word(kBuffers); - si = (0); - cl = (228); - ch = (13); - multiput(); -} - void DreamGenContext::animpointer() { STACK_CHECK; _cmp(data.byte(kPointermode), 2); @@ -20317,7 +20301,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_delpointer: delpointer(); break; case addr_dumppointer: dumppointer(); break; case addr_undertextline: undertextline(); break; - case addr_deltextline: deltextline(); break; case addr_animpointer: animpointer(); break; case addr_setmouse: setmouse(); break; case addr_readmouse: readmouse(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 92fee38f27..4abcd87719 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -88,7 +88,6 @@ public: static const uint16 addr_readmouse = 0xcae4; static const uint16 addr_setmouse = 0xcae0; static const uint16 addr_animpointer = 0xcadc; - static const uint16 addr_deltextline = 0xcad4; static const uint16 addr_undertextline = 0xcad0; static const uint16 addr_dumppointer = 0xcacc; static const uint16 addr_delpointer = 0xcac8; @@ -1398,7 +1397,7 @@ public: void useelevator2(); void buttonone(); void keyboardread(); - void deltextline(); + //void deltextline(); void entercode(); void getopenedsize(); void getpersframe(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index c1cef6c79b..be75abaf0d 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -882,5 +882,15 @@ void DreamGenContext::crosshair() { showframe(src, kZoomx + 24, kZoomy + 19, frame, 0, &width, &height); } +void DreamGenContext::deltextline() { + uint16 x = data.word(kTextaddressx); + uint16 y = data.word(kTextaddressy); + if (data.byte(kForeignrelease) != 0) + y -= 3; + ds = data.word(kBuffers); + si = kTextunder; + multiput(x, y, kUndertextsizex, kUndertextsizey); +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index c2b1172eef..61761a4c8c 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -113,5 +113,5 @@ void zoom(); void crosshair(); void showrain(); - + void deltextline(); -- cgit v1.2.3 From 135efa50a1f96632dae985b593888eb706006d75 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 16:44:29 +0200 Subject: DREAMWEB: Less register interaction in 'multiput' and 'multiget' --- engines/dreamweb/stubs.cpp | 6 +++--- engines/dreamweb/stubs.h | 4 ++-- engines/dreamweb/vgagrafx.cpp | 29 +++++++++++++---------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index be75abaf0d..12e3905657 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -291,7 +291,7 @@ void DreamGenContext::getundertimed() { y -= 3; ds = data.word(kBuffers); si = kUndertimedtext; - multiget(data.byte(kTimedx), y, 240, kUndertimedysize); + multiget(ds.ptr(si, 0), data.byte(kTimedx), y, 240, kUndertimedysize); } void DreamGenContext::putundertimed() { @@ -300,7 +300,7 @@ void DreamGenContext::putundertimed() { y -= 3; ds = data.word(kBuffers); si = kUndertimedtext; - multiput(data.byte(kTimedx), y, 240, kUndertimedysize); + multiput(ds.ptr(si, 0), data.byte(kTimedx), y, 240, kUndertimedysize); } void DreamGenContext::usetimedtext() { @@ -889,7 +889,7 @@ void DreamGenContext::deltextline() { y -= 3; ds = data.word(kBuffers); si = kTextunder; - multiput(x, y, kUndertextsizex, kUndertextsizey); + multiput(ds.ptr(si, 0), x, y, kUndertextsizex, kUndertextsizey); } } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 61761a4c8c..d7f71aed5f 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -31,7 +31,7 @@ void frameoutfx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y); void worktoscreen(); void multiget(); - void multiget(uint16 x, uint16 y, uint8 width, uint8 height); + void multiget(uint8 *dst, uint16 x, uint16 y, uint8 width, uint8 height); void convertkey(); void cls(); void printsprites(); @@ -70,7 +70,7 @@ void showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); void printasprite(const Sprite *sprite); void width160(); - void multiput(uint16 x, uint16 y, uint8 width, uint8 height); + void multiput(const uint8 *src, uint16 x, uint16 y, uint8 width, uint8 height); void multiput(); void eraseoldobs(); void clearsprites(); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index 5acd2ec01f..a4f8d83117 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -39,13 +39,14 @@ void DreamGenContext::allocatework() { } void DreamGenContext::multiget() { - multiget(di, bx, cl, ch); + multiget(ds.ptr(si, 0), di, bx, cl, ch); + si += cl * ch; + di += bx * kScreenwidth + kScreenwidth * ch; + cx = 0; } -void DreamGenContext::multiget(uint16 x, uint16 y, uint8 w, uint8 h) { +void DreamGenContext::multiget(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) { unsigned src = x + y * kScreenwidth; - unsigned dst = (uint16)si; - es = ds; ds = data.word(kWorkspace); if (y + h > 200) h = 200 - y; @@ -53,21 +54,20 @@ void DreamGenContext::multiget(uint16 x, uint16 y, uint8 w, uint8 h) { w = 320 - x; //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); for(unsigned l = 0; l < h; ++l) { - uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); - uint8 *dst_p = es.ptr(dst + w * l, w); + const uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); + uint8 *dst_p = dst + w * l; memcpy(dst_p, src_p, w); } - si += w * h; - di = src + kScreenwidth * h; - cx = 0; } void DreamGenContext::multiput() { - multiput(di, bx, cl, ch); + multiput(ds.ptr(si, 0), di, bx, cl, ch); + si += cl * ch; + di += bx * kScreenwidth + kScreenwidth * ch; + cx = 0; } -void DreamGenContext::multiput(uint16 x, uint16 y, uint8 w, uint8 h) { - unsigned src = (uint16)si; +void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, uint8 h) { unsigned dst = x + y * kScreenwidth; es = data.word(kWorkspace); if (y + h > 200) @@ -76,13 +76,10 @@ void DreamGenContext::multiput(uint16 x, uint16 y, uint8 w, uint8 h) { w = 320 - x; //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); for(unsigned l = 0; l < h; ++l) { - uint8 *src_p = ds.ptr(src + w * l, w); + const uint8 *src_p = src + w * l; uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w); memcpy(dst_p, src_p, w); } - si += w * h; - di = dst + kScreenwidth * h; - cx = 0; } void DreamGenContext::multidump(uint16 x, uint16 y, uint8 width, uint8 height) { -- cgit v1.2.3 From 8ee7ed10664c9c4c6ed944acf489e973be37b327 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 18:11:19 +0200 Subject: DREAMWEB: Less register usage in 'plotreel' --- engines/dreamweb/structs.h | 7 ++++--- engines/dreamweb/stubs.cpp | 24 +++++++----------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h index a567384c00..48b3f914d0 100644 --- a/engines/dreamweb/structs.h +++ b/engines/dreamweb/structs.h @@ -87,9 +87,10 @@ struct Frame { }; struct Reel { - uint16 _frame; - uint16 frame() const { return READ_LE_UINT16(&_frame); } - void setFrame(uint16 v) { WRITE_LE_UINT16(&_frame, v); } + uint8 frame_lo; + uint8 frame_hi; + uint16 frame() const { return READ_LE_UINT16(&frame_lo); } + void setFrame(uint16 v) { WRITE_LE_UINT16(&frame_lo, v); } uint8 x; uint8 y; uint8 b4; diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 12e3905657..c95091a464 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -835,36 +835,26 @@ void DreamGenContext::dealwithspecial() { void DreamGenContext::plotreel() { getreelstart(); + Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); while (true) { - push(es); - push(si); - ax = es.word(si+2); + al = reel->x; + ah = reel->y; if (al < 220) break; if (al == 255) break; dealwithspecial(); _inc(data.word(kReelpointer)); - si = pop(); - es = pop(); - _add(si, 40); + reel += 8; } for (size_t i = 0; i < 8; ++i) { - push(cx); - push(es); - push(si); - ax = es.word(si); + ax = reel->frame(); if (ax != 0xffff) - showreelframe(); - si = pop(); - es = pop(); - cx = pop(); - _add(si, 5); + showreelframe(reel); + ++reel; } soundonreels(); - bx = pop(); - es = pop(); } void DreamGenContext::crosshair() { -- cgit v1.2.3 From 3427d07de07032b203f7aa02486b8073a65bca26 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 3 Aug 2011 18:48:43 +0200 Subject: DREAMWEB: 'doblocks' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 78 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +- engines/dreamweb/stubs.h | 1 + engines/dreamweb/vgagrafx.cpp | 42 +++++++++++++++++++++ 5 files changed, 45 insertions(+), 80 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 1c02417cfd..f665b7403b 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -98,6 +98,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'loopchannel0', 'parseblaster', 'deltextline', + 'doblocks', ], skip_output = [ # These functions are processed but not output 'dreamweb', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 410abff178..83951bd19c 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -3117,83 +3117,6 @@ deloneloop: goto deloneloop; } -void DreamGenContext::doblocks() { - STACK_CHECK; - es = data.word(kWorkspace); - ax = data.word(kMapady); - cx = (320); - _mul(cx); - di = data.word(kMapadx); - _add(di, ax); - al = data.byte(kMapy); - ah = 0; - bx = (66); - _mul(bx); - bl = data.byte(kMapx); - bh = 0; - _add(ax, bx); - si = (0); - _add(si, ax); - cx = 10; -loop120: - push(di); - push(cx); - cx = 11; -loop124: - push(cx); - push(di); - ds = data.word(kMapdata); - _lodsb(); - ds = data.word(kBackdrop); - push(si); - _cmp(al, 0); - if (flags.z()) - goto zeroblock; - ah = al; - al = 0; - si = (0+192); - _add(si, ax); - bh = 14; - bh = 4; -firstbitofblock: - _movsw(8); - _add(di, (320)-16); - _dec(bh); - if (!flags.z()) - goto firstbitofblock; - bh = 12; -loop125: - _movsw(8); - ax = 0x0dfdf; - _stosw(2); - _add(di, (320)-20); - _dec(bh); - if (!flags.z()) - goto loop125; - _add(di, 4); - ax = 0x0dfdf; - _stosw(8); - _add(di, (320)-16); - _stosw(8); - _add(di, (320)-16); - _stosw(8); - _add(di, (320)-16); - _stosw(8); -zeroblock: - si = pop(); - di = pop(); - cx = pop(); - _add(di, 16); - if (--cx) - goto loop124; - _add(si, (66)-11); - cx = pop(); - di = pop(); - _add(di, (320)*16); - if (--cx) - goto loop120; -} - void DreamGenContext::transferinv() { STACK_CHECK; di = data.word(kExframepos); @@ -19774,7 +19697,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_vsync: vsync(); break; case addr_doshake: doshake(); break; case addr_delthisone: delthisone(); break; - case addr_doblocks: doblocks(); break; case addr_transferinv: transferinv(); break; case addr_transfermap: transfermap(); break; case addr_fadedos: fadedos(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 4abcd87719..9c89fead42 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -616,7 +616,6 @@ public: static const uint16 addr_fadedos = 0xc248; static const uint16 addr_transfermap = 0xc244; static const uint16 addr_transferinv = 0xc240; - static const uint16 addr_doblocks = 0xc228; static const uint16 addr_delthisone = 0xc214; static const uint16 addr_doshake = 0xc20c; static const uint16 addr_vsync = 0xc208; @@ -1555,7 +1554,7 @@ public: void locklightoff(); void wearwatch(); void runintroseq(); - void doblocks(); + //void doblocks(); void opensarters(); void allpalette(); void findormake(); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index d7f71aed5f..5ba83c3014 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -114,4 +114,5 @@ void crosshair(); void showrain(); void deltextline(); + void doblocks(); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index a4f8d83117..ca86fc44b0 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -384,6 +384,48 @@ void DreamGenContext::clearwork() { memset(workspace(), 0, 320*200); } +void DreamGenContext::doblocks() { + uint16 dstOffset = data.word(kMapady) * 320 + data.word(kMapadx); + uint16 mapOffset = kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx); + ds = data.word(kMapdata); + const uint8 *mapData = ds.ptr(mapOffset, 0); + ds = data.word(kBackdrop); + const uint8 *blocks = ds.ptr(kBlocks, 0); + es = data.word(kWorkspace); + uint8 *dstBuffer = es.ptr(dstOffset, 0); + + for (size_t i = 0; i < 10; ++i) { + for (size_t j = 0; j < 11; ++j) { + uint16 blockType = mapData[j]; + if (blockType != 0) { + uint8 *dst = dstBuffer + i * 320 * 16 + j * 16; + const uint8 *block = blocks + blockType * 256; + for (size_t k = 0; k < 4; ++k) { + memcpy(dst, block, 16); + block += 16; + dst += 320; + } + for (size_t k = 0; k < 12; ++k) { + memcpy(dst, block, 16); + memset(dst + 16, 0xdf, 4); + block += 16; + dst += 320; + } + dst += 4; + ax = 0x0dfdf; + memset(dst, 0xdf, 16); + dst += 320; + memset(dst, 0xdf, 16); + dst += 320; + memset(dst, 0xdf, 16); + dst += 320; + memset(dst, 0xdf, 16); + } + } + mapData += kMapwidth; + } +} + void DreamGenContext::zoom() { if (data.word(kWatchingtime) != 0) return; -- cgit v1.2.3 From a3c8c1334ba5c948912e35ca8bdc30d479190df0 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 4 Aug 2011 11:03:08 +0200 Subject: DREAMWEB: Helper function to acquire a temporary segment ref to avoid ds and es pollution --- engines/dreamweb/runtime.h | 6 ++++++ engines/dreamweb/sprite.cpp | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h index 714a8d5850..ba16f03d1c 100644 --- a/engines/dreamweb/runtime.h +++ b/engines/dreamweb/runtime.h @@ -287,6 +287,12 @@ public: _freeSegments.push_back(id); } + SegmentRef segRef(uint16 seg) { + SegmentRef result(this); + result = seg; + return result; + } + inline void _cmp(uint8 a, uint8 b) { _sub(a, b); } diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 00cbd2c4dc..8cf0da1de7 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -580,8 +580,7 @@ void DreamGenContext::showrain() { si = 6*58; ax = ds.word(si+2); si = ax + 2080; - es = data.word(kBuffers); - Rain *rain = (Rain *)es.ptr(kRainlist, 0); + Rain *rain = (Rain *)segRef(data.word(kBuffers)).ptr(kRainlist, 0); if (rain->x == 255) return; while (true) { -- cgit v1.2.3 From 5bf9c42c4551e702741ed36427168ad52dd57816 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 4 Aug 2011 11:07:02 +0200 Subject: DREAMWEB: Deprecated functions suppressed --- engines/dreamweb/sprite.cpp | 12 ------------ engines/dreamweb/stubs.h | 2 -- 2 files changed, 14 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 8cf0da1de7..7701983df2 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -405,12 +405,6 @@ void DreamGenContext::steady(Sprite *sprite, ObjData *objData) { sprite->b15 = b18; } -void DreamGenContext::lockeddoorway() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - lockeddoorway(sprite, objData); -} - void DreamGenContext::lockeddoorway(Sprite *sprite, ObjData *objData) { if (data.byte(kRyanx) < sprite->x) { if (sprite->x - data.byte(kRyanx) > 24) @@ -475,12 +469,6 @@ shutdoor2: } } -void DreamGenContext::liftsprite() { - Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite)); - ObjData *objData = (ObjData *)ds.ptr(di, 0); - liftsprite(sprite, objData); -} - void DreamGenContext::liftsprite(Sprite *sprite, ObjData *objData) { uint8 liftFlag = data.byte(kLiftflag); if (liftFlag == 0) { //liftclosed diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 5ba83c3014..7e92ed847e 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -91,9 +91,7 @@ void dodoor(Sprite *sprite, ObjData *objData); void doorway(Sprite *sprite, ObjData *objData); void widedoor(Sprite *sprite, ObjData *objData); - void lockeddoorway(); void lockeddoorway(Sprite *sprite, ObjData *objData); - void liftsprite(); void liftsprite(Sprite *sprite, ObjData *objData); void findsource(); void *findsourceCPP(); -- cgit v1.2.3 From baa109f0582ff3f602d9a856adc01b6e3ea3c693 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 4 Aug 2011 11:13:59 +0200 Subject: DREAMWEB: Less register usage in misc. places --- engines/dreamweb/sprite.cpp | 17 +++-------------- engines/dreamweb/vgagrafx.cpp | 5 +---- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 7701983df2..9941fb2c2d 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -27,10 +27,7 @@ namespace DreamGen { Sprite *DreamGenContext::spritetable() { - push(es); - es = data.word(kBuffers); - Sprite *sprite = (Sprite *)es.ptr(kSpritetable, 16 * sizeof(Sprite)); - es = pop(); + Sprite *sprite = (Sprite *)segRef(data.word(kBuffers)).ptr(kSpritetable, 16 * sizeof(Sprite)); return sprite; } @@ -70,8 +67,7 @@ void DreamGenContext::printasprite(const Sprite *sprite) { else c = 0; uint8 width, height; - ds = sprite->frameData(); - showframe(ds.ptr(0, 0), x, y, sprite->b15, c, &width, &height); + showframe(segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c, &width, &height); } void DreamGenContext::clearsprites() { @@ -277,15 +273,10 @@ void DreamGenContext::backobject() { } void DreamGenContext::backobject(Sprite *sprite) { - push(ds); - - ds = data.word(kSetdat); - di = sprite->objData(); - ObjData *objData = (ObjData *)ds.ptr(di, 0); + ObjData *objData = (ObjData *)segRef(data.word(kSetdat)).ptr(sprite->objData(), 0); if (sprite->delay != 0) { --sprite->delay; - ds = pop(); return; } @@ -304,8 +295,6 @@ void DreamGenContext::backobject(Sprite *sprite) { constant(sprite, objData); else steady(sprite, objData); - - ds = pop(); } void DreamGenContext::constant(Sprite *sprite, ObjData *objData) { diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index ca86fc44b0..ed195aa551 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -27,10 +27,7 @@ namespace DreamGen { uint8 *DreamGenContext::workspace() { - push(es); - es = data.word(kWorkspace); - uint8 *result = es.ptr(0, 0); - es = pop(); + uint8 *result = segRef(data.word(kWorkspace)).ptr(0, 0); return result; } -- cgit v1.2.3 From 79efb47cf64c1482692ed8375eeb9c376af890b0 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:32:37 -0500 Subject: AGOS: Flag CD titles with ADGF_CD --- engines/agos/detection_tables.h | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h index a43d581173..d9f321d98e 100644 --- a/engines/agos/detection_tables.h +++ b/engines/agos/detection_tables.h @@ -1040,7 +1040,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformAcorn, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES }, @@ -1208,7 +1208,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES | GUIO_NOMIDI }, @@ -1232,7 +1232,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES | GUIO_NOMIDI }, @@ -1546,7 +1546,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES }, @@ -1571,7 +1571,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES }, @@ -1596,7 +1596,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::RU_RUS, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1621,7 +1621,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1671,7 +1671,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::HE_ISR, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1696,7 +1696,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1722,7 +1722,7 @@ static const AGOSGameDescription gameDescriptions[] = { // FIXME: DOS version which uses WAV format Common::IT_ITA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1747,7 +1747,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -1772,7 +1772,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES }, @@ -1797,7 +1797,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSUBTITLES }, @@ -2022,7 +2022,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2047,7 +2047,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2072,7 +2072,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2097,7 +2097,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2122,7 +2122,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2147,7 +2147,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::HE_ISR, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2173,7 +2173,7 @@ static const AGOSGameDescription gameDescriptions[] = { // FIXME: DOS version which uses WAV format Common::IT_ITA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2198,7 +2198,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2223,7 +2223,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::CZ_CZE, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2248,7 +2248,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2273,7 +2273,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2298,7 +2298,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, @@ -2323,7 +2323,7 @@ static const AGOSGameDescription gameDescriptions[] = { }, Common::PL_POL, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, -- cgit v1.2.3 From 45fa59598eedadcc962a7795d8131d046ebe73bc Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:32:52 -0500 Subject: MADE: Flag CD titles with ADGF_CD --- engines/made/detection.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp index 1320daaf9d..fa08923e44 100644 --- a/engines/made/detection.cpp +++ b/engines/made/detection.cpp @@ -104,7 +104,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("rtzcd.red", "cd8b62ece4677c438688c1de3f5379b9"), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -121,7 +121,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.dat", "a1db8c97a78dae10f91d356f16ad07b8", 536064), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -138,7 +138,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.red", "c4e2430e6b6c6ff1562a80fb4a9df24c", 276177), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -156,7 +156,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a"), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -173,7 +173,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 276584), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -191,7 +191,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.dat", "9d740378da2d16e83d0d0efff01bf83a", 525824), Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -209,7 +209,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 355442), Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -227,7 +227,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.dat", "5b86035aed0277f96e3d173542b5364a", 523776), Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -245,7 +245,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354971), Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -263,7 +263,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.dat", "bde8251a8e34e87c54e3f93147d56c9e", 523776), Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -281,7 +281,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354614), Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -333,7 +333,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("rtzcd.dat", "c4fccf67ad247f09b94c3c808b138576"), Common::JA_JPN, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -351,7 +351,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("rtzcd.dat", "e949a6a42d82daabfa7d4dc0a87a9843"), Common::JA_JPN, Common::kPlatformFMTowns, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -369,7 +369,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("rtzcd.dat", "0c0117e98530c736a141c2aad6834dc5"), Common::JA_JPN, Common::kPlatformPC98, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_RTZ, @@ -386,7 +386,7 @@ static const MadeGameDescription gameDescriptions[] = { AD_ENTRY1("manhole.dat", "cb21e31ed35c963208343bc995225b73"), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NOSPEECH }, GID_MANHOLE, -- cgit v1.2.3 From 40f765850f3d5ffe76d5987252c8198b4de735a4 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:33:04 -0500 Subject: SAGA: Flag CD titles with ADGF_CD --- engines/saga/detection_tables.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h index a29d835a54..3e83c30eef 100644 --- a/engines/saga/detection_tables.h +++ b/engines/saga/detection_tables.h @@ -328,7 +328,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -352,7 +352,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -384,7 +384,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -414,7 +414,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -438,7 +438,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -462,7 +462,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -486,7 +486,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, @@ -511,7 +511,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_ITE, -- cgit v1.2.3 From a30c3697fbef4c0bfe6e5e19ccad486affbdbd3e Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:33:15 -0500 Subject: TINSEL: Flag CD titles with ADGF_CD --- engines/tinsel/detection_tables.h | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index 116322aa89..bea0938fad 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -214,7 +214,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -236,7 +236,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, + ADGF_DROPLANGUAGE | ADGF_CD, GUIO_NONE }, GID_DW1, @@ -261,7 +261,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, + ADGF_DROPLANGUAGE | ADGF_CD, GUIO_NONE }, GID_DW1, @@ -285,7 +285,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_DROPLANGUAGE, + ADGF_DROPLANGUAGE | ADGF_CD, GUIO_NONE }, GID_DW1, @@ -308,7 +308,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_DROPLANGUAGE, + ADGF_DROPLANGUAGE | ADGF_CD, GUIO_NONE }, GID_DW1, @@ -331,7 +331,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_DROPLANGUAGE, + ADGF_DROPLANGUAGE | ADGF_CD, GUIO_NONE }, GID_DW1, @@ -351,7 +351,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -371,7 +371,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::HE_ISR, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -390,7 +390,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPSX, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -434,7 +434,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -456,7 +456,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -475,7 +475,7 @@ static const TinselGameDescription gameDescriptions[] = { AD_ENTRY1s("dw.scn", "6182c7986eaec893c62fb6ea13a9f225", 774556), Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, @@ -496,7 +496,7 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::RU_RUS, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, -- cgit v1.2.3 From 2c3b7392b80137eb8e51e2a740d74863fa8ea634 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:33:23 -0500 Subject: TSAGE: Flag CD titles with ADGF_CD --- engines/tsage/detection_tables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 7fbfa55c95..34aa13ca11 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -32,7 +32,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618), Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING, + ADGF_TESTING | ADGF_CD, Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, @@ -46,7 +46,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "cb8bba91b30cd172712371d7123bd763", 7427980), Common::ES_ESP, Common::kPlatformPC, - ADGF_TESTING, + ADGF_TESTING | ADGF_CD, Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_Ringworld, @@ -134,7 +134,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, -- cgit v1.2.3 From 47f0ce2fa755e0d3a1717981b3528200f4da1235 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 6 Aug 2011 23:34:44 -0500 Subject: TSAGE: Flag Blue Force with ADGF_UNSTABLE --- engines/tsage/detection_tables.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 34aa13ca11..9e7b853b48 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -120,7 +120,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, @@ -134,7 +134,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322), Common::EN_ANY, Common::kPlatformPC, - ADGF_CD, + ADGF_CD | ADGF_UNSTABLE, Common::GUIO_NOSPEECH | Common::GUIO_NOSFX }, GType_BlueForce, -- cgit v1.2.3 From 3407f2803aec89fcf091900b841f83683fcc8675 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Mon, 8 Aug 2011 22:26:31 +0200 Subject: DREAMWEB: 'autosetwalk' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 54 --------------------------------------- engines/dreamweb/dreamgen.h | 7 +++-- engines/dreamweb/stubs.cpp | 20 +++++++++++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 25 insertions(+), 58 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index f665b7403b..ed4c9f1352 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -74,6 +74,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'showreelframe', 'findsource', 'walking', + 'autosetwalk', 'spriteupdate', 'dodoor', 'lockeddoorway', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 83951bd19c..291078169f 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -17359,59 +17359,6 @@ holdingreel: data.byte(kWatchmode) = 2; } -void DreamGenContext::autosetwalk() { - STACK_CHECK; - al = data.byte(kManspath); - _cmp(data.byte(kFinaldest), al); - if (!flags.z()) - goto notsamealready; - return; -notsamealready: - getroomspaths(); - checkdest(); - push(bx); - al = data.byte(kManspath); - ah = 0; - _add(ax, ax); - _add(ax, ax); - _add(ax, ax); - _add(bx, ax); - al = es.byte(bx); - ah = 0; - _sub(ax, 12); - data.word(kLinestartx) = ax; - al = es.byte(bx+1); - ah = 0; - _sub(ax, 12); - data.word(kLinestarty) = ax; - bx = pop(); - al = data.byte(kDestination); - ah = 0; - _add(ax, ax); - _add(ax, ax); - _add(ax, ax); - _add(bx, ax); - al = es.byte(bx); - ah = 0; - _sub(ax, 12); - data.word(kLineendx) = ax; - al = es.byte(bx+1); - ah = 0; - _sub(ax, 12); - data.word(kLineendy) = ax; - bresenhams(); - _cmp(data.byte(kLinedirection), 0); - if (flags.z()) - goto normalline; - al = data.byte(kLinelength); - _dec(al); - data.byte(kLinepointer) = al; - data.byte(kLinedirection) = 1; - return; -normalline: - data.byte(kLinepointer) = 0; -} - void DreamGenContext::checkdest() { STACK_CHECK; push(bx); @@ -20190,7 +20137,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_walktotext: walktotext(); break; case addr_getflagunderp: getflagunderp(); break; case addr_setwalk: setwalk(); break; - case addr_autosetwalk: autosetwalk(); break; case addr_checkdest: checkdest(); break; case addr_bresenhams: bresenhams(); break; case addr_workoutframes: workoutframes(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 9c89fead42..18be264a9e 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -120,7 +120,6 @@ public: static const uint16 addr_workoutframes = 0xca54; static const uint16 addr_bresenhams = 0xca50; static const uint16 addr_checkdest = 0xca4c; - static const uint16 addr_autosetwalk = 0xca48; static const uint16 addr_setwalk = 0xca44; static const uint16 addr_getflagunderp = 0xca40; static const uint16 addr_walktotext = 0xca3c; @@ -1360,6 +1359,7 @@ public: void fadedos(); //void fillspace(); //void multiget(); + //void autosetwalk(); void fadeupmonfirst(); void drawfloor(); void loadkeypad(); @@ -1385,7 +1385,7 @@ public: void additionaltext(); //void kernchars(); void othersmoker(); - void autosetwalk(); + void dofade(); void setuptimedtemp(); void blocknametext(); void useelevator5(); @@ -1431,7 +1431,6 @@ public: void addtopeoplelist(); void hangoncurs(); void sparkydrip(); - //void modifychar(); void compare(); void printcurs(); //void convertkey(); @@ -1759,7 +1758,7 @@ public: void readfromfile(); void initialinv(); void showslots(); - void dofade(); + //void modifychar(); void hangon(); void settopright(); void findsetobject(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index c95091a464..6d2fee1ecd 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -882,5 +882,25 @@ void DreamGenContext::deltextline() { multiput(ds.ptr(si, 0), x, y, kUndertextsizex, kUndertextsizey); } +void DreamGenContext::autosetwalk() { + al = data.byte(kManspath); + if (data.byte(kFinaldest) == al) + return; + getroomspaths(); + uint8 *roomsPaths = getroomspathsCPP(); + checkdest(); + data.word(kLinestartx) = roomsPaths[data.byte(kManspath) * 8 + 0] - 12; + data.word(kLinestarty) = roomsPaths[data.byte(kManspath) * 8 + 1] - 12; + data.word(kLineendx) = roomsPaths[data.byte(kDestination) * 8 + 0] - 12; + data.word(kLineendy) = roomsPaths[data.byte(kDestination) * 8 + 1] - 12; + bresenhams(); + if (data.byte(kLinedirection) != 0) { + data.byte(kLinepointer) = data.byte(kLinelength) - 1; + data.byte(kLinedirection) = 1; + return; + } + data.byte(kLinepointer) = 0; +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 7e92ed847e..809e5f45f7 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -82,6 +82,7 @@ void facerightway(); void walking(); void walking(Sprite *sprite); + void autosetwalk(); void aboutturn(Sprite *sprite); void backobject(Sprite *sprite); void constant(Sprite *sprite, ObjData *objData); -- cgit v1.2.3 From 4ad8b54241fb04aca95618637b50e4220e461034 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Tue, 9 Aug 2011 22:04:06 +0200 Subject: DREAMWEB: 'checkdest' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 51 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.cpp | 27 ++++++++++++++++++--- engines/dreamweb/stubs.h | 1 + 5 files changed, 27 insertions(+), 56 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index ed4c9f1352..d4f4af715a 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -75,6 +75,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'findsource', 'walking', 'autosetwalk', + 'checkdest', 'spriteupdate', 'dodoor', 'lockeddoorway', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 291078169f..2a7c67e889 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -17359,56 +17359,6 @@ holdingreel: data.byte(kWatchmode) = 2; } -void DreamGenContext::checkdest() { - STACK_CHECK; - push(bx); - _add(bx, 12*8); - ah = data.byte(kManspath); - cl = 4; - _shl(ah, cl); - al = data.byte(kDestination); - cl = 24; - ch = data.byte(kDestination); -checkdestloop: - dh = es.byte(bx); - _and(dh, 0xf0); - dl = es.byte(bx); - _and(dl, 0xf); - _cmp(ax, dx); - if (!flags.z()) - goto nextcheck; - al = es.byte(bx+1); - _and(al, 15); - data.byte(kDestination) = al; - bx = pop(); - return; -nextcheck: - dl = es.byte(bx); - _and(dl, 0xf0); - _shr(dl, 1); - _shr(dl, 1); - _shr(dl, 1); - _shr(dl, 1); - dh = es.byte(bx); - _and(dh, 0xf); - _shl(dh, 1); - _shl(dh, 1); - _shl(dh, 1); - _shl(dh, 1); - _cmp(ax, dx); - if (!flags.z()) - goto nextcheck2; - ch = es.byte(bx+1); - _and(ch, 15); -nextcheck2: - _add(bx, 2); - _dec(cl); - if (!flags.z()) - goto checkdestloop; - data.byte(kDestination) = ch; - bx = pop(); -} - void DreamGenContext::bresenhams() { STACK_CHECK; workoutframes(); @@ -20137,7 +20087,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_walktotext: walktotext(); break; case addr_getflagunderp: getflagunderp(); break; case addr_setwalk: setwalk(); break; - case addr_checkdest: checkdest(); break; case addr_bresenhams: bresenhams(); break; case addr_workoutframes: workoutframes(); break; case addr_copyname: copyname(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 18be264a9e..60abf44c01 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -119,7 +119,6 @@ public: static const uint16 addr_copyname = 0xca5c; static const uint16 addr_workoutframes = 0xca54; static const uint16 addr_bresenhams = 0xca50; - static const uint16 addr_checkdest = 0xca4c; static const uint16 addr_setwalk = 0xca44; static const uint16 addr_getflagunderp = 0xca40; static const uint16 addr_walktotext = 0xca3c; @@ -1875,7 +1874,7 @@ public: void makecaps(); void read(); void fadescreenups(); - void checkdest(); + //void checkdest(); //void initman(); void loadpalfromiff(); //void facerightway(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 6d2fee1ecd..cd6a9d6b4f 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -886,9 +886,8 @@ void DreamGenContext::autosetwalk() { al = data.byte(kManspath); if (data.byte(kFinaldest) == al) return; - getroomspaths(); - uint8 *roomsPaths = getroomspathsCPP(); - checkdest(); + const uint8 *roomsPaths = getroomspathsCPP(); + checkdest(roomsPaths); data.word(kLinestartx) = roomsPaths[data.byte(kManspath) * 8 + 0] - 12; data.word(kLinestarty) = roomsPaths[data.byte(kManspath) * 8 + 1] - 12; data.word(kLineendx) = roomsPaths[data.byte(kDestination) * 8 + 0] - 12; @@ -902,5 +901,27 @@ void DreamGenContext::autosetwalk() { data.byte(kLinepointer) = 0; } +void DreamGenContext::checkdest(const uint8 *roomsPaths) { + const uint8 *p = roomsPaths + 12 * 8; + ah = data.byte(kManspath) << 4; + al = data.byte(kDestination); + uint8 destination = data.byte(kDestination); + for (size_t i = 0; i < 24; ++i) { + dh = p[0] & 0xf0; + dl = p[0] & 0x0f; + if (ax == dx) { + data.byte(kDestination) = p[1] & 0x0f; + return; + } + dl = (p[0] & 0xf0) >> 4; + dh = (p[0] & 0x0f) << 4; + if (ax == dx) { + destination = p[1] & 0x0f; + } + p += 2; + } + data.byte(kDestination) = destination; +} + } /*namespace dreamgen */ diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 809e5f45f7..746a75b97b 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -83,6 +83,7 @@ void walking(); void walking(Sprite *sprite); void autosetwalk(); + void checkdest(const uint8 *roomsPaths); void aboutturn(Sprite *sprite); void backobject(Sprite *sprite); void constant(Sprite *sprite, ObjData *objData); -- cgit v1.2.3 From 37a34e6da26fff8c5b0298874b9e3e26dcb34b29 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 9 Aug 2011 19:16:24 +0200 Subject: SCUMM: Do not pack structs in CMS code. --- engines/scumm/player_v2cms.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/engines/scumm/player_v2cms.h b/engines/scumm/player_v2cms.h index cbad46fe5d..29444b18bc 100644 --- a/engines/scumm/player_v2cms.h +++ b/engines/scumm/player_v2cms.h @@ -50,7 +50,6 @@ public: virtual bool isStereo() const { return true; } private: -#include "common/pack-start.h" // START STRUCT PACKING struct Voice { byte attack; byte decay; @@ -60,7 +59,7 @@ private: int16 vibrato; int16 vibrato2; int16 noise; - } PACKED_STRUCT; + }; struct Voice2 { byte *amplitudeOutput; @@ -105,14 +104,13 @@ private: Voice2 *nextVoice; byte chanNumber; - } PACKED_STRUCT; + }; struct MusicChip { byte ampl[4]; byte freq[4]; byte octave[2]; - } PACKED_STRUCT; -#include "common/pack-end.h" // END STRUCT PACKING + }; Voice _cmsVoicesBase[16]; Voice2 _cmsVoices[8]; -- cgit v1.2.3 From 74560278b2d7d14f459bafc7d5eed63bc6a363b0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 9 Aug 2011 23:47:41 +0200 Subject: SCUMM: Change CMS sfx methods to use its own register set. This is now like in the original and helps comparing register writes against DOSBox's behavior. --- engines/scumm/player_v2cms.cpp | 39 +++++++++++++++++++++------------------ engines/scumm/player_v2cms.h | 2 ++ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/engines/scumm/player_v2cms.cpp b/engines/scumm/player_v2cms.cpp index d16f9d2be7..d4b21774ed 100644 --- a/engines/scumm/player_v2cms.cpp +++ b/engines/scumm/player_v2cms.cpp @@ -36,6 +36,10 @@ Player_V2CMS::Player_V2CMS(ScummEngine *scumm, Audio::Mixer *mixer) _outputTableReady(0), _midiChannel(), _midiChannelUse() { setMusicVolume(255); + memset(_sfxFreq, 0xFF, sizeof(_sfxFreq)); + memset(_sfxAmpl, 0x00, sizeof(_sfxAmpl)); + memset(_sfxOctave, 0x66, sizeof(_sfxOctave)); + _cmsVoices[0].amplitudeOutput = &_cmsChips[0].ampl[0]; _cmsVoices[0].freqOutput = &_cmsChips[0].freq[0]; _cmsVoices[0].octaveOutput = &_cmsChips[0].octave[0]; @@ -596,7 +600,6 @@ void Player_V2CMS::play() { _octaveMask = 0xF0; channel_data *chan = &_channels[0].d; - MusicChip &cms = _cmsChips[0]; byte noiseGen = 3; for (int i = 1; i <= 4; ++i) { @@ -608,8 +611,8 @@ void Player_V2CMS::play() { noiseGen = freq & 0xFF; } else { noiseGen = 3; - cms.freq[0] = cms.freq[3]; - cms.octave[0] = (cms.octave[0] & 0xF0) | ((cms.octave[1] & 0xF0) >> 4); + _sfxFreq[0] = _sfxFreq[3]; + _sfxOctave[0] = (_sfxOctave[0] & 0xF0) | ((_sfxOctave[1] & 0xF0) >> 4); } } else { if (freq == 0) { @@ -635,15 +638,15 @@ void Player_V2CMS::play() { oct |= cmsOct; oct &= _octaveMask; - oct |= (~_octaveMask) & cms.octave[(i & 3) >> 1]; - cms.octave[(i & 3) >> 1] = oct; + oct |= (~_octaveMask) & _sfxOctave[(i & 3) >> 1]; + _sfxOctave[(i & 3) >> 1] = oct; freq >>= -(cmsOct - 9); - cms.freq[i & 3] = (-(freq - 511)) & 0xFF; + _sfxFreq[i & 3] = (-(freq - 511)) & 0xFF; } - cms.ampl[i & 3] = _volumeTable[chan->volume >> 12]; + _sfxAmpl[i & 3] = _volumeTable[chan->volume >> 12]; } else { - cms.ampl[i & 3] = 0; + _sfxAmpl[i & 3] = 0; } chan = &_channels[i].d; @@ -654,25 +657,25 @@ void Player_V2CMS::play() { // the right channels amplitude is set // with the low value the left channels amplitude _cmsEmu->portWrite(0x221, 0); - _cmsEmu->portWrite(0x220, cms.ampl[0]); + _cmsEmu->portWrite(0x220, _sfxAmpl[0]); _cmsEmu->portWrite(0x221, 1); - _cmsEmu->portWrite(0x220, cms.ampl[1]); + _cmsEmu->portWrite(0x220, _sfxAmpl[1]); _cmsEmu->portWrite(0x221, 2); - _cmsEmu->portWrite(0x220, cms.ampl[2]); + _cmsEmu->portWrite(0x220, _sfxAmpl[2]); _cmsEmu->portWrite(0x221, 3); - _cmsEmu->portWrite(0x220, cms.ampl[3]); + _cmsEmu->portWrite(0x220, _sfxAmpl[3]); _cmsEmu->portWrite(0x221, 8); - _cmsEmu->portWrite(0x220, cms.freq[0]); + _cmsEmu->portWrite(0x220, _sfxFreq[0]); _cmsEmu->portWrite(0x221, 9); - _cmsEmu->portWrite(0x220, cms.freq[1]); + _cmsEmu->portWrite(0x220, _sfxFreq[1]); _cmsEmu->portWrite(0x221, 10); - _cmsEmu->portWrite(0x220, cms.freq[2]); + _cmsEmu->portWrite(0x220, _sfxFreq[2]); _cmsEmu->portWrite(0x221, 11); - _cmsEmu->portWrite(0x220, cms.freq[3]); + _cmsEmu->portWrite(0x220, _sfxFreq[3]); _cmsEmu->portWrite(0x221, 0x10); - _cmsEmu->portWrite(0x220, cms.octave[0]); + _cmsEmu->portWrite(0x220, _sfxOctave[0]); _cmsEmu->portWrite(0x221, 0x11); - _cmsEmu->portWrite(0x220, cms.octave[1]); + _cmsEmu->portWrite(0x220, _sfxOctave[1]); _cmsEmu->portWrite(0x221, 0x14); _cmsEmu->portWrite(0x220, 0x3E); _cmsEmu->portWrite(0x221, 0x15); diff --git a/engines/scumm/player_v2cms.h b/engines/scumm/player_v2cms.h index 29444b18bc..905c7c141e 100644 --- a/engines/scumm/player_v2cms.h +++ b/engines/scumm/player_v2cms.h @@ -128,6 +128,8 @@ private: int _loadedMidiSong; + byte _sfxFreq[4], _sfxAmpl[4], _sfxOctave[2]; + byte _lastMidiCommand; uint _outputTableReady; byte _voiceTimer; -- cgit v1.2.3 From b95bbb2ace6a240da8b6ee54ceb66c6ab2484ab7 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 9 Aug 2011 23:57:22 +0200 Subject: CMS: Do proper clipping of the sound data on generation. This fixes some overflows/underflows which resulted in crackling. --- audio/softsynth/cms.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp index 67eacd1a41..889f19a6f9 100644 --- a/audio/softsynth/cms.cpp +++ b/audio/softsynth/cms.cpp @@ -244,8 +244,8 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) { } } /* write sound data to the buffer */ - buffer[j*2] += output_l / 6; - buffer[j*2+1] += output_r / 6; + buffer[j*2+0] = CLIP(buffer[j*2+0] + output_l / 6, -32768, 32767); + buffer[j*2+1] = CLIP(buffer[j*2+1] + output_r / 6, -32768, 32767); } } -- cgit v1.2.3 From 3635efd92cdc48661abd23780520626a12be09d4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 9 Aug 2011 23:59:31 +0200 Subject: CMS: Simplify code a tiny bit. --- audio/softsynth/cms.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp index 889f19a6f9..a675da3f03 100644 --- a/audio/softsynth/cms.cpp +++ b/audio/softsynth/cms.cpp @@ -163,19 +163,15 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) { struct SAA1099 *saa = &_saa1099[chip]; int j, ch; + if (chip == 0) { + memset(buffer, 0, sizeof(int16)*length*2); + } + /* if the channels are disabled we're done */ if (!saa->all_ch_enable) { - /* init output data */ - if (chip == 0) { - memset(buffer, 0, sizeof(int16)*length*2); - } return; } - if (chip == 0) { - memset(buffer, 0, sizeof(int16)*length*2); - } - for (ch = 0; ch < 2; ch++) { switch (saa->noise_params[ch]) { case 0: saa->noise[ch].freq = 31250.0 * 2; break; -- cgit v1.2.3 From 35c53f6b3bae25af9287067003aef4ec34eb5b73 Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Wed, 10 Aug 2011 00:17:08 +0200 Subject: README: Cleanup & little corrections Fixed some little typos, corrected some layout mistakes and similiar. Also, changed that MT-32 is also now the default music driver for most games. --- README | 64 ++++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/README b/README index f0544d08ca..e470cbf714 100644 --- a/README +++ b/README @@ -56,7 +56,7 @@ Table of Contents: * 7.7 TiMidity++ MIDI server support * 7.8 Using compressed audio files (MP3, Ogg Vorbis, Flac) * 7.9 Output sample rate -8.0) Configuration Files +8.0) Configuration file 9.0) Compiling @@ -533,8 +533,8 @@ and follow the instructions in its readme.txt file. (Broken Sword II already has subtitles; no extra work is needed for them.) -3.7.2) Broken Sword games cutscenes, in retrospect ------- ------------------------------------------- +3.7.2) Broken Sword games cutscenes, in retrospect: +------ -------------------------------------------- The original releases of the Broken Sword games used RAD Game Tools's Smacker(tm) format. As RAD was unwilling to open the older legacy versions of this format to us, and had requested we not reverse engineer @@ -1108,8 +1108,8 @@ They are: tv2x - Interlace filter, tries to emulate a TV. Factor 2x. dotmatrix - Dot matrix effect. Factor 2x. -To select a graphics filter, pass its name via the '-g' option to -scummvm, for example: +To select a graphics filter, select it in the Launcher, or pass its name +via the '-g' option to scummvm, for example: scummvm -gadvmame2x monkey2 @@ -1443,14 +1443,14 @@ Where 'xxx' is exact the saved game slot (ie 001) under ScummVM 7.0) Music and Sound: ---- ---------------- On most operating systems and for most games, ScummVM will by default -use AdLib emulation for music playback. MIDI may not be available on all -operating systems or may need manual configuration. If you want to use -MIDI, you have several different choices of output, depending on your -operating system and configuration. +use MT-32 or AdLib emulation for music playback. MIDI may not be +available on all operating systems or may need manual configuration. If +you want to use MIDI, you have several different choices of output, +depending on your operating system and configuration. null - Null output. Don't play any music. - adlib - Internal AdLib emulation (default) + adlib - Internal AdLib emulation fluidsynth - FluidSynth MIDI emulation mt32 - Internal MT-32 emulation pcjr - Internal PCjr emulation (only usable in SCUMM games) @@ -1475,7 +1475,7 @@ via the '-e' option to scummvm, for example: 7.1) Playing sound with AdLib emulation: ---- ----------------------------------- By default an AdLib card will be emulated and ScummVM will output the -music as sampled waves. This is the default mode for most games, and +music as sampled waves. This is the default mode for several games, and offers the best compatibility between machines and games. @@ -1646,7 +1646,7 @@ command as described earlier in this section. 7.6.2) Playing sound with IRIX dmedia sequencer: [UNIX ONLY] ----- ------------------------------------------ +---- ------------------------------------------- If you are using IRIX and the dmedia driver with sequencer support, you can set the environment variable "SCUMMVM_MIDIPORT" or the config file variable "dmedia_port" to specify your sequencer port. The default is to @@ -1670,7 +1670,7 @@ SCUMMVM_PORT=Software Synth in your environment. 7.7) Using TiMidity++ MIDI server: ---- ----------------------------- -If you system lacks any MIDI sequencer, but you still want better MIDI +If your system lacks any MIDI sequencer, but you still want better MIDI quality than default AdLib emulation can offer, you can try the TiMidity++ MIDI server. See http://timidity.sourceforge.net/ for download and install instructions. @@ -1712,9 +1712,9 @@ q specifying the desired quality from 0 to 10: 7.8.2) Using Flac files for CD audio: ------- ------------------------------------ +------ ------------------------------ Use flac or some other flac encoder to encode the audio tracks to files. -Name the files track1.flac track2.flac etc. In your filesystem only +Name the files track1.flac track2.flac etc. If your filesystem only allows three letter extensions, name the files track1.fla track2.fla etc. ScummVM must be compiled with flac support to use this option. You will need to rip the files from the CD as a WAV file, then encode the @@ -1750,7 +1750,7 @@ of time than MP3, so have a good book handy. 7.8.5) Compressing MONSTER.SOU with Flac: ------- ---------------------------------------- +------ ---------------------------------- As above, but ScummVM must be compiled with Flac support. Run: compress_scumm_sou --flac monster.sou @@ -1764,8 +1764,8 @@ those kind of soundfiles. Be sure to read the encoder documentation before you use other values. -7.8.6) Compressing music/sfx/speech in AGOS games ------- ----------------------------------------------------------------- +7.8.6) Compressing music/sfx/speech in AGOS games: +------ ------------------------------------------- Use our 'compress_agos' utility from the scummvm-tools package to perform this task. You can choose between multiple target formats, but note that you can only use each if ScummVM was compiled with the @@ -1799,14 +1799,14 @@ Eventually you will have a much smaller *.mp3, *.ogg or *.fla file, copy this file to your game directory. You can safely remove the old file. -7.8.7) Compressing speech/music in Broken Sword ------- ---------------------------------------- +7.8.7) Compressing speech/music in Broken Sword: +------ ----------------------------------------- The 'compress_sword1' tool from the scummvm-tools package can encode -music and speech to MP3 as well as Ogg Vorbis. The easiest way to encode -the files is simply copying the executable into your BS1 directory -(together with the lame encoder) and run it from there. This way, it -will automatically encode everything to MP3. Afterwards, you can -manually remove the SPEECH?.CLU files and the wave music files. +music and speech to MP3, Ogg Vorbis as well as Flac. The easiest way +to encode the files is simply copying the executable into your +BS1 directory (together with the lame encoder) and run it from there. +This way, it will automatically encode everything to MP3. Afterwards, +you can manually remove the SPEECH?.CLU files and the wave music files. Running "compress_sword1 --vorbis" will compress the files using Ogg Vorbis instead of MP3. @@ -1817,8 +1817,8 @@ instead of MP3. Use "compress_sword1 --help" to get a full list of the options. -7.8.8) Compressing speech/music in Broken Sword II ------- ------------------------------------------- +7.8.8) Compressing speech/music in Broken Sword II: +------ -------------------------------------------- Use our 'compress_sword2' utility from the scummvm-tools package to perform this task. You can choose between multiple target formats, but note that you can only use each if ScummVM was compiled with the @@ -2021,7 +2021,7 @@ Flight of the Amazon Queen adds the following non-standard keywords: music_mute bool If true, music is muted sfx_mute bool If true, sound effects are muted -King's Quest VI Windows adds the following non-standard keywords: +King's Quest VI Windows adds the following non-standard keyword: windows_cursors bool If true, the original unscaled black and white Windows cursors are used instead of the DOS @@ -2055,7 +2055,7 @@ compressed sound. For compressed save states, zlib is required. Some parts of ScummVM, particularly scalers, have highly optimized versions written in assembler. If you wish to use this option, you will -need to install nasm assembler (see http://nasm.sf.net). Note, that +need to install nasm assembler (see http://nasm.sf.net). Note that currently we have only x86 MMX optimized versions, and they will not compile on other processors. @@ -2073,7 +2073,7 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW Microsoft Visual C++ 6.0: - * Open the workspace file "scummwm.dsw" in the "dists\msvc6" directory. + * Open the workspace file "scummvm.dsw" in the "dists\msvc6" directory. * Enter the path to the needed libraries and includes in "Tools|Options|Directories". * Now it should compile successfully. @@ -2084,7 +2084,7 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). * Open the solution file "scummwm.sln" in the "dists\msvc7" respectively "dists\msvc8" directory. * Enter the path to the needed libraries and includes in - Tools|Options|Projects|VC++ Directories". + Tools|Options|Projects and Solutions|VC++ Directories". * Now it should compile successfully. * For more information refer to: http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005 @@ -2136,7 +2136,7 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). Maemo: * Get Scratchbox environment with Maemo 2.2 rootstrap (2.2 is for 770 and up) * Install libmad, Tremor, FLAC from source - * patch scummvm source (some stuff is currently too dirty to be in git directly) + * patch scummvm source (some stuff is currently too dirty to be in git directly): patch -p1 < backends/platform/maemo/scummvm-[currentversion]-maemo.patch * update debian/changelog * run 'fakeroot dpkg-buildpackage -b -d' -- cgit v1.2.3 From d31bf017a9e717759f2410a8d355cf43b3418c4c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 10 Aug 2011 01:04:59 +0200 Subject: README: Update MSVC building instructions a bit. This includes removing horribly outdated information about MSVC6 support. Since the wiki is down right now, I can not update the link. I suspect we should update this building section a bit more anyway. --- README | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/README b/README index e470cbf714..f2c9de5fc2 100644 --- a/README +++ b/README @@ -2072,17 +2072,10 @@ debug messages (see http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). respectively http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW - Microsoft Visual C++ 6.0: - * Open the workspace file "scummvm.dsw" in the "dists\msvc6" directory. - * Enter the path to the needed libraries and includes in - "Tools|Options|Directories". - * Now it should compile successfully. - * For more information refer to: - http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005 - - Microsoft Visual C++ 7.0/8.0: - * Open the solution file "scummwm.sln" in the "dists\msvc7" - respectively "dists\msvc8" directory. + Microsoft Visual C++ 8/9/10: + * Read up on how to create the project files in "dists\msvc8", + "dists\msvc9" respectively "dists\msvc10". + * Open the resulting solution file. * Enter the path to the needed libraries and includes in Tools|Options|Projects and Solutions|VC++ Directories". * Now it should compile successfully. -- cgit v1.2.3 From 5a061dc6edc3c9b8a8dcfc59c59f5c0c2e69db6b Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Wed, 10 Aug 2011 02:25:08 +0200 Subject: DOCS: Finished German README (Liesmich) Completed the last third of the file and also corrected mistakes, typos and other things I didn't like during the final proofreading process. --- doc/de/Liesmich | 1003 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 922 insertions(+), 81 deletions(-) diff --git a/doc/de/Liesmich b/doc/de/Liesmich index 48a0e4dae4..88e10b51bc 100644 --- a/doc/de/Liesmich +++ b/doc/de/Liesmich @@ -1,10 +1,10 @@ ScummVM - Liesmich-Datei ------------------------------------------------------------------------ -Dieses Dokument ist eine teilweise Übersetzung der englischen README-Datei. Das -Original-Dokument enthält viel mehr Informationen. Sollten Sie hier also nicht -das finden, was Sie benötigen und ein wenig Englisch können, sollten Sie sich -die englische README-Datei ansehen. +Dieses Dokument ist größtenteils eine Übersetzung der englischen README-Datei. +Das Original-Dokument ist womöglich aktueller. Sollten Sie hier also nicht das +finden, was Sie benötigen und ein wenig Englisch können, sollten Sie sich die +englische README-Datei ansehen. Für weitere Informationen, Kompatibilitätslisten, Einzelheiten zu Spenden, die neusten veröffentlichten Versionen, Fortschrittsberichte und mehr besuchen Sie @@ -25,7 +25,7 @@ Inhaltsverzeichnis: * 3.4 Hinweise zu Macintosh-Spielen * 3.5 Hinweise zu Spielen auf mehren CDs * 3.6 Hinweise zu The Curse of Monkey Island - * 3.7 Hinweise zu den Baphomets-Fluch-Spielen + * 3.7 Hinweise zu Baphomets Fluch I und II * 3.8 Hinweise zu Beneath a Steel Sky * 3.9 Hinweise zu Flight of the Amazon Queen * 3.10 Hinweise zu Gobliiins @@ -49,6 +49,19 @@ Inhaltsverzeichnis: 6.0) Spielstände * 6.1 Automatische Spielstände * 6.2 Spielstände umwandeln + * 6.3 Spielstände von Kommandozeile aus anzeigen/laden +7.0) Musik und Sound + * 7.1 AdLib-Emulation + * 7.2 FluidSynth-MIDI-Emulation + * 7.3 MT-32-Emulation + * 7.4 MIDI-Emulation + * 7.5 Native MIDI-Unterstützung + * 7.6 UNIX-eigene, ALSA- und IRIX' Sequenzer-Unterstützung + * 7.7 TiMidity++-MIDI-Server-Unterstützung + * 7.8 Komprimierte Audio-Dateien verwenden (MP3, Ogg Vorbis, FLAC) + * 7.9 Ausgabefrequenzen +8.0) Konfigurationsdatei +9.0) Kompilierung 1.0) Einführung: @@ -342,7 +355,7 @@ SCUMM-Spiele von Humongous Entertainment: Putt-Putt & Fatty Bear's Activity Pack [activity] Putt-Putt's Fun Pack [funpack] SPY Fox: Das Milchkartell [spyfox] - SPY Fox: Operation Robobund [spyfox2] + SPY Fox: Operation Robohund [spyfox2] SPY Fox: Alarm im Weltall [spyozon] SPY Fox in Cheese Chase [chase] SPY Fox in Hold the Mustard [mustard] @@ -480,9 +493,9 @@ erforderlich. Zuallererst: Wenn Sie keinen Macintosh dafür verwenden, könnte e kompliziert werden, auf die CD- oder Diskettendaten zuzugreifen. Der Grund hierfür ist, dass der Mac ein spezielles Datenträgerformat nutzt, welches sich HFS nennt, und das andere Systeme normalerweise nicht unterstützen. Es gibt -jedoch zahlreiche kostenlose Tools, die es ermöglichen, einen solchen HFS- -Datenträger zu lesen. Z. B. „HFVExplorer“ für Windows und „hfsutils“ für Linux -und andere Betriebssysteme, die Unix ähnlich sind. +jedoch zahlreiche kostenlose Tools, die es ermöglichen, einen solchen +HFS-Datenträger zu lesen. Z. B. „HFVExplorer“ für Windows und „hfsutils“ für +Linux und andere Betriebssysteme, die Unix ähnlich sind. Die meisten neueren Spiele für den Macintosh wurden nur mit einer einzigen Spieldatei ausgeliefert (beachten Sie, dass in manchen Fällen diese Spieldatei @@ -493,7 +506,7 @@ sollte klappen (so wie mit jedem anderen unterstützten Spiel). Wir stellen außerdem ein Tool mit dem Namen „extract_scumm_mac“ im Tools-Paket zur Verfügung, um die Daten aus diesen Spieldateien zu extrahieren, aber dies -ist weder erforderlich noch wird es empfohlen. +ist weder erforderlich, noch wird es empfohlen. Für weitere Informationen dazu, wie Sie Macintosh-Spieldateien auf Ihre Festplatte kopieren können, lesen Sie: @@ -530,25 +543,25 @@ dieser Dateien lassen sich auf beiden CDs vorfinden, jedoch sind sie auch in diesem Fall identisch. -3.7) Hinweise zu den Baphomets-Fluch-Spielen: ----- ---------------------------------------- -Die Anweisungen für die Baphomets-Fluch-Spiele sind für die ausverkauften -Software-Versionen, bei welchen sich jedes Spiel auf je zwei CDs befindet, da -diese am leichtesten erhältlich waren, als ScummVM Unterstützung für diese -Spiele erlangte. Wir hoffen, dass sie allgemein ausreichend ausführlich sind, um -für andere Ausgaben genauso hilfreich zu sein. - - -3.7.1) Zwischensequenzen der Baphomets-Fluch-Spiele: ------- --------------------------------------------- -Die Zwischensequenzen für die Baphomets-Fluch-Spiele haben eine kleine -Geschichte (schauen Sie im nächsten Abschnitt, wenn Sie interessiert sind), aber -im Großen und Ganzen müssen Sie nur die .SMK-Dateien aus den „SMACKS“- oder -„SMACKSHI“-Verzeichnissen auf den CDs in dasselbe Verzeichnis wie die anderen -Spieldateien kopieren. (Baphomets Fluch hat ein „SMACKSLO“-Verzeichnis mit -denselben Zwischensequenzen, aber diese sind von niedrigerer Qualität.) Sie -können sie auch in einem Unterverzeichnis namens „video“ ablegen, wenn Ihnen das -lieber ist. +3.7) Hinweise zu Baphomets Fluch I und II: +---- ------------------------------------- +Die Anweisungen für die Spiele Baphomets Fluch I und II sind für die +ausverkauften Software-Versionen, bei welchen sich jedes Spiel auf je zwei CDs +befindet, da diese am leichtesten erhältlich waren, als ScummVM Unterstützung +für diese Spiele erlangte. Wir hoffen, dass sie allgemein ausreichend +ausführlich sind, um für andere Ausgaben genauso hilfreich zu sein. + + +3.7.1) Zwischensequenzen von Baphomets Fluch I und II: +------ ----------------------------------------------- +Die Zwischensequenzen für Baphomets Fluch I und II haben eine kleine Geschichte +(schauen Sie im nächsten Abschnitt, wenn Sie interessiert sind), aber im Großen +und Ganzen müssen Sie nur die .SMK-Dateien aus den „SMACKS“- oder „SMACKSHI“- +Verzeichnissen auf den CDs in dasselbe Verzeichnis wie die anderen Spieldateien +kopieren. (Baphomets Fluch hat ein „SMACKSLO“-Verzeichnis mit denselben +Zwischensequenzen, aber diese sind von niedrigerer Qualität.) Sie können sie +auch in einem Unterverzeichnis namens „video“ ablegen, wenn Ihnen das lieber +ist. Einige Neuausgaben der Spiele, wie beispielsweise die PlayStation-Version, haben keine Smacker-Videos. Revolution Software hat uns freundlicherweise erlaubt, die @@ -564,8 +577,8 @@ eine Version von ScummVM erforderlich, die sowohl mit Unterstützung von FLAC al auch zlib kompiliert wurde. Für Systeme, die zu langsam sind, um die Entschlüsselung von FLAC-Audio zu -handhaben, wird die Tonspur für diese Zwischensequenzen gesondert auch mit Ogg- -Vorbis-Audio angeboten. Um diese Zwischensequenzen mit Ogg-Vorbis-Audio +handhaben, wird die Tonspur für diese Zwischensequenzen gesondert auch mit +Ogg-Vorbis-Audio angeboten. Um diese Zwischensequenzen mit Ogg-Vorbis-Audio abspielen zu können, ist eine Version von ScummVM erforderlich, die sowohl mit Unterstützung von libVorbis als auch zlib kompiliert wurde. @@ -574,12 +587,12 @@ einfach und folgen Sie den Anweisungen in der liesmich.txt. (Baphomets Fluch II hat bereits Untertitel; für diese ist keine zusätzliche Arbeit notwendig.) -3.7.2) Zwischensequenzen der Baphomets-Fluch-Spiele im Rückblick ------- --------------------------------------------------------- -Die Originalausgaben der Baphomets-Fluch-Spiele verwendeten das Smacker™-Format -der RAD Game Tools. Da RAD uns nicht die ältere Ur-Version dieses Formats -offenlegen wollte und uns aufforderte, es nicht mittels Reverse Engineering zu -rekonstruieren, musste eine alternative Lösung gefunden werden. +3.7.2) Zwischensequenzen von Baphomets Fluch I und II im Rückblick: +------ ------------------------------------------------------------ +Die Originalausgaben von Baphomets Fluch I und II verwendeten das +Smacker™-Format der RAD Game Tools. Da RAD uns nicht die ältere Ur-Version +dieses Formats offenlegen wollte und uns aufforderte, es nicht mittels Reverse +Engineering zu rekonstruieren, musste eine alternative Lösung gefunden werden. In Baphomets Fluch II war es möglich, die Sprachausgabe ohne das Video wiederzugeben. Dies blieb bis ScummVM 1.0.0 eine Ausweichmöglichkeit, war aber @@ -624,7 +637,7 @@ beiden CDs. (Ein paar von ihnen sind streng genommen eigentlich nicht notwendig, aber diejenigen, über die Unsicherheit besteht, sind alle ziemlich klein.) Sie müssen die Dateien speech.clu und music.clu umbenennen, und zwar in speech1.clu, speech2.clu, music1.clu und music2.clu, sodass ScummVM weiß, welche -der Dateien von CD 1 und welche von CD 2 sind. Alle anderen Dateien, die in +dieser Dateien von CD 1 und welche von CD 2 sind. Alle anderen Dateien, die in beiden „clusters“-Verzeichnissen auftauchen, sind identisch. Verwenden Sie in diesen Fällen die Datei, die Sie möchten. @@ -655,15 +668,15 @@ Alternativ können Sie das Tool „compress_queen“ aus dem Tools-Paket verwend um Ihre FOTAQ-Spieldatei neu „zusammenzubauen“, um die Tabellendatei für diese spezielle Version miteinzubeziehen und somit die Laufzeit-Abhängigkeit von der Datei „queen.tbl“ zu lösen. Dieses Tool kann auch die Sprachausgabe und -Sound-Effekte mittels MP3, OGG oder FLAC komprimieren. +Sound-Effekte mittels MP3, Ogg Vorbis oder FLAC komprimieren. 3.10) Hinweise zu Gobliiins: ----- ---------------------- Die CD-Versionen der Gobliiins-Serie enthalten einen großen Audio-Titel, den Sie -extrahieren müssen (siehe Abschnitt über die Verwendung komprimierter Audio- -Dateien) sowie ins Spielverzeichnis kopieren, wenn Sie Musik im Spiel hören -möchten, ohne die CD die ganze Zeit im Laufwerk haben zu müssen. Die +extrahieren müssen (siehe Abschnitt über die Verwendung komprimierter +Audio-Dateien) sowie ins Spielverzeichnis kopieren, wenn Sie Musik im Spiel +hören möchten, ohne die CD die ganze Zeit im Laufwerk haben zu müssen. Die Sprachausgabe ist auch in diesem Titel und ihre Lautstärke wird deshalb ebenso über die Musiklautstärke-Regelung geändert. @@ -685,8 +698,8 @@ an folgendem Ort befinden: Inherit the Earth.app/Contents/Resources Bei der alten Ausgabe für Mac OS 9 müssen Sie die Dateien im MacBinary-Format -kopieren, da sie sowohl Ressourcen- und Datenverzweigungen beinhalten sollten. -Kopieren Sie alle „ITE *“-Dateien. +kopieren, da sie sowohl Ressourcen- als auch Datenverzweigungen beinhalten +sollten. Kopieren Sie alle „ITE *“-Dateien. 3.12) Hinweise zu Simon the Sorcerer 1 und 2: @@ -787,7 +800,7 @@ Um Mickey's Space Adventure unter ScummVM laufen zu lassen, benötigen Sie die originale EXE-Datei des Spiels (mickey.exe) sowie die Spieldateien. Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im -Originalspiel überhaupt keine Mausunterstützung hab. Menüpunkte können mit der +Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen. @@ -798,11 +811,11 @@ unkomplizierter ist, als sich mit dem Menü umherzubewegen. 3.17) Hinweise zu Winnie the Pooh: ----- ---------------------------- -Es ist möglich, Spielstände vom Original-Interpreters des Spiels in ScummVM zu +Es ist möglich, Spielstände vom Original-Interpreter des Spiels in ScummVM zu importieren. Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im -Originalspiel überhaupt keine Mausunterstützung hab. Menüpunkte können mit der +Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen. @@ -909,7 +922,7 @@ Kompatibilitätsseite der Website aufgeführt ist, sehen Sie bitte im Abschnitt Originalspiel immer ausgeschaltet waren. The Legend of Kyrandia: - - Keine Musik- oder Sound-Effekte in der Macintosh-Diskettenversion. + - Keine Musik oder Sound-Effekte in der Macintosh-Diskettenversion - Die Macintosh-CD-Version verwendet eingebundene DOS-Musik und DOS-Sound-Effekte. - PC-9821-Versionen fehlt Unterstützung für Sound-Effekte. @@ -922,9 +935,9 @@ Kompatibilitätsseite der Website aufgeführt ist, sehen Sie bitte im Abschnitt 4.0) Unterstützte Plattformen: ---- ------------------------- -ScummVM wurde portiert, um auf vielen Plattformen und Betriebssystemen zu -lauffähig zu sein. Links zu diesen Ports können entweder auf der ScummVM-Website -oder durch Suchen mit einer Suchmaschine gefunden werden. Vielen Dank an unsere +ScummVM wurde portiert, um auf vielen Plattformen und Betriebssystemen lauffähig +zu sein. Links zu diesen Ports können entweder auf der ScummVM-Website oder +durch Suchen mit einer Suchmaschine gefunden werden. Vielen Dank an unsere Porter für ihre Bemühungen. Wenn Sie eine Portierung für ScummVM haben und diese zum Entwicklungsbereich (master Git) beisteuern möchten, können Sie uns gerne kontaktieren! @@ -940,7 +953,7 @@ Die unterstützten Plattformen beinhalten (aber beschränken sich nicht auf): BeOS Dreamcast GP2x - iPhone (auch einschließlich iPod Touch und iPad) + iPhone (einschließlich iPod Touch und iPad) Maemo (Nokia-Internet-Tablets 770, N800, N810, N900) Nintendo 64 Nintendo DS @@ -959,8 +972,8 @@ Für weitere plattformabhängige Beschränkungen verweisen wir auf unser Wiki: http://wiki.scummvm.org/index.php/Platforms In der Portierung von Macintosh wird die rechte Maustaste über den Cmd-Klick -emuliert (d. h. Sie klicken die Maustaste, während Sie die Command-/Apple- -/Propeller-Taste gedrückt halten). +emuliert (d. h. Sie klicken die Maustaste, während Sie die +Command-/Apple-/Propeller-Taste gedrückt halten). Es gibt inoffizielle Portierungen für eine Vielzahl von Plattformen, einschließlich PlayStation 3, Xbox und Xbox 360. Bitte beachten Sie, dass diese @@ -973,17 +986,18 @@ unterstützen können. Benutzung erfolgt auf eigene Gefahr! Bitte beachten Sie, dass ScummVM standardmäßig Spielstände in dem Verzeichnis speichert, in welchem es ausgeführt wird, also sollten Sie davon absehen, es von mehr als einem Ort aus zu verwenden. Weitere Informationen, einschließlich -darüber, wie man einen Pfad für Spielstände bestimmt, um dieses Problem zu +darüber, wie man einen Pfad für Spielstände bestimmt, um diesen Sachverhalt zu vermeiden, befinden sich im Abschnitt 6.0. -ScummVM kann direkt durch Aufruf der EXE-Datei gestartet werden. In diesem Fall -wird das eingebaute Startmenü aktiviert. Hier können Sie Spiele hinzufügen, -(klicken Sie auf „Spiel hinzufügen“) oder Spiele starten, die bereits -konfiguriert wurden. Es können auch mehrere Spiele auf einmal hinzugefügt -werden. Indem Sie die Umschalttaste (Shift) gedrückt halten und auf „Spiel -hinzufügen“ klicken (beachten Sie, dass sich die Beschreibung in „Durchsuchen“ -ändert), können Sie ein Verzeichnis bestimmen, wodurch ScummVM versuchen wird, -in allen Unterverzeichnissen dieses Verzeichnisses Spiele zu erkennen. +ScummVM kann direkt durch Aufruf der ausführbaren Datei gestartet werden. In +diesem Fall wird das eingebaute Startmenü aktiviert. Hier können Sie Spiele +hinzufügen, (klicken Sie auf „Spiel hinzufügen“) oder Spiele starten, die +bereits konfiguriert wurden. Es können auch mehrere Spiele auf einmal +hinzugefügt werden. Indem Sie die Umschalttaste (Shift) gedrückt halten und auf +„Spiel hinzufügen“ klicken (beachten Sie, dass sich die Beschreibung in +„Durchsuchen“ ändert), können Sie ein Verzeichnis bestimmen, wodurch ScummVM +versuchen wird, in allen Unterverzeichnissen dieses Verzeichnisses Spiele zu +erkennen. ScummVM kann mittels Argumenten in der Kommandozeile auch direkt in ein Spiel gestartet werden -- siehe nächster Abschnitt. @@ -1016,7 +1030,7 @@ gestartet werden -- siehe nächster Abschnitt. -f, --fullscreen Erzwingt Vollbildmodus. -F, --no-fullscreen Erzwingt Fenstermodus. -g, --gfx-mode=MODUS Wählt Grafikwandler (siehe auch Abschnitt 5.3). - --gui-theme=THEMA Wählt Oberflächenthema (Standard, modern, klassisch). + --gui-theme=THEMA Wählt Oberflächenthema (default, modern, classic). --themepath=PFAD Pfad zu gespeicherten Oberflächenthemen --list-themes Zeigt Liste aller verwendbaren Oberflächenthemen. -e, --music-driver=MODUS @@ -1029,7 +1043,7 @@ gestartet werden -- siehe nächster Abschnitt. --midi-gain=ZAHL Wählt MIDI-Lautstärke, 0-1000 (Standard: 100) (wird nur von einigen MIDI-Treibern unterstützt). -n, --subtitles Aktiviert Untertitel (in Spielen mit Sprachausgabe). - -b, --boot-param=ZAHL Ruft Boot-Skript (Boot-Parameter) mit dieser Zahl + -b, --boot-param=ZAHL Ruft Boot-Skript (Boot-Parameter) mit dieser Nummer auf. -d, --debuglevel=ZAHL Legt Debug-Ausführlichkeit fest. --debugflags=FLAGGEN Aktiviert für Engine spezifische Debug-Flaggen @@ -1057,7 +1071,7 @@ gestartet werden -- siehe nächster Abschnitt. --render-mode=MODUS Aktiviert zusätzlichen Render-Modus (cga, ega, hercGreen, hercAmber, amiga). - --alt-intro Verwendet alternativen Vorspann für CD-Versionen von + --alt-intro Verwendet alternativen Vorspann in CD-Versionen von Beneath a Steel Sky und Flight of the Amazon Queen. --copy-protection Aktiviert Kopierschutz in Spielen, für welche ihn ScummVM standardmäßig deaktiviert. @@ -1084,15 +1098,15 @@ Abschnitt 3.0 zu finden. Beispiele: * Win32: Startet Monkey Island im Vollbildmodus von Festplatte: - C:\Games\LucasArts\scummvm.exe -f -pC:\Games\LucasArts\monkey\ monkey + C:\Spiele\LucasArts\scummvm.exe -f -pC:\Spiele\LucasArts\monkey\ monkey Startet Vollgas von CD, im Vollbildmodus und mit aktivierten Untertiteln: - C:\Games\LucasArts\scummvm.exe -f -n -pD:\resource\ ft + C:\Spiele\LucasArts\scummvm.exe -f -n -pD:\resource\ ft * Unix: Startet Monkey Island im Vollbildmodus von Festplatte: - /path/to/scummvm -f -p/games/LucasArts/monkey/ monkey + /Pfad/zu/scummvm -f -p/Spiele/LucasArts/monkey/ monkey Startet Vollgas von CD, im Vollbildmodus und mit aktivierten Untertiteln: - /path/to/scummvm -f -n -p/cdrom/resource/ ft + /Pfad/zu/scummvm -f -n -p/cdrom/resource/ ft 5.2) Sprachoptionen: @@ -1100,7 +1114,7 @@ Beispiele: ScummVM beinhaltet Sprachoptionen für Maniac Mansion, Zak McKracken, The Dig, The Curse of Monkey Island, Beneath a Steel Sky und Baphomets Fluch. -Beachten Sie, dass mit Ausnahme von Beneath a Steel Sky, Broken Sword, +Beachten Sie, dass mit Ausnahme von Beneath a Steel Sky, Baphomets Fluch, mehrsprachigen Versionen der Goblins-Spiele und Nippon Safes Inc. die Verwendung dieser Option nicht die Sprache des Spiels ändert (die normalerweise fest programmiert ist), sondern nur dazu verwendet wird, um die passende Schriftart @@ -1182,8 +1196,9 @@ Die einzelnen Grafikoptionen im Überblick: tv2x - Zeilensprungfilter, emuliert Fernsehgerät. Faktor 2. dotmatrix - Punktraster-Effekt. Faktor 2. -Um einen Grafikfilter auszuwählen, übergeben Sie dessen Namen über die Option -„-g“ an scummvm, z. B. mit der Eingabe: +Um einen Grafikfilter auszuwählen, stellen Sie diesen im Startmenü ein oder +übergeben Sie dessen Namen über die Option „-g“ an scummvm, z. B. mit der +Eingabe: scummvm -gadvmame2x monkey2 @@ -1280,9 +1295,9 @@ zwischen SCUMM-Spielen und anderen Spielen. sofern eines im Spiel enthalten ist. Sie können mit diesem Spiele speichern und laden, jedoch ist es für diesen Zweck nicht vorgesehen und kann in - einigen Spielen ScummVM zum Absturz bringen. + einigen Spielen ScummVM zum Absturz führen. i - Zeigt IQ-Punkte an (Indiana Jones and the Last - Crusade und Indiana Jones and the Fate of + Crusade sowie Indiana Jones and the Fate of Atlantis). Leertaste - Spielpause Punkt (.) - Überspringt aktuelle Textzeile in machen Spielen. @@ -1345,9 +1360,9 @@ zwischen SCUMM-Spielen und anderen Spielen. Strg 0-9 und Alt 0-9 - Lädt und speichert entsprechenden Speicherstand. Strg+d - Startet den Debugger. Strg+f - Schneller Modus EIN/AUS - F1 - F3 - Texttempo, schneller - langsamer - F10 - Zeigt alle Figuren und Objekte, mit denen man - interagieren kann. + F1-F3 - Texttempo, schneller - langsamer + F10 - Zeigt alle Figuren und Objekte, die näher + betrachtet werden können. Escape - Überspringt Zwischensequenzen. - und + - Musiklautstärke, leiser/lauter m - Musik EIN/AUS @@ -1377,7 +1392,7 @@ zwischen SCUMM-Spielen und anderen Spielen. Strg+d - Startet den Debugger. Strg+f - Schneller Modus EIN/AUS F7 - Wechselt Figuren. - F9 - Klickbereichnamen EIN/AUS + F9 - Objektnamen-Anzeige EIN/AUS s - Sound-Effekte EIN/AUS Pause - Spielpause t - Wechselt zwischen Sprachausgabe allein und @@ -1471,5 +1486,831 @@ Hierbei steht „xxx“ für den genauen Speicherplatz (z. B. 001), auf welchem der Spielstand unter ScummVM befinden soll. -(Übersetzung basiert auf README mit SHA1 ID: -9bb2ba7eee5f18b878845eb49ac282b84ab5d164) +6.3) Spielstände von Kommandozeile aus anzeigen/laden: +---- ------------------------------------------------- + +--list-saves: + + Dieser Schalter kann verwendet werden, um eine Liste der momentanen + Spielstände des festgelegten Zielspiels und der entsprechenden Speicherplätze + anzuzeigen. + + Verwendung: --list-saves=[ZIEL], wobei [ZIEL] das Zielspiel ist + + Die Engines, die momentan --list-saves unterstützen, sind: + + AGI + AGOS + CINE + DRACI + GROOVIE + KYRA + LURE + PARALLACTION + QUEEN + SAGA + SCUMM + SKY + SWORD1 + SWORD2 + TINSEL + TOUCHE + TUCKER + +--save-slot/-x: + + Dieser Schalter kann verwendet werden, um einen Spielstand direkt von der + Kommandozeile aus zu laden. + + Verwendung: --save-slot[SPEICHERPLATZ] oder -x[SPEICHERPLATZ], wobei + [SPEICHERPLATZ] die Nummer des Speicherplatzes ist + + Die Engines, die momentan --save-slot/-x unterstützen, sind: + + AGI + CINE + DRACI + GROOVIE + KYRA + LURE + PARALLACTION + QUEEN + SAGA + SCUMM + SKY + SWORD1 + SWORD2 + TINSEL + TOUCHE + + +7.0) Musik und Sound: +---- ---------------- +Bei den meisten Betriebssystemen und Spielen wird ScummVM standardmäßig MT-32- +oder AdLib-Emulation für die Musikwiedergabe verwenden. MIDI ist nicht bei allen +Betriebssystemen verfügbar oder muss womöglich manuell konfiguriert werden. Wenn +Sie MIDI verwenden möchten, haben Sie mehrere unterschiedliche +Ausgabemöglichkeiten, was von Ihrem Betriebssystem und dessen Konfiguration +abhängt. + + null - Keine Ausgabe. Spielt keinerlei Musik ab. + + adlib - Interne AdLib-Emulation + fluidsynth - FluidSynth-MIDI-Emulation + mt32 - Interne MT-32-Emulation + pcjr - Interne PCjr-Emulation (nur in SCUMM-Spielen verwendbar) + pcspk - Interne PC-Lautsprecher-Emulation + towns - Interne FM-TOWNS-YM2612-Emulation + (nur in SCUMM-FM-TOWNS-Spielen verwendbar) + + alsa - Ausgabe mittels ALSA-Sequenzer-Gerät. Siehe unten. + core - CoreAudio-Sound, für Mac-OS-X-Anwender. + coremidi - CoreMIDI-Sound, für Mac-OS-X-Anwender. Verwenden Sie diese + Option nur, wenn Sie einen Hardware-MIDI-Synthesizer haben. + seq - Verwendet /dev/sequencer für MIDI-Ausgabe, *nix-Anwender. + Siehe unten. + timidity - Verbindet zu TiMidity++-MIDI-Server. Siehe unten. + windows - Windows MIDI. Verwendet eingebauten Sequenzer, für + Windows-Anwender. + +Um einen Sound-Treiber auszuwählen, stellen Sie diesen im Startmenü ein oder +übergeben Sie dessen Namen über die Option „-e“ an scummvm, z. B. mit der +Eingabe: + + scummvm -eadlib monkey2 + + +7.1) Sound-Wiedergabe mittels AdLib-Emulation: +---- ----------------------------------------- +Standardmäßig wird eine AdLib-Soundkarte emuliert und ScummVM wird die Musik als +abgetastete Wellen ausgeben. Das ist die Standard-Methode für die einige Spiele +und bietet die beste Kompatibilität zwischen Maschinen und Spielen. + + +7.2) Sound-Wiedergabe mittels FluidSynth-MIDI-Emulation: +---- --------------------------------------------------- +Wenn ScummVM mit Unterstützung von libfluidsynth kompiliert wurde, wird das +Programm in der Lage sein, MIDI-Musik durch den FluidSynth-Treiber +wiederzugeben. Hierfür müssen Sie jedoch eine zu verwendende SoundFont-Datenbank +festlegen. + +Da die standardmäßige Ausgabelautstärke von FluidSynth ziemlich leise sein kann, +wird ScummVM standardmäßig das Signal verstärken. Dies kann mit der +Kommandozeilenoption --midi-gain weiter geregelt werden oder mittels der +Einstellung „midi_gain“ in der Konfigurationsdatei. + +Die Einstellung kann jeden Wert zwischen 0 und 1000 annehmen, wobei der +Standard-Wert 100 ist (dies entspricht der FluidSynth-Verstärkung von 0,0 bis +10,0, die vermutlich in Dezibel bemessen wird). + +HINWEIS: Die Prozessorvoraussetzungen für FluidSynth können in einigen Fällen +ziemlich hoch sein. Ein schneller Hauptprozessor (CPU) wird empfohlen. + + +7.3) Sound-Wiedergabe mittels MT-32-Emulation: +---- ----------------------------------------- +Einige Spiele, die MIDI-Musikdaten beinhalten, haben auch verbesserte Versionen +der Musikstücke für das MT-32-Soundmodul. ScummVM kann nun dieses Gerät +emulieren, jedoch müssen Sie originale MT-32-ROM-Dateien verwenden, damit es +funktioniert: + +MT32_PCM.ROM - IC21 (512 KB) +MT32_CONTROL.ROM - IC26 (32 KB) und IC27 (32 KB), Byte-weise verschachtelt + +Legen Sie diese ROM-Dateien entweder im Spielverzeichnis ab, im Extrapfad oder +im Verzeichnis, in dem sich Ihre ausführbare ScummVM-Datei befindet. + +Bei diesem Treiber müssen Sie nicht --native-mt32 mittels Kommandozeile +festlegen, da er automatisch aktiviert wird. + +HINWEIS: Die Prozessorvoraussetzungen für diesen Emulator sind ziemlich hoch; +ein schneller Hauptprozessor (CPU) wird dringend empfohlen. + + +7.4) Sound-Wiedergabe mittels MIDI-Emulation: +---- ---------------------------------------- +Einige Spiele (wie beispielsweise Sam & Max) beinhalten nur MIDI-Musikdaten. +Einst hat dies verhindert, Musik in diesen Spielen auf Plattformen +wiederzugeben, auf welchen MIDI nicht unterstützt wird oder auf Soundkarten, die +keine MIDI-Treiber bereitstellen (z. B. können viele Soundkarten MIDI unter +Linux nicht abspielen). ScummVM kann nun den MIDI-Modus emulieren mittels +abgetasteter Wellen und AdLib, FluidSynth-MIDI-Emulation oder MT-32-Emulation +entsprechend über die Option -eadlib, -efluidsynth oder -emt32. Wenn Sie jedoch +in der Lage sind, natives MIDI zu verwenden, empfehlen wir zur Erzielung von +bestmöglichem Klang, eine der unten stehenden MIDI-Methoden zu verwenden. + + +7.5) Sound-Wiedergabe mittels nativem MIDI: +---- -------------------------------------- +Verwenden Sie die geeignete Kommandozeilenoption -e aus der oberen +Aufzählung, um Ihr bevorzugtes MIDI-Gerät auszuwählen. Wenn Sie beispielsweise +den Windows-MIDI-Treiber benutzen möchten, verwenden Sie die Option -ewindows. + + +7.5.1) Verwendung von MIDI-Optionen zur Anpassung der nativen MIDI-Ausgabe: +------ -------------------------------------------------------------------- +ScummVM unterstützt eine Vielzahl von MIDI-Methoden, was von den Fähigkeiten des +MIDI-Geräts abhängt. + +Wenn --native-mt32 festgelegt ist, wird ScummVM Ihr Gerät als echtes MT-32-Modul +behandeln. Da die Instrumentenzuweisung und exklusiven Systembefehle von MT-32 +sich von denen der General-MIDI-Geräte unterscheiden, sollten Sie diese Option +nur aktivieren, wenn Sie tatsächlich Roland MT-32, LAPC-I, CM-64, CM-32L, CM-500 +oder ein GS-Gerät mit MT-32-Zuweisung verwenden. + +Wenn --enable-gs festgelegt ist, wird ScummVM Ihr GS-kompatibles Gerät mit +Voreinstellungen belegen, die den Hall von MT-32 nachahmen, (das Fehlen von) +Chorus, die Empfindlichkeit der gleitenden Tonhöhenverschiebung usw. Wenn dies +in Verbindung mit --native-mt32 festgelegt ist, wird ScummVM die +MT-32-kompatible Zuweisung und das Schlagzeug auf Ihrem GS-Gerät auswählen. +Diese Einstellung funktioniert besser als standardmäßige GM- oder GS-Emulation +in Spielen, die keine spezifische Instrumentenzuweisung haben (Loom und +Monkey1). Sie sollten nur beide Einstellungen festlegen, wenn Sie ein GS-Gerät +verwenden, das eine MT-32-Zuweisung hat, wie beispielsweise SC-55, SC-88, +SC-88 Pro, SC-8820, SC-8850, usw. Bitte beachten Sie, dass --enable-gs sowohl +für DOTT als auch Sam & Max nicht verfügbar ist, da diese Spiele nativ General +MIDI verwenden. + +Wenn keine der oberen Einstellungen aktiviert ist, wird ScummVM Ihr Gerät im +General-MIDI-Modus initialisieren und GM-Emulation in Spielen mit +MT-32-Soundtrack verwenden. + +Einige Spiele beinhalten Sound-Effekte, die exklusiv für den AdLib-Soundtrack +vorgesehen sind. Für diese Spiele sollten Sie --multi-midi festlegen, um +MIDI-Musik mit AdLib-Sound-Effekten zu kombinieren. + + +7.6) Sound-Wiedergabe mittels MIDI-Sequenzer: [NUR IN UNIX] +---- ---------------------------------------- +Wenn Ihr Soundkartentreiber einen Sequenzer unterstützt, können Sie mit der +Umgebungsvariable „SCUMMVM_MIDI“ auf Ihr Sequenzergerät zeigen -- z. B auf +/dev/sequencer + +Wenn Sie bei dieser Einstellung das Problem haben, dass Sie keinen Ton hören, +müssen Sie womöglich die Umgebungsvariable „SCUMMVM_MIDIPORT“ mit dem Wert 1 +oder 2 belegen. Dies wählt den Port auf dem zu verwendenden ausgewählten +Sequenzer aus. Starten Sie dann scummvm mit dem Parameter -eseq. Das sollte bei +verschiedenen Soundkarten funktionieren und bietet womöglich bessere Leistung +und Qualität als AdLib-Emulation. Bei Systemen, bei welchen die +Sequenzer-Unterstützung jedoch nicht funktioniert, können Sie immer auf die +AdLib-Emulation zurückgreifen. + + +7.6.1) Sound-Wiedergabe mittels ALSA-Sequenzer: [NUR IN UNIX] +------ ---------------------------------------- +Wenn Sie den ALSA-Treiber mit Sequenzer-Unterstützung installiert haben, können +Sie bei der Umgebungsvariable „SCUMMVM_PORT“ oder der Variable „alsa_port“ in +der Konfigurationsdatei den Sequenzer-Port festlegen. Wenn der Port in keiner +der beiden Variablen festgelegt ist, werden standardmäßig die Ports „65:0“ und +„17:0“ probiert. + +Hier ist eine kurze Anleitung, um den ALSA-Sequenzer mit Ihrer Soundkarte zu +verwenden. In allen Fällen können Sie eine Liste aller Sequenzer-Ports, die Sie +haben, mit dem Befehl „aconnect -o -l“ erhalten. Hierdurch sollte etwas +Ähnliches wie folgt ausgegeben werden: + +client 14: 'Midi Through' [type=kernel] + 0 'Midi Through Port-0' +client 16: 'SBLive! Value [CT4832]' [type=kernel] + 0 'EMU10K1 MPU-401 (UART)' +client 17: 'Emu10k1 WaveTable' [type=kernel] + 0 'Emu10k1 Port 0 ' + 1 'Emu10k1 Port 1 ' + 2 'Emu10k1 Port 2 ' + 3 'Emu10k1 Port 3 ' +client 128: 'TiMidity' [type=user] + 0 'TiMidity port 0 ' + 1 'TiMidity port 1 ' + 2 'TiMidity port 2 ' + 3 'TiMidity port 3 ' + +Das Wichtigste hieraus ist, dass es vier WaveTable-MIDI-Ausgänge gibt, die sich +bei 17:0, 17:1, 17:2 und 17:3 befinden, sowie vier TiMidity-Ports, die sich bei +128:0, 128:1, 128:2 und 128:3 befinden. + +Wenn Sie einen FM-Chip auf Ihrer Soundkarte haben, wie beispielsweise die +Sound Blaster 16, dann müssen Sie die SoundsFonts über das Programm sbiload +laden. Beispiel: + + sbiload -p 17:0 /etc/std.o3 /etc/drums.o3 + +Wenn Sie eine WaveTable-fähige Soundkarte haben, müssen Sie eine SBK- oder +SF2-SoundFont-Datenbank über das Programm asfxload laden. Beispiel: + + sfxload /Pfad/zu/8mbgmsfx.sf2 + +Wenn Sie keine MIDI-fähige Soundkarte haben, gibt es zwei Alternativen: +FluidSynth und TiMidity. Wir empfehlen FluidSynth, da TiMidity auf vielen +Systemen bei der Musik „nachhinkt“. Das ist in Spielen mit iMUSE sehr auffällig, +die schnelle und dynamische Musikübergänge verwenden. Wenn Sie „TiMidity“ unter +„root“ laufen lassen, ermöglicht dies die Einstellung von Echtzeitpriorität, was +das Nachziehen der Musik reduzieren kann. + +Wie folgt weisen Sie TiMidity an, ein ALSA-Sequenzer zu werden: + + timidity -iAqqq -B2,8 -Os1S -s 44100 & + +(Wenn Sie mit diesen Parametern eine unleserliche Ausgabemeldung erhalten, +können Sie -B2,8 weglassen oder den Wert ändern.) + +Wie folgt weisen Sie FluidSynth an, ein ALSA-Sequenzer zu werden (mittels +SoundFonts): + + fluidsynth -m alsa_seq /Pfad/zu/8mbgmsfx.sf2 + +Wenn einmal TiMidity oder FluidSynth laufen, verwenden Sie den Befehl +„aconnect -o -l“, der bereits in diesem Abschnitt beschrieben wurde. + + +7.6.2) Sound-Wiedergabe mittels IRIX-dmedia-Sequenzer: [NUR IN UNIX] +------ ----------------------------------------------- +Wenn Sie IRIX und den Treiber dmedia mit Sequenzer-Unterstützung verwenden, +können Sie bei der Umgebungsvariable „SCUMMVM_MIDIPORT“ oder der Variable +„dmedia_port“ in der Konfigurationsdatei den Sequenzer-Port festlegen. +Standardmäßig wird der erste Port verwendet. + +Um eine Liste der konfigurierten MIDIs auf Ihrem System zu erhalten, rufen Sie +„startmidi“ ohne Parameter auf. Beispiel-Ausgabemeldung: + + 2 MIDI interfaces configured: + Serial Port 2 + Software Synth + +In diesem Beispiel können Sie in ScummVM konfigurieren, dass der +„Software Synth“ anstatt des standardmäßigen „Serial Port 2“ verwendet wird, +indem Sie die Zeile + + dmedia_port=Software Synth + +in Ihrer Konfigurationsdatei im Abschnitt [scummvm] einfügen oder bei den +Umgebungsvariablen „SCUMMVM_PORT=Software Synth“ festlegen. + + +7.7) TiMidity++-MIDI-Server verwenden: +---- --------------------------------- +Wenn Ihrem Betriebssystem jeglicher MIDI-Sequenzer fehlt, aber Sie trotzdem eine +bessere MIDI-Qualität haben wollen, als die standardmäßige AdLib-Emulation +bieten kann, können Sie es mit dem TiMidity++-MIDI-Server versuchen. Schauen Sie +auf der Website http://timidity.sourceforge.net/ bezüglich Download- und +Installationsanweisungen nach. + +Zuerst benötigen Sie einen Dämonen (ein im Hintergrund laufendes +Dienstprogramm): + + timidity -ir 7777 + +Nun können Sie ScummVM starten und TiMidity für Musikausgabe auswählen. +Standardmäßig wird das Programm mit dem localhost:7777 verbunden, aber Sie +können Host und Port über die Umgebungsvariable „TIMIDITY_HOST“ ändern. Sie +können auch eine „Gerätenummer“ über die Umgebungsvariable „SCUMMVM_MIDIPORT“ +festlegen. + + +7.8) Komprimierte Audio-Dateien verwenden +---- ------------------------------------ + +7.8.0) MP3-Dateien für Audio von CD verwenden: +------ --------------------------------------- +Verwenden Sie LAME oder einen anderen MP3-Kodierer, um die CD-Audio-Titel in +Dateien zu extrahieren. Benennen Sie die Dateien in track1.mp3, track2.mp3 usw. +um. Sie müssen die Dateien zuerst von der CD als WAV-Datei extrahieren und dann +in eine MP3-Datei mit konstanter Bitrate umwandeln. Das kann durch folgenden +LAME-Befehl in der Kommandozeile geschehen: + + lame -t -q 0 -b 96 track1.wav track1.mp3 + + +7.8.1) Ogg-Vorbis-Dateien für Audio von CD verwenden: +------ ---------------------------------------------- +Verwenden Sie oggenc oder einen anderen Vorbis-Kodierer, um die CD-Audio-Titel +in Dateien umzuwandeln. Benennen Sie die Dateien in track1.ogg, track2.ogg usw. +um. ScummVM muss mit Unterstützung für Ogg Vorbis kompiliert sein, um diese +Option nutzen zu können. Sie müssen die Dateien zuerst von der CD als WAV-Datei +extrahieren und dann in eine Vorbis-Datei umwandeln. Das kann mit folgendem +Befehl in oggenc in der Kommandozeile geschehen, wobei der Wert nach q die +gewünschte Qualität zwischen 0 und 10 festlegt: + + oggenc -q 5 track1.wav + + +7.8.2) FLAC-Dateien für Audio von CD verwenden: +------ ---------------------------------------- +Verwenden Sie flac oder einen anderen FLAC-Kodierer, um die CD-Audio-Titel in +Dateien umzuwandeln. Benennen Sie die Dateien in track1.flac, track2.flac usw. +um. Wenn Ihr Dateisystem nur drei Buchstaben für die Dateiendung erlaubt, +benennen Sie die Dateien in track1.fla, track2.fla usw. um. ScummVM muss mit +Unterstützung für FLAC kompiliert sein, um diese Option nutzen zu können. Sie +müssen die Dateien zuerst von der CD als WAV-Datei extrahieren und dann in eine +FLAC-Datei umwandeln. Das kann mit folgendem FLAC-Befehl in der Kommandozeile +geschehen: + + flac --best track1.wav + +Denken Sie daran, dass die Qualität immer dieselbe ist und die abweichenden +Kodieroptionen nur Auswirkungen auf die Kodierzeit und letztendliche Dateigröße +haben. + + +7.8.3) MONSTER.SOU mittels MP3 komprimieren: +------ ------------------------------------- +Sie benötigen LAME und unser Dienstprogramm „compress_scumm_sou“ aus dem +ScummVM-Tools-Paket, um diese Aufgabe zu verrichten, und ScummVM muss mit +MAD-Unterstützung kompiliert sein. + + compress_scumm_sou monster.sou + +Am Ende werden Sie die viel kleinere Datei monster.so3 haben. Kopieren Sie diese +Datei ins Verzeichnis des Spiels. Sie können unbesorgt die Datei monster.sou +hieraus entfernen. + + +7.8.4) MONSTER.SOU mittels Ogg Vorbis komprimieren: +------ -------------------------------------------- +Ähnlich wie oben muss ScummVM mit Ogg-Unterstützung kompiliert sein. Rufen Sie +auf: + + compress_scumm_sou --vorbis monster.sou + +Dadurch sollte die kleinere Datei monster.sog erzeugt werden, welche Sie ins +Verzeichnis des Spiels kopieren sollten. Die Umwandlung in Ogg kann beträchtlich +länger dauern als bei MP3, also sollten Sie ein gutes Buch zur Hand haben. + + +7.8.5) MONSTER.SOU mittels FLAC komprimieren: +------ -------------------------------------- +Ähnlich wie oben muss ScummVM mit FLAC-Unterstützung kompiliert sein. Rufen Sie +auf: + + compress_scumm_sou --flac monster.sou + +Dadurch sollte die kleinere Datei monster.sof erzeugt werden, welche Sie ins +Verzeichnis des Spiels kopieren sollten. Denken Sie daran, dass die Qualität +immer dieselbe ist und die abweichenden Kodieroptionen nur Auswirkungen auf die +Kodierzeit und letztendliche Dateigröße haben. Die Veränderung der Blockgröße +(-b ) hat den größten Einfluss auf die letztendliche Dateigröße -- +1152 scheint ein guter Wert für diese Art von Sound-Dateien zu sein. Lesen Sie +auf jeden Fall die Dokumentation des Kodierers, bevor Sie einen anderen Wert +verwenden. + + +7.8.6) Musik/Sound/Sprachausgabe in AGOS-Spielen komprimieren: +------ ------------------------------------------------------- +Verwenden Sie unser Dienstprogramm „compress_agos“ aus dem ScummVM-Tools-Paket, +um diese Aufgabe zu verrichten. Sie können zwischen mehreren Zielformaten +auswählen, aber beachten Sie, dass Sie diese nur verwenden können, wenn ScummVM +mit entsprechender Dekodierer-Unterstützung kompiliert wurde. + + compress_agos effects (Für Acorn-CD-Version von Simon 1) + compress_agos simon (Für Acorn-CD-Version von Simon 1) + compress_agos effects.voc (Für DOS-CD-Version von Simon 1) + compress_agos simon.voc (Für DOS-CD-Version von Simon 1) + compress_agos simon.wav (Für Windows-CD-Version von Simon 1) + compress_agos simon2.voc (Für DOS-CD-Version von Simon 2) + compress_agos simon2.wav (Für Windows-CD-Version von Simon 2) + compress_agos mac (Für Macintosh-Version von Simon 2) + + compress_agos voices1.wav (Für Windows-2CD/4CD-Version von Floyd) + compress_agos voices2.wav (Für Windows-2CD/4CD-Version von Floyd) + compress_agos voices3.wav (Für Windows-4CD-Version von Floyd) + compress_agos voices4.wav (Für Windows-4CD-Version von Floyd) + + compress_agos Music (Für Windows-Version von Game Pack) + +Für Ogg Vorbis fügen Sie den Parameter --vorbis den Optionen hinzu. Beispiel: + + compress_agos --vorbis + +Für FLAC fügen Sie den Parameter --flac und optionale Unterparameter hinzu. +Beispiel: + + compress_agos --flac + +Am Ende werden Sie die viel kleinere Datei *.mp3, *.ogg oder *.fla haben. +Kopieren Sie diese Datei ins Verzeichnis des Spiels. Sie können unbesorgt die +alte Datei hieraus entfernen. + + +7.8.7) Sprachausgabe/Musik in Baphomets Fluch komprimieren: +------ ---------------------------------------------------- +Das Tool „compress_sword1“ aus dem ScummVM-Tools-Paket kann Musik und +Sprachausgabe des Spiels sowohl in MP3, Ogg Vorbis als auch FLAC kodieren. Die +einfachste Möglichkeit, die Dateien umzuwandeln, ist, die ausführbare Datei des +Tools in das Verzeichnis des Spiels zu kopieren (zusammen mit dem LAME-Kodierer) +und sie von dort aus aufzurufen. Auf diese Weise wird automatisch alles in MP3 +umgewandelt. Hinterher können Sie manuell die Dateien SPEECH?.CLU und die +WAVE-Musik-Dateien entfernen. + +Wenn Sie „compress_sword1 --vorbis“ aufrufen, werden die Dateien in Ogg Vorbis +anstatt MP3 umgewandelt. + +Wenn Sie „compress_sword1 --flac“ aufrufen, werden die Dateien in FLAC anstatt +MP3 umgewandelt. + +Rufen Sie „compress_sword1 --help“ auf, um eine komplette Liste der Optionen +angezeigt zu bekommen. + + +7.8.8) Sprachausgabe/Musik in Baphomets Fluch II komprimieren: +------ ------------------------------------------------------- +Verwenden Sie unser Dienstprogramm „compress_sword2“ aus dem +ScummVM-Tools-Paket, um diese Aufgabe zu verrichten. Sie können zwischen +mehreren Zielformaten auswählen, aber beachten Sie, dass Sie diese nur verwenden +können, wenn ScummVM mit entsprechender Dekodierer-Unterstützung kompiliert +wurde. + + compress_sword2 speech1.clu + compress_sword2 music1.clu + +Für Ogg Vorbis fügen Sie den Parameter --vorbis den Optionen hinzu. Beispiel: + + compress_sword2 --vorbis + +Am Ende werden Sie die viel kleinere Datei *.cl3 oder *.clg haben. Kopieren Sie +diese Datei ins Verzeichnis des Spiels. Sie können unbesorgt die alte Datei +hieraus entfernen. + +Es ist möglich, die FLAC-Komprimierung zu verwenden, indem Sie den Parameter +--flac den Optionen hinzufügen. Jedoch wird die letztendliche Datei sogar größer +sein als die Originaldatei. + +Bitte beachten Sie, dass compress_sword2 nur mit den vier +Sprachausgabe-/Musikdateien aus Baphomets Fluch II funktioniert. Das Programm +funktioniert mit keiner der anderen *.clu-Dateien noch mit den +Sprachausgabe-Dateien aus Baphomets Fluch I. + + +7.9) Ausgabefrequenzen: +---- ------------------ +Die Ausgabefrequenz teilt ScummVM mit, wie viele Sound-Abtastungen je Kanal pro +Sekunde abgespielt werden sollen. Es gibt viel, was über dieses Thema gesagt +werden könnte, aber das Meiste wäre hier unerheblich. Die Kurzfassung ist, dass +für die meisten Spiele 22050 Hz genügen, aber in einigen Fällen 44100 Hz +vorzuziehen sind. Auf äußerst alten, langsamen Systemen möchten Sie womöglich +11025 Hz verwenden, aber es ist unwahrscheinlich, dass Sie sich darum Sorgen +machen müssen. + +Zur Erklärung: Die meisten Sounds, die ScummVM wiedergeben muss, wurden entweder +mit der Frequenz 22050 Hz oder 11025 Hz abgetastet. Durch die Verwendung einer +höheren Abtastfrequenz wird die Qualität der Sounds nicht magisch verbessert. +Deswegen genügen 22050 Hz. + +Einige Spiele verwenden Audio von CD. Wenn Sie komprimierte Dateien hierfür +verwenden, haben diese wahrscheinlich die Abtastfrequenz 44100 Hz, womit dies +für solche Spiele die bessere Wahl für die Abtastfrequenz ist. + +Bei Verwendung von AdLib, FM Towns, des PC-Lautsprecher oder des +PCjr-Musiktreibers ist ScummVM für die Erzeugung der Abtastungen zuständig. +Normalerweise sind 22050 Hz hierfür eine Menge, aber in Beneath a Steel Sky gibt +es mindestens ein AdLib-Musikstück, das mit 44100 Hz viel besser klingt. + +Die Verwendung von Frequenzen dazwischen wird nicht empfohlen. Einerseits könnte +Ihre Soundkarte diese nicht unterstützen. In der Theorie sollte ScummVM in +diesem Fall auf eine sinnvollere Frequenz zurückgreifen, aber verlassen Sie sich +nicht darauf. Ein noch wichtigerer Grund ist, dass ScummVM alle Sounds zu ihrer +Ausgabefrequenz umwandeln muss. Das funktioniert viel einfacher, wenn die +Ausgabefrequenz ein Vielfaches der Originalfrequenz ist. + + +8.0) Konfigurationsdatei: +---- -------------------- +Standardmäßig wird die Konfigurationsdatei hier gespeichert und geladen: + + Windows Vista: + \Users\Benutzername\AppData\Roaming\ScummVM\scummvm.ini + + Windows 2000/XP: + \Dokumente und Einstellungen\Benutzername\Anwendungsdaten\ + ScummVM\scummvm.ini + + Windows NT4: + \Profiles\Benutzername\ + Application Data\ScummVM\scummvm.ini + + Windows 95/98/ME: + \scummvm.ini + + Wenn eine ältere Version von ScummVM unter Windows installiert wurde, wird + der frühere Standard-Ort „\scummvm.ini“ beibehalten. + + Unix: + ~/.scummvmrc + + Mac OS X: + ~/Library/Preferences/ScummVM Preferences + (Hierbei bezieht sich ~ auf das Benutzerverzeichnis.) + + Sonstige: + scummvm.ini im aktuellen Verzeichnis + +Eine beispielhafte Konfigurationsdatei sieht wie folgt aus: + + [scummvm] + gfx_mode=supereagle + fullscreen=true + savepath=C:\Spielstaende\ + + [sky] + path=C:\Spiele\SteelSky\ + + [sky-Deutsch] + gameid=sky + language=de + path=C:\Spiele\SteelSky\ + description=Beneath a Steel Sky mit deutschen Untertiteln + + [dott-Deutsch] + gameid=tentacle + path=C:\Deutsch\tentacle\ + description=Deutsche Version von DOTT + + [tentacle] + path=C:\tentacle\ + subtitles=true + music_volume=40 + sfx_volume=255 + + [loomcd] + cdrom=1 + path=C:\loom\ + talkspeed=5 + savepath=C:\loom\Spielstaende\ + + [monkey2] + path=C:\amiga_mi2\ + music_driver=windows + +Erklärung zu nachfolgender Liste: In der nachfolgenden Liste mit +Schlüsselwörtern werden rechts das Schlüsselwort, in der Mitte der Typ der +erwarteten Zuweisung und rechts die Erklärung angezeigt. Der Typ „Bool“ bedeutet +Wahrheitswert. Er kann entweder „true“ (wahr) oder „false“ (falsch) sein. + +Die folgenden Schlüsselwörter werden erkannt: + + path Text Verzeichnis mit Spieldaten + autosave_period Zahl Sekunden zwischen automatischem Speichern + (Standard: 300) + save_slot Zahl Nummer des Spielstands, der zu Spielbeginn + geladen werden soll + savepath Text Verzeichnis für Spielstände des Spiels + versioninfo Text Die Version von ScummVM, welche diese + Konfigurationsdatei erstellt hat + + gameid Text Die echte Spielkennung. Hilfreich, wenn Sie + mehrere Versionen des gleichen Spiels haben und + verschiedene Einträge für diese wollen. + Siehe Beispiel. + description Text Die Spielbeschreibung wie sie in der Spieleliste + erscheinen wird + + language Text Legt Sprache fest (de, en, us, fr, it, pt, es, + jp, zh, kr, se, gb, hb, cz, ru). + speech_mute Bool Falls „true“, wird Sprachausgabe unterdrückt. + subtitles Bool Belegung mit „true“ aktiviert Untertitel. + talkspeed Zahl Textverzögerung in SCUMM-Spielen oder Texttempo + in anderen Spielen + + fullscreen Bool Vollbildmodus + aspect_ratio Bool Seitenverhältniskorrektur + disable_dithering Bool Entfernung von Fehlerdiffusionsartefakten in + EGA-Spielen + gfx_mode Text Grafikmodus (normal, 2x, 3x, 2xsai, + super2xsai, supereagle, advmame2x, advmame3x, + hq2x, hq3x, tv2x, dotmatrix) + + confirm_exit Bool Fragt Anwender vor Beenden nach Bestätigung + (nur SDL-System). + console Bool Konsolenfenster (Standard: aktiv) (nur Windows) + cdrom Zahl Nummer von CD-ROM-Laufwerk für das Auslesen von + Audio. Falls negaitv, wird erst gar nicht + versucht, auf CD-ROM-Laufwerk zuzugreifen. + joystick_num Zahl Nummer von Joystick für Verwendung als + Eingabegerät + music_driver Text Zu verwendender Musiktreiber + opl_driver Text Verwendung von AdLib-(OPL-)Emulator + output_rate Zahl Zu verwendende Ausgabefrequenz in Hz. Sinnvolle + Werte sind 11025, 22050 und 44100. + alsa_port Text Zu verwendender Port für Ausgabe mittels + ALSA-Musiktreiber + music_volume Zahl Musiklautstärke-Einstellung (0-255) + multi_midi Bool Falls „true“, werden AdLib und natives MIDI + kombiniert. + soundfont Text Zu verwendende SoundFont-Datenbank für + MIDI-Wiedergabe (wird nur von einigen + MIDI-Treibern unterstützt) + native_mt32 Bool Falls „true“, wird GM-Emulation deaktiviert und + angenommen, dass ein echtes Roland-MT-32-Modul + verfügbar ist. + enable_gs Bool Falls „true“, werden GS-spezifische Funktionen + aktiviert, um GM-Emulation zu verbessern. Falls + native_mt32 auch „true“ ist, wird das GS-Gerät + eine MT-32-Zuweisung auswählen, um die korrekten + Instrumente wiederzugeben. + sfx_volume Zahl Effektlautstärke-Einstellung (0-255) + tempo Zahl Musiktempo (50-200) (Standard: 100) + speech_volume Zahl Sprachlautstärke-Einstellung (0-255) + midi_gain Zahl MIDI-Lautstärke (0-1000) (Standard: 100) + (wird nur von einigen MIDI-Treibern unterstützt) + + copy_protection Bool Kopierschutz in bestimmten Spielen, für welche + ScummVM ihn standardmäßig ausschaltet + demo_mode Bool Startet Demo in Maniac Mansion. + alt_intro Bool Verwendet alternativen Vorspann bei CD-Versionen + von Beneath a Steel Sky und Flight of the Amazon + Queen. + + boot_param Zahl Ruft Boot-Skript mit dieser Nummer auf. + +Baphomets Fluch II verfügt zusätzlich über folgende nicht standardmäßige +Schlüsselwörter: + + gfx_details Zahl Grafikqualitätseinstellung (0-3) + music_mute Bool Falls „true“, wird Musik unterdrückt. + object_labels Bool Falls „true“, werden Objektnamen angezeigt. + reverse_stereo Bool Falls „true“, werden Stereokanäle umgekehrt. + sfx_mute Bool Falls „true“, werden Geräusche unterdrückt. + +Flight of the Amazon Queen verfügt zusätzlich über folgende nicht standardmäßige +Schlüsselwörter: + + music_mute Bool Falls „true“, wird Musik unterdrückt. + sfx_mute Bool Falls „true“, werden Geräusche unterdrückt. + +Die Windows-Version von King's Quest VI verfügt zusätzlich über folgendes nicht +standardmäßiges Schlüsselwort: + + windows_cursors Bool Falls „true“, werden die originalen + unskalierten, schwarz-weißen Windows-Zeiger + anstatt der von DOS verwendet. Wenn „false“, + werden die DOS-Zeiger in der Windows-Version + verwendet - hochskaliert, um zum Rest der + hochskalierten Grafiken zu passen. + +Simon the Sorcerer 1 und 2 verfügen zusätzlich über folgende nicht +standardmäßige Schlüsselwörter: + + music_mute Bool Falls „true“, wird Musik unterdrückt. + sfx_mute Bool Falls „true“, werden Geräusche unterdrückt. + +The Legend of Kyrandia verfügt zusätzlich über folgendes nicht standardmäßiges +Schlüsselwort: + + walkspeed Zahl Bewegungsgeschwindigkeit (0-4) + + +9.0) Kompilierung: +---- ------------- +Für eine aktuelle Übersicht dazu, wie man ScummVM für unterschiedliche +Plattformen kompiliert, schauen Sie bitte in unserem Wiki nach, insbesondere auf +dieser Seite: + http://wiki.scummvm.org/index.php/Compiling_ScummVM + +Wenn Sie für Windows, Linux oder Mac OS X kompilieren, benötigen Sie SDL-1.2.2 +oder höher (ältere Versionen funktionieren möglicherweise, haben aber keinen +Support) und einen unterstützten Kompilierer. Mehrere Kompilierer, +einschließlich GCC, mingw und neue Versionen von Microsoft Visual C++ werden +unterstützt. Wenn Sie mit MP3 komprimierte CD-Titel oder .SOU-Dateien verwenden +möchten, müssen Sie die MAD-Bibliothek installieren; ebenso benötigen Sie die +geeigneten Bibliotheken für Sound-Dateien, die mit Ogg Vorbis und FLAC +komprimiert wurden. Für komprimierte Speicherstände ist zlib erforderlich. + +Von einigen Teilen in ScummVM, insbesondere Grafikwandlern, gibt es stark +optimierte Versionen, die in Assembler geschrieben sind. Wenn Sie diese +verwenden möchten, müssen Sie den Assembler nasm installieren +(siehe http://nasm.sf.net). Beachten Sie, dass wir momentan nur für x86 MMX +optimierte Versionen haben und diese auf keinem anderen Prozessor kompiliert +werden. + +Bei Win9x/NT/XP können Sie USE_WINDBG definieren und WinDbg anhängen, um +Debug-Nachrichten zu durchsuchen +(siehe http://www.sysinternals.com/ntw2k/freeware/debugview.shtml). + + GCC und MinGW32: + * Geben Sie „./configure“ ein. + * Geben Sie „make“ ein (oder „gmake“ bzw. „gnumake“, abhängig davon, auf + welchem GNU der Befehl „make“ auf Ihrem System aufgerufen wird) und mit + etwas Glück wird ScummVM für Sie kompiliert. + * Weitere Information finden Sie hier: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/GCC + entsprechend + http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW + + Microsoft Visual C++ 8/9/10: + * Lesen Sie nach, wie man die Projektmappendatei in „dists\msvc8“ bzw. + entsprechend in „dists\msvc9“ oder „dists\msvc10“ erstellt. + * Öffnen Sie die erstellte Projektmappendatei. + * Geben Sie die Pfade zu den benötigten Bibliotheksdateien + und Includedateien unter + „Extras|Optionen|Projekte und Projektmappen|VC++-Verzeichnisse“ ein. + * Jetzt sollte das Programm erfolgreich kompiliert werden können. + * Weitere Information finden Sie hier: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/VS2005 + + Windows Mobile: + * Bitte lesen Sie: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE + + Debian GNU/Linux: + * Installieren Sie die Pakete „build-essential“, „fakeroot“, „debhelper“, + und „libsdl1.2-dev“ auf Ihrem Betriebssystem. + * Installieren Sie beliebig viele der folgenden Pakete (optional): + „libvorbis-dev“ (für Ogg-Vorbis-Unterstützung), „libasound2-dev“ (für + ALSA-Sequenzer-Unterstützung), „libmad0-dev“ (für MAD-MP3-Unterstützung), + „zlib1g-dev“ (für Unterstützung von komprimierten Spielständen) + * Rufen Sie „make deb“ auf. + * Rufen Sie zum Schluss „dpkg -i ../scummvm-cvs*deb“ auf und + Sie sind fertig. + + Mac OS X: + * Stellen Sie sicher, dass Sie die „Developer“-Tools installiert haben. + * Das „Developer“-Paket von SDL für OS X, das auf der SDL-Website + zur Verfügung steht, ist _nicht_ geeignet. Sie benötigen stattdessen eine + SDL-Zusammenstellung im UNIX-Stil. Eine Möglichkeit, diese zu erhalten, + ist, SDL über Fink zu installieren (http://fink.sf.net). Alternativ können + Sie SDL mittels Quellcode manuell kompilieren, indem Sie dessen + UNIX-Zusammenstellungssystem verwenden (configure && make). + * Geben Sie „./configure“ im ScummVM-Verzeichnis ein. + * Sie können nun „make“ eingeben, um eine von der Kommandozeile aus + aufrufbare Binärdatei zu erstellen. + * Um eine Version zu erhalten, die Sie vom Finder aus aufrufen können, geben + Sie „make bundle“ ein, wodurch ScummVM.app erstellt wird (das funktioniert + nur dann auf Anhieb, wenn Sie SDL in das Verzeichnis /sw installiert haben + [wie es bei der Verwendung von Fink getan wird]. + Wenn Sie SDL auf andere Weise installiert haben, müssen Sie + die Datei ports.mk von ScummVM bearbeiten. + * Weitere Information finden Sie hier: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/MacOS_X_Crosscompiling + + AmigaOS 4 (Cross-Kompilation mit Cygwin): + * Stellen Sie sicher, dass Sie SDL installiert haben. Sie benötigen + womöglich auch libogg, libvorbis, libvorbisfile, zlib und libmad. + * Geben Sie „./configure --host=ppc-amigaos“ ein. + * Wenn Sie einen Fehler wegen sdl-config erhalten, verwenden Sie den + Parameter „--with-sdl-prefix“, um den Pfad zu bestimmen. + * Überprüfen Sie die Datei „config.mk“ und wenn alles in Ordnung + zu sein scheint: + * Rufen Sie „make“ auf. + * Cross-Kompilation mit Linux ist womöglich genau so einfach. + + iPhone: + * Bitte lesen Sie: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/iPhone + + Maemo: + * Besorgen Sie sich die Scratchbox-Umgebung mit Maemo 2.2 rootstrap + (2.2 ist für 770 und höher). + * Installieren Sie libmad, Tremor und FLAC mittels Quellcode. + * Patchen Sie den ScummVM-Quellcode (einige Dinge sind momentan zu unsauber, + um direkt in Git eingebunden zu sein): + patch -p1 < backends/platform/maemo/scummvm-[currentversion]-maemo.patch + * Aktualisieren Sie debian/changelog. + * Rufen Sie „fakeroot dpkg-buildpackage -b -d“ auf. + +------------------------------------------------------------------------ +Viel Glück und viel Spaß beim Spielen! +Das ScummVM-Team. +http://www.scummvm.org/ +------------------------------------------------------------------------ + + +(Deutscher Text basiert auf README mit SHA1 ID: +d31bf017a9e717759f2410a8d355cf43b3418c4c) -- cgit v1.2.3 From 26107fdc55dd9000a3928c6833d94291acb089dd Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Wed, 10 Aug 2011 11:30:01 +1000 Subject: BUILD: Install documentation based on language chosen during installation. --- dists/win32/ScummVM.iss | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss index 8edc647e62..7179450459 100644 --- a/dists/win32/ScummVM.iss +++ b/dists/win32/ScummVM.iss @@ -54,8 +54,12 @@ Name: {group}\Authors; Filename: {app}\AUTHORS.txt; WorkingDir: {app}; Comment: Name: {group}\Copying; Filename: {app}\COPYING.txt; WorkingDir: {app}; Comment: COPYING; Flags: createonlyiffileexists Name: {group}\Copying.LGPL; Filename: {app}\COPYING.LGPL.txt; WorkingDir: {app}; Comment: COPYING.LGPL; Flags: createonlyiffileexists Name: {group}\Copyright; Filename: {app}\COPYRIGHT.txt; WorkingDir: {app}; Comment: COPYRIGHT; Flags: createonlyiffileexists -Name: {group}\Readme; Filename: {app}\README.txt; WorkingDir: {app}; Comment: README; Flags: createonlyiffileexists Name: {group}\News; Filename: {app}\NEWS.txt; WorkingDir: {app}; Comment: NEWS; Flags: createonlyiffileexists +Name: {group}\QuickStart; Filename: {app}\QUICKSTART.txt; WorkingDir: {app}; Comment: QUICKSTART; Flags: createonlyiffileexists; Languages: not (fr or de) +Name: {group}\QuickStart_fr; Filename: {app}\QuickStart_fr.txt; WorkingDir: {app}; Comment: QuickStart_fr; Flags: createonlyiffileexists; Languages: fr +Name: {group}\Readme; Filename: {app}\README.txt; WorkingDir: {app}; Comment: README; Flags: createonlyiffileexists; Languages: not de +Name: {group}\Liesmich; Filename: {app}\Liesmich.txt; WorkingDir: {app}; Comment: Liesmich; Flags: createonlyiffileexists; Languages: de +Name: {group}\Schnellstart; Filename: {app}\Schnellstart.txt; WorkingDir: {app}; Comment: Schnellstart; Flags: createonlyiffileexists; Languages: de [Run] Filename: {app}\scummvm.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent; Description: Launch ScummVM @@ -69,7 +73,11 @@ Source: COPYING.txt; DestDir: {app}; Flags: ignoreversion Source: COPYING.LGPL.txt; DestDir: {app}; Flags: ignoreversion Source: COPYRIGHT.txt; DestDir: {app}; Flags: ignoreversion Source: NEWS.txt; DestDir: {app}; Flags: ignoreversion -Source: README.txt; DestDir: {app}; Flags: ignoreversion isreadme +Source: doc/QUICKSTART.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: not (fr or de) +Source: doc/fr/QuickStart_fr.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: fr +Source: doc/de/Schnellstart.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: de +Source: README.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: not de +Source: doc/de/Liesmich.txt; DestDir: {app}; Flags: ignoreversion isreadme; Languages: de Source: README-SDL.txt; DestDir: {app}; Flags: ignoreversion Source: scummvm.exe; DestDir: {app}; Flags: ignoreversion Source: SDL.dll; DestDir: {app} -- cgit v1.2.3 From 1dcab5aeddc922830a475332d00b6d24d09a172c Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Wed, 10 Aug 2011 13:00:43 +1000 Subject: BUILD: Only use supported languages in Windows installer script. --- dists/win32/ScummVM.iss | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss index 7179450459..405ef0ef30 100644 --- a/dists/win32/ScummVM.iss +++ b/dists/win32/ScummVM.iss @@ -25,26 +25,18 @@ LanguageDetectionMethod=uilanguage [Languages] Name: en; MessagesFile: compiler:Default.isl -Name: eu; MessagesFile: compiler:Languages\Basque.isl Name: br; MessagesFile: compiler:Languages\BrazilianPortuguese.isl Name: ca; MessagesFile: compiler:Languages\Catalan.isl Name: cz; MessagesFile: compiler:Languages\Czech.isl Name: da; MessagesFile: compiler:Languages\Danish.isl -Name: nl; MessagesFile: compiler:Languages\Dutch.isl -Name: fi; MessagesFile: compiler:Languages\Finnish.isl Name: fr; MessagesFile: compiler:Languages\French.isl Name: de; MessagesFile: compiler:Languages\German.isl -Name: he; MessagesFile: compiler:Languages\Hebrew.isl +Name: es; MessagesFile: compiler:Languages\Spanish.isl Name: hu; MessagesFile: compiler:Languages\Hungarian.isl Name: it; MessagesFile: compiler:Languages\Italian.isl -Name: ja; MessagesFile: compiler:Languages\Japanese.isl Name: nb; MessagesFile: compiler:Languages\Norwegian.isl Name: pl; MessagesFile: compiler:Languages\Polish.isl -Name: pt; MessagesFile: compiler:Languages\Portuguese.isl Name: ru; MessagesFile: compiler:Languages\Russian.isl -Name: sk; MessagesFile: compiler:Languages\Slovak.isl -Name: sl; MessagesFile: compiler:Languages\Slovenian.isl -Name: es; MessagesFile: compiler:Languages\Spanish.isl [Icons] Name: {group}\{cm:UninstallProgram, ScummVM}; Filename: {uninstallexe} @@ -62,7 +54,7 @@ Name: {group}\Liesmich; Filename: {app}\Liesmich.txt; WorkingDir: {app}; Comment Name: {group}\Schnellstart; Filename: {app}\Schnellstart.txt; WorkingDir: {app}; Comment: Schnellstart; Flags: createonlyiffileexists; Languages: de [Run] -Filename: {app}\scummvm.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent; Description: Launch ScummVM +Filename: {app}\scummvm.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent [UninstallDelete] Type: files; Name: {app}\ISTool.url -- cgit v1.2.3 From 579cc2376017fd18f18a514470030b27a9206bb5 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Wed, 10 Aug 2011 13:55:34 +1000 Subject: BUILD: Remove English specific launch message in Windows installer script. --- dists/win32/ScummVM.iss | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss index 405ef0ef30..5a66d8c224 100644 --- a/dists/win32/ScummVM.iss +++ b/dists/win32/ScummVM.iss @@ -25,18 +25,26 @@ LanguageDetectionMethod=uilanguage [Languages] Name: en; MessagesFile: compiler:Default.isl +Name: eu; MessagesFile: compiler:Languages\Basque.isl Name: br; MessagesFile: compiler:Languages\BrazilianPortuguese.isl Name: ca; MessagesFile: compiler:Languages\Catalan.isl Name: cz; MessagesFile: compiler:Languages\Czech.isl Name: da; MessagesFile: compiler:Languages\Danish.isl +Name: nl; MessagesFile: compiler:Languages\Dutch.isl +Name: fi; MessagesFile: compiler:Languages\Finnish.isl Name: fr; MessagesFile: compiler:Languages\French.isl Name: de; MessagesFile: compiler:Languages\German.isl -Name: es; MessagesFile: compiler:Languages\Spanish.isl +Name: he; MessagesFile: compiler:Languages\Hebrew.isl Name: hu; MessagesFile: compiler:Languages\Hungarian.isl Name: it; MessagesFile: compiler:Languages\Italian.isl +Name: ja; MessagesFile: compiler:Languages\Japanese.isl Name: nb; MessagesFile: compiler:Languages\Norwegian.isl Name: pl; MessagesFile: compiler:Languages\Polish.isl +Name: pt; MessagesFile: compiler:Languages\Portuguese.isl Name: ru; MessagesFile: compiler:Languages\Russian.isl +Name: sk; MessagesFile: compiler:Languages\Slovak.isl +Name: sl; MessagesFile: compiler:Languages\Slovenian.isl +Name: es; MessagesFile: compiler:Languages\Spanish.isl [Icons] Name: {group}\{cm:UninstallProgram, ScummVM}; Filename: {uninstallexe} @@ -54,7 +62,7 @@ Name: {group}\Liesmich; Filename: {app}\Liesmich.txt; WorkingDir: {app}; Comment Name: {group}\Schnellstart; Filename: {app}\Schnellstart.txt; WorkingDir: {app}; Comment: Schnellstart; Flags: createonlyiffileexists; Languages: de [Run] -Filename: {app}\scummvm.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent +Filename: {app}\ScummVM.exe; Flags: nowait skipifdoesntexist postinstall skipifsilent [UninstallDelete] Type: files; Name: {app}\ISTool.url -- cgit v1.2.3 From f049e6788ae029e5e0750408e3571037acfb2abd Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Wed, 10 Aug 2011 14:20:25 +1000 Subject: BUILD: Only use supported languages in Windows installer script. --- dists/win32/ScummVM.iss | 8 -------- 1 file changed, 8 deletions(-) diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss index 5a66d8c224..17afb23716 100644 --- a/dists/win32/ScummVM.iss +++ b/dists/win32/ScummVM.iss @@ -25,25 +25,17 @@ LanguageDetectionMethod=uilanguage [Languages] Name: en; MessagesFile: compiler:Default.isl -Name: eu; MessagesFile: compiler:Languages\Basque.isl Name: br; MessagesFile: compiler:Languages\BrazilianPortuguese.isl Name: ca; MessagesFile: compiler:Languages\Catalan.isl Name: cz; MessagesFile: compiler:Languages\Czech.isl Name: da; MessagesFile: compiler:Languages\Danish.isl -Name: nl; MessagesFile: compiler:Languages\Dutch.isl -Name: fi; MessagesFile: compiler:Languages\Finnish.isl Name: fr; MessagesFile: compiler:Languages\French.isl Name: de; MessagesFile: compiler:Languages\German.isl -Name: he; MessagesFile: compiler:Languages\Hebrew.isl Name: hu; MessagesFile: compiler:Languages\Hungarian.isl Name: it; MessagesFile: compiler:Languages\Italian.isl -Name: ja; MessagesFile: compiler:Languages\Japanese.isl Name: nb; MessagesFile: compiler:Languages\Norwegian.isl Name: pl; MessagesFile: compiler:Languages\Polish.isl -Name: pt; MessagesFile: compiler:Languages\Portuguese.isl Name: ru; MessagesFile: compiler:Languages\Russian.isl -Name: sk; MessagesFile: compiler:Languages\Slovak.isl -Name: sl; MessagesFile: compiler:Languages\Slovenian.isl Name: es; MessagesFile: compiler:Languages\Spanish.isl [Icons] -- cgit v1.2.3 From edbec1cccbe52a85b579cdfb4ecbe5f6276a2506 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 16:54:23 +0200 Subject: DREAMWEB: Improvement of 'printchar' signature --- engines/dreamweb/print.cpp | 12 ++++++------ engines/dreamweb/stubs.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index d29a073960..98cb4f612d 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -35,7 +35,7 @@ void DreamGenContext::printboth() { void DreamGenContext::printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { uint16 newX = *x; uint8 width, height; - printchar(src, &newX, y, c, nextChar, &width, &height); + printchar(segRef(src).ptr(0, 0), &newX, y, c, nextChar, &width, &height); multidump(*x, y, width, height); *x = newX; } @@ -76,13 +76,13 @@ void DreamGenContext::getnextword() { void DreamGenContext::printchar() { uint16 x = di; uint8 width, height; - printchar(ds, &x, bx, al, ah, &width, &height); + printchar(ds.ptr(0, 0), &x, bx, al, ah, &width, &height); di = x; cl = width; ch = height; } -void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { +void DreamGenContext::printchar(const void *src, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { if (c == 255) return; push(si); @@ -90,8 +90,7 @@ void DreamGenContext::printchar(uint16 src, uint16* x, uint16 y, uint8 c, uint8 if (data.byte(kForeignrelease) != 0) y -= 3; uint16 tmp = c - 32 + data.word(kCharshift); - ds = src; - showframe(ds.ptr(0, 0), *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); + showframe(src, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); @@ -169,6 +168,7 @@ void DreamGenContext::printdirect() { void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered) { data.word(kLastxpos) = x; ds = data.word(kCurrentset); + const void *src = ds.ptr(0, 0); while (true) { uint16 offset = x; uint8 charCount = getnumber(si, maxWidth, centered, &offset); @@ -182,7 +182,7 @@ void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool cent } c = engine->modifyChar(c); uint8 width, height; - printchar(ds, &i, *y, c, nextChar, &width, &height); + printchar(src, &i, *y, c, nextChar, &width, &height); data.word(kLastxpos) = i; --charCount; } while(charCount); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 746a75b97b..b9c5936907 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -46,7 +46,7 @@ void printboth(); void printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); - void printchar(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); + void printchar(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); void printdirect(); void printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); -- cgit v1.2.3 From d8cbea02f9aa9d2795ccc683c02ab9a20479b067 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 17:03:02 +0200 Subject: DREAMWEB: Improvement of 'getnumber' signature --- engines/dreamweb/print.cpp | 12 ++++++------ engines/dreamweb/stubs.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 98cb4f612d..36cfc7695d 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -109,7 +109,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center ds = data.word(kCharset1); do { uint16 offset = x; - uint16 charCount = getnumber(si, maxWidth, centered, &offset); + uint16 charCount = getnumber(es.ptr(si, 0), maxWidth, centered, &offset); do { push(si); push(es); @@ -171,7 +171,7 @@ void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool cent const void *src = ds.ptr(0, 0); while (true) { uint16 offset = x; - uint8 charCount = getnumber(si, maxWidth, centered, &offset); + uint8 charCount = getnumber(es.ptr(si, 0), maxWidth, centered, &offset); uint16 i = offset; do { uint8 c = es.byte(si); @@ -192,17 +192,17 @@ void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool cent void DreamGenContext::getnumber() { uint16 offset = di; - cl = getnumber(si, dl, (bool)(dl & 1), &offset); + cl = getnumber(es.ptr(si, 0), dl, (bool)(dl & 1), &offset); di = offset; } -uint8 DreamGenContext::getnumber(uint16 index, uint16 maxWidth, bool centered, uint16* offset) { +uint8 DreamGenContext::getnumber(const uint8 *string, uint16 maxWidth, bool centered, uint16* offset) { uint8 totalWidth = 0; uint8 charCount = 0; while (true) { uint8 wordTotalWidth, wordCharCount; - uint8 done = getnextword(es.ptr(index, 0), &wordTotalWidth, &wordCharCount); - index += wordCharCount; + uint8 done = getnextword(string, &wordTotalWidth, &wordCharCount); + string += wordCharCount; if (done == 1) { //endoftext ax = totalWidth + wordTotalWidth - 10; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index b9c5936907..10cb6568d2 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -56,7 +56,7 @@ void printslow(); void dumptextline(); void getnumber(); - uint8 getnumber(uint16 index, uint16 maxWidth, bool centered, uint16 *offset); + uint8 getnumber(const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset); void kernchars(); uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); void getroomdata(); -- cgit v1.2.3 From 78e337203d35000ac0f4b7fe653db230d50beec3 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 17:12:26 +0200 Subject: DREAMWEB: Improvement of 'printdirect' signature and register usage --- engines/dreamweb/print.cpp | 16 ++++++++++------ engines/dreamweb/stubs.cpp | 3 ++- engines/dreamweb/stubs.h | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 36cfc7695d..5859722633 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -161,22 +161,26 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center void DreamGenContext::printdirect() { uint16 y = bx; - printdirect(di, &y, dl, (bool)(dl & 1)); + uint16 initialSi = si; + const uint8 *initialString = es.ptr(si, 0); + const uint8 *string = initialString; + printdirect(&string, di, &y, dl, (bool)(dl & 1)); + si = initialSi + (string - initialString); bx = y; } -void DreamGenContext::printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered) { +void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) { data.word(kLastxpos) = x; ds = data.word(kCurrentset); const void *src = ds.ptr(0, 0); while (true) { uint16 offset = x; - uint8 charCount = getnumber(es.ptr(si, 0), maxWidth, centered, &offset); + uint8 charCount = getnumber(*string, maxWidth, centered, &offset); uint16 i = offset; do { - uint8 c = es.byte(si); - uint8 nextChar = es.byte(si+1); - ++si; + uint8 c = (*string)[0]; + uint8 nextChar = (*string)[1]; + ++(*string); if ((c == 0) || (c == ':')) { return; } diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index cd6a9d6b4f..4bc631cef0 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -320,8 +320,9 @@ void DreamGenContext::usetimedtext() { es = data.word(kTimedseg); si = data.word(kTimedoffset); + const uint8 *string = es.ptr(si, 0); uint16 y = data.byte(kTimedy); - printdirect(data.byte(kTimedx), &y, 237, true); + printdirect(&string, data.byte(kTimedx), &y, 237, true); data.byte(kNeedtodumptimed) = 1; } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 10cb6568d2..b0c0370803 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -48,7 +48,7 @@ void printchar(); void printchar(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); void printdirect(); - void printdirect(uint16 x, uint16 *y, uint8 maxWidth, bool centered); + void printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); void getundertimed(); void putundertimed(); -- cgit v1.2.3 From 81a522e03ee05716f06cb541511f165d138e104a Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 17:20:34 +0200 Subject: DREAMWEB: Improvement of 'printslow' signature --- engines/dreamweb/print.cpp | 11 ++++++----- engines/dreamweb/stubs.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 5859722633..e1f446a978 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -28,14 +28,14 @@ namespace DreamGen { void DreamGenContext::printboth() { uint16 x = di; - printboth(ds, &x, bx, al, ah); + printboth(ds.ptr(0, 0), &x, bx, al, ah); di = x; } -void DreamGenContext::printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { +void DreamGenContext::printboth(const void* src, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { uint16 newX = *x; uint8 width, height; - printchar(segRef(src).ptr(0, 0), &newX, y, c, nextChar, &width, &height); + printchar(src, &newX, y, c, nextChar, &width, &height); multidump(*x, y, width, height); *x = newX; } @@ -107,6 +107,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center data.byte(kPointerframe) = 1; data.byte(kPointermode) = 3; ds = data.word(kCharset1); + const void* src = ds.ptr(0, 0); do { uint16 offset = x; uint16 charCount = getnumber(es.ptr(si, 0), maxWidth, centered, &offset); @@ -119,7 +120,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center push(es); push(ds); c0 = engine->modifyChar(c0); - printboth(ds, &offset, y, c0, c1); + printboth(src, &offset, y, c0, c1); ds = pop(); es = pop(); ++si; @@ -134,7 +135,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center c1 = engine->modifyChar(c1); data.word(kCharshift) = 91; uint16 offset2 = offset; - printboth(ds, &offset2, y, c1, c2); + printboth(src, &offset2, y, c1, c2); data.word(kCharshift) = 0; es = pop(); ds = pop(); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index b0c0370803..840a47384d 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -44,7 +44,7 @@ void getnextword(); uint8 getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount); void printboth(); - void printboth(uint16 src, uint16 *x, uint16 y, uint8 c, uint8 nextChar); + void printboth(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); void printchar(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); void printdirect(); -- cgit v1.2.3 From 80f712b5b9d15e87f29aea8992fbd1896a7eddfd Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 17:34:41 +0200 Subject: DREAMWEB: 'multidump' doesn't dirty ds anymore --- engines/dreamweb/vgagrafx.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index ed195aa551..bb7f30fdb5 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -80,10 +80,9 @@ void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, ui } void DreamGenContext::multidump(uint16 x, uint16 y, uint8 width, uint8 height) { - ds = data.word(kWorkspace); unsigned offset = x + y * kScreenwidth; //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset); - engine->blit(ds.ptr(offset, width * height), kScreenwidth, x, y, width, height); + engine->blit(workspace() + offset, kScreenwidth, x, y, width, height); } void DreamGenContext::multidump() { -- cgit v1.2.3 From a710b32c615d2d8bdf3c07f5e9674d37d40a009d Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Wed, 10 Aug 2011 17:35:55 +0200 Subject: DREAMWEB: Removed useless push/pops --- engines/dreamweb/print.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index e1f446a978..105f7e14f9 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -117,12 +117,8 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center uint8 c0 = es.byte(si); uint8 c1 = es.byte(si+1); uint8 c2 = es.byte(si+2); - push(es); - push(ds); c0 = engine->modifyChar(c0); printboth(src, &offset, y, c0, c1); - ds = pop(); - es = pop(); ++si; if ((c1 == 0) || (c1 == ':')) { es = pop(); @@ -130,15 +126,11 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center return 0; } if (charCount != 1) { - push(ds); - push(es); c1 = engine->modifyChar(c1); data.word(kCharshift) = 91; uint16 offset2 = offset; printboth(src, &offset2, y, c1, c2); data.word(kCharshift) = 0; - es = pop(); - ds = pop(); for (int i=0; i<2; ++i) { waitframes(); if (ax == 0) -- cgit v1.2.3 From cea06991ebab97c72e9fd89a4bf63835bcf0de80 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 10 Aug 2011 18:15:00 +0200 Subject: TIMER: Remove name of callback in removeTimerProc. This should fix #3389673 "LOOM: CD-Version crashes at start". It also fixes the same error showing up for me in Monkey CD. The doc changes in 4c7958450f628937270f claims the name is used for the event recorder, but as far as I can tell it is not used right now. Thus depending on how it is used the behavior of SCUMM removing and adding the same timer aagain *might* cause problems. In any way we need to remove the name in removeTimerProc, else RTL + launching the same game again would be broken too. --- backends/timer/default/default-timer.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index efb3ec9ad9..28524bf3b5 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -161,4 +161,11 @@ void DefaultTimerManager::removeTimerProc(TimerProc callback) { slot = slot->next; } } + + for (TimerSlotMap::iterator i = _callbacks.begin(), end = _callbacks.end(); i != end; ++i) { + if (i->_value == callback) { + _callbacks.erase(i); + break; + } + } } -- cgit v1.2.3 From c443f113ed5729b88792d3b54b77d70033cb24dc Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 10 Aug 2011 18:34:08 +0200 Subject: TIMER: Remove all names associated with a callback, since all callbacks are removed. This makes the name removal consistent with the timer proc removal. It seems we only allow a specific timer proc being added once anymore though. So this should not change too much right now. --- backends/timer/default/default-timer.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index 28524bf3b5..5b133660e0 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -163,9 +163,7 @@ void DefaultTimerManager::removeTimerProc(TimerProc callback) { } for (TimerSlotMap::iterator i = _callbacks.begin(), end = _callbacks.end(); i != end; ++i) { - if (i->_value == callback) { + if (i->_value == callback) _callbacks.erase(i); - break; - } } } -- cgit v1.2.3 From 930f626daba5de8ec0b42fd32ba7ddf107e7d95a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 10 Aug 2011 18:42:19 +0200 Subject: TIMER: Add a comment to explain why we remove the name in removeTimerProc. --- backends/timer/default/default-timer.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index 5b133660e0..e1aadb62b8 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -162,6 +162,18 @@ void DefaultTimerManager::removeTimerProc(TimerProc callback) { } } + // We need to remove all names referencing the timer proc here. + // + // Else we run into troubles, when the client code removes and readds timer + // callbacks. + // + // Another issues occurs when one plays a game with ALSA as music driver, + // does RTL and starts a different engine game with ALSA as music driver. + // In this case the MPU401 code will add different timer procs with the + // same name, resulting in two different callbacks added with the same + // name and causing installTimerProc to error out. + // A good test case is running a SCUMM with ALSA output and then a KYRA + // game for example. for (TimerSlotMap::iterator i = _callbacks.begin(), end = _callbacks.end(); i != end; ++i) { if (i->_value == callback) _callbacks.erase(i); -- cgit v1.2.3 From 2739d8fa205c22319de37bfde570b7a39f9f2c13 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 10 Aug 2011 21:23:33 +0200 Subject: COMPOSER: Add detection for Dragor FR and Gregory FR --- engines/composer/detection.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/engines/composer/detection.cpp b/engines/composer/detection.cpp index c4e98fadd7..8c97b6c4db 100644 --- a/engines/composer/detection.cpp +++ b/engines/composer/detection.cpp @@ -120,6 +120,19 @@ static const ComposerGameDescription gameDescriptions[] = { GType_ComposerV2 }, + { // Provided by Strangerke, "CD-Rom 100% Malin" Pack + { + "darby", + 0, + AD_ENTRY1("book.ini", "285308372f7dddff2ca5a25c9192cf5c"), + Common::FR_FRA, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_ComposerV2 + }, + { { "gregory", @@ -133,6 +146,19 @@ static const ComposerGameDescription gameDescriptions[] = { GType_ComposerV2 }, + { // Provided by Strangerke, "CD-Rom 100% Malin" Pack + { + "gregory", + 0, + AD_ENTRY1("book.ini", "e54fc5c00de5f94e908a969e445af5d0"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_ComposerV2 + }, + { { "princess", -- cgit v1.2.3 From 3e9773a858b5d710845d7a188dbebbada1101887 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 02:27:41 +0200 Subject: DREAMWEB: Stricter typing in the printing subsystem --- engines/dreamweb/print.cpp | 38 +++++++++++++++++++------------------- engines/dreamweb/stubs.h | 8 ++++---- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 105f7e14f9..f8dddf3f4e 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -28,19 +28,19 @@ namespace DreamGen { void DreamGenContext::printboth() { uint16 x = di; - printboth(ds.ptr(0, 0), &x, bx, al, ah); + printboth((const Frame *)ds.ptr(0, 0), &x, bx, al, ah); di = x; } -void DreamGenContext::printboth(const void* src, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { +void DreamGenContext::printboth(const Frame *charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { uint16 newX = *x; uint8 width, height; - printchar(src, &newX, y, c, nextChar, &width, &height); + printchar(charSet, &newX, y, c, nextChar, &width, &height); multidump(*x, y, width, height); *x = newX; } -uint8 DreamGenContext::getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount) { +uint8 DreamGenContext::getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount) { *totalWidth = 0; *charCount = 0; while(true) { @@ -58,7 +58,7 @@ uint8 DreamGenContext::getnextword(const uint8 *string, uint8 *totalWidth, uint8 firstChar = engine->modifyChar(firstChar); if (firstChar != 255) { uint8 secondChar = *string; - uint8 width = ds.byte(6*(firstChar - 32 + data.word(kCharshift))); + uint8 width = charSet[firstChar - 32 + data.word(kCharshift)].width; width = kernchars(firstChar, secondChar, width); *totalWidth += width; } @@ -67,7 +67,7 @@ uint8 DreamGenContext::getnextword(const uint8 *string, uint8 *totalWidth, uint8 void DreamGenContext::getnextword() { uint8 totalWidth, charCount; - al = getnextword(es.ptr(di, 0), &totalWidth, &charCount); + al = getnextword((Frame *)ds.ptr(0, 0), es.ptr(di, 0), &totalWidth, &charCount); bl = totalWidth; bh = charCount; di += charCount; @@ -76,13 +76,13 @@ void DreamGenContext::getnextword() { void DreamGenContext::printchar() { uint16 x = di; uint8 width, height; - printchar(ds.ptr(0, 0), &x, bx, al, ah, &width, &height); + printchar((const Frame *)ds.ptr(0, 0), &x, bx, al, ah, &width, &height); di = x; cl = width; ch = height; } -void DreamGenContext::printchar(const void *src, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { +void DreamGenContext::printchar(const Frame *charSet, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) { if (c == 255) return; push(si); @@ -90,7 +90,7 @@ void DreamGenContext::printchar(const void *src, uint16* x, uint16 y, uint8 c, u if (data.byte(kForeignrelease) != 0) y -= 3; uint16 tmp = c - 32 + data.word(kCharshift); - showframe(src, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); + showframe(charSet, *x, y, tmp & 0x1ff, (tmp >> 8) & 0xfe, width, height); di = pop(); si = pop(); _cmp(data.byte(kKerning), 0); @@ -107,10 +107,10 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center data.byte(kPointerframe) = 1; data.byte(kPointermode) = 3; ds = data.word(kCharset1); - const void* src = ds.ptr(0, 0); + const Frame* charSet = (const Frame *)ds.ptr(0, 0); do { uint16 offset = x; - uint16 charCount = getnumber(es.ptr(si, 0), maxWidth, centered, &offset); + uint16 charCount = getnumber(charSet, es.ptr(si, 0), maxWidth, centered, &offset); do { push(si); push(es); @@ -118,7 +118,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center uint8 c1 = es.byte(si+1); uint8 c2 = es.byte(si+2); c0 = engine->modifyChar(c0); - printboth(src, &offset, y, c0, c1); + printboth(charSet, &offset, y, c0, c1); ++si; if ((c1 == 0) || (c1 == ':')) { es = pop(); @@ -129,7 +129,7 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center c1 = engine->modifyChar(c1); data.word(kCharshift) = 91; uint16 offset2 = offset; - printboth(src, &offset2, y, c1, c2); + printboth(charSet, &offset2, y, c1, c2); data.word(kCharshift) = 0; for (int i=0; i<2; ++i) { waitframes(); @@ -165,10 +165,10 @@ void DreamGenContext::printdirect() { void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) { data.word(kLastxpos) = x; ds = data.word(kCurrentset); - const void *src = ds.ptr(0, 0); + const Frame *charSet = (const Frame *)ds.ptr(0, 0); while (true) { uint16 offset = x; - uint8 charCount = getnumber(*string, maxWidth, centered, &offset); + uint8 charCount = getnumber(charSet, *string, maxWidth, centered, &offset); uint16 i = offset; do { uint8 c = (*string)[0]; @@ -179,7 +179,7 @@ void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uin } c = engine->modifyChar(c); uint8 width, height; - printchar(src, &i, *y, c, nextChar, &width, &height); + printchar(charSet, &i, *y, c, nextChar, &width, &height); data.word(kLastxpos) = i; --charCount; } while(charCount); @@ -189,16 +189,16 @@ void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uin void DreamGenContext::getnumber() { uint16 offset = di; - cl = getnumber(es.ptr(si, 0), dl, (bool)(dl & 1), &offset); + cl = getnumber((Frame *)ds.ptr(0, 0), es.ptr(si, 0), dl, (bool)(dl & 1), &offset); di = offset; } -uint8 DreamGenContext::getnumber(const uint8 *string, uint16 maxWidth, bool centered, uint16* offset) { +uint8 DreamGenContext::getnumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16* offset) { uint8 totalWidth = 0; uint8 charCount = 0; while (true) { uint8 wordTotalWidth, wordCharCount; - uint8 done = getnextword(string, &wordTotalWidth, &wordCharCount); + uint8 done = getnextword(charSet, string, &wordTotalWidth, &wordCharCount); string += wordCharCount; if (done == 1) { //endoftext diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 840a47384d..5ac340feea 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -42,11 +42,11 @@ void randomnumber(); void quickquit2(); void getnextword(); - uint8 getnextword(const uint8 *string, uint8 *totalWidth, uint8 *charCount); + uint8 getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount); void printboth(); - void printboth(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar); + void printboth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); - void printchar(const void *src, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); + void printchar(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); void printdirect(); void printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); @@ -56,7 +56,7 @@ void printslow(); void dumptextline(); void getnumber(); - uint8 getnumber(const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset); + uint8 getnumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset); void kernchars(); uint8 kernchars(uint8 firstChar, uint8 secondChar, uint8 width); void getroomdata(); -- cgit v1.2.3 From b701deed4f192f29b92fadb50275e2bdb5c39959 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 02:30:25 +0200 Subject: DREAMWEB: Less ds pollution in 'printslow' and 'printdirect' --- engines/dreamweb/print.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index f8dddf3f4e..9e4c416015 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -106,8 +106,7 @@ void DreamGenContext::printslow() { uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool centered) { data.byte(kPointerframe) = 1; data.byte(kPointermode) = 3; - ds = data.word(kCharset1); - const Frame* charSet = (const Frame *)ds.ptr(0, 0); + const Frame* charSet = (const Frame *)segRef(data.word(kCharset1)).ptr(0, 0); do { uint16 offset = x; uint16 charCount = getnumber(charSet, es.ptr(si, 0), maxWidth, centered, &offset); @@ -164,8 +163,7 @@ void DreamGenContext::printdirect() { void DreamGenContext::printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) { data.word(kLastxpos) = x; - ds = data.word(kCurrentset); - const Frame *charSet = (const Frame *)ds.ptr(0, 0); + const Frame *charSet = (const Frame *)segRef(data.word(kCurrentset)).ptr(0, 0); while (true) { uint16 offset = x; uint8 charCount = getnumber(charSet, *string, maxWidth, centered, &offset); -- cgit v1.2.3 From 707c6ed01c6f19ec192efe915636f256e12898b0 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 03:19:51 +0200 Subject: DREAMWEB: 'printslow' API improved --- engines/dreamweb/print.cpp | 29 +++++++---------------------- engines/dreamweb/stubs.h | 3 +-- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 9e4c416015..3d571f939e 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -26,12 +26,6 @@ namespace DreamGen { -void DreamGenContext::printboth() { - uint16 x = di; - printboth((const Frame *)ds.ptr(0, 0), &x, bx, al, ah); - di = x; -} - void DreamGenContext::printboth(const Frame *charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar) { uint16 newX = *x; uint8 width, height; @@ -100,28 +94,23 @@ void DreamGenContext::printchar(const Frame *charSet, uint16* x, uint16 y, uint8 } void DreamGenContext::printslow() { - al = printslow(di, bx, dl, (bool)(dl & 1)); + al = printslow(es.ptr(si, 0), di, bx, dl, (bool)(dl & 1)); } -uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool centered) { +uint8 DreamGenContext::printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered) { data.byte(kPointerframe) = 1; data.byte(kPointermode) = 3; const Frame* charSet = (const Frame *)segRef(data.word(kCharset1)).ptr(0, 0); do { uint16 offset = x; - uint16 charCount = getnumber(charSet, es.ptr(si, 0), maxWidth, centered, &offset); + uint16 charCount = getnumber(charSet, string, maxWidth, centered, &offset); do { - push(si); - push(es); - uint8 c0 = es.byte(si); - uint8 c1 = es.byte(si+1); - uint8 c2 = es.byte(si+2); + uint8 c0 = string[0]; + uint8 c1 = string[1]; + uint8 c2 = string[2]; c0 = engine->modifyChar(c0); printboth(charSet, &offset, y, c0, c1); - ++si; if ((c1 == 0) || (c1 == ':')) { - es = pop(); - si = pop(); return 0; } if (charCount != 1) { @@ -135,16 +124,12 @@ uint8 DreamGenContext::printslow(uint16 x, uint16 y, uint8 maxWidth, bool center if (ax == 0) continue; if (ax != data.word(kOldbutton)) { - es = pop(); - si = pop(); return 1; } } } - es = pop(); - si = pop(); - ++si; + ++string; --charCount; } while (charCount); y += 10; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 5ac340feea..3140bbd8bc 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -43,7 +43,6 @@ void quickquit2(); void getnextword(); uint8 getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount); - void printboth(); void printboth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); void printchar(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height); @@ -52,7 +51,7 @@ void usetimedtext(); void getundertimed(); void putundertimed(); - uint8 printslow(uint16 x, uint16 y, uint8 maxWidth, bool centered); + uint8 printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered); void printslow(); void dumptextline(); void getnumber(); -- cgit v1.2.3 From c2e9f01ae448287670a398a2e6881b66d1f8fb39 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 03:23:22 +0200 Subject: DREAMWEB: A stub has become useless --- engines/dreamweb/print.cpp | 8 -------- engines/dreamweb/stubs.h | 1 - 2 files changed, 9 deletions(-) diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp index 3d571f939e..26084c35d1 100644 --- a/engines/dreamweb/print.cpp +++ b/engines/dreamweb/print.cpp @@ -59,14 +59,6 @@ uint8 DreamGenContext::getnextword(const Frame *charSet, const uint8 *string, ui } } -void DreamGenContext::getnextword() { - uint8 totalWidth, charCount; - al = getnextword((Frame *)ds.ptr(0, 0), es.ptr(di, 0), &totalWidth, &charCount); - bl = totalWidth; - bh = charCount; - di += charCount; -} - void DreamGenContext::printchar() { uint16 x = di; uint8 width, height; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 3140bbd8bc..e7b6a152b5 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -41,7 +41,6 @@ void seecommandtail(); void randomnumber(); void quickquit2(); - void getnextword(); uint8 getnextword(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount); void printboth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar); void printchar(); -- cgit v1.2.3 From d5a184e2f058f89fa4b5297078ca8fd035c4a6a7 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 03:30:41 +0200 Subject: DREAMWEB: 'showframe' takes a Frame --- engines/dreamweb/sprite.cpp | 8 ++++---- engines/dreamweb/stubs.cpp | 2 +- engines/dreamweb/stubs.h | 4 ++-- engines/dreamweb/vgagrafx.cpp | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index 9941fb2c2d..c1fe3a9e95 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -67,7 +67,7 @@ void DreamGenContext::printasprite(const Sprite *sprite) { else c = 0; uint8 width, height; - showframe(segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c, &width, &height); + showframe((const Frame *)segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c, &width, &height); } void DreamGenContext::clearsprites() { @@ -529,10 +529,10 @@ void DreamGenContext::findsource() { } } -void *DreamGenContext::findsourceCPP() { +Frame *DreamGenContext::findsourceCPP() { push(ds); findsource(); - void *result = ds.ptr(0, 0); + Frame *result = (Frame *)ds.ptr(0, 0); ds = pop(); return result; } @@ -546,7 +546,7 @@ void DreamGenContext::showreelframe(Reel *reel) { uint16 x = reel->x + data.word(kMapadx); uint16 y = reel->y + data.word(kMapady); data.word(kCurrentframe) = reel->frame(); - void *source = findsourceCPP(); + Frame *source = findsourceCPP(); uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff); uint8 width, height; showframe(source, x, y, frame, 8, &width, &height); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 4bc631cef0..70d4364031 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -867,7 +867,7 @@ void DreamGenContext::crosshair() { } push(ds); ds = data.word(kIcons1); - uint8 *src = ds.ptr(0, 0); + Frame *src = (Frame *)ds.ptr(0, 0); ds = pop(); uint8 width, height; showframe(src, kZoomx + 24, kZoomy + 19, frame, 0, &width, &height); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index e7b6a152b5..edaded67df 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -65,7 +65,7 @@ void startloading(const Room *room); Sprite *spritetable(); void showframe(); - void showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); + void showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height); void printasprite(const Sprite *sprite); void width160(); void multiput(const uint8 *src, uint16 x, uint16 y, uint8 width, uint8 height); @@ -94,7 +94,7 @@ void lockeddoorway(Sprite *sprite, ObjData *objData); void liftsprite(Sprite *sprite, ObjData *objData); void findsource(); - void *findsourceCPP(); + Frame *findsourceCPP(); void showreelframe(); void showreelframe(Reel *reel); void turnpathonCPP(uint8 param); diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index bb7f30fdb5..ebf1bff23c 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -314,8 +314,8 @@ void DreamGenContext::frameoutv(uint8 *dst, const uint8 *src, uint16 pitch, uint } } -void DreamGenContext::showframe(const void *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { - const Frame *frame = ((const Frame *)frameData) + frameNumber; +void DreamGenContext::showframe(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height) { + const Frame *frame = frameData + frameNumber; if ((frame->width == 0) && (frame->height == 0)) { *width = 0; *height = 0; @@ -371,7 +371,7 @@ void DreamGenContext::showframe(const void *frameData, uint16 x, uint16 y, uint1 void DreamGenContext::showframe() { uint8 width, height; - showframe(ds.ptr(0, 0), di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); + showframe((Frame *)ds.ptr(0, 0), di, bx, ax & 0x1ff, ah & 0xfe, &width, &height); cl = width; ch = height; } -- cgit v1.2.3 From 0f6e231356305043bc7f66ae1cbe2c3a0607c68a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 11 Aug 2011 04:25:46 +0200 Subject: SDL: Implement a hellish workaround to fix bug #3368143. The bug in question is "SDL/OpenGL: Crash when switching renderer backend". To fix it I added a stupid graphics state copying to the SDL backend, in case the graphics manager is switched. The implementation of this is considered a pure workaround, no one should ever do it like this in reality... I just want to die when looking at this... Not sure why I actually committed it. Anyway it at least makes the OpenGL backend testable for those who do not want to fiddle with the config file directly. --- .../graphics/surfacesdl/surfacesdl-graphics.cpp | 5 +- backends/platform/sdl/sdl.cpp | 58 +++++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 81c439e7e2..146200148a 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -249,7 +249,10 @@ void SurfaceSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) } bool SurfaceSdlGraphicsManager::getFeatureState(OSystem::Feature f) { - assert(_transactionMode == kTransactionNone); + // We need to allow this to be called from within a transaction, since we + // currently use it to retreive the graphics state, when switching from + // SDL->OpenGL mode for example. + //assert(_transactionMode == kTransactionNone); switch (f) { case OSystem::kFeatureFullscreenMode: diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 63871f5034..ba57841256 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -49,6 +49,7 @@ #include "backends/graphics/surfacesdl/surfacesdl-graphics.h" #ifdef USE_OPENGL #include "backends/graphics/openglsdl/openglsdl-graphics.h" +#include "graphics/cursorman.cpp" #endif #include "icons/scummvm.xpm" @@ -524,6 +525,22 @@ bool OSystem_SDL::setGraphicsMode(int mode) { i = _sdlModesCount; } + // Very hacky way to set up the old graphics manager state, in case we + // switch from SDL->OpenGL or OpenGL->SDL. + // + // This is a probably temporary workaround to fix bugs like #3368143 + // "SDL/OpenGL: Crash when switching renderer backend". + const int screenWidth = _graphicsManager->getWidth(); + const int screenHeight = _graphicsManager->getHeight(); + const bool arState = _graphicsManager->getFeatureState(kFeatureAspectRatioCorrection); + const bool fullscreen = _graphicsManager->getFeatureState(kFeatureFullscreenMode); + const bool cursorPalette = _graphicsManager->getFeatureState(kFeatureCursorPalette); +#ifdef USE_RGB_COLOR + const Graphics::PixelFormat pixelFormat = _graphicsManager->getScreenFormat(); +#endif + + bool switchedManager = false; + // Loop through modes while (srcMode->name) { if (i == mode) { @@ -535,16 +552,55 @@ bool OSystem_SDL::setGraphicsMode(int mode) { _graphicsManager = new SurfaceSdlGraphicsManager(_eventSource); ((SurfaceSdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); + + switchedManager = true; } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { debug(1, "switching to OpenGL graphics"); delete _graphicsManager; _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource); ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); + + switchedManager = true; } _graphicsMode = mode; - return _graphicsManager->setGraphicsMode(srcMode->id); + + if (switchedManager) { +#ifdef USE_RGB_COLOR + _graphicsManager->initSize(screenWidth, screenHeight, &pixelFormat); +#else + _graphicsManager->initSize(screenWidth, screenHeight, 0); +#endif + _graphicsManager->setFeatureState(kFeatureAspectRatioCorrection, arState); + _graphicsManager->setFeatureState(kFeatureFullscreenMode, fullscreen); + _graphicsManager->setFeatureState(kFeatureCursorPalette, cursorPalette); + + // Worst part about this right now, tell the cursor manager to + // resetup the cursor + cursor palette if necessarily + + // First we need to try to setup the old state on the new manager... + if (_graphicsManager->endGFXTransaction() != kTransactionSuccess) { + // Oh my god if this failed the client code might just explode. + return false; + } + + // Next setup the cursor again + CursorMan.pushCursor(0, 0, 0, 0, 0, 0); + CursorMan.popCursor(); + + // Next setup cursor palette if needed + if (cursorPalette) { + CursorMan.pushCursorPalette(0, 0, 0); + CursorMan.popCursorPalette(); + } + + _graphicsManager->beginGFXTransaction(); + // Oh my god if this failed the client code might just explode. + return _graphicsManager->setGraphicsMode(srcMode->id); + } else { + return _graphicsManager->setGraphicsMode(srcMode->id); + } } i++; -- cgit v1.2.3 From b6a8e2e98cb59f4edc3c6e9441b894dd1237a745 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 12:26:30 +0200 Subject: DREAMWEB: Misc cleanings in stubs.cpp --- engines/dreamweb/stubs.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 70d4364031..41f834b3d5 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -623,10 +623,7 @@ void DreamGenContext::getroomspaths() { } uint8 *DreamGenContext::getroomspathsCPP() { - push(es); - es = data.word(kReels); - void *result = es.ptr(data.byte(kRoomnum) * 144, 144); - es = pop(); + void *result = segRef(data.word(kReels)).ptr(data.byte(kRoomnum) * 144, 144); return (uint8 *)result; } @@ -845,13 +842,12 @@ void DreamGenContext::plotreel() { if (al == 255) break; dealwithspecial(); - _inc(data.word(kReelpointer)); + ++data.word(kReelpointer); reel += 8; } for (size_t i = 0; i < 8; ++i) { - ax = reel->frame(); - if (ax != 0xffff) + if (reel->frame() != 0xffff) showreelframe(reel); ++reel; } @@ -865,10 +861,7 @@ void DreamGenContext::crosshair() { } else { frame = 29; } - push(ds); - ds = data.word(kIcons1); - Frame *src = (Frame *)ds.ptr(0, 0); - ds = pop(); + const Frame *src = (const Frame *)segRef(data.word(kIcons1)).ptr(0, 0); uint8 width, height; showframe(src, kZoomx + 24, kZoomy + 19, frame, 0, &width, &height); } @@ -878,9 +871,7 @@ void DreamGenContext::deltextline() { uint16 y = data.word(kTextaddressy); if (data.byte(kForeignrelease) != 0) y -= 3; - ds = data.word(kBuffers); - si = kTextunder; - multiput(ds.ptr(si, 0), x, y, kUndertextsizex, kUndertextsizey); + multiput(segRef(data.word(kBuffers)).ptr(kTextunder, 0), x, y, kUndertextsizex, kUndertextsizey); } void DreamGenContext::autosetwalk() { -- cgit v1.2.3 From a8c619d7ad3d78cd218c2f1af5ec13a58a02e0be Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 12:33:33 +0200 Subject: DREAMWEB: 'dealwithspecial' has a better signature --- engines/dreamweb/stubs.cpp | 26 ++++++++++++-------------- engines/dreamweb/stubs.h | 2 +- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 41f834b3d5..688fd936a6 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -800,32 +800,32 @@ void DreamGenContext::fillspace() { memset(ds.ptr(dx, cx), al, cx); } -void DreamGenContext::dealwithspecial() { - uint8 type = al - 220; +void DreamGenContext::dealwithspecial(uint8 firstParam, uint8 secondParam) { + uint8 type = firstParam - 220; if (type == 0) { - al = ah; + al = secondParam; placesetobject(); data.byte(kHavedoneobs) = 1; } else if (type == 1) { - al = ah; + al = secondParam; removesetobject(); data.byte(kHavedoneobs) = 1; } else if (type == 2) { - al = ah; + al = secondParam; placefreeobject(); data.byte(kHavedoneobs) = 1; } else if (type == 3) { - al = ah; + al = secondParam; removefreeobject(); data.byte(kHavedoneobs) = 1; } else if (type == 4) { switchryanoff(); } else if (type == 5) { - data.byte(kTurntoface) = ah; - data.byte(kFacing) = ah; + data.byte(kTurntoface) = secondParam; + data.byte(kFacing) = secondParam; switchryanon(); } else if (type == 6) { - data.byte(kNewlocation) = ah; + data.byte(kNewlocation) = secondParam; } else { movemap(); } @@ -835,13 +835,11 @@ void DreamGenContext::plotreel() { getreelstart(); Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); while (true) { - al = reel->x; - ah = reel->y; - if (al < 220) + if (reel->x < 220) break; - if (al == 255) + if (reel->x == 255) break; - dealwithspecial(); + dealwithspecial(reel->x, reel->y); ++data.word(kReelpointer); reel += 8; } diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index edaded67df..7485f095c2 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -107,7 +107,7 @@ void cancelch0(); void cancelch1(); void plotreel(); - void dealwithspecial(); + void dealwithspecial(uint8 firstParam, uint8 secondParam); void zoom(); void crosshair(); void showrain(); -- cgit v1.2.3 From 76a18b247b4ee64725f1ae5cae93d5e82a248f53 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Thu, 11 Aug 2011 13:12:20 +0200 Subject: COMPOSER: Stop kBitmapSpp32 writing off the end of the buffer. This fixes corruption when there's only one pixel left to decompress, but two pixels available in the compressed data. Also, improve error checking in the bitmap decompression code. --- engines/composer/graphics.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp index 5c9fc6e1f7..0768a86e7a 100644 --- a/engines/composer/graphics.cpp +++ b/engines/composer/graphics.cpp @@ -598,10 +598,16 @@ enum { }; void ComposerEngine::decompressBitmap(uint16 type, Common::SeekableReadStream *stream, byte *buffer, uint32 size, uint width, uint height) { + uint outSize = width * height; + switch (type) { case kBitmapUncompressed: - assert(stream->size() - (uint)stream->pos() == size); - assert(size == width * height); + if (stream->size() - (uint)stream->pos() != size) + error("kBitmapUncompressed stream had %d bytes left, supposed to be %d", + stream->size() - (uint)stream->pos(), size); + if (size != outSize) + error("kBitmapUncompressed size %d doesn't match required size %d", + size, outSize); stream->read(buffer, size); break; case kBitmapSpp32: @@ -615,12 +621,22 @@ void ComposerEngine::decompressBitmap(uint16 type, Common::SeekableReadStream *s // run of a single color uint count = (uint)stream->readByte() + 3; size--; + if (outSize < count) + error("kBitmapSpp32 only needed %d bytes, but got run of %d", + outSize, count); + outSize -= count; memset(buffer, lookup[lowBits], count); buffer += count; } else { // two pixels + if (!outSize) + error("kBitmapSpp32 had too many pixels"); *buffer++ = lookup[highBits]; - *buffer++ = lookup[lowBits]; + outSize--; + if (outSize) { + *buffer++ = lookup[lowBits]; + outSize--; + } } } break; -- cgit v1.2.3 From cea283644fb78d4e113fa5c994bfcfce61ba7381 Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 13:29:33 +0200 Subject: DREAMWEB: 'getreelstart' ported to C++ --- engines/dreamweb/sprite.cpp | 5 +++++ engines/dreamweb/stubs.cpp | 3 +-- engines/dreamweb/stubs.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp index c1fe3a9e95..53c972008c 100644 --- a/engines/dreamweb/sprite.cpp +++ b/engines/dreamweb/sprite.cpp @@ -537,6 +537,11 @@ Frame *DreamGenContext::findsourceCPP() { return result; } +Reel *DreamGenContext::getreelstartCPP() { + Reel *reel = (Reel *)segRef(data.word(kReels)).ptr(kReellist + data.word(kReelpointer) * sizeof(Reel) * 8, sizeof(Reel)); + return reel; +} + void DreamGenContext::showreelframe() { Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); showreelframe(reel); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 688fd936a6..64067c0d62 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -832,8 +832,7 @@ void DreamGenContext::dealwithspecial(uint8 firstParam, uint8 secondParam) { } void DreamGenContext::plotreel() { - getreelstart(); - Reel *reel = (Reel *)es.ptr(si, sizeof(Reel)); + Reel *reel = getreelstartCPP(); while (true) { if (reel->x < 220) break; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 7485f095c2..8e87b962dc 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -107,6 +107,7 @@ void cancelch0(); void cancelch1(); void plotreel(); + Reel *getreelstartCPP(); void dealwithspecial(uint8 firstParam, uint8 secondParam); void zoom(); void crosshair(); -- cgit v1.2.3 From c9034110363ebc031a37784af913ba107411376d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 11 Aug 2011 22:03:57 +1000 Subject: TSAGE: Added support for reverse palette fading --- engines/tsage/core.cpp | 34 ++++++++++++++++++++++++++++++++-- engines/tsage/core.h | 15 +++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index d0075d5acf..52c1a5c8be 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1161,6 +1161,20 @@ void PaletteFader::remove() { action->signal(); } +void PaletteFader::setPalette(ScenePalette *palette, int step) { + if (step < 0) { + // Reverse step means moving from dest palette to source, so swap the two palettes + byte tempPal[256 * 3]; + Common::copy(&palette->_palette[0], &palette->_palette[256 * 3], &tempPal[0]); + Common::copy(&this->_palette[0], &this->_palette[256 * 3], &palette->_palette[0]); + Common::copy(&tempPal[0], &tempPal[256 * 3], &this->_palette[0]); + + step = -step; + } + + PaletteModifierCached::setPalette(palette, step); +} + /*--------------------------------------------------------------------------*/ ScenePalette::ScenePalette() { @@ -1314,7 +1328,7 @@ PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode, return obj; } -PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action) { +PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int step, Action *action) { PaletteFader *fader = new PaletteFader(); fader->_action = action; for (int i = 0; i < 256 * 3; i += 3) { @@ -1326,7 +1340,7 @@ PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int arrBufferRGB += 3; } - fader->setPalette(this, percent); + fader->setPalette(this, step); _globals->_scenePalette._listeners.push_back(fader); return fader; } @@ -2274,6 +2288,22 @@ void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, i /*--------------------------------------------------------------------------*/ +void SceneObjectExt2::postInit(SceneObjectList *OwnerList) { + _v8A = -1; + _v8C = -1; + _v8E = -1; + SceneObject::postInit(); +} + +void SceneObjectExt2::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_v8A); + s.syncAsSint16LE(_v8C); + s.syncAsSint16LE(_v8E); +} + +/*--------------------------------------------------------------------------*/ + void SceneObjectList::draw() { Common::Array objList; int paneNum = 0; diff --git a/engines/tsage/core.h b/engines/tsage/core.h index b86e2f63fe..959f96bf34 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -287,7 +287,7 @@ public: PaletteModifierCached(); - void setPalette(ScenePalette *palette, int step); + virtual void setPalette(ScenePalette *palette, int step); virtual Common::String getClassName() { return "PaletteModifierCached"; } virtual void synchronize(Serializer &s); }; @@ -323,6 +323,7 @@ public: virtual void synchronize(Serializer &s); virtual void signal(); virtual void remove(); + virtual void setPalette(ScenePalette *palette, int step); }; /*--------------------------------------------------------------------------*/ @@ -356,7 +357,7 @@ public: void clearListeners(); void fade(const byte *adjustData, bool fullAdjust, int percent); PaletteRotation *addRotation(int start, int end, int rotationMode, int duration = 0, Action *action = NULL); - PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action); + PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int step, Action *action); static void changeBackground(const Rect &bounds, FadeMode fadeMode); @@ -569,6 +570,16 @@ public: virtual Common::String getClassName() { return "SceneObjectExt"; } }; +class SceneObjectExt2: public SceneObject { +public: + int _v88, _v8A, _v8C, _v8E; + + virtual Common::String getClassName() { return "BF100Object"; } + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + + class SceneText : public SceneObject { public: int _fontNumber; -- cgit v1.2.3 From 744f04bf5001bf4220ecec40adc299e00b5792a4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 11 Aug 2011 22:05:44 +1000 Subject: TSAGE: Implemented new Globals for Blue Force, and beginnings of implementation of Scene 100 (Title Screen) --- engines/tsage/blueforce_logic.cpp | 5 + engines/tsage/blueforce_scenes1.cpp | 195 ++++++++++++++++++++++++++++++++++++ engines/tsage/blueforce_scenes1.h | 73 ++++++++++++++ engines/tsage/events.cpp | 2 +- engines/tsage/globals.cpp | 12 +++ engines/tsage/globals.h | 15 +++ engines/tsage/module.mk | 1 + engines/tsage/scenes.cpp | 8 +- engines/tsage/staticres.cpp | 11 ++ engines/tsage/staticres.h | 12 +++ engines/tsage/tsage.cpp | 6 +- 11 files changed, 335 insertions(+), 5 deletions(-) create mode 100644 engines/tsage/blueforce_scenes1.cpp create mode 100644 engines/tsage/blueforce_scenes1.h diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp index 3cf31b0b0a..cad7609abc 100644 --- a/engines/tsage/blueforce_logic.cpp +++ b/engines/tsage/blueforce_logic.cpp @@ -22,6 +22,7 @@ #include "tsage/blueforce_logic.h" #include "tsage/blueforce_scenes0.h" +#include "tsage/blueforce_scenes1.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" @@ -37,13 +38,17 @@ void BlueForceGame::start() { Scene *BlueForceGame::createScene(int sceneNumber) { switch (sceneNumber) { + /* Scene Group #0 */ case 20: // Tsunami Title Screen return new BF_Scene20(); case 50: case 60: error("Scene group 0 not implemented"); + /* Scene Group #1 */ case 100: + // Tsnunami Title Screen #2 + return new BF_Scene100(); case 109: case 110: case 114: diff --git a/engines/tsage/blueforce_scenes1.cpp b/engines/tsage/blueforce_scenes1.cpp new file mode 100644 index 0000000000..81f7d0ac76 --- /dev/null +++ b/engines/tsage/blueforce_scenes1.cpp @@ -0,0 +1,195 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/blueforce_scenes1.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 100 - Tsunami Title Screen #2 + * + *--------------------------------------------------------------------------*/ + +void BF_Scene100::Action1::signal() { + static byte black[3] = { 0, 0, 0 }; + + switch (_actionIndex++) { + case 0: + _state = 0; + setDelay(6); + break; + case 1: { + Common::String msg1 = _resourceManager->getMessage(100, _state++); + if (!msg1.compareTo("LASTCREDIT")) { + Common::String msg2 = _resourceManager->getMessage(100, _state++); + setTextStrings(msg1, msg2, this); + } else { + setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this); + + Common::Point pt(_sceneText1._position.x, 80); + NpcMover *mover = new NpcMover(); + _sceneText1.addMover(mover, &pt, this); + } + break; + } + case 2: + setDelay(600); + break; + case 3: + BF_GLOBALS._sound1.fade(0, 10, 10, 1, this); + GLOBALS._scenePalette.addFader(black, 1, 2, NULL); + break; + case 4: + error("??exit"); + break; + } +} + +void BF_Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) { + // Set data for first text control + _sceneText1._fontNumber = 10; + _sceneText1._width = 160; + _sceneText1._textMode = ALIGN_RIGHT; + _sceneText1._color1 = _globals->_fontColors.background; + _sceneText1._color2 = _globals->_fontColors.foreground; + _sceneText1._color3 = _globals->_fontColors.background; + _sceneText1.setup(msg1); + _sceneText1.setFrame2(-1); + _sceneText1.setPosition(Common::Point( + (SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202)); + _sceneText1._moveRate = 30; + _sceneText1._moveDiff.y = 1; + + // Set data for second text control + _sceneText2._fontNumber = 10; + _sceneText2._width = _sceneText1._width; + _sceneText2._textMode = _sceneText1._textMode; + _sceneText2._color1 = _globals->_fontColors.background; + _sceneText2._color2 = _globals->_fontColors.foreground; + _sceneText2._color3 = _globals->_fontColors.background; + _sceneText2.setup(msg1); + _sceneText2.setFrame2(-1); + GfxSurface textSurface = _sceneText2.getFrame(); + _sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202)); + _sceneText2._moveRate = 30; + _sceneText2._moveDiff.y = 1; + + _textHeight = textSurface.getBounds().height(); + int yp = -(_textHeight * 2); + + Common::Point pt(_sceneText1._position.x, yp); + NpcMover *mover = new NpcMover(); + _sceneText1.addMover(mover, &pt, action); +} + +void BF_Scene100::Action2::signal() { + BF_Scene100 *scene = (BF_Scene100 *)_globals->_sceneManager._scene; + static byte black[3] = {0, 0, 0}; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._scenePalette.addFader(black, 1, -2, this); + break; + case 1: + setDelay(180); + break; + case 2: { + const char *SEEN_INTRO = "seen_intro"; + if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { + // First time being played, so will need to show the intro + ConfMan.setBool(SEEN_INTRO, true); + ConfMan.flushToDisk(); + } else { + // Prompt user for whether to start play or watch introduction + _globals->_player.enableControl(); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + // Signal to start the game + scene->_index = 190; + remove(); + return; + } + } + + // At this point the introduction needs to start + _globals->_scenePalette.addFader(black, 1, 2, this); + break; + } + case 3: + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +BF_Scene100::BF_Scene100(): Scene() { + _index = 0; +} + +void BF_Scene100::postInit(SceneObjectList *OwnerList) { + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._v51C44 = 1; + Scene::postInit(); + BF_GLOBALS._v51C24 = 200; + + _globals->_player.enableControl(); + _globals->_player.hide(); + _globals->_player.disableControl(); + _index = 109; + + if (BF_GLOBALS._v4CEA2 < 6) { + // Title + loadScene(100); + BF_GLOBALS._sound1.play(2); + setAction(&_action2, this); + } else { + // Credits + loadScene(101); + BF_GLOBALS._sound1.play(118); + setAction(&_action1, this); + } + + loadScene(20); + setZoomPercents(60, 85, 200, 100); +} + +void BF_Scene100::signal() { + ++_sceneMode; + if (BF_GLOBALS._v4CEA2 < 6) { + BF_GLOBALS._scenePalette.clearListeners(); + BF_GLOBALS._scenePalette.loadPalette(100); + BF_GLOBALS._sceneManager.changeScene(_index); + } else { + if (_sceneMode > 1) + BF_GLOBALS._events.setCursor(CURSOR_ARROW); + + setAction(this, &_action1, this); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/blueforce_scenes1.h b/engines/tsage/blueforce_scenes1.h new file mode 100644 index 0000000000..d9fcc486c6 --- /dev/null +++ b/engines/tsage/blueforce_scenes1.h @@ -0,0 +1,73 @@ +/* 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. + * + */ + +#ifndef TSAGE_BLUEFORCE_SCENES1_H +#define TSAGE_BLUEFORCE_SCENES1_H + +#include "common/scummsys.h" +#include "tsage/blueforce_logic.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace tSage { + +class BF_Scene100: public Scene { + /* Actions */ + class Action1: public ActionExt { + private: + void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action); + public: + SceneText _sceneText1, _sceneText2; + int _textHeight; + + virtual Common::String getClassName() { return "BF100Action1"; } + virtual void synchronize(Serializer &s) { + ActionExt::synchronize(s); + s.syncAsSint16LE(_textHeight); + } + virtual void signal(); + }; + class Action2: public ActionExt { + public: + virtual Common::String getClassName() { return "BF100Action2"; } + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + ScenePalette _scenePalette; + SceneObjectExt2 _object1, _object2, _object3, _object4, _object5; + int _index; + + BF_Scene100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 7aadf62b8d..59894f3300 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -155,7 +155,7 @@ void EventsClass::setCursor(CursorType cursorType) { // No cursor _globals->setFlag(122); - if (_vm->getFeatures() & GF_DEMO) { + if ((_vm->getFeatures() & GF_DEMO) || (_vm->getGameID() == GType_BlueForce)) { CursorMan.showMouse(false); return; } diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 34b26ec311..e5572d9058 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -166,5 +166,17 @@ void Globals::dispatchSounds() { Common::for_each(_sounds.begin(), _sounds.end(), Globals::dispatchSound); } +/*--------------------------------------------------------------------------*/ + +BlueForceGlobals::BlueForceGlobals(): Globals() { + _v51C24 = 0; + _v51C44 = 1; + _v4CEA2 = 0; +} + +void BlueForceGlobals::synchronize(Serializer &s) { + Globals::synchronize(s); + error("Sync variables"); +} } // end of namespace tSage diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 7cfec718e2..9d12669fa7 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -96,8 +96,23 @@ public: void dispatchSounds(); }; +class BlueForceGlobals: public Globals { +public: + ASound _sound1, _sound2, _sound3; + int _v4CEA2; + int _v51C44; + int _v51C24; + + BlueForceGlobals(); + virtual Common::String getClassName() { return "BFGlobals"; } + virtual void synchronize(Serializer &s); +}; + extern Globals *_globals; +#define GLOBALS (*_globals) +#define BF_GLOBALS (*((BlueForceGlobals *)_globals)) + // Note: Currently this can't be part of the _globals structure, since it needs to be constructed // prior to many of the fields in Globals execute their constructors extern ResourceManager *_resourceManager; diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 586699593d..7ac1795537 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -3,6 +3,7 @@ MODULE := engines/tsage MODULE_OBJS := \ blueforce_logic.o \ blueforce_scenes0.o \ + blueforce_scenes1.o \ converse.o \ core.o \ debugger.o \ diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 9a175ea08f..6a164a6b1e 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -28,9 +28,6 @@ namespace tSage { -// TODO: Doesn't seem to be ever set -const bool _v52C9F = false; - SceneManager::SceneManager() { _scene = NULL; _hasPalette = false; @@ -505,8 +502,13 @@ void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent } byte *Scene::preloadVisage(int resNum) { + // This isn't being used, since modern systems can load the data much quicker, and in any case + // visage data is specially loaded into the Visage class, and the resources discarded from memory. + return NULL; +/* assert(!_v52C9F); return _resourceManager->getResource(RES_VISAGE, resNum, 9999, false); +*/ } /*--------------------------------------------------------------------------*/ diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp index 9f36268ce3..5d8f1b057f 100644 --- a/engines/tsage/staticres.cpp +++ b/engines/tsage/staticres.cpp @@ -118,4 +118,15 @@ const char *EXIT_BTN_STRING = "Exit"; const char *DEMO_BTN_STRING = "Demo"; const char *DEMO_RESUME_BTN_STRING = "Resume"; +// Blue Force general messages +const char *BF_NAME = "Blue Force"; +const char *BF_COPYRIGHT = " Copyright, 1993 Tsunami Media, Inc."; +const char *BF_ALL_RIGHTS_RESERVED = "All Rights Reserved"; +const char *BF_19840518 = "May 18, 1984"; +const char *BF_19840515 = "May 15, 1984"; +const char *BF_3_DAYS = "Three days later"; +const char *BF_11_YEARS = "Eleven years later."; +const char *BF_NEXT_DAY = "The Next Day"; +const char *BF_ACADEMY = "Here we are at the Academy"; + } // End of namespace tSage diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h index fa93511779..bac8976a14 100644 --- a/engines/tsage/staticres.h +++ b/engines/tsage/staticres.h @@ -86,6 +86,18 @@ extern const char *EXIT_BTN_STRING; extern const char *DEMO_BTN_STRING; extern const char *DEMO_RESUME_BTN_STRING; +// Blue Force messages +extern const char *BF_NAME; +extern const char *BF_COPYRIGHT; +extern const char *BF_ALL_RIGHTS_RESERVED; +extern const char *BF_19840518; +extern const char *BF_19840515; +extern const char *BF_3_DAYS; +extern const char *BF_11_YEARS; +extern const char *BF_NEXT_DAY; +extern const char *BF_ACADEMY; + + } // End of namespace tSage #endif diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 23a0193b7c..3332841188 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -68,18 +68,22 @@ void TSageEngine::initialize() { if (_vm->getFeatures() & GF_DEMO) { // Add the single library file associated with the demo _resourceManager->addLib(getPrimaryFilename()); + _globals = new Globals(); + } else if (_vm->getGameID() == GType_Ringworld) { _resourceManager->addLib("RING.RLB"); _resourceManager->addLib("TSAGE.RLB"); + _globals = new Globals(); + } else if (_vm->getGameID() == GType_BlueForce) { _resourceManager->addLib("BLUE.RLB"); if (_vm->getFeatures() & GF_FLOPPY) { _resourceManager->addLib("FILES.RLB"); _resourceManager->addLib("TSAGE.RLB"); } + _globals = new BlueForceGlobals(); } - _globals = new Globals(); _globals->gfxManager().setDefaults(); // Setup sound settings -- cgit v1.2.3 From 7ef6c73d61588482f2686c43047e0a4522c5baf8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 11 Aug 2011 22:30:46 +1000 Subject: SDL: Previous commit broke compilation on MSVC Including cursorman.cpp rather than cursorman.h resulted in the CursorManager class being present in multiple .obj files, resulting in linking errors. --- backends/platform/sdl/sdl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index ba57841256..8dff5cec05 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -49,7 +49,7 @@ #include "backends/graphics/surfacesdl/surfacesdl-graphics.h" #ifdef USE_OPENGL #include "backends/graphics/openglsdl/openglsdl-graphics.h" -#include "graphics/cursorman.cpp" +#include "graphics/cursorman.h" #endif #include "icons/scummvm.xpm" -- cgit v1.2.3 From 701776a73aee44d18a729b1cc7f51ff97e2fbc3d Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 15:18:41 +0200 Subject: DREAMWEB: 'multiget' and 'multiput' don't dirty segments anymore --- engines/dreamweb/vgagrafx.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp index ebf1bff23c..c87e27a8c4 100644 --- a/engines/dreamweb/vgagrafx.cpp +++ b/engines/dreamweb/vgagrafx.cpp @@ -43,15 +43,14 @@ void DreamGenContext::multiget() { } void DreamGenContext::multiget(uint8 *dst, uint16 x, uint16 y, uint8 w, uint8 h) { - unsigned src = x + y * kScreenwidth; - ds = data.word(kWorkspace); + const uint8 *src = workspace() + x + y * kScreenwidth; if (y + h > 200) h = 200 - y; if (x + w > 320) w = 320 - x; //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); for(unsigned l = 0; l < h; ++l) { - const uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); + const uint8 *src_p = src + kScreenwidth * l; uint8 *dst_p = dst + w * l; memcpy(dst_p, src_p, w); } @@ -65,8 +64,7 @@ void DreamGenContext::multiput() { } void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, uint8 h) { - unsigned dst = x + y * kScreenwidth; - es = data.word(kWorkspace); + uint8 *dst = workspace() + x + y * kScreenwidth; if (y + h > 200) h = 200 - y; if (x + w > 320) @@ -74,7 +72,7 @@ void DreamGenContext::multiput(const uint8 *src, uint16 x, uint16 y, uint8 w, ui //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); for(unsigned l = 0; l < h; ++l) { const uint8 *src_p = src + w * l; - uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w); + uint8 *dst_p = dst + kScreenwidth * l; memcpy(dst_p, src_p, w); } } -- cgit v1.2.3 From 2250c10ffeddad9b1b1796b6946cfd285f48207f Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 15:24:06 +0200 Subject: DREAMWEB: 'dumptimedtext' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 23 ----------------------- engines/dreamweb/dreamgen.h | 5 ++--- engines/dreamweb/stubs.cpp | 11 +++++++++++ engines/dreamweb/stubs.h | 1 + 5 files changed, 15 insertions(+), 26 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index d4f4af715a..0a86ab43d0 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -52,6 +52,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'printdirect', 'printslow', 'usetimedtext', + 'dumptimedtext', 'putundertimed', 'getundertimed', 'worktoscreen', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index 2a7c67e889..dc576314a4 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -12084,28 +12084,6 @@ notonsartroof: placesetobject(); } -void DreamGenContext::dumptimedtext() { - STACK_CHECK; - _cmp(data.byte(kNeedtodumptimed), 1); - if (!flags.z()) - return /* (nodumptimed) */; - al = data.byte(kTimedy); - _cmp(data.byte(kForeignrelease), 0); - if (flags.z()) - goto _tmp1; - _sub(al, 3); -_tmp1: - ah = 0; - bx = ax; - al = data.byte(kTimedx); - ah = 0; - di = ax; - cl = 240; - ch = (30); - multidump(); - data.byte(kNeedtodumptimed) = 0; -} - void DreamGenContext::setuptimeduse() { STACK_CHECK; _cmp(data.word(kTimecount), 0); @@ -19892,7 +19870,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_setallchanges: setallchanges(); break; case addr_dochange: dochange(); break; case addr_autoappear: autoappear(); break; - case addr_dumptimedtext: dumptimedtext(); break; case addr_setuptimeduse: setuptimeduse(); break; case addr_setuptimedtemp: setuptimedtemp(); break; case addr_edenscdplayer: edenscdplayer(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 60abf44c01..5a74ed6ad0 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -315,7 +315,6 @@ public: static const uint16 addr_edenscdplayer = 0xc728; static const uint16 addr_setuptimedtemp = 0xc720; static const uint16 addr_setuptimeduse = 0xc71c; - static const uint16 addr_dumptimedtext = 0xc718; static const uint16 addr_autoappear = 0xc70c; static const uint16 addr_dochange = 0xc708; static const uint16 addr_setallchanges = 0xc704; @@ -1500,7 +1499,7 @@ public: void loadspeech(); //void cls(); //void printsprites(); - void checkifperson(); + //void dumptimedtext(); void showallobs(); //void getnumber(); void adjustleft(); @@ -1568,7 +1567,7 @@ public: void folderhints(); void openhoteldoor(); void removesetobject(); - void dumptimedtext(); + void checkifperson(); //void frameoutfx(); void blank(); void drinker(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 64067c0d62..361b22dac8 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -326,6 +326,17 @@ void DreamGenContext::usetimedtext() { data.byte(kNeedtodumptimed) = 1; } +void DreamGenContext::dumptimedtext() { + if (data.byte(kNeedtodumptimed) != 1) + return; + uint8 y = data.byte(kTimedy); + if (data.byte(kForeignrelease) != 0) + y -= 3; + + multidump(data.byte(kTimedx), y, 240, kUndertimedysize); + data.byte(kNeedtodumptimed) = 0; +} + void DreamGenContext::gettime() { TimeDate t; g_system->getTimeAndDate(t); diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 8e87b962dc..1baad44524 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -48,6 +48,7 @@ void printdirect(); void printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); + void dumptimedtext(); void getundertimed(); void putundertimed(); uint8 printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered); -- cgit v1.2.3 From 1737190a7161ec77f1f3f0d6a72dfc1920850ee4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 11 Aug 2011 13:10:51 -0400 Subject: MOHAWK: Implement the rest of the sunners code --- engines/mohawk/riven.cpp | 172 ++++++++++++++++++++++++++++++++++++-- engines/mohawk/riven.h | 1 + engines/mohawk/riven_external.cpp | 27 +++++- 3 files changed, 192 insertions(+), 8 deletions(-) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 612b8b3685..ffd9621e02 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -209,8 +209,10 @@ void MohawkEngine_Riven::handleEvents() { needsUpdate = true; break; case Common::EVENT_LBUTTONDOWN: - if (_curHotspot >= 0) + if (_curHotspot >= 0) { + checkSunnerAlertClick(); runHotspotScript(_curHotspot, kMouseDownScript); + } break; case Common::EVENT_LBUTTONUP: // See RivenScript::switchCard() for more information on why we sometimes @@ -812,6 +814,138 @@ static void catherineIdleTimer(MohawkEngine_Riven *vm) { vm->installTimer(&catherineIdleTimer, timeUntilNextMovie); } +static void sunnersTopStairsTimer(MohawkEngine_Riven *vm) { + // If the sunners are gone, we have no video to play + if (vm->_vars["jsunners"] != 0) { + vm->removeTimer(); + return; + } + + // Play a random sunners video if the script one is not playing already + // and then set a new timer for when the new video should be played + + VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); + uint32 timerTime = 500; + + if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + uint32 &sunnerTime = vm->_vars["jsunnertime"]; + + if (sunnerTime == 0) { + timerTime = vm->_rnd->getRandomNumberRng(2, 15) * 1000; + } else if (sunnerTime < vm->getTotalPlayTime()) { + VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(1, 3)); + + timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(2, 15) * 1000; + } + + sunnerTime = timerTime + vm->getTotalPlayTime(); + } + + vm->installTimer(&sunnersTopStairsTimer, timerTime); +} + +static void sunnersMidStairsTimer(MohawkEngine_Riven *vm) { + // If the sunners are gone, we have no video to play + if (vm->_vars["jsunners"] != 0) { + vm->removeTimer(); + return; + } + + // Play a random sunners video if the script one is not playing already + // and then set a new timer for when the new video should be played + + VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); + uint32 timerTime = 500; + + if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + uint32 &sunnerTime = vm->_vars["jsunnertime"]; + + if (sunnerTime == 0) { + timerTime = vm->_rnd->getRandomNumberRng(1, 10) * 1000; + } else if (sunnerTime < vm->getTotalPlayTime()) { + // Randomize the video + int randValue = vm->_rnd->getRandomNumber(5); + uint16 movie = 4; + if (randValue == 4) + movie = 2; + else if (randValue == 5) + movie = 3; + + VideoHandle handle = vm->_video->playMovieRiven(movie); + + timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 10) * 1000; + } + + sunnerTime = timerTime + vm->getTotalPlayTime(); + } + + vm->installTimer(&sunnersMidStairsTimer, timerTime); +} + +static void sunnersLowerStairsTimer(MohawkEngine_Riven *vm) { + // If the sunners are gone, we have no video to play + if (vm->_vars["jsunners"] != 0) { + vm->removeTimer(); + return; + } + + // Play a random sunners video if the script one is not playing already + // and then set a new timer for when the new video should be played + + VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); + uint32 timerTime = 500; + + if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + uint32 &sunnerTime = vm->_vars["jsunnertime"]; + + if (sunnerTime == 0) { + timerTime = vm->_rnd->getRandomNumberRng(1, 30) * 1000; + } else if (sunnerTime < vm->getTotalPlayTime()) { + VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(3, 5)); + + timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + } + + sunnerTime = timerTime + vm->getTotalPlayTime(); + } + + vm->installTimer(&sunnersLowerStairsTimer, timerTime); +} + +static void sunnersBeachTimer(MohawkEngine_Riven *vm) { + // If the sunners are gone, we have no video to play + if (vm->_vars["jsunners"] != 0) { + vm->removeTimer(); + return; + } + + // Play a random sunners video if the script one is not playing already + // and then set a new timer for when the new video should be played + + VideoHandle oldHandle = vm->_video->findVideoHandleRiven(3); + uint32 timerTime = 500; + + if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + uint32 &sunnerTime = vm->_vars["jsunnertime"]; + + if (sunnerTime == 0) { + timerTime = vm->_rnd->getRandomNumberRng(1, 30) * 1000; + } else if (sunnerTime < vm->getTotalPlayTime()) { + // Unlike the other cards' scripts which automatically + // activate the MLST, we have to set it manually here. + uint16 mlstID = vm->_rnd->getRandomNumberRng(3, 8); + vm->_video->activateMLST(mlstID, vm->getCurCard()); + VideoHandle handle = vm->_video->playMovieRiven(mlstID); + + timerTime = vm->_video->getDuration(handle) + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + } + + sunnerTime = timerTime + vm->getTotalPlayTime(); + } + + vm->installTimer(&sunnersBeachTimer, timerTime); +} + void MohawkEngine_Riven::installCardTimer() { switch (getCurCardRMAP()) { case 0x3a85: // Top of elevator on prison island @@ -819,16 +953,16 @@ void MohawkEngine_Riven::installCardTimer() { installTimer(&catherineIdleTimer, _rnd->getRandomNumberRng(1, 33) * 1000); break; case 0x77d6: // Sunners, top of stairs - // TODO: Background Sunner videos + installTimer(&sunnersTopStairsTimer, 500); break; case 0x79bd: // Sunners, middle of stairs - // TODO: Background Sunner videos + installTimer(&sunnersMidStairsTimer, 500); break; case 0x7beb: // Sunners, bottom of stairs - // TODO: Background Sunner videos + installTimer(&sunnersLowerStairsTimer, 500); break; case 0xb6ca: // Sunners, shoreline - // TODO: Background Sunner videos + installTimer(&sunnersBeachTimer, 500); break; } } @@ -846,6 +980,34 @@ void MohawkEngine_Riven::doVideoTimer(VideoHandle handle, bool force) { _scriptMan->runStoredMovieOpcode(); } +void MohawkEngine_Riven::checkSunnerAlertClick() { + // We need to do a manual hardcoded check for the sunners' + // alert movies. + + uint32 &sunners = _vars["jsunners"]; + + // If the sunners are gone, there's nothing for us to do + if (sunners != 0) + return; + + uint32 rmapCode = getCurCardRMAP(); + + // This is only for the mid/lower staircase sections + if (rmapCode != 0x79bd && rmapCode != 0x7beb) + return; + + // Only set the sunners variable on the forward hotspot + if ((rmapCode == 0x79bd && _curHotspot != 1) || (rmapCode == 0x7beb && _curHotspot != 2)) + return; + + // If the alert video is no longer playing, we have nothing left to do + VideoHandle handle = _video->findVideoHandleRiven(1); + if (handle == NULL_VID_HANDLE || _video->endOfVideo(handle)) + return; + + sunners = 1; +} + bool ZipMode::operator== (const ZipMode &z) const { return z.name == name && z.id == id; } diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index c7d36e585d..01a4fbb38c 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -164,6 +164,7 @@ private: // Miscellaneous bool _gameOver; bool _ignoreNextMouseUp; + void checkSunnerAlertClick(); public: // Stack/card/script funtions diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 60e94ea795..c72dafaf7f 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -1889,21 +1889,42 @@ void RivenExternal::xjplaybeetle_1450(uint16 argc, uint16 *argv) { } void RivenExternal::xjlagoon700_alert(uint16 argc, uint16 *argv) { - // TODO: Sunner related + // Handle sunner reactions (mid-staircase) + + if (_vm->_vars["jsunners"] == 0) + _vm->_video->playMovieRiven(1); } void RivenExternal::xjlagoon800_alert(uint16 argc, uint16 *argv) { - // TODO: Sunner related + // Handle sunner reactions (lower-staircase) + + uint32 &sunners = _vm->_vars["jsunners"]; + + if (sunners == 0) { + // Show the sunners alert video + _vm->_video->playMovieRiven(1); + } else if (sunners == 1) { + // Show the sunners leaving if you moved forward in their "alert" status + _vm->_video->playMovieBlockingRiven(2); + _vm->_video->playMovieBlockingRiven(6); + sunners = 2; + _vm->refreshCard(); + } } void RivenExternal::xjlagoon1500_alert(uint16 argc, uint16 *argv) { - // Have the sunners move a bit as you get closer ;) + // Handle sunner reactions (beach) + uint32 &sunners = _vm->_vars["jsunners"]; + if (sunners == 0) { + // Show the sunners alert video _vm->_video->playMovieBlockingRiven(3); } else if (sunners == 1) { + // Show the sunners leaving if you moved forward in their "alert" status _vm->_video->playMovieBlockingRiven(2); sunners = 2; + _vm->refreshCard(); } } -- cgit v1.2.3 From bb3b1a2b759d702dcfd4731fed58387bda7e23d3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 11 Aug 2011 13:12:36 -0400 Subject: MOHAWK: Error out on any unknown Riven stack variables --- engines/mohawk/riven_vars.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp index 946e2e0496..8243d2842d 100644 --- a/engines/mohawk/riven_vars.cpp +++ b/engines/mohawk/riven_vars.cpp @@ -268,7 +268,12 @@ static const char *variableNames[] = { }; uint32 &MohawkEngine_Riven::getStackVar(uint32 index) { - return _vars[getName(VariableNames, index)]; + Common::String name = getName(VariableNames, index); + + if (!_vars.contains(name)) + error("Could not find variable '%s' (stack variable %d)", name.c_str(), index); + + return _vars[name]; } void MohawkEngine_Riven::initVars() { -- cgit v1.2.3 From b08b31eed3e31fb485a9091829f23cfb9006551f Mon Sep 17 00:00:00 2001 From: Bertrand Augereau Date: Thu, 11 Aug 2011 16:59:20 +0200 Subject: DREAMWEB: 'setuptimedtemp' ported to C++ --- devtools/tasmrecover/tasm-recover | 1 + engines/dreamweb/dreamgen.cpp | 53 --------------------------------------- engines/dreamweb/dreamgen.h | 3 +-- engines/dreamweb/stubs.cpp | 41 ++++++++++++++++++++++++++++++ engines/dreamweb/stubs.h | 2 ++ 5 files changed, 45 insertions(+), 55 deletions(-) diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover index 0a86ab43d0..3a9d4f462c 100755 --- a/devtools/tasmrecover/tasm-recover +++ b/devtools/tasmrecover/tasm-recover @@ -53,6 +53,7 @@ generator = cpp(context, "DreamGen", blacklist = [ 'printslow', 'usetimedtext', 'dumptimedtext', + 'setuptimedtemp', 'putundertimed', 'getundertimed', 'worktoscreen', diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index dc576314a4..12bfcb413f 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -12106,58 +12106,6 @@ void DreamGenContext::setuptimeduse() { data.word(kTimedoffset) = bx; } -void DreamGenContext::setuptimedtemp() { - STACK_CHECK; - _cmp(ah, 0); - if (flags.z()) - goto notloadspeech3; - push(ax); - push(bx); - push(cx); - push(dx); - dl = 'T'; - dh = ah; - cl = 'T'; - ah = 0; - loadspeech(); - _cmp(data.byte(kSpeechloaded), 1); - if (!flags.z()) - goto _tmp1; - al = 50+12; - playchannel1(); -_tmp1: - dx = pop(); - cx = pop(); - bx = pop(); - ax = pop(); - _cmp(data.byte(kSpeechloaded), 1); - if (!flags.z()) - goto notloadspeech3; - _cmp(data.byte(kSubtitles), 1); - if (flags.z()) - goto notloadspeech3; - return; -notloadspeech3: - _cmp(data.word(kTimecount), 0); - if (!flags.z()) - return /* (cantsetup2) */; - data.byte(kTimedy) = bh; - data.byte(kTimedx) = bl; - data.word(kCounttotimed) = cx; - _add(dx, cx); - data.word(kTimecount) = dx; - bl = al; - bh = 0; - _add(bx, bx); - es = data.word(kTextfile1); - cx = (66*2); - ax = es.word(bx); - _add(ax, cx); - bx = ax; - data.word(kTimedseg) = es; - data.word(kTimedoffset) = bx; -} - void DreamGenContext::edenscdplayer() { STACK_CHECK; showfirstuse(); @@ -19871,7 +19819,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) { case addr_dochange: dochange(); break; case addr_autoappear: autoappear(); break; case addr_setuptimeduse: setuptimeduse(); break; - case addr_setuptimedtemp: setuptimedtemp(); break; case addr_edenscdplayer: edenscdplayer(); break; case addr_usewall: usewall(); break; case addr_usechurchgate: usechurchgate(); break; diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index 5a74ed6ad0..42d135fa9a 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -313,7 +313,6 @@ public: static const uint16 addr_usechurchgate = 0xc730; static const uint16 addr_usewall = 0xc72c; static const uint16 addr_edenscdplayer = 0xc728; - static const uint16 addr_setuptimedtemp = 0xc720; static const uint16 addr_setuptimeduse = 0xc71c; static const uint16 addr_autoappear = 0xc70c; static const uint16 addr_dochange = 0xc708; @@ -1384,7 +1383,7 @@ public: //void kernchars(); void othersmoker(); void dofade(); - void setuptimedtemp(); + //void setuptimedtemp(); void blocknametext(); void useelevator5(); void useelevator4(); diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 361b22dac8..da37df99e1 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -326,6 +326,47 @@ void DreamGenContext::usetimedtext() { data.byte(kNeedtodumptimed) = 1; } +void DreamGenContext::setuptimedtemp() { + setuptimedtemp(al, ah, bl, bh, cx, dx); +} + +void DreamGenContext::setuptimedtemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount) { +#if 1 // if cd + if (voiceIndex != 0) { + push(ax); + push(bx); + push(cx); + push(dx); + dl = 'T'; + dh = voiceIndex; + cl = 'T'; + ah = 0; + loadspeech(); + if (data.byte(kSpeechloaded) == 1) { + al = 50+12; + playchannel1(); + } + dx = pop(); + cx = pop(); + bx = pop(); + ax = pop(); + if ((data.byte(kSpeechloaded) == 1) && (data.byte(kSubtitles) != 1)) + return; + } +#endif + + if (data.word(kTimecount) != 0) + return; + data.byte(kTimedy) = y; + data.byte(kTimedx) = x; + data.word(kCounttotimed) = countToTimed; + data.word(kTimecount) = timeCount + countToTimed; + data.word(kTimedseg) = data.word(kTextfile1); + data.word(kTimedoffset) = kTextstart + segRef(data.word(kTextfile1)).word(textIndex * 2); + const uint8 *string = segRef(data.word(kTextfile1)).ptr(data.word(kTimedoffset), 0); + debug(1, "setuptimedtemp: (%d, %d) => '%s'", textIndex, voiceIndex, string); +} + void DreamGenContext::dumptimedtext() { if (data.byte(kNeedtodumptimed) != 1) return; diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h index 1baad44524..5886630821 100644 --- a/engines/dreamweb/stubs.h +++ b/engines/dreamweb/stubs.h @@ -49,6 +49,8 @@ void printdirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered); void usetimedtext(); void dumptimedtext(); + void setuptimedtemp(); + void setuptimedtemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount); void getundertimed(); void putundertimed(); uint8 printslow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered); -- cgit v1.2.3 From 30d0010b9e14cc5b959cef825fabf4de86bff6f1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 11 Aug 2011 17:49:01 -0400 Subject: MOHAWK: Stub off xflies --- engines/mohawk/riven_external.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index c72dafaf7f..63f4307cfa 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -2747,6 +2747,7 @@ void RivenExternal::xtatboundary(uint16 argc, uint16 *argv) { void RivenExternal::xflies(uint16 argc, uint16 *argv) { // TODO: Activate the "flies" effect + debug(1, "STUB: xflies(): create %d %s fl%s", argv[1], (argv[0] == 0) ? "black" : "glowing", (argv[1] == 1) ? "y" : "ies"); } } // End of namespace Mohawk -- cgit v1.2.3 From bb3d1f2738ccd3fd5a06a2570d23c27a11589288 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 12 Aug 2011 03:22:01 +0200 Subject: AUDIO: Replace macro in emumidi code with enum. --- audio/softsynth/emumidi.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/audio/softsynth/emumidi.h b/audio/softsynth/emumidi.h index f3d7645f87..f72dad7eaf 100644 --- a/audio/softsynth/emumidi.h +++ b/audio/softsynth/emumidi.h @@ -26,8 +26,6 @@ #include "audio/mididrv.h" #include "audio/mixer.h" -#define FIXP_SHIFT 16 - class MidiDriver_Emulated : public Audio::AudioStream, public MidiDriver { protected: bool _isOpen; @@ -38,6 +36,10 @@ private: Common::TimerManager::TimerProc _timerProc; void *_timerParam; + enum { + FIXP_SHIFT = 16 + }; + int _nextTick; int _samplesPerTick; -- cgit v1.2.3 From a77c29327e8e4c06c3b45dac16b96198a120fefe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 12 Aug 2011 03:46:32 +0200 Subject: OPENGLSDL: Do not change requested window size on resize. This should help fix a lock up on window managers, which will try to force the ScummVM window to a certain size, by just requesting the same size over and over again. Now we get black borders even in windowed mode when the aspect of the window does not match the aspect of the game screen (and we are not in "normal" mode), but that is usually the same in video players too, so shouldn't be too bad. --- backends/graphics/openglsdl/openglsdl-graphics.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index 8ea95768df..d2810818e7 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -640,10 +640,7 @@ void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) _videoMode.hardwareWidth = width; _videoMode.hardwareHeight = height; - if (_videoMode.mode != OpenGL::GFX_ORIGINAL) { - _screenResized = true; - calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); - } + _screenResized = true; int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth, _videoMode.hardwareHeight / _videoMode.screenHeight); @@ -653,10 +650,6 @@ void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) setScale(MAX(MIN(scale, 3), 1)); } - if (_videoMode.mode == OpenGL::GFX_ORIGINAL) { - calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); - } - _transactionDetails.sizeChanged = true; endGFXTransaction(); #ifdef USE_OSD -- cgit v1.2.3 From b8dcd9a25eb27ef40aa5535fc83879d20db7e10c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 12 Aug 2011 04:06:54 +0200 Subject: OPENGL: Fix aspect ratio correction behavior. Now only 320x200 and 640x400 will result in aspect ratio correction to be used if the user requested it. This should fix some strechting in Myst/Riven. --- backends/graphics/opengl/opengl-graphics.cpp | 8 ++++++-- backends/graphics/opengl/opengl-graphics.h | 5 +---- backends/graphics/openglsdl/openglsdl-graphics.cpp | 19 +++++++++++-------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index 57c2378649..40ef17e477 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -1245,12 +1245,16 @@ void OpenGLGraphicsManager::toggleAntialiasing() { _transactionDetails.filterChanged = true; } -uint OpenGLGraphicsManager::getAspectRatio() { +uint OpenGLGraphicsManager::getAspectRatio() const { // In case we enable aspect ratio correction we force a 4/3 ratio. + // But just for 320x200 and 640x400 games, since other games do not need + // this. // TODO: This makes OpenGL Normal behave like OpenGL Conserve, when aspect // ratio correction is enabled, but it's better than the previous 4/3 mode // mess at least... - if (_videoMode.aspectRatioCorrection) + if (_videoMode.aspectRatioCorrection + && ((_videoMode.screenWidth == 320 && _videoMode.screenHeight == 200) + || (_videoMode.screenWidth == 640 && _videoMode.screenHeight == 400))) return 13333; else if (_videoMode.mode == OpenGL::GFX_NORMAL) return _videoMode.hardwareWidth * 10000 / _videoMode.hardwareHeight; diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h index 8a110b2d5f..42cfbacc85 100644 --- a/backends/graphics/opengl/opengl-graphics.h +++ b/backends/graphics/opengl/opengl-graphics.h @@ -214,10 +214,7 @@ protected: virtual void calculateDisplaySize(int &width, int &height); virtual void refreshDisplaySize(); - /** - * Returns the current target aspect ratio x 10000 - */ - virtual uint getAspectRatio(); + uint getAspectRatio() const; bool _formatBGR; diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index d2810818e7..84515732fe 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -313,14 +313,17 @@ bool OpenGLSdlGraphicsManager::loadGFXMode() { _videoMode.overlayWidth = _videoMode.hardwareWidth = _videoMode.screenWidth * scaleFactor; _videoMode.overlayHeight = _videoMode.hardwareHeight = _videoMode.screenHeight * scaleFactor; - int screenAspectRatio = _videoMode.screenWidth * 10000 / _videoMode.screenHeight; - int desiredAspectRatio = getAspectRatio(); - - // Do not downscale dimensions, only enlarge them if needed - if (screenAspectRatio > desiredAspectRatio) - _videoMode.hardwareHeight = (_videoMode.overlayWidth * 10000 + 5000) / desiredAspectRatio; - else if (screenAspectRatio < desiredAspectRatio) - _videoMode.hardwareWidth = (_videoMode.overlayHeight * desiredAspectRatio + 5000) / 10000; + // The only modes where we need to adapt the aspect ratio are 320x200 + // and 640x400. That is since our aspect ratio correction in fact is + // only used to ensure that the original pixel size aspect for these + // modes is used. + // (Non-square pixels on old monitors vs square pixel on new ones). + if (_videoMode.aspectRatioCorrection + && ((_videoMode.screenWidth == 320 && _videoMode.screenHeight == 200) + || (_videoMode.screenWidth == 640 && _videoMode.screenHeight == 400))) + _videoMode.overlayHeight = _videoMode.hardwareHeight = 240 * scaleFactor; + else + _videoMode.overlayHeight = _videoMode.hardwareHeight = _videoMode.screenHeight * scaleFactor; } _screenResized = false; -- cgit v1.2.3 From 26befa4b40dd230d51be756d189b92517c94720c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 12 Aug 2011 09:27:59 -0400 Subject: SCUMM: Implement basketball u32 op 1012 The game no longer divides by zero when starting a match and the court is now visible. --- engines/scumm/he/logic_he.cpp | 10 ++++++++++ engines/scumm/he/logic_he.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp index af56bca2ee..ffdc365d2d 100644 --- a/engines/scumm/he/logic_he.cpp +++ b/engines/scumm/he/logic_he.cpp @@ -1386,6 +1386,7 @@ int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) { break; case 1012: + res = op_1012(); break; case 1035: @@ -1449,6 +1450,15 @@ int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) { return res; } +int LogicHEbasketball::op_1012() { + writeScummVar(108, 12000); + writeScummVar(109, 8000); + writeScummVar(110, 760); + writeScummVar(111, 4000); + writeScummVar(112, 1600); + return 1; +} + /*********************** * Moonbase Commander * diff --git a/engines/scumm/he/logic_he.h b/engines/scumm/he/logic_he.h index e05a05f310..e649a93e72 100644 --- a/engines/scumm/he/logic_he.h +++ b/engines/scumm/he/logic_he.h @@ -174,6 +174,9 @@ public: int versionID(); int32 dispatch(int op, int numArgs, int32 *args); + +private: + int op_1012(); }; class LogicHEmoonbase : public LogicHE { -- cgit v1.2.3 From 5d416e7903cd6fb6efa7e6dbdd0bd91aa3fc4de0 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Fri, 12 Aug 2011 20:57:38 +0200 Subject: COMPOSER: Don't ignore setCursorVisible when there's no cursor yet. --- engines/composer/composer.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp index cf773dc2dc..11bf8e8900 100644 --- a/engines/composer/composer.cpp +++ b/engines/composer/composer.cpp @@ -253,16 +253,15 @@ void ComposerEngine::setCursor(uint16 id, const Common::Point &offset) { } void ComposerEngine::setCursorVisible(bool visible) { - if (!_mouseSpriteId) - return; - if (visible && !_mouseVisible) { _mouseVisible = true; - addSprite(_mouseSpriteId, 0, 0, _lastMousePos - _mouseOffset); + if (_mouseSpriteId) + addSprite(_mouseSpriteId, 0, 0, _lastMousePos - _mouseOffset); onMouseMove(_lastMousePos); } else if (!visible && _mouseVisible) { _mouseVisible = false; - removeSprite(_mouseSpriteId, 0); + if (_mouseSpriteId) + removeSprite(_mouseSpriteId, 0); } } -- cgit v1.2.3 From d13b96737602c66d61b7fd7d343d8cc48b229073 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Fri, 12 Aug 2011 21:11:39 +0200 Subject: MOHAWK: Yet more LB detection entries. --- engines/mohawk/detection_tables.h | 84 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 01eac0aaba..a587d06760 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -653,6 +653,23 @@ static const MohawkGameDescription gameDescriptions[] = { "HARRY.EXE" }, + // part of "Super Living Books" compilation + // from rgemini, bug #3309343 + { + { + "harryhh", + "", + AD_ENTRY1("HARRY.512", "39d11399796dfa36d3f631d2d87e8b85"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + "HARRY.EXE" + }, + { { "carmentq", @@ -929,6 +946,23 @@ static const MohawkGameDescription gameDescriptions[] = { "TORTOISE.EXE" }, + // part of "Super Living Books" compilation + // from rgemini, bug #3309343 + { + { + "tortoise", + "", + AD_ENTRY1("TORTOISE.512", "e9ec7a6bc6b451c9e85e5b4f072d5143"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + "TORTOISE.EXE" + }, + // From afholman in bug#3309308 { { @@ -1053,6 +1087,23 @@ static const MohawkGameDescription gameDescriptions[] = { "ARTHUR.EXE" }, + // part of "Super Living Books" compilation + // from rgemini, bug #3309343 + { + { + "arthur", + "", + AD_ENTRY1("PAGES.512", "cd995d20d0d7b4642476fd76044b4e5b"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_LB_10, + "ARTHUR.EXE" + }, + // From afholman in bug#3309308 { { @@ -1195,6 +1246,22 @@ static const MohawkGameDescription gameDescriptions[] = { "GRANDMA.EXE" }, + // from jjnryan in bug #3389857 + { + { + "grandma", + "v1.0", + AD_ENTRY1("PAGES.512", "613ca946bc8d91087fb7c10e9b84e88b"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_LB_10, + "GRANDMA.EXE" + }, + { { "grandma", @@ -1366,6 +1433,23 @@ static const MohawkGameDescription gameDescriptions[] = { "NEWKID.EXE" }, + // part of "Super Living Books" compilation + // from rgemini, bug #3309343 + { + { + "newkid", + "", + AD_ENTRY1("NEWKID.512", "28a5aef3e6ef7e2ed7742485c25bdff6"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + "NEWKID.EXE" + }, + // From aluff in bug#3309981 { { -- cgit v1.2.3 From b631104fd0220190841423614156b76334f59f39 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Fri, 12 Aug 2011 21:16:47 +0200 Subject: COMPOSER: Catch up with animations if we're starved of CPU time. --- engines/composer/composer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp index 11bf8e8900..41afc13184 100644 --- a/engines/composer/composer.cpp +++ b/engines/composer/composer.cpp @@ -125,9 +125,9 @@ Common::Error ComposerEngine::run() { } if (lastDrawTime + frameTime <= thisTime) { - // catch up if we're more than 5 frames behind - if (lastDrawTime + (frameTime * 5) <= thisTime) - lastDrawTime = thisTime - (frameTime * 5); + // catch up if we're more than 2 frames behind + if (lastDrawTime + (frameTime * 2) <= thisTime) + lastDrawTime = thisTime; else lastDrawTime += frameTime; -- cgit v1.2.3 From c109a60a9233bfe6f30475abf4814ad5c6bc2f70 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 12 Aug 2011 16:41:16 -0400 Subject: SCUMM: Implement basic basketball court data parsing --- engines/scumm/he/logic_he.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++ engines/scumm/he/logic_he.h | 19 +++++++++++ 2 files changed, 92 insertions(+) diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp index ffdc365d2d..495af1c217 100644 --- a/engines/scumm/he/logic_he.cpp +++ b/engines/scumm/he/logic_he.cpp @@ -1393,6 +1393,7 @@ int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) { break; case 1050: + res = op_1050(args); break; case 1051: @@ -1401,6 +1402,10 @@ int32 LogicHEbasketball::dispatch(int op, int numArgs, int32 *args) { case 1052: break; + case 1053: + res = op_1053(); + break; + case 1056: break; @@ -1459,6 +1464,74 @@ int LogicHEbasketball::op_1012() { return 1; } +int LogicHEbasketball::op_1050(int32 *args) { + // This function loads the court data + static const char *courtNames[] = { + "Dobbaguchi", "Jocindas", "SandyFlats", "Queens", + "Park", "Scheffler", "Polk", "McMillan", + "CrownHill", "Memorial", "TechState", "Garden", + "Moon", "Barn" + }; + + Common::String courtFileName = Common::String::format("data/courts/%s.cof", courtNames[args[0] - 1]); + + Common::File file; + if (!file.open(courtFileName)) + error("Could not open file '%s'", courtFileName.c_str()); + + debug(0, "Loading court data from '%s'", courtFileName.c_str()); + + // First, read in the header + file.readUint32LE(); // Header size (?) + + char version[6]; + file.read(version, 5); + version[5] = 0; + + if (strcmp(version, "01.05")) + error("Invalid court version field: %s", version); + + uint32 objectCount = file.readUint32LE(); + + for (uint32 i = 0; i < objectCount; i++) { + char nameBuf[100]; + memset(nameBuf, 0, sizeof(nameBuf)); + + uint32 nameLength = file.readUint32LE(); + assert(nameLength < sizeof(nameBuf) - 1); + file.read(nameBuf, nameLength); + + CourtObject object; + object.name = nameBuf; + object.type = (CourtObjectType)file.readUint32LE(); + for (uint32 j = 0; j < 10; j++) + object.data[j] = file.readUint32LE(); + + debug(1, "Found court object '%s' - Type %d", nameBuf, object.type); + + // Store backboard object indices for later + if (object.type == kObjectTypeBackboard) { + if (object.data[7] + object.data[4] / 2 >= 6000) + _backboardObjectRight = i; + else + _backboardObjectLeft = i; + } + + _courtObjects.push_back(object); + } + + // TODO: Some other variables are initialized with constants here + + return 1; +} + +int LogicHEbasketball::op_1053() { + _courtObjects.clear(); + // TODO: This also calls op_1065 with one argument (5) + + return 1; +} + /*********************** * Moonbase Commander * diff --git a/engines/scumm/he/logic_he.h b/engines/scumm/he/logic_he.h index e649a93e72..4e0d084325 100644 --- a/engines/scumm/he/logic_he.h +++ b/engines/scumm/he/logic_he.h @@ -177,6 +177,25 @@ public: private: int op_1012(); + int op_1050(int32 *args); + int op_1053(); + + // op_1050 loads court object data + enum CourtObjectType { + kObjectTypeBackboard = 1, + kObjectTypeRim = 2, + kObjectTypeOther = 3, + kObjectTypeFloor = 4 + }; + + struct CourtObject { + Common::String name; + CourtObjectType type; + uint32 data[10]; + }; + + Common::Array _courtObjects; + uint32 _backboardObjectLeft, _backboardObjectRight; }; class LogicHEmoonbase : public LogicHE { -- cgit v1.2.3 From e9c8232da864891fafcceb217b291a50096738ce Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 13 Aug 2011 19:49:54 +1000 Subject: TSAGE: Split up the hard-coded logic files for Ringworld and Blue Force into separate sub-folderes --- engines/tsage/blue_force/blueforce_logic.cpp | 128 + engines/tsage/blue_force/blueforce_logic.h | 42 + engines/tsage/blue_force/blueforce_scenes0.cpp | 196 + engines/tsage/blue_force/blueforce_scenes0.h | 56 + engines/tsage/blue_force/blueforce_scenes1.cpp | 195 + engines/tsage/blue_force/blueforce_scenes1.h | 73 + engines/tsage/blueforce_logic.cpp | 128 - engines/tsage/blueforce_logic.h | 42 - engines/tsage/blueforce_scenes0.cpp | 196 - engines/tsage/blueforce_scenes0.h | 56 - engines/tsage/blueforce_scenes1.cpp | 195 - engines/tsage/blueforce_scenes1.h | 73 - engines/tsage/debugger.cpp | 2 +- engines/tsage/dialogs.cpp | 2 +- engines/tsage/globals.cpp | 6 +- engines/tsage/module.mk | 26 +- engines/tsage/ringworld/ringworld_demo.cpp | 120 + engines/tsage/ringworld/ringworld_demo.h | 59 + engines/tsage/ringworld/ringworld_logic.cpp | 1490 ++++++ engines/tsage/ringworld/ringworld_logic.h | 461 ++ engines/tsage/ringworld/ringworld_scenes1.cpp | 3345 +++++++++++++ engines/tsage/ringworld/ringworld_scenes1.h | 538 +++ engines/tsage/ringworld/ringworld_scenes10.cpp | 2089 ++++++++ engines/tsage/ringworld/ringworld_scenes10.h | 532 ++ engines/tsage/ringworld/ringworld_scenes2.cpp | 928 ++++ engines/tsage/ringworld/ringworld_scenes2.h | 149 + engines/tsage/ringworld/ringworld_scenes3.cpp | 6133 ++++++++++++++++++++++++ engines/tsage/ringworld/ringworld_scenes3.h | 895 ++++ engines/tsage/ringworld/ringworld_scenes4.cpp | 250 + engines/tsage/ringworld/ringworld_scenes4.h | 92 + engines/tsage/ringworld/ringworld_scenes5.cpp | 4441 +++++++++++++++++ engines/tsage/ringworld/ringworld_scenes5.h | 693 +++ engines/tsage/ringworld/ringworld_scenes6.cpp | 2200 +++++++++ engines/tsage/ringworld/ringworld_scenes6.h | 330 ++ engines/tsage/ringworld/ringworld_scenes8.cpp | 2545 ++++++++++ engines/tsage/ringworld/ringworld_scenes8.h | 490 ++ engines/tsage/ringworld_demo.cpp | 120 - engines/tsage/ringworld_demo.h | 59 - engines/tsage/ringworld_logic.cpp | 1490 ------ engines/tsage/ringworld_logic.h | 461 -- engines/tsage/ringworld_scenes1.cpp | 3345 ------------- engines/tsage/ringworld_scenes1.h | 538 --- engines/tsage/ringworld_scenes10.cpp | 2089 -------- engines/tsage/ringworld_scenes10.h | 532 -- engines/tsage/ringworld_scenes2.cpp | 928 ---- engines/tsage/ringworld_scenes2.h | 149 - engines/tsage/ringworld_scenes3.cpp | 6133 ------------------------ engines/tsage/ringworld_scenes3.h | 895 ---- engines/tsage/ringworld_scenes4.cpp | 250 - engines/tsage/ringworld_scenes4.h | 92 - engines/tsage/ringworld_scenes5.cpp | 4441 ----------------- engines/tsage/ringworld_scenes5.h | 693 --- engines/tsage/ringworld_scenes6.cpp | 2200 --------- engines/tsage/ringworld_scenes6.h | 330 -- engines/tsage/ringworld_scenes8.cpp | 2545 ---------- engines/tsage/ringworld_scenes8.h | 490 -- engines/tsage/scenes.cpp | 2 +- 57 files changed, 28489 insertions(+), 28489 deletions(-) create mode 100644 engines/tsage/blue_force/blueforce_logic.cpp create mode 100644 engines/tsage/blue_force/blueforce_logic.h create mode 100644 engines/tsage/blue_force/blueforce_scenes0.cpp create mode 100644 engines/tsage/blue_force/blueforce_scenes0.h create mode 100644 engines/tsage/blue_force/blueforce_scenes1.cpp create mode 100644 engines/tsage/blue_force/blueforce_scenes1.h delete mode 100644 engines/tsage/blueforce_logic.cpp delete mode 100644 engines/tsage/blueforce_logic.h delete mode 100644 engines/tsage/blueforce_scenes0.cpp delete mode 100644 engines/tsage/blueforce_scenes0.h delete mode 100644 engines/tsage/blueforce_scenes1.cpp delete mode 100644 engines/tsage/blueforce_scenes1.h create mode 100644 engines/tsage/ringworld/ringworld_demo.cpp create mode 100644 engines/tsage/ringworld/ringworld_demo.h create mode 100644 engines/tsage/ringworld/ringworld_logic.cpp create mode 100644 engines/tsage/ringworld/ringworld_logic.h create mode 100644 engines/tsage/ringworld/ringworld_scenes1.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes1.h create mode 100644 engines/tsage/ringworld/ringworld_scenes10.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes10.h create mode 100644 engines/tsage/ringworld/ringworld_scenes2.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes2.h create mode 100644 engines/tsage/ringworld/ringworld_scenes3.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes3.h create mode 100644 engines/tsage/ringworld/ringworld_scenes4.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes4.h create mode 100644 engines/tsage/ringworld/ringworld_scenes5.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes5.h create mode 100644 engines/tsage/ringworld/ringworld_scenes6.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes6.h create mode 100644 engines/tsage/ringworld/ringworld_scenes8.cpp create mode 100644 engines/tsage/ringworld/ringworld_scenes8.h delete mode 100644 engines/tsage/ringworld_demo.cpp delete mode 100644 engines/tsage/ringworld_demo.h delete mode 100644 engines/tsage/ringworld_logic.cpp delete mode 100644 engines/tsage/ringworld_logic.h delete mode 100644 engines/tsage/ringworld_scenes1.cpp delete mode 100644 engines/tsage/ringworld_scenes1.h delete mode 100644 engines/tsage/ringworld_scenes10.cpp delete mode 100644 engines/tsage/ringworld_scenes10.h delete mode 100644 engines/tsage/ringworld_scenes2.cpp delete mode 100644 engines/tsage/ringworld_scenes2.h delete mode 100644 engines/tsage/ringworld_scenes3.cpp delete mode 100644 engines/tsage/ringworld_scenes3.h delete mode 100644 engines/tsage/ringworld_scenes4.cpp delete mode 100644 engines/tsage/ringworld_scenes4.h delete mode 100644 engines/tsage/ringworld_scenes5.cpp delete mode 100644 engines/tsage/ringworld_scenes5.h delete mode 100644 engines/tsage/ringworld_scenes6.cpp delete mode 100644 engines/tsage/ringworld_scenes6.h delete mode 100644 engines/tsage/ringworld_scenes8.cpp delete mode 100644 engines/tsage/ringworld_scenes8.h diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp new file mode 100644 index 0000000000..87e1597e1d --- /dev/null +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -0,0 +1,128 @@ +/* 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. + * + */ + +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/blue_force/blueforce_scenes0.h" +#include "tsage/blue_force/blueforce_scenes1.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +void BlueForceGame::start() { + // Start the game + _globals->_sceneManager.changeScene(20); + + _globals->_events.setCursor(CURSOR_WALK); +} + +Scene *BlueForceGame::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene Group #0 */ + case 20: + // Tsunami Title Screen + return new BF_Scene20(); + case 50: + case 60: + error("Scene group 0 not implemented"); + /* Scene Group #1 */ + case 100: + // Tsnunami Title Screen #2 + return new BF_Scene100(); + case 109: + case 110: + case 114: + case 115: + case 125: + case 140: + case 150: + case 160: + case 180: + case 190: + error("Scene group 1 not implemented"); + case 200: + case 210: + case 220: + case 225: + case 265: + case 270: + case 271: + case 280: + error("Scene group 2 not implemented"); + case 300: + case 315: + case 325: + case 330: + case 340: + case 342: + case 350: + case 355: + case 360: + case 370: + case 380: + case 385: + case 390: + error("Scene group 3 not implemented"); + case 410: + case 415: + case 440: + case 450: + error("Scene group 4 not implemented"); + case 550: + case 551: + case 560: + case 570: + case 580: + case 590: + error("Scene group 5 not implemented"); + case 600: + case 620: + case 666: + case 690: + error("Scene group 6 not implemented"); + case 710: + error("Scene group 7 not implemented"); + case 800: + case 810: + case 820: + case 830: + case 840: + case 850: + case 860: + case 870: + case 880: + error("Scene group 8 not implemented"); + case 900: + case 910: + case 920: + case 930: + case 935: + case 940: + error("Scene group 9 not implemented"); + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +} // End of namespace tSage diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h new file mode 100644 index 0000000000..9237e50a13 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -0,0 +1,42 @@ +/* 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. + * + */ + +#ifndef TSAGE_BLUEFORCE_LOGIC_H +#define TSAGE_BLUEFORCE_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +class BlueForceGame: public Game { +public: + virtual void start(); + virtual Scene *createScene(int sceneNumber); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp new file mode 100644 index 0000000000..3eaa2bfdab --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes0.cpp @@ -0,0 +1,196 @@ +/* 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. + * + */ + +#include "tsage/blue_force/blueforce_scenes0.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 20 - Tsunami Title Screen + * + *--------------------------------------------------------------------------*/ + +void BF_Scene20::Action1::signal() { + BF_Scene20 *scene = (BF_Scene20 *)_globals->_sceneManager._scene; + static byte black[3] = { 0, 0, 0 }; + + switch (_actionIndex++) { + case 0: + setDelay(2); + break; + case 1: + _sound.play(1); + _globals->_scenePalette.addRotation(64, 127, -1, 1, this); + break; + case 2: + scene->_object1.setVisage(22); + scene->_object1._strip = 1; + scene->_object1._frame = 1; + scene->_object1.changeZoom(100); + + scene->_object2.setVisage(22); + scene->_object2._strip = 2; + scene->_object2._frame = 1; + scene->_object2.changeZoom(100); + + scene->_object3.setVisage(22); + scene->_object3._strip = 3; + scene->_object3._frame = 1; + scene->_object3.changeZoom(100); + + scene->_object4.setVisage(22); + scene->_object4._strip = 4; + scene->_object4._frame = 1; + scene->_object4.changeZoom(100); + + scene->_object5.setVisage(22); + scene->_object5._strip = 5; + scene->_object5._frame = 1; + scene->_object5.changeZoom(100); + + scene->_object6.setVisage(22); + scene->_object6._strip = 6; + scene->_object6._frame = 1; + scene->_object6.changeZoom(100); + + scene->_object7.setVisage(22); + scene->_object7._strip = 7; + scene->_object7._frame = 1; + scene->_object7.changeZoom(100); + + scene->_object8.setVisage(22); + scene->_object8._strip = 8; + scene->_object8._frame = 1; + scene->_object8.changeZoom(100); + + setDelay(1); + break; + case 3: + _globals->_scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this); + break; + case 4: + setDelay(60); + break; + case 5: + scene->_object2.animate(ANIM_MODE_5, NULL); + scene->_object3.animate(ANIM_MODE_5, NULL); + scene->_object4.animate(ANIM_MODE_5, NULL); + scene->_object5.animate(ANIM_MODE_5, NULL); + scene->_object6.animate(ANIM_MODE_5, NULL); + scene->_object7.animate(ANIM_MODE_5, this); + break; + case 6: + setDelay(120); + break; + case 7: + _globals->_scenePalette.addFader(black, 1, 5, this); + break; + case 8: + _globals->_sceneManager.changeScene(100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void BF_Scene20::postInit(SceneObjectList *OwnerList) { + loadScene(20); + Scene::postInit(); + setZoomPercents(60, 85, 200, 100); + + preloadVisage(21); + preloadVisage(22); + _scenePalette.loadPalette(1); + _scenePalette.loadPalette(22); + + _object1.postInit(); + _object1.setVisage(21); + _object1._strip = 1; + _object1._frame = 1; + _object1.animate(ANIM_MODE_NONE, NULL); + _object1.setPosition(Common::Point(62, 85)); + _object1.changeZoom(100); + + _object2.postInit(); + _object2.setVisage(21); + _object2._strip = 2; + _object2._frame = 1; + _object2.animate(ANIM_MODE_NONE, NULL); + _object2.setPosition(Common::Point(27, 94)); + _object2.changeZoom(100); + + _object3.postInit(); + _object3.setVisage(21); + _object3._strip = 2; + _object3._frame = 2; + _object3.animate(ANIM_MODE_NONE, NULL); + _object3.setPosition(Common::Point(68, 94)); + _object3.changeZoom(100); + + _object4.postInit(); + _object4.setVisage(21); + _object4._strip = 2; + _object4._frame = 3; + _object4.animate(ANIM_MODE_NONE, NULL); + _object4.setPosition(Common::Point(110, 94)); + _object4.changeZoom(100); + + _object5.postInit(); + _object5.setVisage(21); + _object5._strip = 2; + _object5._frame = 4; + _object5.animate(ANIM_MODE_NONE, NULL); + _object5.setPosition(Common::Point(154, 94)); + _object5.changeZoom(100); + + _object6.postInit(); + _object6.setVisage(21); + _object6._strip = 2; + _object6._frame = 5; + _object6.animate(ANIM_MODE_NONE, NULL); + _object6.setPosition(Common::Point(199, 94)); + _object6.changeZoom(100); + + _object7.postInit(); + _object7.setVisage(21); + _object7._strip = 2; + _object7._frame = 6; + _object7.animate(ANIM_MODE_NONE, NULL); + _object7.setPosition(Common::Point(244, 94)); + _object7.changeZoom(100); + + _object8.postInit(); + _object8.setVisage(21); + _object8._strip = 2; + _object8._frame = 7; + _object8.animate(ANIM_MODE_NONE, NULL); + _object8.setPosition(Common::Point(286, 94)); + _object8.changeZoom(100); + + setAction(&_action1); +} + +} // End of namespace tSage diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h new file mode 100644 index 0000000000..c176a17110 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes0.h @@ -0,0 +1,56 @@ +/* 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. + * + */ + +#ifndef TSAGE_BLUEFORCE_SCENES0_H +#define TSAGE_BLUEFORCE_SCENES0_H + +#include "common/scummsys.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace tSage { + +class BF_Scene20 : public Scene { + /* Actions */ + class Action1 : public Action { + private: + ASoundExt _sound; + public: + virtual void signal(); + }; +public: + Action1 _action1; + ScenePalette _scenePalette; + SceneObject _object1, _object2, _object3, _object4; + SceneObject _object5, _object6, _object7, _object8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp new file mode 100644 index 0000000000..0f0ab6c1c3 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes1.cpp @@ -0,0 +1,195 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/blue_force/blueforce_scenes1.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 100 - Tsunami Title Screen #2 + * + *--------------------------------------------------------------------------*/ + +void BF_Scene100::Action1::signal() { + static byte black[3] = { 0, 0, 0 }; + + switch (_actionIndex++) { + case 0: + _state = 0; + setDelay(6); + break; + case 1: { + Common::String msg1 = _resourceManager->getMessage(100, _state++); + if (!msg1.compareTo("LASTCREDIT")) { + Common::String msg2 = _resourceManager->getMessage(100, _state++); + setTextStrings(msg1, msg2, this); + } else { + setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this); + + Common::Point pt(_sceneText1._position.x, 80); + NpcMover *mover = new NpcMover(); + _sceneText1.addMover(mover, &pt, this); + } + break; + } + case 2: + setDelay(600); + break; + case 3: + BF_GLOBALS._sound1.fade(0, 10, 10, 1, this); + GLOBALS._scenePalette.addFader(black, 1, 2, NULL); + break; + case 4: + error("??exit"); + break; + } +} + +void BF_Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) { + // Set data for first text control + _sceneText1._fontNumber = 10; + _sceneText1._width = 160; + _sceneText1._textMode = ALIGN_RIGHT; + _sceneText1._color1 = _globals->_fontColors.background; + _sceneText1._color2 = _globals->_fontColors.foreground; + _sceneText1._color3 = _globals->_fontColors.background; + _sceneText1.setup(msg1); + _sceneText1.setFrame2(-1); + _sceneText1.setPosition(Common::Point( + (SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202)); + _sceneText1._moveRate = 30; + _sceneText1._moveDiff.y = 1; + + // Set data for second text control + _sceneText2._fontNumber = 10; + _sceneText2._width = _sceneText1._width; + _sceneText2._textMode = _sceneText1._textMode; + _sceneText2._color1 = _globals->_fontColors.background; + _sceneText2._color2 = _globals->_fontColors.foreground; + _sceneText2._color3 = _globals->_fontColors.background; + _sceneText2.setup(msg1); + _sceneText2.setFrame2(-1); + GfxSurface textSurface = _sceneText2.getFrame(); + _sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202)); + _sceneText2._moveRate = 30; + _sceneText2._moveDiff.y = 1; + + _textHeight = textSurface.getBounds().height(); + int yp = -(_textHeight * 2); + + Common::Point pt(_sceneText1._position.x, yp); + NpcMover *mover = new NpcMover(); + _sceneText1.addMover(mover, &pt, action); +} + +void BF_Scene100::Action2::signal() { + BF_Scene100 *scene = (BF_Scene100 *)_globals->_sceneManager._scene; + static byte black[3] = {0, 0, 0}; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._scenePalette.addFader(black, 1, -2, this); + break; + case 1: + setDelay(180); + break; + case 2: { + const char *SEEN_INTRO = "seen_intro"; + if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { + // First time being played, so will need to show the intro + ConfMan.setBool(SEEN_INTRO, true); + ConfMan.flushToDisk(); + } else { + // Prompt user for whether to start play or watch introduction + _globals->_player.enableControl(); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + // Signal to start the game + scene->_index = 190; + remove(); + return; + } + } + + // At this point the introduction needs to start + _globals->_scenePalette.addFader(black, 1, 2, this); + break; + } + case 3: + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +BF_Scene100::BF_Scene100(): Scene() { + _index = 0; +} + +void BF_Scene100::postInit(SceneObjectList *OwnerList) { + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._v51C44 = 1; + Scene::postInit(); + BF_GLOBALS._v51C24 = 200; + + _globals->_player.enableControl(); + _globals->_player.hide(); + _globals->_player.disableControl(); + _index = 109; + + if (BF_GLOBALS._v4CEA2 < 6) { + // Title + loadScene(100); + BF_GLOBALS._sound1.play(2); + setAction(&_action2, this); + } else { + // Credits + loadScene(101); + BF_GLOBALS._sound1.play(118); + setAction(&_action1, this); + } + + loadScene(20); + setZoomPercents(60, 85, 200, 100); +} + +void BF_Scene100::signal() { + ++_sceneMode; + if (BF_GLOBALS._v4CEA2 < 6) { + BF_GLOBALS._scenePalette.clearListeners(); + BF_GLOBALS._scenePalette.loadPalette(100); + BF_GLOBALS._sceneManager.changeScene(_index); + } else { + if (_sceneMode > 1) + BF_GLOBALS._events.setCursor(CURSOR_ARROW); + + setAction(this, &_action1, this); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h new file mode 100644 index 0000000000..16d327fe9f --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes1.h @@ -0,0 +1,73 @@ +/* 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. + * + */ + +#ifndef TSAGE_BLUEFORCE_SCENES1_H +#define TSAGE_BLUEFORCE_SCENES1_H + +#include "common/scummsys.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace tSage { + +class BF_Scene100: public Scene { + /* Actions */ + class Action1: public ActionExt { + private: + void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action); + public: + SceneText _sceneText1, _sceneText2; + int _textHeight; + + virtual Common::String getClassName() { return "BF100Action1"; } + virtual void synchronize(Serializer &s) { + ActionExt::synchronize(s); + s.syncAsSint16LE(_textHeight); + } + virtual void signal(); + }; + class Action2: public ActionExt { + public: + virtual Common::String getClassName() { return "BF100Action2"; } + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + ScenePalette _scenePalette; + SceneObjectExt2 _object1, _object2, _object3, _object4, _object5; + int _index; + + BF_Scene100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp deleted file mode 100644 index cad7609abc..0000000000 --- a/engines/tsage/blueforce_logic.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* 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. - * - */ - -#include "tsage/blueforce_logic.h" -#include "tsage/blueforce_scenes0.h" -#include "tsage/blueforce_scenes1.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -void BlueForceGame::start() { - // Start the game - _globals->_sceneManager.changeScene(20); - - _globals->_events.setCursor(CURSOR_WALK); -} - -Scene *BlueForceGame::createScene(int sceneNumber) { - switch (sceneNumber) { - /* Scene Group #0 */ - case 20: - // Tsunami Title Screen - return new BF_Scene20(); - case 50: - case 60: - error("Scene group 0 not implemented"); - /* Scene Group #1 */ - case 100: - // Tsnunami Title Screen #2 - return new BF_Scene100(); - case 109: - case 110: - case 114: - case 115: - case 125: - case 140: - case 150: - case 160: - case 180: - case 190: - error("Scene group 1 not implemented"); - case 200: - case 210: - case 220: - case 225: - case 265: - case 270: - case 271: - case 280: - error("Scene group 2 not implemented"); - case 300: - case 315: - case 325: - case 330: - case 340: - case 342: - case 350: - case 355: - case 360: - case 370: - case 380: - case 385: - case 390: - error("Scene group 3 not implemented"); - case 410: - case 415: - case 440: - case 450: - error("Scene group 4 not implemented"); - case 550: - case 551: - case 560: - case 570: - case 580: - case 590: - error("Scene group 5 not implemented"); - case 600: - case 620: - case 666: - case 690: - error("Scene group 6 not implemented"); - case 710: - error("Scene group 7 not implemented"); - case 800: - case 810: - case 820: - case 830: - case 840: - case 850: - case 860: - case 870: - case 880: - error("Scene group 8 not implemented"); - case 900: - case 910: - case 920: - case 930: - case 935: - case 940: - error("Scene group 9 not implemented"); - default: - error("Unknown scene number - %d", sceneNumber); - break; - } -} - -} // End of namespace tSage diff --git a/engines/tsage/blueforce_logic.h b/engines/tsage/blueforce_logic.h deleted file mode 100644 index 9237e50a13..0000000000 --- a/engines/tsage/blueforce_logic.h +++ /dev/null @@ -1,42 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_BLUEFORCE_LOGIC_H -#define TSAGE_BLUEFORCE_LOGIC_H - -#include "common/scummsys.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -class BlueForceGame: public Game { -public: - virtual void start(); - virtual Scene *createScene(int sceneNumber); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/blueforce_scenes0.cpp b/engines/tsage/blueforce_scenes0.cpp deleted file mode 100644 index 4a0259cb98..0000000000 --- a/engines/tsage/blueforce_scenes0.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* 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. - * - */ - -#include "tsage/blueforce_scenes0.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 20 - Tsunami Title Screen - * - *--------------------------------------------------------------------------*/ - -void BF_Scene20::Action1::signal() { - BF_Scene20 *scene = (BF_Scene20 *)_globals->_sceneManager._scene; - static byte black[3] = { 0, 0, 0 }; - - switch (_actionIndex++) { - case 0: - setDelay(2); - break; - case 1: - _sound.play(1); - _globals->_scenePalette.addRotation(64, 127, -1, 1, this); - break; - case 2: - scene->_object1.setVisage(22); - scene->_object1._strip = 1; - scene->_object1._frame = 1; - scene->_object1.changeZoom(100); - - scene->_object2.setVisage(22); - scene->_object2._strip = 2; - scene->_object2._frame = 1; - scene->_object2.changeZoom(100); - - scene->_object3.setVisage(22); - scene->_object3._strip = 3; - scene->_object3._frame = 1; - scene->_object3.changeZoom(100); - - scene->_object4.setVisage(22); - scene->_object4._strip = 4; - scene->_object4._frame = 1; - scene->_object4.changeZoom(100); - - scene->_object5.setVisage(22); - scene->_object5._strip = 5; - scene->_object5._frame = 1; - scene->_object5.changeZoom(100); - - scene->_object6.setVisage(22); - scene->_object6._strip = 6; - scene->_object6._frame = 1; - scene->_object6.changeZoom(100); - - scene->_object7.setVisage(22); - scene->_object7._strip = 7; - scene->_object7._frame = 1; - scene->_object7.changeZoom(100); - - scene->_object8.setVisage(22); - scene->_object8._strip = 8; - scene->_object8._frame = 1; - scene->_object8.changeZoom(100); - - setDelay(1); - break; - case 3: - _globals->_scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this); - break; - case 4: - setDelay(60); - break; - case 5: - scene->_object2.animate(ANIM_MODE_5, NULL); - scene->_object3.animate(ANIM_MODE_5, NULL); - scene->_object4.animate(ANIM_MODE_5, NULL); - scene->_object5.animate(ANIM_MODE_5, NULL); - scene->_object6.animate(ANIM_MODE_5, NULL); - scene->_object7.animate(ANIM_MODE_5, this); - break; - case 6: - setDelay(120); - break; - case 7: - _globals->_scenePalette.addFader(black, 1, 5, this); - break; - case 8: - _globals->_sceneManager.changeScene(100); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void BF_Scene20::postInit(SceneObjectList *OwnerList) { - loadScene(20); - Scene::postInit(); - setZoomPercents(60, 85, 200, 100); - - preloadVisage(21); - preloadVisage(22); - _scenePalette.loadPalette(1); - _scenePalette.loadPalette(22); - - _object1.postInit(); - _object1.setVisage(21); - _object1._strip = 1; - _object1._frame = 1; - _object1.animate(ANIM_MODE_NONE, NULL); - _object1.setPosition(Common::Point(62, 85)); - _object1.changeZoom(100); - - _object2.postInit(); - _object2.setVisage(21); - _object2._strip = 2; - _object2._frame = 1; - _object2.animate(ANIM_MODE_NONE, NULL); - _object2.setPosition(Common::Point(27, 94)); - _object2.changeZoom(100); - - _object3.postInit(); - _object3.setVisage(21); - _object3._strip = 2; - _object3._frame = 2; - _object3.animate(ANIM_MODE_NONE, NULL); - _object3.setPosition(Common::Point(68, 94)); - _object3.changeZoom(100); - - _object4.postInit(); - _object4.setVisage(21); - _object4._strip = 2; - _object4._frame = 3; - _object4.animate(ANIM_MODE_NONE, NULL); - _object4.setPosition(Common::Point(110, 94)); - _object4.changeZoom(100); - - _object5.postInit(); - _object5.setVisage(21); - _object5._strip = 2; - _object5._frame = 4; - _object5.animate(ANIM_MODE_NONE, NULL); - _object5.setPosition(Common::Point(154, 94)); - _object5.changeZoom(100); - - _object6.postInit(); - _object6.setVisage(21); - _object6._strip = 2; - _object6._frame = 5; - _object6.animate(ANIM_MODE_NONE, NULL); - _object6.setPosition(Common::Point(199, 94)); - _object6.changeZoom(100); - - _object7.postInit(); - _object7.setVisage(21); - _object7._strip = 2; - _object7._frame = 6; - _object7.animate(ANIM_MODE_NONE, NULL); - _object7.setPosition(Common::Point(244, 94)); - _object7.changeZoom(100); - - _object8.postInit(); - _object8.setVisage(21); - _object8._strip = 2; - _object8._frame = 7; - _object8.animate(ANIM_MODE_NONE, NULL); - _object8.setPosition(Common::Point(286, 94)); - _object8.changeZoom(100); - - setAction(&_action1); -} - -} // End of namespace tSage diff --git a/engines/tsage/blueforce_scenes0.h b/engines/tsage/blueforce_scenes0.h deleted file mode 100644 index 06f7912959..0000000000 --- a/engines/tsage/blueforce_scenes0.h +++ /dev/null @@ -1,56 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_BLUEFORCE_SCENES0_H -#define TSAGE_BLUEFORCE_SCENES0_H - -#include "common/scummsys.h" -#include "tsage/blueforce_logic.h" -#include "tsage/converse.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" -#include "tsage/sound.h" - -namespace tSage { - -class BF_Scene20 : public Scene { - /* Actions */ - class Action1 : public Action { - private: - ASoundExt _sound; - public: - virtual void signal(); - }; -public: - Action1 _action1; - ScenePalette _scenePalette; - SceneObject _object1, _object2, _object3, _object4; - SceneObject _object5, _object6, _object7, _object8; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/blueforce_scenes1.cpp b/engines/tsage/blueforce_scenes1.cpp deleted file mode 100644 index 81f7d0ac76..0000000000 --- a/engines/tsage/blueforce_scenes1.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "tsage/blueforce_scenes1.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" -#include "tsage/globals.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 100 - Tsunami Title Screen #2 - * - *--------------------------------------------------------------------------*/ - -void BF_Scene100::Action1::signal() { - static byte black[3] = { 0, 0, 0 }; - - switch (_actionIndex++) { - case 0: - _state = 0; - setDelay(6); - break; - case 1: { - Common::String msg1 = _resourceManager->getMessage(100, _state++); - if (!msg1.compareTo("LASTCREDIT")) { - Common::String msg2 = _resourceManager->getMessage(100, _state++); - setTextStrings(msg1, msg2, this); - } else { - setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this); - - Common::Point pt(_sceneText1._position.x, 80); - NpcMover *mover = new NpcMover(); - _sceneText1.addMover(mover, &pt, this); - } - break; - } - case 2: - setDelay(600); - break; - case 3: - BF_GLOBALS._sound1.fade(0, 10, 10, 1, this); - GLOBALS._scenePalette.addFader(black, 1, 2, NULL); - break; - case 4: - error("??exit"); - break; - } -} - -void BF_Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) { - // Set data for first text control - _sceneText1._fontNumber = 10; - _sceneText1._width = 160; - _sceneText1._textMode = ALIGN_RIGHT; - _sceneText1._color1 = _globals->_fontColors.background; - _sceneText1._color2 = _globals->_fontColors.foreground; - _sceneText1._color3 = _globals->_fontColors.background; - _sceneText1.setup(msg1); - _sceneText1.setFrame2(-1); - _sceneText1.setPosition(Common::Point( - (SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202)); - _sceneText1._moveRate = 30; - _sceneText1._moveDiff.y = 1; - - // Set data for second text control - _sceneText2._fontNumber = 10; - _sceneText2._width = _sceneText1._width; - _sceneText2._textMode = _sceneText1._textMode; - _sceneText2._color1 = _globals->_fontColors.background; - _sceneText2._color2 = _globals->_fontColors.foreground; - _sceneText2._color3 = _globals->_fontColors.background; - _sceneText2.setup(msg1); - _sceneText2.setFrame2(-1); - GfxSurface textSurface = _sceneText2.getFrame(); - _sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202)); - _sceneText2._moveRate = 30; - _sceneText2._moveDiff.y = 1; - - _textHeight = textSurface.getBounds().height(); - int yp = -(_textHeight * 2); - - Common::Point pt(_sceneText1._position.x, yp); - NpcMover *mover = new NpcMover(); - _sceneText1.addMover(mover, &pt, action); -} - -void BF_Scene100::Action2::signal() { - BF_Scene100 *scene = (BF_Scene100 *)_globals->_sceneManager._scene; - static byte black[3] = {0, 0, 0}; - - switch (_actionIndex++) { - case 0: - BF_GLOBALS._scenePalette.addFader(black, 1, -2, this); - break; - case 1: - setDelay(180); - break; - case 2: { - const char *SEEN_INTRO = "seen_intro"; - if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { - // First time being played, so will need to show the intro - ConfMan.setBool(SEEN_INTRO, true); - ConfMan.flushToDisk(); - } else { - // Prompt user for whether to start play or watch introduction - _globals->_player.enableControl(); - - if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { - // Signal to start the game - scene->_index = 190; - remove(); - return; - } - } - - // At this point the introduction needs to start - _globals->_scenePalette.addFader(black, 1, 2, this); - break; - } - case 3: - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -BF_Scene100::BF_Scene100(): Scene() { - _index = 0; -} - -void BF_Scene100::postInit(SceneObjectList *OwnerList) { - BF_GLOBALS._scenePalette.loadPalette(2); - BF_GLOBALS._v51C44 = 1; - Scene::postInit(); - BF_GLOBALS._v51C24 = 200; - - _globals->_player.enableControl(); - _globals->_player.hide(); - _globals->_player.disableControl(); - _index = 109; - - if (BF_GLOBALS._v4CEA2 < 6) { - // Title - loadScene(100); - BF_GLOBALS._sound1.play(2); - setAction(&_action2, this); - } else { - // Credits - loadScene(101); - BF_GLOBALS._sound1.play(118); - setAction(&_action1, this); - } - - loadScene(20); - setZoomPercents(60, 85, 200, 100); -} - -void BF_Scene100::signal() { - ++_sceneMode; - if (BF_GLOBALS._v4CEA2 < 6) { - BF_GLOBALS._scenePalette.clearListeners(); - BF_GLOBALS._scenePalette.loadPalette(100); - BF_GLOBALS._sceneManager.changeScene(_index); - } else { - if (_sceneMode > 1) - BF_GLOBALS._events.setCursor(CURSOR_ARROW); - - setAction(this, &_action1, this); - } -} - -} // End of namespace tSage diff --git a/engines/tsage/blueforce_scenes1.h b/engines/tsage/blueforce_scenes1.h deleted file mode 100644 index d9fcc486c6..0000000000 --- a/engines/tsage/blueforce_scenes1.h +++ /dev/null @@ -1,73 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_BLUEFORCE_SCENES1_H -#define TSAGE_BLUEFORCE_SCENES1_H - -#include "common/scummsys.h" -#include "tsage/blueforce_logic.h" -#include "tsage/converse.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" -#include "tsage/sound.h" - -namespace tSage { - -class BF_Scene100: public Scene { - /* Actions */ - class Action1: public ActionExt { - private: - void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action); - public: - SceneText _sceneText1, _sceneText2; - int _textHeight; - - virtual Common::String getClassName() { return "BF100Action1"; } - virtual void synchronize(Serializer &s) { - ActionExt::synchronize(s); - s.syncAsSint16LE(_textHeight); - } - virtual void signal(); - }; - class Action2: public ActionExt { - public: - virtual Common::String getClassName() { return "BF100Action2"; } - virtual void signal(); - }; -public: - SequenceManager _sequenceManager; - Action1 _action1; - Action2 _action2; - ScenePalette _scenePalette; - SceneObjectExt2 _object1, _object2, _object3, _object4, _object5; - int _index; - - BF_Scene100(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index 00cd61ae07..cae9639565 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -23,7 +23,7 @@ #include "tsage/debugger.h" #include "tsage/globals.h" #include "tsage/graphics.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" namespace tSage { diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index d315ce092b..8a1b7c6429 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -30,7 +30,7 @@ #include "tsage/dialogs.h" #include "tsage/staticres.h" #include "tsage/globals.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" namespace tSage { diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index e5572d9058..39850cd1a5 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -22,9 +22,9 @@ #include "tsage/globals.h" #include "tsage/tsage.h" -#include "tsage/blueforce_logic.h" -#include "tsage/ringworld_demo.h" -#include "tsage/ringworld_logic.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/ringworld/ringworld_demo.h" +#include "tsage/ringworld/ringworld_logic.h" namespace tSage { diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 7ac1795537..41078cdaaf 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -1,9 +1,9 @@ MODULE := engines/tsage MODULE_OBJS := \ - blueforce_logic.o \ - blueforce_scenes0.o \ - blueforce_scenes1.o \ + blue_force\blueforce_logic.o \ + blue_force\blueforce_scenes0.o \ + blue_force\blueforce_scenes1.o \ converse.o \ core.o \ debugger.o \ @@ -13,16 +13,16 @@ MODULE_OBJS := \ globals.o \ graphics.o \ resources.o \ - ringworld_demo.o \ - ringworld_logic.o \ - ringworld_scenes1.o \ - ringworld_scenes2.o \ - ringworld_scenes3.o \ - ringworld_scenes4.o \ - ringworld_scenes5.o \ - ringworld_scenes6.o \ - ringworld_scenes8.o \ - ringworld_scenes10.o \ + ringworld\ringworld_demo.o \ + ringworld\ringworld_logic.o \ + ringworld\ringworld_scenes1.o \ + ringworld\ringworld_scenes2.o \ + ringworld\ringworld_scenes3.o \ + ringworld\ringworld_scenes4.o \ + ringworld\ringworld_scenes5.o \ + ringworld\ringworld_scenes6.o \ + ringworld\ringworld_scenes8.o \ + ringworld\ringworld_scenes10.o \ saveload.o \ scenes.o \ sound.o \ diff --git a/engines/tsage/ringworld/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp new file mode 100644 index 0000000000..ce06df8e80 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_demo.cpp @@ -0,0 +1,120 @@ +/* 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. + * + */ + +#include "tsage/ringworld/ringworld_demo.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +void RingworldDemoGame::start() { + // Start the demo's single scene + _globals->_sceneManager.changeScene(1); + + _globals->_events.setCursor(CURSOR_NONE); +} + +Scene *RingworldDemoGame::createScene(int sceneNumber) { + // The demo only has a single scene, so ignore the scene number and always return it + return new RingworldDemoScene(); +} + +void RingworldDemoGame::quitGame() { + if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0) + _vm->quitGame(); +} + +void RingworldDemoGame::pauseGame() { + _globals->_events.setCursor(CURSOR_ARROW); + MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING); + dlg->draw(); + + GfxButton *selectedButton = dlg->execute(&dlg->_btn2); + bool exitFlag = selectedButton != &dlg->_btn2; + + delete dlg; + _globals->_events.hideCursor(); + + if (exitFlag) + _vm->quitGame(); +} + +void RingworldDemoGame::processEvent(Event &event) { + if (event.eventType == EVENT_KEYPRESS) { + switch (event.kbd.keycode) { + case Common::KEYCODE_F1: + // F1 - Help + MessageDialog::show(DEMO_HELP_MSG, OK_BTN_STRING); + break; + + case Common::KEYCODE_F2: { + // F2 - Sound Options + ConfigDialog *dlg = new ConfigDialog(); + dlg->runModal(); + delete dlg; + _globals->_soundManager.syncSounds(); + _globals->_events.setCursorFromFlag(); + break; + } + + case Common::KEYCODE_F3: + // F3 - Quit + quitGame(); + event.handled = false; + break; + + default: + break; + } + } else if (event.eventType == EVENT_BUTTON_DOWN) { + pauseGame(); + event.handled = true; + } +} + +/*-------------------------------------------------------------------------- + * Ringworld Demo scene + * + *--------------------------------------------------------------------------*/ + +void RingworldDemoScene::postInit(SceneObjectList *OwnerList) { + signal(); +} + +void RingworldDemoScene::signal() { + _soundHandler.play(4); + _actor1.postInit(); + _actor2.postInit(); + _actor3.postInit(); + _actor4.postInit(); + _actor5.postInit(); + _actor6.postInit(); + + setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL); +} + +void RingworldDemoScene::process(Event &event) { + +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h new file mode 100644 index 0000000000..3e7431e107 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_demo.h @@ -0,0 +1,59 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_DEMO_H +#define TSAGE_RINGWORLD_DEMO_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace tSage { + +class RingworldDemoGame: public Game { +private: + void pauseGame(); +public: + virtual void start(); + virtual Scene *createScene(int sceneNumber); + virtual void quitGame(); + virtual void processEvent(Event &event); +}; + +class RingworldDemoScene: public Scene { +public: + SequenceManager _sequenceManager; + SceneObject _actor1, _actor2, _actor3; + SceneObject _actor4, _actor5, _actor6; + ASound _soundHandler; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void process(Event &event); + virtual void signal(); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp new file mode 100644 index 0000000000..99890c90ff --- /dev/null +++ b/engines/tsage/ringworld/ringworld_logic.cpp @@ -0,0 +1,1490 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "common/translation.h" +#include "gui/saveload.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld/ringworld_demo.h" +#include "tsage/ringworld/ringworld_scenes1.h" +#include "tsage/ringworld/ringworld_scenes2.h" +#include "tsage/ringworld/ringworld_scenes3.h" +#include "tsage/ringworld/ringworld_scenes4.h" +#include "tsage/ringworld/ringworld_scenes5.h" +#include "tsage/ringworld/ringworld_scenes6.h" +#include "tsage/ringworld/ringworld_scenes8.h" +#include "tsage/ringworld/ringworld_scenes10.h" + +namespace tSage { + +Scene *RingworldGame::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene group 1 */ + // Kziniti Palace (Introduction) + case 10: return new Scene10(); + // Outer Space (Introduction) + case 15: return new Scene15(); + // Cut-scenes for Ch'mee house in distance + case 20: return new Scene20(); + // Outside Ch'mee residence + case 30: return new Scene30(); + // Chmeee Home + case 40: return new Scene40(); + // By Flycycles + case 50: return new Scene50(); + // Flycycle controls + case 60: return new Scene60(); + // Shipyard Entrance + case 90: return new Scene90(); + // Ship Close-up + case 95: return new Scene95(); + // Sunflower navigation sequence + case 6100: return new Scene6100(); + + /* Scene group 2 */ + // Title screen + case 1000: return new Scene1000(); + // Fleeing planet cutscene + case 1001: return new Scene1001(); + // Unused + case 1250: return new Scene1250(); + // Ringworld Wall + case 1400: return new Scene1400(); + // Ringworld Space-port + case 1500: return new Scene1500(); + + /* Scene group 3 - Part #1 */ + // Cockpit cutscenes + case 2000: return new Scene2000(); + // Starcraft - Cockpit + case 2100: return new Scene2100(); + // Encyclopedia + case 2120: return new Scene2120(); + // Starcraft - Level 2 + case 2150: return new Scene2150(); + // Starcraft - AutoDoc + case 2200: return new Scene2200(); + // Stasis Field Map + case 2222: return new Scene2222(); + // Starcraft - Quinn's Room + case 2230: return new Scene2230(); + + /* Scene group 3 - Part #2 */ + // Starcraft - Storage Room + case 2280: return new Scene2280(); + // Starcraft - Hanger Bay + case 2300: return new Scene2300(); + // Starcraft - Copy Protection Screen + case 2310: return new Scene2310(); + // Starcraft - Lander Bay + case 2320: return new Scene2320(); + // Scene 2400 - Descending in Lander + case 2400: return new Scene2400(); + + /* Scene group 4 */ + // Ringworld Scan + case 3500: return new Scene3500(); + // Remote Viewer + case 3700: return new Scene3700(); + + /* Scene group 5 */ + // Village + case 4000: return new Scene4000(); + // Village - Outside Lander + case 4010: return new Scene4010(); + // Village - Puzzle Board + case 4025: return new Scene4025(); + // Village - Temple Antechamber + case 4045: return new Scene4045(); + // Village - Temple + case 4050: return new Scene4050(); + // Village - Hut + case 4100: return new Scene4100(); + // Village - Bedroom + case 4150: return new Scene4150(); + // Village - Near Slaver Ship + case 4250: return new Scene4250(); + // Village - Slaver Ship + case 4300: return new Scene4300(); + // Village - Slaver Ship Keypad + case 4301: return new Scene4301(); + + /* Scene group 6 */ + // Caverns - Entrance + case 5000: return new Scene5000(); + // Caverns + case 5100: return new Scene5100(); + // Caverns - Throne-room + case 5200: return new Scene5200(); + // Caverns - Pit + case 5300: return new Scene5300(); + + /* Scene group 8 */ + // Landing near beach + case 7000: return new Scene7000(); + // Underwater: swimming + case 7100: return new Scene7100(); + // Underwater: Entering the cave + case 7200: return new Scene7200(); + // Underwater: Lord Poria + case 7300: return new Scene7300(); + // Floating Buildings: Outside + case 7600: return new Scene7600(); + // Floating Buildings: In the lab + case 7700: return new Scene7700(); + + /* Scene group 10 */ + // Near beach: Slave washing clothes + case 9100: return new Scene9100(); + // Castle: Outside the bulwarks + case 9150: return new Scene9150(); + // Castle: Near the fountain + case 9200: return new Scene9200(); + // Castle: In front of a large guarded door + case 9300: return new Scene9300(); + // Castle: In a hallway + case 9350: return new Scene9350(); + // Castle: In a hallway + case 9360: return new Scene9360(); + // Castle: Black-Smith room + case 9400: return new Scene9400(); + // Castle: Dining room + case 9450: return new Scene9450(); + // Castle: Bedroom + case 9500: return new Scene9500(); + // Castle: Balcony + case 9700: return new Scene9700(); + // Castle: In the garden + case 9750: return new Scene9750(); + // Castle: Dressing room + case 9850: return new Scene9850(); + // Ending + case 9900: return new Scene9900(); + // Space travel + case 9999: return new Scene9999(); + + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +DisplayHotspot::DisplayHotspot(int regionId, ...) { + _sceneRegionId = regionId; + + // Load up the actions + va_list va; + va_start(va, regionId); + + int param = va_arg(va, int); + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayHotspot::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +DisplayObject::DisplayObject(int firstAction, ...) { + // Load up the actions + va_list va; + va_start(va, firstAction); + + int param = firstAction; + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayObject::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +SceneArea::SceneArea() { + _savedArea = NULL; + _pt.x = _pt.y = 0; +} + +SceneArea::~SceneArea() { + delete _savedArea; +} + +void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { + _resNum = resNum; + _rlbNum = rlbNum; + _subNum = subNum; + _actionId = actionId; + + _surface = surfaceFromRes(resNum, rlbNum, subNum); +} + +void SceneArea::draw2() { + _surface.draw(Common::Point(_bounds.left, _bounds.top)); +} + +void SceneArea::display() { + _bounds.left = _pt.x - (_surface.getBounds().width() / 2); + _bounds.top = _pt.y + 1 - _surface.getBounds().height(); + _bounds.setWidth(_surface.getBounds().width()); + _bounds.setHeight(_surface.getBounds().height()); + + _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds); + draw2(); +} + +void SceneArea::restore() { + assert(_savedArea); + _savedArea->draw(Common::Point(_bounds.left, _bounds.top)); + delete _savedArea; + _savedArea = NULL; +} + +void SceneArea::draw(bool flag) { + _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum); + _surface.draw(Common::Point(_bounds.left, _bounds.top)); +} + +void SceneArea::wait() { + // Wait until a mouse or keypress + Event event; + while (!_vm->shouldQuit() && !_globals->_events.getEvent(event)) { + g_system->updateScreen(); + g_system->delayMillis(10); + } + + SynchronizedList::iterator ii; + for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) { + SceneItem *sceneItem = *ii; + if (sceneItem->contains(event.mousePos)) { + sceneItem->doAction(_actionId); + break; + } + } + + _globals->_events.setCursor(CURSOR_ARROW); +} + +void SceneArea::synchronize(Serializer &s) { + if (s.getVersion() >= 2) + SavedObject::synchronize(s); + + s.syncAsSint16LE(_pt.x); + s.syncAsSint16LE(_pt.y); + s.syncAsSint32LE(_resNum); + s.syncAsSint32LE(_rlbNum); + s.syncAsSint32LE(_subNum); + s.syncAsSint32LE(_actionId); + _bounds.synchronize(s); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGText::SpeakerGText() { + _speakerName = "GTEXT"; + _textWidth = 160; + _textPos = Common::Point(130, 10); + _color1 = 42; + _hideObjects = false; +} + +void SpeakerGText::setText(const Common::String &msg) { + // Set the animation properties + _sceneObject.postInit(); + _sceneObject.setVisage(9405); + _sceneObject.setStrip2(3); + _sceneObject.fixPriority(255); + _sceneObject.changeZoom(100); + _sceneObject._frame = 1; + _sceneObject.setPosition(Common::Point(183, 71)); + _sceneObject.animate(ANIM_MODE_7, 0, NULL); + + // Set the text + Rect textRect; + _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth); + textRect.center(_sceneObject._position.x, _sceneObject._position.y); + _textPos.x = textRect.left; + Speaker::setText(msg); +} + +void SpeakerGText::removeText() { + _sceneObject.remove(); + Speaker::removeText(); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPOR::SpeakerPOR() { + _speakerName = "POR"; + _newSceneNumber = 7221; + _textPos = Common::Point(10, 30); + _color1 = 41; +} + +void SpeakerPOR::SpeakerAction1::signal(){ + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(60) + 60); + break; + case 1: + static_cast(_owner)->animate(ANIM_MODE_5, this, NULL); + break; + case 2: + setDelay(_globals->_randomSource.getRandomNumber(10)); + _actionIndex = 0; + break; + default: + break; + } +} + +void SpeakerPOR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(7223); + _object1.setStrip2(2); + _object1.setPosition(Common::Point(191, 166)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(7223); + _object2.setPosition(Common::Point(159, 86)); + _object2.setAction(&_speakerAction, NULL); + + _object3.postInit(&_objectList); + _object3.setVisage(7223); + _object3.setStrip(3); + _object3.setPosition(Common::Point(119, 107)); + _object3.fixPriority(199); + _object3.setAction(&_action2); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerOR::SpeakerOR() { + _speakerName = "OR"; + _newSceneNumber = 9430; + _textPos = Common::Point(8, 36); + _color1 = 42; + _textWidth = 136; +} + +void SpeakerOR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(9431); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(202, 147)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(9431); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(199, 85)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerOText::SpeakerOText() : SpeakerGText() { + _speakerName = "OTEXT"; + _textWidth = 240; + _textPos = Common::Point(130, 10); + _color1 = 42; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQText::SpeakerQText() : ScreenSpeaker() { + _speakerName = "QTEXT"; + _textPos = Common::Point(160, 40); + _color1 = 35; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSText::SpeakerSText() : ScreenSpeaker() { + _speakerName = "STEXT"; + _color1 = 13; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPOText::SpeakerPOText() : ScreenSpeaker() { + _speakerName = "POTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 41; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerMText::SpeakerMText() { + _speakerName = "MTEXT"; + _color1 = 22; + _textWidth = 230; + _textMode = ALIGN_CENTER; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCText::SpeakerCText() { + _speakerName = "CTEXT"; + _color1 = 4; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerEText::SpeakerEText() { + _speakerName = "ETEXT"; + _textPos = Common::Point(20, 20); + _color1 = 22; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGR::SpeakerGR() : AnimatedSpeaker() { + _speakerName = "GR"; + _newSceneNumber = 9220; + _textWidth = 136; + _textPos = Common::Point(168, 36); + _color1 = 14; +} + +void SpeakerGR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(9221); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(101, 70)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerHText::SpeakerHText() { + _speakerName = "HTEXT"; + _textPos = Common::Point(160, 40); + _color1 = 52; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSKText::SpeakerSKText() : ScreenSpeaker() { + _speakerName = "SKTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 9; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPText::SpeakerPText() { + _speakerName = "PTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 5; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCHFText::SpeakerCHFText() { + _speakerName = "CHFTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 56; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCDRText::SpeakerCDRText() { + _speakerName = "CDRTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 52; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerFLText::SpeakerFLText() { + _speakerName = "FLTEXT"; + _textPos = Common::Point(10, 40); + _color1 = 17; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerBatText::SpeakerBatText() { + _speakerName = "BATTEXT"; + _textWidth = 240; + _textMode = ALIGN_CENTER; + _color1 = 3; + _hideObjects = false; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSKL::SpeakerSKL() : AnimatedSpeaker() { + _speakerName = "SKL"; + _newSceneNumber = 7011; + _textPos = Common::Point(10, 30); + _color1 = 9; +} + +void SpeakerSKL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(7013); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(203, 120)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(7013); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(197, 80)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQL::SpeakerQL() : AnimatedSpeaker() { + _speakerName = "QL"; + _newSceneNumber = 2610; + _textPos = Common::Point(160, 30); + _color1 = 35; + _textMode = ALIGN_CENTER; +} + +void SpeakerQL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2612); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(128, 146)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2612); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(122, 84)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSR::SpeakerSR() { + _speakerName = "SR"; + _newSceneNumber = 2811; + _textPos = Common::Point(10, 30); + _color1 = 13; + _textMode = ALIGN_CENTER; +} + +void SpeakerSR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2813); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(224, 198)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2813); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(203, 96)); + _object2.setAction(&_speakerAction, NULL); + + _object3.postInit(&_objectList); + _object3.setVisage(2813); + _object3.setStrip(3); + _object3.setPosition(Common::Point(204, 91)); + _object3.fixPriority(199); + _object3._numFrames = 3; + _object3.animate(ANIM_MODE_7, 0, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSL::SpeakerSL() { + _speakerName = "SL"; + _newSceneNumber = 2810; + _textPos = Common::Point(140, 30); + _textWidth = 160; + _color1 = 13; + _textMode = ALIGN_CENTER; +} + +void SpeakerSL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2812); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(95, 198)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2812); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(116, 96)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQR::SpeakerQR() { + _speakerName = "QR"; + _newSceneNumber = 2611; + _textPos = Common::Point(10, 30); + _color1 = 35; + _textMode = ALIGN_CENTER; +} + +void SpeakerQR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2613); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(191, 146)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2613); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(197, 84)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQU::SpeakerQU() { + _speakerName = "QU"; + _newSceneNumber = 7020; + _textPos = Common::Point(160, 30); + _color1 = 35; + _textMode = ALIGN_CENTER; +} + +void SpeakerQU::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(7021); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(116, 120)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(7021); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(111, 84)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCR::SpeakerCR() { + _speakerName = "CR"; + _newSceneNumber = 9010; + _textPos = Common::Point(20, 40); + _color1 = 4; +} + +void SpeakerCR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(9011); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.setPosition(Common::Point(219, 168)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(9011); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(232, 81)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerMR::SpeakerMR() { + _speakerName = "MR"; + _newSceneNumber = 2711; + _textPos = Common::Point(10, 40); + _color1 = 22; +} + +void SpeakerMR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2713); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(220, 143)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2713); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(215, 99)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSAL::SpeakerSAL() { + _speakerName = "SAL"; + _newSceneNumber = 2851; + _textPos = Common::Point(10, 30); + _color1 = 13; + _textMode = ALIGN_CENTER; +} + +void SpeakerSAL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2853); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(185, 200)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2853); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(170, 92)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerML::SpeakerML() { + _speakerName = "ML"; + _newSceneNumber = 2710; + _textPos = Common::Point(160, 40); + _color1 = 22; +} + +void SpeakerML::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(2712); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(99, 143)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(2712); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(105, 99)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCHFL::SpeakerCHFL() { + _speakerName = "CHFL"; + _newSceneNumber = 4111; + _textPos = Common::Point(10, 40); + _color1 = 56; +} + +void SpeakerCHFL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4113); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(205, 116)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4113); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(202, 71)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCHFR::SpeakerCHFR() { + _speakerName = "CHFR"; + _newSceneNumber = 4110; + _textPos = Common::Point(160, 40); + _color1 = 56; +} + +void SpeakerCHFR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4112); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(103, 116)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4112); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(106, 71)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPL::SpeakerPL() { + _speakerName = "PL"; + _newSceneNumber = 4060; + _textPos = Common::Point(160, 40); + _color1 = 5; +} + +void SpeakerPL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4062); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(107, 117)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4062); + _object2.setStrip2(1); + _object2.fixPriority(200); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(105, 62)); + _object2.setAction(&_speakerAction, NULL); + + _object3.postInit(&_objectList); + _object3.setVisage(4062); + _object3.setStrip2(3); + _object3.fixPriority(255); + _object3.changeZoom(100); + _object3._frame = 1; + _object3.setPosition(Common::Point(105, 59)); + _object3.setAction(&_speakerAction2, NULL); + + Speaker::setText(msg); +} + +void SpeakerPL::removeText() { + _object3.remove(); + AnimatedSpeaker::removeText(); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPR::SpeakerPR() { + _speakerName = "PR"; + _newSceneNumber = 4061; + _textPos = Common::Point(10, 40); + _color1 = 5; +} + +void SpeakerPR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4063); + _object1.setStrip2(1); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(212, 117)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4063); + _object2.setStrip2(2); + _object2.fixPriority(200); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(214, 62)); + _object2.setAction(&_speakerAction, NULL); + + _object3.postInit(&_objectList); + _object3.setVisage(4063); + _object3.setStrip2(3); + _object3.fixPriority(255); + _object3.changeZoom(100); + _object3._frame = 1; + _object3.setPosition(Common::Point(214, 59)); + _object3.setAction(&_speakerAction2, NULL); + + Speaker::setText(msg); +} + +void SpeakerPR::removeText() { + _object3.remove(); + AnimatedSpeaker::removeText(); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCDR::SpeakerCDR() { + _speakerName = "CDR"; + _newSceneNumber = 4161; + _textPos = Common::Point(10, 40); + _color1 = 52; +} + +void SpeakerCDR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4163); + _object1.setStrip2(1); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(208, 97)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4163); + _object2.setStrip2(2); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(200, 57)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCDL::SpeakerCDL() { + _speakerName = "CDL"; + _newSceneNumber = 4160; + _textPos = Common::Point(160, 40); + _color1 = 52; +} + +void SpeakerCDL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(4162); + _object1.setStrip2(1); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(112, 97)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(4162); + _object2.setStrip2(2); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(115, 57)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerFLL::SpeakerFLL() { + _speakerName = "FLL"; + _newSceneNumber = 5221; + _textPos = Common::Point(10, 40); + _color1 = 17; +} + +void SpeakerFLL::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(5223); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(216, 129)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(5223); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(210, 67)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerBatR::SpeakerBatR() { + _speakerName = "BATR"; + _newSceneNumber = 5360; + _textPos = Common::Point(140, 40); + _color1 = 3; +} + +void SpeakerBatR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(5361); + _object1.setStrip2(2); + _object1.fixPriority(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(137, 122)); + _object1.animate(ANIM_MODE_7, 0, NULL); + + _object2.postInit(&_objectList); + _object2.setVisage(5361); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.changeZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(137, 104)); + _object2.setAction(&_speakerAction, NULL); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + +RingworldInvObjectList::RingworldInvObjectList() : + _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."), + _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."), + _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."), + _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."), + _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."), + _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."), + _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."), + _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."), + _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."), + _key(7700, 1, 11, OBJECT_KEY, "A key."), + _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."), + _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."), + _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."), + _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."), + _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."), + _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."), + _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."), + _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."), + _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."), + _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."), + _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."), + _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."), + _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."), + _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."), + _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."), + _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."), + _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."), + _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."), + _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."), + _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."), + _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."), + _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."), + _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") { + + // Add the items to the list + _itemList.push_back(&_stunner); + _itemList.push_back(&_scanner); + _itemList.push_back(&_stasisBox); + _itemList.push_back(&_infoDisk); + _itemList.push_back(&_stasisNegator); + _itemList.push_back(&_keyDevice); + _itemList.push_back(&_medkit); + _itemList.push_back(&_ladder); + _itemList.push_back(&_rope); + _itemList.push_back(&_key); + _itemList.push_back(&_translator); + _itemList.push_back(&_ale); + _itemList.push_back(&_paper); + _itemList.push_back(&_waldos); + _itemList.push_back(&_stasisBox2); + _itemList.push_back(&_ring); + _itemList.push_back(&_cloak); + _itemList.push_back(&_tunic); + _itemList.push_back(&_candle); + _itemList.push_back(&_straw); + _itemList.push_back(&_scimitar); + _itemList.push_back(&_sword); + _itemList.push_back(&_helmet); + _itemList.push_back(&_items); + _itemList.push_back(&_concentrator); + _itemList.push_back(&_nullifier); + _itemList.push_back(&_peg); + _itemList.push_back(&_vial); + _itemList.push_back(&_jacket); + _itemList.push_back(&_tunic2); + _itemList.push_back(&_bone); + _itemList.push_back(&_jar); + _itemList.push_back(&_emptyJar); + + _selectedItem = NULL; +} + +/*--------------------------------------------------------------------------*/ + +void RingworldGame::restartGame() { + if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1) + _globals->_game->restart(); +} + +void RingworldGame::saveGame() { + if (!_vm->canSaveGameStateCurrently()) + MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING); + else { + // Show the save dialog + handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName); + } +} + +void RingworldGame::restoreGame() { + if (!_vm->canLoadGameStateCurrently()) + MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING); + else { + // Show the load dialog + handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); + } +} + +void RingworldGame::quitGame() { + if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) + _vm->quitGame(); +} + +void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) { + const EnginePlugin *plugin = 0; + EngineMan.findGame(_vm->getGameId(), &plugin); + GUI::SaveLoadChooser *dialog; + if (saveFlag) + dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); + else + dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); + + dialog->setSaveMode(saveFlag); + + saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); + saveName = dialog->getResultString(); + + delete dialog; +} + +void RingworldGame::start() { + // Set some default flags + _globals->setFlag(12); + _globals->setFlag(34); + + // Set the screen to scroll in response to the player moving off-screen + _globals->_scrollFollower = &_globals->_player; + + // Set the object's that will be in the player's inventory by default + RING_INVENTORY._stunner._sceneNumber = 1; + RING_INVENTORY._scanner._sceneNumber = 1; + RING_INVENTORY._ring._sceneNumber = 1; + + int slot = -1; + + if (ConfMan.hasKey("save_slot")) { + slot = ConfMan.getInt("save_slot"); + Common::String file = _vm->generateSaveName(slot); + Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file); + if (in) + delete in; + else + slot = -1; + } + + if (slot >= 0) + _globals->_sceneHandler._loadGameSlot = slot; + else + // Switch to the title screen + _globals->_sceneManager.setNewScene(1000); + + _globals->_events.showCursor(); +} + +void RingworldGame::restart() { + _globals->_scenePalette.clearListeners(); + _globals->_soundHandler.stop(); + + // Reset the flags + _globals->reset(); + _globals->setFlag(34); + + // Clear save/load slots + _globals->_sceneHandler._saveGameSlot = -1; + _globals->_sceneHandler._loadGameSlot = -1; + + _globals->_stripNum = 0; + _globals->_events.setCursor(CURSOR_WALK); + + // Reset item properties + RING_INVENTORY._stunner._sceneNumber = 1; + RING_INVENTORY._scanner._sceneNumber = 1; + RING_INVENTORY._stasisBox._sceneNumber = 5200; + RING_INVENTORY._infoDisk._sceneNumber = 40; + RING_INVENTORY._stasisNegator._sceneNumber = 0; + RING_INVENTORY._keyDevice._sceneNumber = 0; + RING_INVENTORY._medkit._sceneNumber = 2280; + RING_INVENTORY._ladder._sceneNumber = 4100; + RING_INVENTORY._rope._sceneNumber = 4150; + RING_INVENTORY._key._sceneNumber = 7700; + RING_INVENTORY._translator._sceneNumber = 2150; + RING_INVENTORY._paper._sceneNumber = 7700; + RING_INVENTORY._waldos._sceneNumber = 0; + RING_INVENTORY._ring._sceneNumber = 1; + RING_INVENTORY._stasisBox2._sceneNumber = 8100; + RING_INVENTORY._cloak._sceneNumber = 9850; + RING_INVENTORY._tunic._sceneNumber = 9450; + RING_INVENTORY._candle._sceneNumber = 9500; + RING_INVENTORY._straw._sceneNumber = 9400; + RING_INVENTORY._scimitar._sceneNumber = 9850; + RING_INVENTORY._sword._sceneNumber = 9850; + RING_INVENTORY._helmet._sceneNumber = 9500; + RING_INVENTORY._items._sceneNumber = 4300; + RING_INVENTORY._concentrator._sceneNumber = 4300; + RING_INVENTORY._nullifier._sceneNumber = 4300; + RING_INVENTORY._peg._sceneNumber = 4045; + RING_INVENTORY._vial._sceneNumber = 5100; + RING_INVENTORY._jacket._sceneNumber = 9850; + RING_INVENTORY._tunic2._sceneNumber = 9850; + RING_INVENTORY._bone._sceneNumber = 5300; + RING_INVENTORY._jar._sceneNumber = 7700; + RING_INVENTORY._emptyJar._sceneNumber = 7700; + RING_INVENTORY._selectedItem = NULL; + + // Change to the first game scene + _globals->_sceneManager.changeScene(30); +} + +void RingworldGame::endGame(int resNum, int lineNum) { + _globals->_events.setCursor(CURSOR_WALK); + Common::String msg = _resourceManager->getMessage(resNum, lineNum); + bool savesExist = _saver->savegamesExist(); + + if (!savesExist) { + // No savegames exist, so prompt the user to restart or quit + if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) + _vm->quitGame(); + else + restart(); + } else { + // Savegames exist, so prompt for Restore/Restart + bool breakFlag; + do { + if (_vm->shouldQuit()) { + breakFlag = true; + } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { + restart(); + breakFlag = true; + } else { + handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); + breakFlag = _globals->_sceneHandler._loadGameSlot >= 0; + } + } while (!breakFlag); + } + + _globals->_events.setCursorFromFlag(); +} + +void RingworldGame::processEvent(Event &event) { + if (event.eventType == EVENT_KEYPRESS) { + switch (event.kbd.keycode) { + case Common::KEYCODE_F1: + // F1 - Help + MessageDialog::show(HELP_MSG, OK_BTN_STRING); + break; + + case Common::KEYCODE_F2: { + // F2 - Sound Options + ConfigDialog *dlg = new ConfigDialog(); + dlg->runModal(); + delete dlg; + _globals->_soundManager.syncSounds(); + _globals->_events.setCursorFromFlag(); + break; + } + + case Common::KEYCODE_F3: + // F3 - Quit + quitGame(); + event.handled = false; + break; + + case Common::KEYCODE_F4: + // F4 - Restart + restartGame(); + _globals->_events.setCursorFromFlag(); + break; + + case Common::KEYCODE_F7: + // F7 - Restore + restoreGame(); + _globals->_events.setCursorFromFlag(); + break; + + case Common::KEYCODE_F10: + // F10 - Pause + GfxDialog::setPalette(); + MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); + _globals->_events.setCursorFromFlag(); + break; + + default: + break; + } + } +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h new file mode 100644 index 0000000000..19b0f10b42 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_logic.h @@ -0,0 +1,461 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_LOGIC_H +#define TSAGE_RINGWORLD_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + _globals->_player.addMover(mover, &pt, this); } +#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + OBJ.addMover(mover, &pt, NULL); } +#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + OBJ.addMover(mover, &pt, this); } + +#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ + OBJ.addMover(mover, &pt, this); } +#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ + OBJ.addMover(mover, &pt, NULL); } + + +class SceneFactory { +public: + static Scene *createScene(int sceneNumber); +}; + +class DisplayHotspot : public SceneObject { +private: + Common::Array _actions; + bool performAction(int action); +public: + DisplayHotspot(int regionId, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class DisplayObject : public SceneObject { +private: + Common::Array _actions; + bool performAction(int action); +public: + DisplayObject(int firstAction, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class SceneArea : public SavedObject { +public: + GfxSurface _surface; + GfxSurface *_savedArea; + Common::Point _pt; + int _resNum; + int _rlbNum; + int _subNum; + int _actionId; + Rect _bounds; +public: + SceneArea(); + ~SceneArea(); + + void setup(int resNum, int rlbNum, int subNum, int actionId); + void draw2(); + void display(); + void restore(); + + virtual void synchronize(Serializer &s); + virtual void draw(bool flag); + virtual void wait(); +}; + +/*--------------------------------------------------------------------------*/ +// Ringworld specific game speakers + +class SpeakerGText : public Speaker { +public: + SceneObject _sceneObject; +public: + SpeakerGText(); + + virtual Common::String getClassName() { return "SpeakerGText"; } + virtual void setText(const Common::String &msg); + virtual void removeText(); +}; + +class SpeakerPOR : public AnimatedSpeaker { + class SpeakerAction1 : public SpeakerAction { + public: + virtual void signal(); + }; + +public: + SceneObject _object3; + SpeakerAction1 _action2; +public: + SpeakerPOR(); + virtual Common::String getClassName() { return "SpeakerPOR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerOR : public AnimatedSpeaker { +public: + SpeakerOR(); + virtual Common::String getClassName() { return "SpeakerOR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerOText : public SpeakerGText { +public: + SpeakerOText(); + + virtual Common::String getClassName() { return "SpeakerOText"; } +}; + +class SpeakerPOText : public ScreenSpeaker { +public: + SpeakerPOText(); + + virtual Common::String getClassName() { return "SpeakerPOText"; } +}; + +class SpeakerSText : public ScreenSpeaker { +public: + SpeakerSText(); + + virtual Common::String getClassName() { return "SpeakerSText"; } +}; + +class SpeakerQText : public ScreenSpeaker { +public: + SpeakerQText(); + + virtual Common::String getClassName() { return "SpeakerQText"; } +}; + +class SpeakerMText : public ScreenSpeaker { +public: + SpeakerMText(); + + virtual Common::String getClassName() { return "SpeakerMText"; } +}; + +class SpeakerCText : public ScreenSpeaker { +public: + SpeakerCText(); + + virtual Common::String getClassName() { return "SpeakerCText"; } +}; + +class SpeakerEText : public ScreenSpeaker { +public: + SpeakerEText(); + + virtual Common::String getClassName() { return "SpeakerEText"; } +}; + +class SpeakerGR : public AnimatedSpeaker { +public: + SpeakerGR(); + + virtual Common::String getClassName() { return "SpeakerGR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerHText : public ScreenSpeaker { +public: + SpeakerHText(); + + virtual Common::String getClassName() { return "SpeakerHText"; } +}; + +class SpeakerPText : public ScreenSpeaker { +public: + SpeakerPText(); + + virtual Common::String getClassName() { return "SpeakerPText"; } +}; + +class SpeakerCHFText : public ScreenSpeaker { +public: + SpeakerCHFText(); + + virtual Common::String getClassName() { return "SpeakerCHFText"; } +}; + +class SpeakerSKText : public ScreenSpeaker { +public: + SpeakerSKText(); + + virtual Common::String getClassName() { return "SpeakerSKText"; } +}; + +class SpeakerCDRText : public ScreenSpeaker { +public: + SpeakerCDRText(); + + virtual Common::String getClassName() { return "SpeakerCDRText"; } +}; + +class SpeakerFLText : public ScreenSpeaker { +public: + SpeakerFLText(); + + virtual Common::String getClassName() { return "SpeakerFLText"; } +}; + +class SpeakerBatText : public ScreenSpeaker { +public: + SpeakerBatText(); + + virtual Common::String getClassName() { return "SpeakerFLText"; } +}; + +class SpeakerQR : public AnimatedSpeaker { +public: + SpeakerQR(); + + virtual Common::String getClassName() { return "SpeakerQR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerQU : public AnimatedSpeaker { +public: + SpeakerQU(); + + virtual Common::String getClassName() { return "SpeakerQU"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerSKL : public AnimatedSpeaker { +public: + SpeakerSKL(); + + virtual Common::String getClassName() { return "SpeakerQL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerQL : public AnimatedSpeaker { +public: + SpeakerQL(); + + virtual Common::String getClassName() { return "SpeakerQL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerSR : public AnimatedSpeaker { +public: + SceneObject _object3; +public: + SpeakerSR(); + + virtual Common::String getClassName() { return "SpeakerSR"; } + void setText(const Common::String &msg); +}; + +class SpeakerSL : public AnimatedSpeaker { +public: + SpeakerSL(); + + virtual Common::String getClassName() { return "SpeakerSL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerCR : public AnimatedSpeaker { +public: + SpeakerCR(); + + virtual Common::String getClassName() { return "SpeakerCR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerMR : public AnimatedSpeaker { +public: + SpeakerMR(); + + virtual Common::String getClassName() { return "SpeakerMR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerSAL : public AnimatedSpeaker { +public: + SpeakerSAL(); + + virtual Common::String getClassName() { return "SpeakerSAL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerML : public AnimatedSpeaker { +public: + SpeakerML(); + + virtual Common::String getClassName() { return "SpeakerML"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerCHFL : public AnimatedSpeaker { +public: + SpeakerCHFL(); + + virtual Common::String getClassName() { return "SpeakerCHFL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerCHFR : public AnimatedSpeaker { +public: + SpeakerCHFR(); + + virtual Common::String getClassName() { return "SpeakerCHFR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerPL : public AnimatedSpeaker { +public: + SceneObject _object3; + SpeakerAction _speakerAction2; + + SpeakerPL(); + + virtual Common::String getClassName() { return "SpeakerPL"; } + virtual void setText(const Common::String &msg); + virtual void removeText(); +}; + +class SpeakerPR : public AnimatedSpeaker { +public: + SceneObject _object3; + SpeakerAction _speakerAction2; + + SpeakerPR(); + + virtual Common::String getClassName() { return "SpeakerPR"; } + virtual void setText(const Common::String &msg); + virtual void removeText(); +}; + +class SpeakerCDR : public AnimatedSpeaker { +public: + SpeakerCDR(); + + virtual Common::String getClassName() { return "SpeakerCDR"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerCDL : public AnimatedSpeaker { +public: + SpeakerCDL(); + + virtual Common::String getClassName() { return "SpeakerCDL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerFLL : public AnimatedSpeaker { +public: + SpeakerFLL(); + + virtual Common::String getClassName() { return "SpeakerFLL"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerBatR : public AnimatedSpeaker { +public: + SpeakerBatR(); + + virtual Common::String getClassName() { return "SpeakerBatR"; } + virtual void setText(const Common::String &msg); +}; + +/*--------------------------------------------------------------------------*/ + +class RingworldInvObjectList : public InvObjectList { +public: + InvObject _stunner; + InvObject _scanner; + InvObject _stasisBox; + InvObject _infoDisk; + InvObject _stasisNegator; + InvObject _keyDevice; + InvObject _medkit; + InvObject _ladder; + InvObject _rope; + InvObject _key; + InvObject _translator; + InvObject _ale; + InvObject _paper; + InvObject _waldos; + InvObject _stasisBox2; + InvObject _ring; + InvObject _cloak; + InvObject _tunic; + InvObject _candle; + InvObject _straw; + InvObject _scimitar; + InvObject _sword; + InvObject _helmet; + InvObject _items; + InvObject _concentrator; + InvObject _nullifier; + InvObject _peg; + InvObject _vial; + InvObject _jacket; + InvObject _tunic2; + InvObject _bone; + InvObject _jar; + InvObject _emptyJar; +public: + RingworldInvObjectList(); + + virtual Common::String getClassName() { return "RingworldInvObjectList"; } +}; + +#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory)) + +class RingworldGame: public Game { +protected: + virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName); +public: + virtual void start(); + virtual void restart(); + virtual void restartGame(); + virtual void saveGame(); + virtual void restoreGame(); + virtual void quitGame(); + virtual void endGame(int resNum, int lineNum); + + virtual Scene *createScene(int sceneNumber); + virtual void processEvent(Event &event); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp new file mode 100644 index 0000000000..880fa51e6e --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes1.cpp @@ -0,0 +1,3345 @@ +/* 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. + * + */ + +#include "tsage/ringworld/ringworld_scenes1.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 10 - Kziniti Palace (Introduction) + * + *--------------------------------------------------------------------------*/ + +void Scene10::Action1::signal() { + Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: + _globals->_scenePalette.addRotation(240, 254, -1); + scene->_stripManager.start(10, this); + break; + case 2: + scene->_speakerSText.setTextPos(Common::Point(20, 20)); + scene->_speakerSText._color1 = 10; + scene->_speakerSText._textWidth = 160; + scene->_stripManager.start(11, this, scene); + break; + case 3: + scene->_object2.hide(); + scene->_object3.hide(); + scene->_object3.setAction(NULL); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 4: + case 9: + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_object2.setStrip(3); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(240, 51)); + scene->_object2.show(); + + scene->_object3.setStrip(6); + scene->_object3.setFrame(1); + scene->_object3.setPosition(Common::Point(200, 76)); + scene->_object3._numFrames = 20; + scene->_object3.show(); + + scene->_stripManager.start(12, this, scene); + break; + case 6: + scene->_object2.hide(); + scene->_object3.hide(); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 7: + scene->_object3.show(); + scene->_object3.setStrip2(5); + scene->_object3._numFrames = 10; + scene->_object3.setPosition(Common::Point(180, 87)); + scene->_object3.setAction(&scene->_action2); + + scene->_object2.setStrip(4); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(204, 59)); + scene->_object2.show(); + + scene->_stripManager.start(13, this, scene); + break; + case 8: + scene->_object2.hide(); + scene->_object3.hide(); + scene->_object4.animate(ANIM_MODE_6, this); + break; + case 10: + _globals->_soundHandler.fadeOut(this); + break; + case 11: + _globals->_scenePalette.clearListeners(); + _globals->_sceneManager.changeScene(15); + break; + } +} + +void Scene10::Action2::signal() { + Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(179)); + break; + case 1: + scene->_object3.setFrame(1); + scene->_object3.animate(ANIM_MODE_5, this); + _actionIndex = 0; + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene10::postInit(SceneObjectList *OwnerList) { + loadScene(10); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerQText); + _speakerSText._speakerName = "STEXT"; + _speakerQText._speakerName = "QTEXT"; + _speakerSText._hideObjects = false; + _speakerQText._hideObjects = false; + _speakerQText.setTextPos(Common::Point(140, 120)); + _speakerQText._color1 = 4; + _speakerQText._textWidth = 160; + _speakerSText.setTextPos(Common::Point(20, 20)); + _speakerSText._color1 = 7; + _speakerSText._textWidth = 320; + + _stripManager.setCallback(this); + + _object1.postInit(); + _object1.setVisage(10); + _object1.setPosition(Common::Point(232, 90)); + _object1.fixPriority(1); + + _object2.postInit(); + _object2.setVisage(10); + _object2.setStrip(4); + _object2.setFrame(1); + _object2.setPosition(Common::Point(204, 59)); + _object2.fixPriority(198); + + _object3.postInit(); + _object3.setVisage(10); + _object3.setStrip2(5); + _object3.setPosition(Common::Point(180, 87)); + _object3.fixPriority(196); + _object3.setAction(&_action2); + + _object4.postInit(); + _object4.setVisage(10); + _object4.setStrip(2); + _object4.setPosition(Common::Point(0, 209)); + _object4.animate(ANIM_MODE_1, NULL); + + _object5.postInit(); + _object5.setVisage(11); + _object5.setPosition(Common::Point(107, 146)); + _object5.animate(ANIM_MODE_2, NULL); + _object5._numFrames = 5; + + _object6.postInit(); + _object6.setVisage(11); + _object6.setStrip(2); + _object6.setPosition(Common::Point(287, 149)); + _object6.animate(ANIM_MODE_2, NULL); + _object6._numFrames = 5; + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + + setAction(&_action1); + _globals->_soundHandler.play(5); +} + +void Scene10::stripCallback(int v) { + switch (v) { + case 1: + _object2.animate(ANIM_MODE_7, -1, NULL); + break; + case 2: + _object2.animate(ANIM_MODE_NONE); + break; + case 3: + _object2.animate(ANIM_MODE_7, -1, NULL); + _object3.animate(ANIM_MODE_5, NULL); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 15 - Outer Space (Introduction) + * + *--------------------------------------------------------------------------*/ + +void Scene15::Action1::signal() { + Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + SceneItem::display(15, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7, + SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(300); + break; + case 2: { + SceneItem::display(15, 1, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7, + SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END); + scene->_object1.postInit(); + scene->_object1.setVisage(15); + scene->_object1.setPosition(Common::Point(160, -10)); + scene->_object1.animate(ANIM_MODE_2, NULL); + Common::Point pt(160, 100); + NpcMover *mover = new NpcMover(); + scene->_object1.addMover(mover, &pt, this); + scene->_soundHandler.play(7); + break; + } + case 3: + SceneItem::display(0, 0); + _globals->_sceneManager.changeScene(20); + break; + } +} + +void Scene15::Action1::dispatch() { + Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; + + if (scene->_object1._position.y < 100) + scene->_object1.changeZoom(100 - scene->_object1._position.y); + Action::dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene15::postInit(SceneObjectList *OwnerList) { + loadScene(15); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + _globals->_soundHandler.play(6); + setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 20 - Cut-scenes where House Chmeee is in the distance + * + *--------------------------------------------------------------------------*/ + +void Scene20::Action1::signal() { + Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(120); + break; + case 1: + scene->_stripManager.start(20, this); + break; + case 2: + _globals->_soundHandler.fadeOut(this); + break; + case 3: + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_sceneManager.changeScene(30); // First game scene + break; + default: + break; + } +} + +void Scene20::Action2::signal() { + Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + NpcMover *npcMover; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + SceneItem::display(20, 1, SET_WIDTH, 200, SET_Y, 20, SET_X, 160, SET_KEEP_ONSCREEN, true, + SET_EXT_BGCOLOR, 4, LIST_END); + setDelay(120); + break; + case 2: { + NpcMover *mover = new NpcMover(); + Common::Point pt(455, 77); + _globals->_player.addMover(mover, &pt, this); + ObjectMover2 *mover2 = new ObjectMover2(); + scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player); + ObjectMover2 *mover3 = new ObjectMover2(); + scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player); + break; + } + case 3: { + npcMover = new NpcMover(); + Common::Point pt(557, 100); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 4: { + npcMover = new NpcMover(); + Common::Point pt(602, 90); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 5: { + npcMover = new NpcMover(); + Common::Point pt(618, 90); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 6: { + npcMover = new NpcMover(); + Common::Point pt(615, 81); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 7: { + npcMover = new NpcMover(); + Common::Point pt(588, 79); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 8: + scene->_sound.release(); + _globals->_soundHandler.fadeOut(this); + break; + case 9: + SceneItem::display(0, 0, LIST_END); + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_sceneManager.changeScene(40); + break; + default: + break; + } +} + +void Scene20::Action3::signal() { + Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + NpcMover *npcMover; + + switch (_actionIndex++) { + case 0: + setDelay(120); + break; + case 1: { + npcMover = new NpcMover(); + Common::Point pt(615, 81); + _globals->_player.addMover(npcMover, &pt, this); + ObjectMover2 *mover1 = new ObjectMover2(); + scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player); + ObjectMover2 *mover2 = new ObjectMover2(); + scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player); + break; + } + case 2: { + npcMover = new NpcMover(); + Common::Point pt(618, 90); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 3: { + _globals->_player._moveDiff = Common::Point(10, 10); + scene->_SceneObjectExt._moveDiff = Common::Point(10, 10); + scene->_sceneObject3._moveDiff = Common::Point(10, 10); + npcMover = new NpcMover(); + Common::Point pt(445, 132); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 4: { + npcMover = new NpcMover(); + Common::Point pt(151, 137); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 5: { + npcMover = new NpcMover(); + Common::Point pt(-15, 137); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 6: + scene->_sound.play(60, this, 127); + _globals->_soundHandler.release(); + break; + case 7: + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_sceneManager.changeScene(90); + break; + default: + break; + } +} + +void Scene20::Action4::signal() { + Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + NpcMover *npcMover; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: { + npcMover = new NpcMover(); + Common::Point pt(486, 134); + _globals->_player.addMover(npcMover, &pt, this); + ObjectMover2 *mover1 = new ObjectMover2(); + scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player); + break; + } + case 2: { + _globals->_player._moveDiff = Common::Point(12, 12); + scene->_SceneObjectExt._moveDiff = Common::Point(12, 12); + NpcMover *mover1 = new NpcMover(); + Common::Point pt(486, 134); + scene->_sceneObject3.addMover(mover1, &pt, this); + NpcMover *mover2 = new NpcMover(); + pt = Common::Point(-15, 134); + _globals->_player.addMover(mover2, &pt, NULL); + NpcMover *mover3 = new NpcMover(); + pt = Common::Point(-15, 134); + scene->_SceneObjectExt.addMover(mover3, &pt, NULL); + break; + } + case 3: { + scene->_sceneObject3._moveDiff = Common::Point(20, 20); + npcMover = new NpcMover(); + Common::Point pt(320, 134); + scene->_sceneObject3.addMover(npcMover, &pt, this); + break; + } + case 4: { + scene->_sound.play(28); + scene->_sceneObject4.postInit(); + scene->_sceneObject4.setVisage(21); + scene->_sceneObject4.setStrip(3); + scene->_sceneObject4.setPosition(Common::Point(scene->_sceneObject3._position.x - 36, + scene->_sceneObject3._position.y - 1)); + scene->_sceneObject4._moveDiff.x = 48; + + ObjectMover3 *mover = new ObjectMover3(); + scene->_sceneObject4.addMover(mover, &scene->_SceneObjectExt, 4, this); + break; + } + case 5: { + scene->_sound.play(42); + scene->_sceneObject4.remove(); + scene->_SceneObjectExt.setVisage(21); + scene->_SceneObjectExt.setStrip(1); + scene->_SceneObjectExt.setFrame(1); + scene->_SceneObjectExt.animate(ANIM_MODE_5, NULL); + + scene->_SceneObjectExt._moveDiff.x = 4; + NpcMover *mover1 = new NpcMover(); + Common::Point pt(scene->_SceneObjectExt._position.x - 12, scene->_SceneObjectExt._position.y + 5); + scene->_SceneObjectExt.addMover(mover1, &pt, NULL); + + scene->_sceneObject5.postInit(); + scene->_sceneObject5.setVisage(21); + scene->_sceneObject5.setStrip(3); + scene->_sceneObject5.setPosition(Common::Point(scene->_sceneObject3._position.x - 36, + scene->_sceneObject3._position.y - 1)); + scene->_sceneObject5._moveDiff.x = 48; + + ObjectMover3 *mover = new ObjectMover3(); + scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this); + break; + } + case 6: { + scene->_sound.play(42); + scene->_SceneObjectExt.setStrip(2); + scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL); + + scene->_sceneObject5.remove(); + _globals->_player.setVisage(21); + _globals->_player.setStrip(1); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + _globals->_player._moveDiff.x = 4; + + npcMover = new NpcMover(); + Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5); + _globals->_player.addMover(npcMover, &pt, this); + break; + } + case 7: + _globals->_player.setStrip(2); + _globals->_player.animate(ANIM_MODE_2, NULL); + scene->_sound.play(77, this, 127); + break; + case 8: + _globals->_game->endGame(20, 0); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene20::Scene20() { +} + +void Scene20::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerGameText); + _speakerQText._npc = &_globals->_player; + + if (_globals->_sceneManager._previousScene == 30) { + // Cut scene: Assassins are coming + _globals->_player.postInit(); + _globals->_player.setVisage(20); + _globals->_player.setPosition(Common::Point(405, 69)); + _globals->_player._moveDiff = Common::Point(10, 10); + _globals->_player.animate(ANIM_MODE_1, NULL); + + _SceneObjectExt.postInit(); + _SceneObjectExt.setVisage(20); + _SceneObjectExt.setPosition(Common::Point(400, 69)); + _SceneObjectExt.animate(ANIM_MODE_1, NULL); + + _sceneObject3.postInit(); + _sceneObject3.setVisage(20); + _sceneObject3.setPosition(Common::Point(395, 69)); + _sceneObject3.animate(ANIM_MODE_1, NULL); + + _SceneObjectExt._moveDiff = Common::Point(10, 10); + _sceneObject3._moveDiff = Common::Point(10, 10); + _globals->_soundHandler.play(20); + _sound.play(21); + _sound.holdAt(true); + setAction(&_action2); + + _sceneBounds = Rect(320, 0, 640, 200); + } else if (_globals->_sceneManager._previousScene == 60) { + // Evasion + _sound.play(30); + _globals->_player.postInit(); + _globals->_player.setVisage(20); + _globals->_player.setPosition(Common::Point(588, 79)); + _globals->_player._moveDiff = Common::Point(5, 5); + _globals->_player.fixPriority(50); + _globals->_player.animate(ANIM_MODE_1, NULL); + + _SceneObjectExt.postInit(); + _SceneObjectExt.setVisage(20); + _SceneObjectExt.setPosition(Common::Point(583, 79)); + _SceneObjectExt.animate(ANIM_MODE_1, NULL); + + _sceneObject3.postInit(); + _sceneObject3.setVisage(20); + _sceneObject3.setStrip2(2); + _sceneObject3.setPosition(Common::Point(595, 79)); + _sceneObject3.animate(ANIM_MODE_1, NULL); + + if ((_globals->getFlag(120) && _globals->getFlag(116)) || + (_globals->getFlag(117) && _globals->getFlag(119))) { + // Successful evasion + setAction(&_action3); + } else if (_globals->getFlag(104)) { + _sceneMode = 21; + setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL); + } else { + // Failed evasion + _sceneObject3._moveDiff = Common::Point(8, 8); + setAction(&_action4); + } + _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + } else { + // Intro: Quinn looking at the monaster + _globals->_player.postInit(); + _globals->_player.setVisage(2640); + _globals->_player.animate(ANIM_MODE_NONE, NULL); + _globals->_player.setStrip2(1); + _globals->_player.setFrame2(4); + _globals->_player.fixPriority(200); + _globals->_player.setPosition(Common::Point(425, 233)); + + setAction(&_action1); + _speakerQText.setTextPos(Common::Point(350, 20)); + _speakerQText._textWidth = 260; + _speakerGameText.setTextPos(Common::Point(350, 20)); + _speakerGameText._textWidth = 260; + + _globals->_soundHandler.play(8); + _sceneBounds = Rect(320, 0, 640, 200); + } + + _globals->_player.disableControl(); + loadScene(20); +} + +void Scene20::signal() { + if (_sceneMode == 21) + _globals->_sceneManager.changeScene(90); +} + +/*-------------------------------------------------------------------------- + * Scene 30 - First game scene (Outside Ch'mee house) + * + *--------------------------------------------------------------------------*/ + +void Scene30::BeamObject::doAction(int action) { + if (action == OBJECT_SCANNER) + display2(30, 14); + else if (action == CURSOR_LOOK) + display2(30, 2); + else if (action == CURSOR_USE) { + Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene; + parent->setAction(&parent->_beamAction); + } else + SceneObject::doAction(action); +} + +void Scene30::DoorObject::doAction(int action) { + if (action == OBJECT_SCANNER) + display2(30, 13); + else if (action == CURSOR_LOOK) + display2(30, 1); + else if (action == CURSOR_USE) + display2(30, 7); + else + SceneObject::doAction(action); +} + +void Scene30::BeamAction::signal() { + Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + // Disable control and move player to the doorway beam + _globals->_player.disableControl(); + NpcMover *mover = new NpcMover(); + Common::Point pt(114, 198); + _globals->_player.addMover(mover, &pt, this); + break; + } + + case 1: + // Perform the animation of player raising hand + _globals->_player.setVisage(31); + _globals->_player.setStrip(1); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + + case 2: + // Hide the beam and lower the player's hand + scene->_sound.play(10, NULL, 127); + _globals->_player.animate(ANIM_MODE_6, this); + scene->_beam.remove(); + break; + + case 3: { + // Bring the Kzin to the doorway + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(7); + scene->_kzin.postInit(); + scene->_kzin.setVisage(2801); + scene->_kzin.animate(ANIM_MODE_1, NULL); + scene->_kzin.setObjectWrapper(new SceneObjectWrapper()); + scene->_kzin.setPosition(Common::Point(334, 1)); + NpcMover *mover = new NpcMover(); + Common::Point pt(158, 170); + scene->_kzin.addMover(mover, &pt, this); + _globals->_sceneItems.push_front(&scene->_kzin); + break; + } + + case 4: + // Open the door + scene->_sound.play(11, NULL, 127); + scene->_door.animate(ANIM_MODE_5, this); + break; + + case 5: + // Run the Kzin's talk sequence + scene->_sound.play(13, NULL, 127); + _globals->_soundHandler.play(12, NULL, 127); + scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this); + break; + + case 6: + // Slight delay + setDelay(3); + break; + + case 7: + // Re-activate player control + scene->_sceneMode = 31; + scene->_kzin.setAction(&scene->_kzinAction); + _globals->_player.enableControl(); + + // End this action + remove(); + break; + + default: + break; + } +} + +void Scene30::KzinAction::signal() { + Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1200); + break; + case 1: + _globals->_soundHandler.fadeOut(NULL); + _globals->_player.disableControl(); + setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL); + break; + case 2: + _globals->_player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene30::RingAction::signal() { + Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + scene->_kzin.setAction(NULL); + NpcMover *mover = new NpcMover(); + Common::Point pt(114, 198); + _globals->_player.addMover(mover, &pt, this); + break; + } + + case 1: + _globals->_player.checkAngle(&scene->_kzin); + scene->_stripManager.start(32, this); + break; + + case 2: { + _globals->_player.animate(ANIM_MODE_1, NULL); + NpcMover *mover = new NpcMover(); + Common::Point pt(143, 177); + _globals->_player.addMover(mover, &pt, this); + break; + } + + case 3: + scene->_sound.play(11, NULL, 127); + scene->_door.animate(ANIM_MODE_6, this); + break; + + case 4: { + scene->_sound.play(13, NULL, 127); + NpcMover *kzinMover = new NpcMover(); + Common::Point pt(354, 5); + scene->_kzin.addMover(kzinMover, &pt, this); + NpcMover *playerMover = new NpcMover(); + pt = Common::Point(335, 36); + _globals->_player.addMover(playerMover, &pt, this); + break; + } + + case 5: + break; + + case 6: + _globals->_sceneManager.changeScene(20); + break; + + default: + break; + } +} + +void Scene30::TalkAction::signal() { + Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + scene->_kzin.setAction(NULL); + NpcMover *mover = new NpcMover(); + Common::Point pt(114, 198); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_player.checkAngle(&scene->_kzin); + scene->_stripManager.start(34, this); + break; + case 2: + setDelay(5); + break; + case 3: + scene->_kzin.setAction(&scene->_kzinAction); + _globals->_player.enableControl(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene30::KzinObject::doAction(int action) { + Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + display2(30, 12); + break; + case OBJECT_SCANNER: + display2(30, 11); + break; + case OBJECT_RING: + RING_INVENTORY._ring._sceneNumber = 30; + scene->setAction(&scene->_ringAction); + break; + case CURSOR_LOOK: + display2(30, 6); + break; + case CURSOR_USE: + display2(30, 10); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->setAction(&scene->_talkAction); + break; + default: + SceneObject::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene30::Scene30() : + _groundHotspot(9, OBJECT_SCANNER, 50, 17, CURSOR_LOOK, 30, 3, CURSOR_USE, 30, 8, LIST_END), + _wallsHotspot(8, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 30, 0, CURSOR_USE, 30, 7, LIST_END), + _courtyardHotspot(0, CURSOR_LOOK, 30, 4, LIST_END), + _treeHotspot(10, OBJECT_SCANNER, 40, 39, CURSOR_LOOK, 30, 5, CURSOR_USE, 30, 9, LIST_END) { +} + +void Scene30::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + // Add the speaker classes to the strip manager + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerQText); + _speakerSText._npc = &_kzin; + _speakerQText._npc = &_globals->_player; + + + // Setup player + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setStrip(7); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(114, 198)); + _globals->_player.changeZoom(75); + _globals->_player.enableControl(); + + // Set up beam object + _beam.postInit(); + _beam.setVisage(31); + _beam.setStrip(2); + _beam.setPosition(Common::Point(124, 178)); + _beam.fixPriority(188); + + // Set up door object + _door.postInit(); + _door.setVisage(30); + _door.setPosition(Common::Point(150, 183)); + + // Final processing and add of scene items + _courtyardHotspot.setBounds(Rect(0, 0, 320, 200)); + + // Add the objects and hotspots to the scene + _globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot, + &_courtyardHotspot, NULL); + + // Load the scene data + loadScene(30); + _sceneMode = 0; +} + +void Scene30::signal() { + if (_sceneMode == 31) { + // Re-activate beam if the Kzin goes back inside + _beam.postInit(); + _beam.setVisage(31); + _beam.setStrip(2); + _beam.setPosition(Common::Point(124, 178)); + _beam.fixPriority(188); + _globals->_sceneItems.push_front(&_beam); + _globals->_player.enableControl(); + } else if (_sceneMode == 32) { + _globals->_player.disableControl(); + _sceneMode = 31; + setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 40 - Chmeee Home + * + *--------------------------------------------------------------------------*/ + +void Scene40::Action1::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(120); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(40, this); + break; + case 2: + scene->_doorway.postInit(); + scene->_doorway.setVisage(46); + scene->_doorway.setPosition(Common::Point(305, 61)); + scene->_doorway.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(25); + break; + case 3: + scene->_doorway.hide(); + scene->_dyingKzin.setPosition(Common::Point(296, 62)); + _globals->_player.animate(ANIM_MODE_5, NULL); + scene->_object1.setVisage(43); + scene->_object1.setStrip(3); + scene->_object1.animate(ANIM_MODE_5, NULL); + scene->_object2.hide(); + scene->_object3.hide(); + scene->_stripManager.start(45, this); + break; + case 4: + scene->_object2.remove(); + scene->_object3.remove(); + scene->_assassin.setVisage(42); + scene->_assassin.setStrip(2); + scene->_assassin.setFrame(1); + scene->_assassin.setPosition(Common::Point(13, 171)); + scene->_assassin.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(25); + break; + case 5: + scene->_doorway.show(); + scene->_doorway.setVisage(42); + scene->_doorway.setStrip(3); + scene->_doorway.setFrame(1); + scene->_doorway.setPosition(Common::Point(41, 144)); + scene->_assassin.animate(ANIM_MODE_6, NULL); + setDelay(6); + break; + case 6: + scene->_doorway.setPosition(Common::Point(178, 101)); + setDelay(6); + break; + case 7: + scene->_doorway.setPosition(Common::Point(271, 69)); + setDelay(6); + break; + case 8: + scene->_doorway.remove(); + scene->_dyingKzin.animate(ANIM_MODE_5, this); + break; + case 9: { + scene->_dyingKzin.setStrip(1); + //Workaround: The original uses setFrame(1) but it's completely wrong. + scene->_dyingKzin.setFrame(2); + scene->_dyingKzin._moveDiff.y = 15; + scene->_dyingKzin.animate(ANIM_MODE_5, NULL); + Common::Point pt(223, 186); + NpcMover *mover = new NpcMover(); + scene->_dyingKzin.addMover(mover, &pt, this); + break; + } + case 10: { + scene->_soundHandler.play(27); + Common::Point pt(223, 184); + NpcMover *mover = new NpcMover(); + scene->_dyingKzin.addMover(mover, &pt, this); + break; + } + case 11: { + Common::Point pt(223, 186); + NpcMover *mover = new NpcMover(); + scene->_dyingKzin.addMover(mover, &pt, this); + break; + } + case 12: { + _globals->_soundHandler.play(26); + _globals->_player._uiEnabled = true; + scene->_assassin.setVisage(42); + scene->_assassin.setPosition(Common::Point(4, 191)); + scene->_assassin.setStrip(1); + scene->_assassin.animate(ANIM_MODE_1, NULL); + Common::Point pt(230, 187); + NpcMover *mover = new NpcMover(); + scene->_assassin.addMover(mover, &pt, this); + break; + } + case 13: + setDelay(180); + break; + case 14: + scene->_assassin.setVisage(45); + scene->_assassin.setStrip(1); + scene->_assassin.setFrame(1); + scene->_assassin.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(28); + break; + case 15: + _globals->_player.disableControl(); + scene->_object1.setVisage(40); + scene->_object1.setStrip(4); + scene->_object1.setFrame(1); + scene->_object1.animate(ANIM_MODE_5, NULL); + _globals->_player.setVisage(40); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 16: + _globals->_soundHandler.play(77, this); + break; + case 17: + _globals->_game->endGame(40, 20); + remove(); + break; + } +} + +void Scene40::Action2::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + if (scene->_assassin._position.x < 229) + _actionIndex = 0; + setDelay(1); + break; + case 1: + scene->_assassin.animate(ANIM_MODE_NONE, NULL); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: { + scene->_soundHandler.play(28); + scene->_doorway.postInit(); + scene->_doorway.setVisage(16); + scene->_doorway.setStrip2(6); + scene->_doorway.fixPriority(200); + scene->_doorway.setPosition(Common::Point(159, 191)); + scene->_doorway._moveDiff = Common::Point(40, 40); + scene->_doorway._moveRate = 60; + scene->_doorway.animate(ANIM_MODE_5, NULL); + + Common::Point pt(271, 165); + NpcMover *mover = new NpcMover(); + scene->_doorway.addMover(mover, &pt, this); + break; + } + case 3: + scene->_doorway.remove(); + scene->_assassin.setVisage(44); + scene->_assassin._frame = 1; + scene->_assassin.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(29); + RING_INVENTORY._infoDisk._sceneNumber = 40; + break; + case 4: + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 5: { + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(1); + Common::Point pt(230, 195); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: { + _globals->_player.setStrip(7); + scene->_object1.setVisage(2806); + scene->_object1.animate(ANIM_MODE_1, NULL); + SceneObjectWrapper *wrapper = new SceneObjectWrapper(); + scene->_object1.setObjectWrapper(wrapper); + Common::Point pt(200, 190); + NpcMover *mover = new NpcMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 7: + scene->_stripManager.start(44, this); + break; + case 8: { + Common::Point pt(170, 260); + NpcMover *mover = new NpcMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 9: + scene->_dyingKzin.setAction(&scene->_action7); + scene->_object1.remove(); + _globals->_stripNum = 88; + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.enableControl(); + scene->_assassin.setAction(&scene->_action8); + break; + } +} + +void Scene40::Action3::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.setAction(NULL); + _globals->_stripNum = 99; + _globals->_player.disableControl(); + Common::Point pt(240, 195); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_player.setVisage(5010); + _globals->_player._strip = 2; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_4, 5, 1, this); + break; + case 2: + scene->_assassin.setStrip(2); + scene->_assassin.setFrame(1); + RING_INVENTORY._infoDisk._sceneNumber = 1; + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(7); + _globals->_stripNum = 88; + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene40::Action4::signal() { + switch (_actionIndex++) { + case 0: { + Common::Point pt(178, 190); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_stripNum = 88; + _globals->_player.enableControl(); + break; + } +} + +void Scene40::Action5::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(119) + 120); + break; + case 1: + scene->_object2.animate(ANIM_MODE_8, 1, this); + _actionIndex = 0; + } +} + +void Scene40::Action6::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_object1.postInit(); + scene->_object1.setVisage(16); + scene->_object1.setStrip2(6); + scene->_object1._moveDiff = Common::Point(40, 40); + scene->_object1.setPosition(Common::Point(313, 53)); + scene->_object1._moveRate = 60; + + Common::Point pt(141, 194); + NpcMover *mover = new NpcMover(); + scene->_object1.addMover(mover, &pt, NULL); + scene->_object1.animate(ANIM_MODE_5, NULL); + + scene->_doorway.postInit(); + scene->_doorway.setVisage(46); + scene->_doorway.setPosition(Common::Point(305, 61)); + scene->_doorway.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(25); + break; + } + case 1: + scene->_soundHandler.play(28); + scene->_doorway.setPosition(Common::Point(148, 74)); + scene->_doorway.setFrame(1); + scene->_doorway.setStrip(2); + scene->_doorway.animate(ANIM_MODE_5, this); + break; + case 2: + remove(); + break; + } +} + +void Scene40::Action7::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(499) + 500); + break; + case 1: + scene->_object7.postInit(); + scene->_object7.setVisage(46); + + if (_globals->_randomSource.getRandomNumber(32767) >= 16384) { + scene->_object7.setStrip(3); + scene->_object7.setPosition(Common::Point(15, 185)); + } else { + scene->_object7.setPosition(Common::Point(305, 61)); + scene->_object7.setFrame(15); + } + scene->_object7.animate(ANIM_MODE_5, this); + scene->_soundHandler.play(25); + break; + case 2: + scene->_object7.remove(); + _actionIndex = 0; + setDelay(60); + break; + } +} + +void Scene40::Action8::signal() { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(300); + break; + case 1: + _globals->_player.disableControl(); + + if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) { + _actionIndex = 1; + setDelay(30); + } else { + scene->_doorway.postInit(); + scene->_doorway.setVisage(16); + scene->_doorway.setStrip2(6); + scene->_doorway.fixPriority(200); + scene->_doorway._moveRate = 60; + + if (_globals->_player._position.x >= 145) { + scene->_doorway.fixPriority(-1); + scene->_doorway.setPosition(Common::Point(6, 157)); + } else { + scene->_doorway.setPosition(Common::Point(313, 53)); + } + + scene->_doorway._moveDiff = Common::Point(40, 40); + Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18); + NpcMover *mover = new NpcMover(); + scene->_doorway.addMover(mover, &pt, this); + scene->_doorway.animate(ANIM_MODE_5, NULL); + } + break; + case 2: + scene->_doorway.remove(); + _globals->_player.setVisage(40); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_soundHandler.play(77, this); + break; + case 4: + _globals->_game->endGame(40, 45); + remove(); + break; + } +} + +void Scene40::Action8::dispatch() { + if (_action) + _action->dispatch(); + + if (_delayFrames) { + uint32 frameNumber = _globals->_events.getFrameNumber(); + if ((_startFrame + 60) < frameNumber) { + --_delayFrames; + _startFrame = frameNumber; + + if (_delayFrames <= 0) { + _delayFrames = 0; + signal(); + } + } + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene40::DyingKzin::doAction(int action) { + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(40, 44); + break; + case OBJECT_SCANNER: + SceneItem::display2(40, 43); + break; + case CURSOR_LOOK: + SceneItem::display2(40, 12); + break; + case CURSOR_USE: + SceneItem::display2(40, 18); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene40::Assassin::doAction(int action) { + Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + if (scene->_assassin._visage == 44) + SceneItem::display2(40, 21); + else { + _globals->_player.disableControl(); + Common::Point pt(230, 187); + NpcMover *mover = new NpcMover(); + addMover(mover, &pt, NULL); + scene->setAction(&scene->_action2); + } + break; + case OBJECT_SCANNER: + SceneItem::display2(40, (scene->_assassin._visage == 44) ? 22 : 23); + break; + case CURSOR_LOOK: + if (scene->_assassin._visage != 44) + SceneItem::display2(40, 13); + else + SceneItem::display2(40, (RING_INVENTORY._infoDisk._sceneNumber == 1) ? 19 : 14); + break; + case CURSOR_USE: + if (scene->_assassin._visage != 44) + SceneItem::display2(40, 15); + else if (RING_INVENTORY._infoDisk._sceneNumber == 1) + SceneItem::display2(40, 19); + else { + _globals->_player.disableControl(); + setAction(&scene->_action3); + } + break; + case CURSOR_TALK: + SceneItem::display2(40, 38); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene40::Item2::doAction(int action) { + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(40, 35); + _globals->_events.setCursor(CURSOR_WALK); + break; + case OBJECT_SCANNER: + SceneItem::display2(40, 34); + break; + case CURSOR_LOOK: + SceneItem::display2(40, 8); + break; + case CURSOR_USE: + SceneItem::display2(40, 36); + break; + case CURSOR_TALK: + SceneItem::display2(40, 37); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene40::Item6::doAction(int action) { + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(40, 25); + _globals->_events.setCursor(CURSOR_WALK); + break; + case OBJECT_SCANNER: + SceneItem::display2(40, 42); + break; + case CURSOR_LOOK: + SceneItem::display2(40, 6); + break; + case CURSOR_USE: + SceneItem::display2(40, 36); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene40::Scene40() : + _item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END), + _item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END), + _item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END), + _item5(0, CURSOR_LOOK, 40, 11, LIST_END), + _item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END), + _item8(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) { +} + +void Scene40::postInit(SceneObjectList *OwnerList) { + loadScene(40); + Scene::postInit(); + + setZoomPercents(0, 100, 200, 100); + _globals->_stripNum = 99; + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + + _speakerGameText._color1 = 9; + _speakerGameText.setTextPos(Common::Point(160, 30)); + _speakerQText._npc = &_globals->_player; + _speakerSText._npc = &_object1; + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(130, 220)); + _globals->_player.disableControl(); + + if (_globals->_sceneManager._previousScene == 20) { + _globals->_soundHandler.play(24); + _globals->_player.setVisage(43); + + _object1.postInit(); + _object1.setVisage(41); + _object1.setPosition(Common::Point(105, 220)); + _object2.postInit(); + _object2.setVisage(41); + _object2.setStrip(6); + _object2.fixPriority(200); + _object2.setPosition(Common::Point(94, 189)); + _object2.setAction(&_action5); + + _object3.postInit(); + _object3.setVisage(41); + _object3.setStrip(5); + _object3.fixPriority(205); + _object3.setPosition(Common::Point(110, 186)); + _object3._numFrames = 2; + _object3.animate(ANIM_MODE_8, NULL, NULL); + + _assassin.postInit(); + _assassin.setPosition(Common::Point(-40, 191)); + _globals->_sceneItems.push_back(&_assassin); + + _dyingKzin.postInit(); + _dyingKzin.setVisage(40); + _dyingKzin.setStrip(6); + _dyingKzin.setPosition(Common::Point(-90, 65)); + _dyingKzin.fixPriority(170); + + setAction(&_action1); + } else { + _doorway.postInit(); + _doorway.setVisage(46); + _doorway.setPosition(Common::Point(148, 74)); + _doorway.setStrip(2); + _doorway.setFrame(_doorway.getFrameCount()); + + _dyingKzin.postInit(); + _dyingKzin.setVisage(40); + _dyingKzin.setPosition(Common::Point(205, 183)); + _dyingKzin.fixPriority(170); + _dyingKzin._frame = 9; + _dyingKzin.setAction(&_action7); + + _assassin.postInit(); + _assassin.setVisage(44); + _assassin.setPosition(Common::Point(230, 187)); + _assassin.setAction(&_action8); + + if (RING_INVENTORY._infoDisk._sceneNumber == 40) { + _assassin.setStrip(1); + _assassin.setFrame(_assassin.getFrameCount()); + } else { + _assassin.setStrip(2); + } + + _globals->_sceneItems.push_back(&_assassin); + _globals->_player.setPosition(Common::Point(170, 220)); + + setAction(&_action4); + } + + _item5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _item6._sceneRegionId = 3; + _item2._sceneRegionId = 7; + + _globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4, + &_item6, &_item7, &_item5, NULL); +} + +void Scene40::signal() { + if (_sceneMode == 41) + _globals->_sceneManager.changeScene(50); +} + +void Scene40::dispatch() { + if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) { + _globals->_player.disableControl(); + _globals->_stripNum = 0; + _globals->_player.setAction(NULL); + _sceneMode = 41; + setAction(&_sequenceManager, this, 41, &_globals->_player, NULL); + + if (_globals->_sceneManager._previousScene == 20) { + _dyingKzin.setAction(&_action6); + } + } + + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 50 - By Flycycles + * + *--------------------------------------------------------------------------*/ + +void Scene50::Action1::signal() { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(63, this); + break; + case 2: + if (scene->_stripManager._field2E8 != 107) { + _globals->_player.enableControl(); + remove(); + } else { + Common::Point pt(282, 139); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } + break; + case 3: + _globals->_stripNum = -1; + _globals->_sceneManager.changeScene(60); + break; + } +} + +void Scene50::Action2::signal() { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + scene->_stripManager.start(66, this); + break; + case 1: { + Common::Point pt(141, 142); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_sceneManager.changeScene(40); + remove(); + break; + } +} + +void Scene50::Action3::signal() { + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(136, 185); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_sceneManager.changeScene(60); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene50::Object1::doAction(int action) { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(50, 20); + break; + case OBJECT_SCANNER: + SceneItem::display2(50, 19); + break; + case CURSOR_LOOK: + SceneItem::display2(50, 4); + break; + case CURSOR_USE: + SceneItem::display2(50, 21); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->_sceneMode = 52; + scene->setAction(&scene->_sequenceManager, scene, 52, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene50::Object2::doAction(int action) { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(50, 11); + break; + case OBJECT_SCANNER: + SceneItem::display2(50, 10); + break; + case CURSOR_LOOK: + SceneItem::display2(50, 1); + break; + case OBJECT_INFODISK: + case CURSOR_USE: + _globals->_stripNum = 50; + scene->setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene50::Object3::doAction(int action) { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(50, 11); + break; + case OBJECT_SCANNER: + SceneItem::display2(50, 10); + break; + case CURSOR_LOOK: + SceneItem::display2(50, 1); + break; + case OBJECT_INFODISK: + case CURSOR_USE: + SceneItem::display2(50, 8); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->_sceneMode = 52; + scene->setAction(&scene->_sequenceManager, scene, 52, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene50::Object4::doAction(int action) { + Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(50, 11); + break; + case OBJECT_SCANNER: + SceneItem::display2(50, 10); + break; + case CURSOR_LOOK: + SceneItem::display2(50, 1); + break; + case OBJECT_INFODISK: + case CURSOR_USE: + _globals->_player.disableControl(); + _globals->_stripNum = 0; + scene->_sceneMode = 51; + scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene50::Scene50() : + _item0(0, CURSOR_LOOK, 50, 3, LIST_END), + _item1(0, OBJECT_SCANNER, 50, 15, CURSOR_USE, 50, 16, CURSOR_LOOK, 50, 3, LIST_END), + _item2(0, CURSOR_LOOK, 50, 7, LIST_END), + _item3(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 50, 3, LIST_END), + _item4(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END), + _item5(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) { + + _doorwayRect = Rect(80, 108, 160, 112); +} + +void Scene50::postInit(SceneObjectList *OwnerList) { + loadScene(50); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player._canWalk = false; + _globals->_player.changeZoom(75); + _globals->_player._moveDiff.y = 3; + + if (_globals->_sceneManager._previousScene == 40) { + _globals->_player.setPosition(Common::Point(128, 123)); + } else if (_globals->_stripNum == 50) { + _globals->_player.setPosition(Common::Point(136, 185)); + } else { + _globals->_player.setPosition(Common::Point(270, 143)); + } + + _object2.postInit(); + _object2.setVisage(2331); + _object2.setStrip(6); + _object2.setPosition(Common::Point(136, 192)); + _object2.fixPriority(200); + + _object3.postInit(); + _object3.setVisage(2337); + _object3.setStrip(6); + _object3.setPosition(Common::Point(260, 180)); + _object3.fixPriority(200); + + _object4.postInit(); + _object4.setVisage(2331); + _object4.setStrip(6); + _object4.setPosition(Common::Point(295, 144)); + _object4.fixPriority(178); + + _globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL); + + if (!_globals->getFlag(101)) { + _globals->_player.disableControl(); + _globals->setFlag(101); + setAction(&_action1); + } else { + _globals->_player.enableControl(); + + if (_globals->_sceneManager._previousScene == 40) { + _globals->_player.disableControl(); + _sceneMode = 54; + setAction(&_sequenceManager, this, 54, &_globals->_player, NULL); + } + } + + _item0.setBounds(Rect(200, 0, 320, 200)); + _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL); +} + +void Scene50::signal() { + switch (_sceneMode) { + case 51: + _globals->_sceneManager.changeScene(60); + break; + case 55: + _globals->_sceneManager.changeScene(40); + break; + case 52: + case 54: + _globals->_player.enableControl(); + break; + } +} + +void Scene50::dispatch() { + Scene::dispatch(); + + if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) { + // Player in house doorway, start player moving to within + _globals->_player.disableControl(); + _sceneMode = 55; + Common::Point pt(89, 111); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } +} + +/*-------------------------------------------------------------------------- + * Scene 60 - Flycycle controls + * + *--------------------------------------------------------------------------*/ + +void Scene60::Action1::signal() { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_floppyDrive.postInit(); + scene->_floppyDrive.setVisage(60); + scene->_floppyDrive.setStrip(7); + scene->_floppyDrive.setPosition(Common::Point(136, 65)); + scene->_floppyDrive.animate(ANIM_MODE_5, this); + + scene->_soundHandler1.play(35); + break; + case 2: + scene->_redLights.postInit(); + scene->_redLights.setVisage(60); + scene->_redLights.setPosition(Common::Point(199, 186)); + scene->_redLights.animate(ANIM_MODE_8, 0, NULL); + scene->_redLights._numFrames = 5; + + scene->_controlButton.animate(ANIM_MODE_2, NULL); + + if (!_globals->getFlag(83)) { + scene->_message.postInit(); + scene->_message.setVisage(60); + scene->_message.setStrip2(3); + scene->_message.setFrame(2); + scene->_message.setPosition(Common::Point(148, 85)); + scene->_message.animate(ANIM_MODE_2, NULL); + scene->_message._numFrames = 5; + + _globals->_sceneItems.push_front(&scene->_message); + scene->_soundHandler2.play(38); + } + + _globals->_events.setCursor(CURSOR_USE); + break; + case 3: + scene->_soundHandler2.play(37); + scene->loadScene(65); + scene->_message.remove(); + + if (_globals->_sceneObjects->contains(&scene->_redLights)) + scene->_redLights.remove(); + + scene->_controlButton.remove(); + scene->_slaveButton.remove(); + scene->_masterButton.remove(); + scene->_item1.remove(); + scene->_item2.remove(); + + scene->_nextButton.postInit(); + scene->_nextButton.setVisage(65); + scene->_nextButton.setPosition(Common::Point(118, 197)); + + scene->_prevButton.postInit(); + scene->_prevButton.setVisage(65); + scene->_prevButton.setStrip(2); + scene->_prevButton.setPosition(Common::Point(160, 197)); + + scene->_exitButton.postInit(); + scene->_exitButton.setVisage(65); + scene->_exitButton.setStrip(3); + scene->_exitButton.setPosition(Common::Point(202, 197)); + + scene->_rose.postInit(); + scene->_rose.setVisage(65); + scene->_rose.setStrip(4); + scene->_rose.setFrame(1); + scene->_rose.setPosition(Common::Point(145, 165)); + + _globals->_sceneItems.push_front(&scene->_nextButton); + _globals->_sceneItems.push_front(&scene->_prevButton); + _globals->_sceneItems.push_front(&scene->_exitButton); + setDelay(10); + + _globals->_events.setCursor(CURSOR_USE); + break; + case 4: + _globals->setFlag(90); + // Deliberate fall-through + case 5: + case 6: + case 7: + SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75, + SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0, + SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); + _globals->_events.setCursor(CURSOR_USE); + break; + case 9: + _globals->_player._uiEnabled = false; + RING_INVENTORY._infoDisk._sceneNumber = 1; + + if (_globals->_sceneObjects->contains(&scene->_message)) + scene->_message.remove(); + + scene->_controlButton.animate(ANIM_MODE_NONE); + scene->_controlButton.setFrame(1); + scene->_redLights.remove(); + + scene->_floppyDrive.postInit(); + scene->_floppyDrive.setVisage(60); + scene->_floppyDrive.setStrip(7); + scene->_floppyDrive.setPosition(Common::Point(136, 65)); + scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount()); + scene->_floppyDrive.animate(ANIM_MODE_6, this); + + scene->_soundHandler1.play(35); + scene->_soundHandler3.stop(); + + scene->_masterButton.setFrame(1); + scene->_masterButton._state = 0; + + _globals->clearFlag(103); + _globals->clearFlag(!_globals->_stripNum ? 116 : 119); + break; + case 10: + setDelay(60); + break; + case 11: + _globals->_player._uiEnabled = true; + scene->_floppyDrive.remove(); + remove(); + break; + case 8: + default: + break; + } +} + +void Scene60::Action2::signal() { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + case 2: + setDelay(3); + break; + case 1: + scene->_stripManager.start(66, this); + break; + case 3: + _globals->_sceneManager.changeScene(50); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene60::PrevObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 16); + } else if (action == CURSOR_USE) { + animate(ANIM_MODE_8, 1, NULL); + + if (scene->_action1.getActionIndex() > 5) { + scene->_soundHandler3.play(36); + scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2); + scene->_action1.setDelay(1); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::NextObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 17); + } else if (action == CURSOR_USE) { + animate(ANIM_MODE_8, 1, NULL); + + if (scene->_action1.getActionIndex() < 8) { + scene->_soundHandler3.play(36); + scene->_action1.setDelay(1); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::ExitObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 18); + } else if (action == CURSOR_USE) { + scene->_soundHandler3.play(36); + animate(ANIM_MODE_8, 1, NULL); + scene->_nextButton.remove(); + scene->_prevButton.remove(); + scene->_exitButton.remove(); + scene->_rose.remove(); + + SceneItem::display(0, 0); + scene->loadScene(60); + + scene->_controlButton.postInit(); + scene->_controlButton.setVisage(60); + scene->_controlButton.setStrip(5); + scene->_controlButton.setPosition(Common::Point(233, 143)); + scene->_controlButton.animate(ANIM_MODE_2, NULL); + + scene->_slaveButton.postInit(); + scene->_slaveButton.setVisage(60); + scene->_slaveButton.setStrip(8); + scene->_slaveButton.setPosition(Common::Point(143, 125)); + + scene->_masterButton.postInit(); + scene->_masterButton.setVisage(60); + scene->_masterButton.setStrip(8); + scene->_masterButton.setPosition(Common::Point(143, 105)); + + _globals->_sceneItems.push_front(&scene->_masterButton); + _globals->_sceneItems.push_front(&scene->_slaveButton); + + scene->_redLights.postInit(); + scene->_redLights.setVisage(60); + scene->_redLights.setPosition(Common::Point(199, 186)); + scene->_redLights.animate(ANIM_MODE_8, 0, NULL); + scene->_redLights._numFrames = 5; + scene->_redLights.setAction(&scene->_sequenceManager, scene, 61, NULL); + + if (scene->_slaveButton._state) + scene->_slaveButton.setFrame(2); + if (scene->_masterButton._state) + scene->_masterButton.setFrame(2); + + _globals->_sceneItems.push_front(&scene->_item1); + _globals->_sceneItems.push_front(&scene->_controlButton); + _globals->_sceneItems.push_front(&scene->_slaveButton); + _globals->_sceneItems.push_front(&scene->_masterButton); + _globals->_sceneItems.push_back(&scene->_item2); + + _globals->gfxManager()._font.setFontNumber(2); + _globals->_sceneText._fontNumber = 2; + + scene->_action1.setActionIndex(2); + scene->_action1.setDelay(1); + scene->_sceneMode = 9999; + scene->signal(); + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::MessageObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 9); + } else if (action == CURSOR_USE) { + scene->_action1.setDelay(1); + _globals->setFlag(83); + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::ControlObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 11); + } else if (action == CURSOR_USE) { + if (_animateMode == ANIM_MODE_NONE) + SceneItem::display2(60, 14); + else if (!scene->_slaveButton._state) { + _globals->_soundHandler.play(40); + _globals->_soundHandler.holdAt(true); + _globals->_sceneManager.changeScene(20); + } else { + scene->_sceneMode = 15; + setAction(&scene->_sequenceManager, scene, 62, NULL); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::SlaveObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 8); + } else if (action == CURSOR_USE) { + if (scene->_masterButton._state) + scene->_sceneMode = 19; + else if (_state) { + scene->_soundHandler3.stop(); + animate(ANIM_MODE_6, NULL); + _globals->clearFlag(102); + _globals->clearFlag(!_globals->_stripNum ? 117 : 120); + _state = 0; + scene->_sceneMode = 9998; + } else { + scene->_soundHandler3.play(39); + _globals->setFlag(102); + _globals->setFlag(!_globals->_stripNum ? 117 : 120); + animate(ANIM_MODE_5, NULL); + _state = 1; + scene->_sceneMode = 9998; + } + + setAction(&scene->_sequenceManager, scene, 62, NULL); + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::MasterObject::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 7); + } else if (action == CURSOR_USE) { + if (!scene->_controlButton._animateMode) + scene->_sceneMode = 14; + else if (scene->_slaveButton._state) + scene->_sceneMode = 20; + else if (_state) { + scene->_soundHandler3.stop(); + animate(ANIM_MODE_6, NULL); + _state = 0; + _globals->clearFlag(103); + _globals->clearFlag(!_globals->_stripNum ? 116 : 119); + scene->_sceneMode = 9998; + } else { + scene->_soundHandler3.play(39); + animate(ANIM_MODE_5, NULL); + _state = 1; + _globals->setFlag(103); + _globals->setFlag(!_globals->_stripNum ? 116 : 119); + scene->_sceneMode = 9998; + } + + setAction(&scene->_sequenceManager, scene, 62, NULL); + } else { + SceneHotspot::doAction(action); + } +} + +void Scene60::FloppyDrive::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(60, 13); + } else if (action == CURSOR_USE) { + _globals->setFlag(!_globals->_stripNum ? 118 : 121); + scene->setAction(&scene->_action1); + } else { + SceneHotspot::doAction(action); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene60::Item1::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_INFODISK: + RING_INVENTORY._infoDisk._sceneNumber = 60; + _globals->setFlag(!_globals->_stripNum ? 118 : 121); + scene->_sceneMode = 0; + scene->setAction(&scene->_action1); + break; + case CURSOR_LOOK: + SceneItem::display2(60, 10); + break; + case CURSOR_USE: + if (RING_INVENTORY._infoDisk._sceneNumber == 60) { + if (_globals->getFlag(118) && !_globals->_stripNum) { + _globals->clearFlag(118); + scene->setAction(&scene->_action1); + scene->_action1.setActionIndex(9); + scene->_action1.setDelay(1); + } + if (_globals->getFlag(121) && !_globals->_stripNum) { + _globals->clearFlag(121); + scene->setAction(&scene->_action1); + scene->_action1.setActionIndex(9); + scene->_action1.setDelay(1); + } + } else if (RING_INVENTORY._infoDisk._sceneNumber == 1) { + scene->_sceneMode = 0; + setAction(&scene->_sequenceManager, scene, 62, NULL); + } else { + scene->setAction(&scene->_action2); + } + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene60::Item::doAction(int action) { + Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(60, _messageNum); + break; + case CURSOR_USE: + scene->_sceneMode = _sceneMode; + setAction(&scene->_sequenceManager, this, 62, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene60::Scene60() : + _item2(0, 12, 12), + _item3(8, 22, 23), + _item4(9, 24, 25), + _item5(10, 26, 27), + _item6(11, 28, 29) { +} + +void Scene60::postInit(SceneObjectList *OwnerList) { + loadScene(60); + Scene::postInit(); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + + _slaveButton.postInit(); + _slaveButton.setVisage(60); + _slaveButton.setStrip(8); + _slaveButton.setPosition(Common::Point(143, 125)); + _slaveButton._state = 0; + + _masterButton.postInit(); + _masterButton.setVisage(60); + _masterButton.setStrip(8); + _masterButton.setPosition(Common::Point(143, 105)); + _masterButton._state = 0; + + _globals->_sceneItems.push_back(&_masterButton); + _globals->_sceneItems.push_back(&_slaveButton); + + _controlButton.postInit(); + _controlButton.setVisage(60); + _controlButton.setStrip(5); + _controlButton.setPosition(Common::Point(233, 143)); + _globals->_sceneItems.push_back(&_controlButton); + + if (_globals->_stripNum == -1) { + _globals->_stripNum = 0; + } else { + _globals->_player.disableControl(); + _sceneMode = 9999; + setAction(&_sequenceManager, this, 61, NULL); + } + + _item1.setBounds(Rect(130, 55, 174, 70)); + _item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + + if (_globals->_stripNum == 0) { + if (_globals->getFlag(117)) { + _slaveButton._state = 1; + _slaveButton.setFrame(2); + } + + if (_globals->getFlag(116)) { + _masterButton._state = 1; + _masterButton.setFrame(2); + } + + if (_globals->getFlag(118)) { + _controlButton.animate(ANIM_MODE_2, NULL); + + _redLights.postInit(); + _redLights.setVisage(60); + _redLights.setPosition(Common::Point(199, 186)); + _redLights.animate(ANIM_MODE_8, 0, NULL); + + _soundHandler1.play(35); + + if (!_globals->getFlag(83)) { + _message.postInit(); + _message.setVisage(60); + _message.setStrip2(3); + _message.setFrame(2); + _message.setPosition(Common::Point(148, 85)); + _message.animate(ANIM_MODE_2, NULL); + _message._numFrames = 5; + _globals->_sceneItems.push_front(&_message); + + _soundHandler2.play(38); + } + } + } else { + if (_globals->getFlag(120)) { + _slaveButton._state = 1; + _slaveButton.setFrame(2); + } + + if (_globals->getFlag(119)) { + _masterButton._state = 1; + _masterButton.setFrame(2); + } + + if (_globals->getFlag(121)) { + _controlButton.animate(ANIM_MODE_2, NULL); + + _redLights.postInit(); + _redLights.setVisage(60); + _redLights.setPosition(Common::Point(199, 186)); + _redLights.animate(ANIM_MODE_8, 0, NULL); + _redLights._numFrames = 5; + + _soundHandler1.play(35); + + if (!_globals->getFlag(83)) { + _message.postInit(); + _message.setVisage(60); + _message.setStrip2(3); + _message.setFrame(2); + _message.setPosition(Common::Point(148, 85)); + _message.animate(ANIM_MODE_2, NULL); + _message._numFrames = 5; + _globals->_sceneItems.push_front(&_message); + + _soundHandler2.play(38); + } + } + } + + _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6, + &_item1, &_item2, NULL); +} + +void Scene60::signal() { + if (_sceneMode != 0) { + if (_sceneMode == 9998) { + _globals->_events.setCursor(CURSOR_USE); + } else if (_sceneMode == 9999) { + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + + _gfxButton.setText(EXIT_MSG); + _gfxButton._bounds.center(160, 193); + _gfxButton.draw(); + _gfxButton._bounds.expandPanes(); + } else { + SceneItem::display2(60, _sceneMode); + _globals->_events.setCursor(CURSOR_USE); + } + } +} + +void Scene60::process(Event &event) { + Scene::process(event); + + if (_screenNumber == 60) { + if (_gfxButton.process(event)) + _globals->_sceneManager.changeScene(50); + } +} + +/*-------------------------------------------------------------------------- + * Scene 90 - Shipyard Entrance + * + *--------------------------------------------------------------------------*/ + +void Scene90::Action1::signal() { + Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + _globals->_scenePalette.addRotation(64, 72, -1); + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(90, this); + break; + case 2: + setDelay(2); + break; + case 3: { + Common::Point pt(278, 191); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 4: + scene->_object2.setStrip(3); + setDelay(2); + break; + case 5: + scene->_soundHandler2.play(58); + + if (scene->_stripManager._field2E8 == 220) + scene->_stripManager.start(91, this, scene); + else { + scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene); + _actionIndex = 7; + } + break; + case 6: + scene->_object2.animate(ANIM_MODE_NONE); + _globals->_player._uiEnabled = true; + break; + case 7: + scene->_object2.animate(ANIM_MODE_NONE); + _globals->_soundHandler.play(56); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 8: { + Common::Point pt(215, 127); + PlayerMover *mover = new PlayerMover(); + scene->_object5.addMover(mover, &pt, this); + break; + } + case 9: { + Common::Point pt1(215, 127); + PlayerMover *mover1 = new PlayerMover(); + scene->_object1.addMover(mover1, &pt1, this); + Common::Point pt2(86, 62); + PlayerMover *mover2 = new PlayerMover(); + scene->_object5.addMover(mover2, &pt2, this); + break; + } + case 10: { + PlayerMover2 *mover = new PlayerMover2(); + scene->_object1.addMover(mover, 10, 15, &scene->_object5); + + if (!_globals->getFlag(104)) { + mover = new PlayerMover2(); + scene->_object4.addMover(mover, 10, 15, &scene->_object1); + } + setDelay(60); + break; + } + case 11: + _globals->_soundHandler.play(57); + _globals->_soundHandler.play(68); + scene->_object3.animate(ANIM_MODE_6, NULL); + + SceneItem::display(90, _globals->getFlag(104) ? 15 : 14, + SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END); + break; + case 12: + SceneItem::display(0, 0); + _globals->_scenePalette.clearListeners(); + _globals->_sceneManager.changeScene(95); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene90::Object1::doAction(int action) { + Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(90, 7); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 97; + setAction(&scene->_sequenceManager, scene, 97, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene90::Object2::doAction(int action) { + Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_object6.postInit(); + scene->_object6.setVisage(90); + scene->_object6.setStrip(6); + scene->_object6.setPosition(Common::Point(184, 210)); + scene->_object6.hide(); + + scene->_sceneMode = 91; + scene->_soundHandler1.play(59); + scene->_soundHandler1.holdAt(true); + scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL); + break; + case CURSOR_LOOK: + SceneItem::display2(90, 8); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + setAction(&scene->_sequenceManager, scene, 96, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene90::Scene90() : + _item1(0, CURSOR_LOOK, 90, 9, LIST_END), + _item2(0, CURSOR_LOOK, 90, 10, LIST_END), + _item3(0, CURSOR_LOOK, 90, 11, LIST_END), + _object3(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END), + _object4(CURSOR_LOOK, 90, 17, LIST_END), + _object5(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) { +} + +void Scene90::stripCallback(int v) { + Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + + if (v == 1) + scene->_object2.animate(ANIM_MODE_7, NULL); + else if (v == 2) + scene->_object2.animate(ANIM_MODE_NONE); +} + +void Scene90::postInit(SceneObjectList *OwnerList) { + loadScene(90); + Scene::postInit(); + + setZoomPercents(70, 10, 180, 100); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerSR); + + _speakerMText._npc = &_object2; + _speakerQText._textWidth = 160; + _speakerQText._npc = &_object5; + _speakerSText._npc = &_object1; + + _object5.postInit(); + _object5.setVisage(2333); + _object5.setObjectWrapper(new SceneObjectWrapper()); + _object5._strip = 7; + _object5._moveDiff = Common::Point(22, 22); + _object5.setPosition(Common::Point(151, 177)); + _object5.changeZoom(-1); + _globals->_sceneItems.push_back(&_object5); + + _object1.postInit(); + _object1.setVisage(2337); + _object1.setObjectWrapper(new SceneObjectWrapper()); + _object1._strip = 4; + _object1._moveDiff = Common::Point(20, 20); + _object1.setPosition(Common::Point(212, 183)); + _object1.changeZoom(-1); + _globals->_sceneItems.push_back(&_object1); + + if (!_globals->getFlag(104)) { + _object4.postInit(); + _object4.setVisage(2331); + _object4.setObjectWrapper(new SceneObjectWrapper()); + _object4._strip = 4; + _object4._moveDiff = Common::Point(20, 20); + _object4.setPosition(Common::Point(251, 207)); + _object4.changeZoom(-1); + _globals->_sceneItems.push_back(&_object4); + } + + _object2.postInit(); + _object2.setVisage(90); + _object2.animate(ANIM_MODE_1, NULL); + _object2.setPosition(Common::Point(315, 185)); + _object2._strip = 2; + _globals->_sceneItems.push_back(&_object2); + + _object3.postInit(); + _object3.setVisage(90); + _object3.animate(ANIM_MODE_1, NULL); + _object3.setPosition(Common::Point(196, 181)); + _object3.fixPriority(175); + _globals->_sceneItems.push_back(&_object3); + + _globals->_player.disableControl(); + _globals->_soundHandler.play(55); + _soundHandler1.play(52); + _soundHandler1.holdAt(true); + + setAction(&_action1); + + _item3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _item1.setBounds(Rect(271, 65, 271, 186)); + _item2.setBounds(Rect(0, 17, 124, 77)); + + _globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL); +} + +void Scene90::signal() { + switch (_sceneMode) { + case 91: + _sceneMode = 92; + _globals->_soundHandler.play(77, this); + break; + case 92: + _globals->_scenePalette.clearListeners(); + _globals->_game->endGame(90, 6); + break; + case 96: + _globals->_player.enableControl(); + break; + case 97: + _stripManager._field2E8 = 0; + _action1.setActionIndex(5); + _action1.setDelay(1); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 95 - Ship Close-up + * + *--------------------------------------------------------------------------*/ + +void Scene95::Action1::signal() { + Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _state = 6; + setDelay(60); + break; + case 1: + if (_state) { + SceneItem::display(95, _state % 2, SET_FONT, 2, + SET_EXT_BGCOLOR, -1, SET_EXT_BGCOLOR, 20, + SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, SET_TEXT_MODE, 1, LIST_END); + --_state; + _actionIndex = 1; + } + setDelay(60); + break; + case 2: { + scene->_soundHandler.play(66); + scene->_object3._numFrames = 5; + scene->_object3.animate(ANIM_MODE_5, NULL); + SceneItem::display(0, 0); + + Common::Point pt1(5, 198); + NpcMover *mover1 = new NpcMover(); + _globals->_player.addMover(mover1, &pt1, this); + + Common::Point pt2(9, 190); + NpcMover *mover2 = new NpcMover(); + scene->_object1.addMover(mover2, &pt2, NULL); + break; + } + case 3: { + scene->_soundHandler.play(21); + + Common::Point pt1(235, 72); + PlayerMover *mover1 = new PlayerMover(); + _globals->_player.addMover(mover1, &pt1, NULL); + + Common::Point pt2(235, 72); + PlayerMover *mover2 = new PlayerMover(); + scene->_object1.addMover(mover2, &pt2, NULL); + + SceneItem::display(95, 2, SET_Y, 45, SET_FONT, 2, + SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 13, SET_WIDTH, 200, + SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(240); + break; + } + case 4: + scene->_object3.remove(); + + SceneItem::display(95, 3, SET_Y, 45, SET_FONT, 2, + SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, + SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(240); + break; + case 5: + SceneItem::display(95, 4, SET_Y, 45, SET_FONT, 2, + SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, + SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(240); + break; + case 6: + setDelay(20); + break; + case 7: { + SceneItem::display(0, 0); + _globals->_player.setVisage(92); + _globals->_player.setPosition(Common::Point(-25, 200)); + scene->_object1.setVisage(91); + scene->_object1.setPosition(Common::Point(-22, 220)); + + scene->_soundHandler.play(21); + + Common::Point pt1(5, 198); + NpcMover *mover1 = new NpcMover(); + _globals->_player.addMover(mover1, &pt1, this); + + Common::Point pt2(9, 190); + NpcMover *mover2 = new NpcMover(); + scene->_object1.addMover(mover2, &pt2, NULL); + break; + } + case 8: { + Common::Point pt1(108, 112); + PlayerMover *mover1 = new PlayerMover(); + _globals->_player.addMover(mover1, &pt1, this); + + Common::Point pt2(108, 112); + PlayerMover *mover2 = new PlayerMover(); + scene->_object1.addMover(mover2, &pt2, NULL); + break; + } + case 9: + _globals->_sceneManager.changeScene(2300); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene95::Scene95() { +} + +void Scene95::postInit(SceneObjectList *OwnerList) { + loadScene(95); + Scene::postInit(); + setZoomPercents(100, 10, 200, 100); + + _globals->_player.postInit(); + _globals->_player.setVisage(2337); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player._strip = 4; + _globals->_player._moveDiff = Common::Point(30, 30); + _globals->_player.setPosition(Common::Point(-35, 200)); + _globals->_player.changeZoom(-1); + _globals->_player.disableControl(); + + _object1.postInit(); + _object1.setVisage(2333); + _object1.setPosition(Common::Point(-22, 220)); + _object1.animate(ANIM_MODE_1, NULL); + _object1.setObjectWrapper(new SceneObjectWrapper()); + _object1._moveDiff = Common::Point(30, 30); + _object1.changeZoom(-1); + + _object3.postInit(); + _object3.setVisage(96); + _object3.setPosition(Common::Point(29, 198)); + + _soundHandler.play(67); + setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 6100 - Sunflower navigation sequence + * + *--------------------------------------------------------------------------*/ + +void Scene6100::Action1::signal() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->showMessage(SCENE6100_CAREFUL, 13, this); + break; + case 1: + scene->showMessage(SCENE6100_TOUGHER, 35, this); + break; + case 2: + scene->showMessage(NULL, 0, NULL); + remove(); + break; + } +} + +void Scene6100::Action2::signal() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->showMessage(SCENE6100_ONE_MORE_HIT, 13, this); + break; + case 1: + scene->showMessage(SCENE6100_DOING_BEST, 35, this); + break; + case 2: + scene->showMessage(NULL, 0, NULL); + remove(); + break; + } +} + +void Scene6100::Action3::signal() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_speed = 0; + setDelay(60); + break; + case 1: + _globals->_scenePalette.clearListeners(); + scene->_fadePercent = 100; + _globals->_scenePalette.refresh(); + scene->loadScene(9997); + scene->_object1.hide(); + scene->_object2.hide(); + scene->_object3.hide(); + scene->_sunflower1.hide(); + scene->_sunflower2.hide(); + scene->_sunflower3.hide(); + scene->_rocks.hide(); + scene->_sceneText.hide(); + + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(8120, this); + break; + case 2: + scene->showMessage(SCENE6100_REPAIR, 7, this); + break; + case 3: + scene->showMessage(NULL, 0, NULL); + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(8130, this); + break; + case 4: + _globals->setFlag(76); + _globals->_sceneManager.changeScene( + (scene->_stripManager._field2E8 == 135) ? 6100 : 2320); + remove(); + break; + } +} + +void Scene6100::Action4::signal() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->showMessage(SCENE6100_ROCKY_AREA, 13, this); + break; + case 1: + scene->showMessage(SCENE6100_REPLY, 35, this); + break; + case 2: + scene->showMessage(NULL, 0, NULL); + remove(); + break; + } +} + +void Scene6100::Action5::dispatch() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + FloatSet zeroSet; + const double MULTIPLY_FACTOR = 0.01744; // 2 * pi / 360 + + if (scene->_turnAmount) { + scene->_angle = (scene->_turnAmount + scene->_angle) % 360; + + for (int objIndex = 1; objIndex <= 3; ++objIndex) { + SceneObject *obj = &scene->_object1; + if (objIndex == 2) obj = &scene->_object2; + if (objIndex == 3) obj = &scene->_object3; + + obj->_position.x += scene->_turnAmount * 2; + if (obj->_position.x >= 320) + obj->_position.x -= 480; + if (obj->_position.x < -160) + obj->_position.x += 480; + } + } + + scene->_object1._flags |= OBJFLAG_PANES; + scene->_object2._flags |= OBJFLAG_PANES; + scene->_object3._flags |= OBJFLAG_PANES; + + double distance = scene->_speed; + double angle = (double)scene->_angle * MULTIPLY_FACTOR; + scene->_probe._floats._float1 += sin(angle) * distance; + scene->_probe._floats._float2 += cos(angle) * distance; + + for (int idx = 0; idx < 4; ++idx) { + FloatSet tempSet = scene->_objList[idx]->_floats; + tempSet.add(-scene->_probe._floats._float1, -scene->_probe._floats._float2, + -scene->_probe._floats._float3); + + tempSet.proc1(scene->_angle * MULTIPLY_FACTOR); + + double sqrtVal = tempSet.sqrt(zeroSet); + if (sqrtVal != 0.0) { + scene->_objList[idx]->_position.y = static_cast(13800.0 / sqrtVal + 62.0); + } + + scene->_objList[idx]->_position.x = static_cast( + 160.0 - (330.0 / (tempSet._float2 + 330.0) * tempSet._float1)); + scene->_objList[idx]->dispatch(); + + if (tempSet._float2 < 0) { + scene->_objList[idx]->_position.y = 300; + + if (idx != 3) { + scene->_objList[idx]->_floats._float1 = + _globals->_randomSource.getRandomNumber(199); + scene->_objList[idx]->_floats._float2 = + _globals->_randomSource.getRandomNumber(999) + 750.0; + + scene->_objList[idx]->_floats.proc1( + -(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR); + scene->_objList[idx]->_floats.add(scene->_probe._floats._float1, + scene->_probe._floats._float2, scene->_probe._floats._float3); + } + } + + if (idx == 3) { + scene->_rocksCheck = (ABS((int)tempSet._float1) < 100) && (tempSet._float2 > 0); + } + + scene->_objList[idx]->_flags |= OBJFLAG_PANES; + + if ((idx != 3) && (scene->_fadePercent == 100) && + (tempSet.sqrt(zeroSet) < 150.0)) { + switch (scene->_hitCount++) { + case 0: + scene->_soundHandler.play(233); + scene->showMessage(NULL, 0, NULL); + + if (!_globals->getFlag(76)) + scene->_probe.setAction(&scene->_action1); + break; + case 1: + scene->_soundHandler.play(233); + scene->showMessage(NULL, 0, NULL); + + if (!_globals->getFlag(76)) + scene->_probe.setAction(&scene->_action2); + break; + case 2: + scene->_soundHandler.play(234); + scene->showMessage(NULL, 0, NULL); + + if (!_globals->getFlag(76)) + scene->_probe.setAction(NULL); + scene->setAction(&scene->_action3); + break; + } + + _globals->_scenePalette.clearListeners(); + scene->_fadePercent = 0; + } + } +} + +void Scene6100::GetBoxAction::signal() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_turnAmount = 0; + Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y + 10); + ProbeMover *mover = new ProbeMover(); + scene->_probe.addMover(mover, &pt, NULL); + scene->_probe.show(); + break; + } + case 1: { + scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this); + _globals->_scenePalette.clearListeners(); + + Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10); + NpcMover *mover = new NpcMover(); + scene->_probe.addMover(mover, &pt, NULL); + break; + } + case 2: + scene->_probe._percent = 4; + scene->showMessage(SCENE6100_SURPRISE, 13, this); + break; + case 3: + scene->showMessage(SCENE6100_SWEAT, 35, this); + break; + case 4: + scene->showMessage(SCENE6100_VERY_WELL, 13, this); + break; + case 5: + scene->showMessage(NULL, 0, NULL); + _globals->_sceneManager.changeScene(2320); + remove(); + } +} + +void Scene6100::GetBoxAction::dispatch() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) { + if (scene->_getBoxAction._actionIndex == 1) { + scene->_speed = 0; + scene->_getBoxAction.signal(); + } + + if (scene->_probe._percent > 4) + // Handle the probe disappearing into the rocks + scene->_probe._percent = scene->_probe._percent * 7 / 8; + scene->_probe._flags |= OBJFLAG_PANES; + } + + Action::dispatch(); +} + +void Scene6100::Action7::signal() { + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + setDelay(90); + break; + case 2: + _globals->_sceneManager.changeScene(2100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene6100::Object::synchronize(Serializer &s) { + SceneObject::synchronize(s); + + // Save the double fields of the FloatSet + s.syncAsDouble(_floats._float1); + s.syncAsDouble(_floats._float2); + s.syncAsDouble(_floats._float3); + s.syncAsDouble(_floats._float4); +} + +/*--------------------------------------------------------------------------*/ + +void Scene6100::ProbeMover::dispatch() { + Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + + if (!dontMove()) { + if (scene->_speed > 0) { + scene->_action5.dispatch(); + scene->_speed = (scene->_speed * 4) / 5; + } + } + + NpcMover::dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene6100::Item1::doAction(int action) { + SceneItem::display2(4000, 0); +} + +/*--------------------------------------------------------------------------*/ + +Scene6100::Scene6100(): Scene() { + _objList[0] = &_sunflower1; + _objList[1] = &_sunflower2; + _objList[2] = &_sunflower3; + _objList[3] = &_rocks; + + _speed = 30; + _fadePercent = 100; + _rocksCheck = false; + _hitCount = 0; + _turnAmount = 0; + _angle = 0; + _msgActive = false; + + _globals->_sceneHandler._delayTicks = 8; + + _globals->_player.disableControl(); + _globals->_events.setCursor(CURSOR_WALK); +} + +void Scene6100::synchronize(Serializer &s) { + Scene::synchronize(s); + + s.syncAsSint16LE(_speed); + s.syncAsSint16LE(_fadePercent); + s.syncAsByte(_rocksCheck); + s.syncAsByte(_msgActive); + s.syncAsSint16LE(_hitCount); + s.syncAsSint16LE(_turnAmount); + s.syncAsSint16LE(_angle); +} + +void Scene6100::postInit(SceneObjectList *OwnerList) { + loadScene(6100); + Scene::postInit(); + setZoomPercents(62, 2, 200, 425); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerSL); + + _object1.postInit(); + _object1.setVisage(6100); + _object1._frame = 1; + _object1._strip = 4; + _object1.setPosition(Common::Point(0, 60)); + _object1.fixPriority(1); + + _object2.postInit(); + _object2.setVisage(6100); + _object2._frame = 1; + _object2._strip = 4; + _object2.setPosition(Common::Point(160, 60)); + _object2.fixPriority(1); + + _object3.postInit(); + _object3.setVisage(6100); + _object3._frame = 1; + _object3._strip = 4; + _object3.setPosition(Common::Point(320, 60)); + _object3.fixPriority(1); + + _rocks.postInit(); + _rocks.setVisage(6100); + _rocks._frame = 1; + _rocks._strip = 3; + _rocks.setPosition(Common::Point(320, 0)); + _rocks.fixPriority(2); + _rocks.changeZoom(-1); + _rocks._floats._float1 = 320.0; + _rocks._floats._float2 = 25000.0; + _rocks._floats._float3 = 0.0; + + _probe.postInit(); + _probe._moveDiff = Common::Point(15, 15); + _probe.setVisage(6100); + _probe._frame = 1; + _probe._strip = 5; + _probe.setPosition(Common::Point(160, 260)); + _probe.fixPriority(3); + _probe._floats._float1 = 320.0; + _probe._floats._float2 = 0.0; + _probe._floats._float3 = 0.0; + _probe.hide(); + + int baseVal = 2000; + for (int idx = 0; idx < 3; ++idx) { + _objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999); + _objList[idx]->_floats._float2 = baseVal; + _objList[idx]->_floats._float3 = 0.0; + baseVal += _globals->_randomSource.getRandomNumber(499); + + _objList[idx]->postInit(); + _objList[idx]->setVisage(6100); + _objList[idx]->_frame = 1; + _objList[idx]->_strip = 2; + + _objList[idx]->setPosition(Common::Point( + _globals->_randomSource.getRandomNumber(319), 60)); + _objList[idx]->fixPriority(1); + _objList[idx]->changeZoom(-1); + } + + setAction(&_action5); + _globals->_scenePalette.addRotation(96, 143, -1); + + if (!_globals->getFlag(76)) + _probe.setAction(&_action4); + + _globals->_soundHandler.play(231); +} + +void Scene6100::remove() { + _globals->_player.disableControl(); + _globals->_scenePalette.clearListeners(); + Scene::remove(); +} + +void Scene6100::process(Event &event) { + Scene::process(event); + + if (event.eventType == EVENT_KEYPRESS) { + // Handle incremental turning speeds with arrow keys + if ((event.kbd.keycode == Common::KEYCODE_LEFT) || (event.kbd.keycode == Common::KEYCODE_KP4)) { + _turnAmount = MIN(_turnAmount + 1, 8); + } else if ((event.kbd.keycode == Common::KEYCODE_RIGHT) || (event.kbd.keycode == Common::KEYCODE_KP6)) { + _turnAmount = MAX(_turnAmount - 1, -8); + } + } + + if (_probe._action) + _probe._action->process(event); +} + +void Scene6100::dispatch() { + Scene::dispatch(); + + if (_probe._action) + _probe._action->dispatch(); + + // Handle mouse controlling the turning + int changeAmount = (_globals->_events._mousePos.x - 160) / -20; + _turnAmount += (changeAmount - _turnAmount) / 2; + + if (_fadePercent < 100) { + _fadePercent += 10; + if (_fadePercent >= 100) { + _globals->_scenePalette.addRotation(96, 143, -1); + _fadePercent = 100; + } + + byte adjustData[] = {0xff, 0xff, 0xff, 0}; + _globals->_scenePalette.fade(adjustData, false, _fadePercent); + } + + if (_action != &_action3) { + // Display the distance remaining to the target + int distance = (int)_probe._floats.sqrt(_rocks._floats); + Common::String s = Common::String::format("%06d", distance); + + _sceneText.setPosition(Common::Point(24, 160)); + _sceneText._fontNumber = 0; + _sceneText._color1 = 35; + _sceneText.setup(s); + } + + if (_rocksCheck && (_action == &_action5)) { + // Check whether the probe is close enough to the rocks + double distance = _probe._floats.sqrt(_rocks._floats); + + if ((distance >= 300.0) && (distance <= 500.0)) + setAction(&_getBoxAction); + } +} + +void Scene6100::showMessage(const Common::String &msg, int color, Action *action) { + if (_msgActive) { + _msgActive = false; + _speaker1.removeText(); + } + + if (!msg.empty()) { + _msgActive = true; + _speaker1._textPos.x = 20; + _speaker1._textWidth = 280; + _speaker1._color1 = color; + _speaker1._action = action; + _speaker1.setText(msg); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h new file mode 100644 index 0000000000..dd64e563cd --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes1.h @@ -0,0 +1,538 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES1_H +#define TSAGE_RINGWORLD_SCENES1_H + +#include "common/scummsys.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace tSage { + +class Scene10 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; +public: + Speaker _speakerSText; + Speaker _speakerQText; + Action1 _action1; + Action2 _action2; + SceneObject _object1, _object2, _object3; + SceneObject _object4, _object5, _object6; + + virtual void stripCallback(int v); + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene15 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; +public: + Action1 _action1; + SceneObject _object1; + ASound _soundHandler; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene20 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + SpeakerQText _speakerQText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5; + ASound _sound; +public: + Scene20(); + virtual ~Scene20() {} + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene30 : public Scene { + /* Scene objects */ + // Doorway beam sensor + class BeamObject : public SceneObject { + public: + virtual void doAction(int action); + }; + // Doorway object + class DoorObject : public SceneObject { + public: + virtual void doAction(int action); + }; + // Kzin object + class KzinObject : public SceneObject { + public: + virtual void doAction(int action); + }; + + /* Actions */ + class BeamAction : public Action { + public: + virtual void signal(); + }; + class KzinAction : public Action { + public: + virtual void signal(); + }; + class RingAction : public Action { + public: + virtual void signal(); + }; + class TalkAction : public Action { + public: + virtual void signal(); + }; + +public: + ASound _sound; + DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot; + BeamObject _beam; + DoorObject _door; + KzinObject _kzin; + + BeamAction _beamAction; + KzinAction _kzinAction; + RingAction _ringAction; + TalkAction _talkAction; + SequenceManager _sequenceManager; + + SpeakerSR _speakerSR; + SpeakerQL _speakerQL; + SpeakerSText _speakerSText; + SpeakerQText _speakerQText; +public: + Scene30(); + virtual ~Scene30() {} + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene40 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + + /* Objects */ + class DyingKzin : public SceneObject { + public: + virtual void doAction(int action); + }; + class Assassin : public SceneObject { + public: + virtual void doAction(int action); + }; + + /* Items */ + class Item2 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class Item6 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class Item8 : public SceneHotspot { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SpeakerSL _speakerSL; + SpeakerQR _speakerQR; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + SpeakerGameText _speakerGameText; + ASound _soundHandler; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + SceneObject _object1, _object2, _object3; + DyingKzin _dyingKzin; + Assassin _assassin; + SceneObject _doorway, _object7, _object8; + DisplayHotspot _item1; + Item2 _item2; + DisplayHotspot _item3, _item4, _item5; + Item6 _item6; + DisplayHotspot _item7, _item8; + + Scene40(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene50 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Object1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object4 : public SceneObject { + public: + virtual void doAction(int action); + }; + +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Object1 _object1; + Object2 _object2; + Object3 _object3; + Object4 _object4; + Rect _doorwayRect; + SpeakerSText _speakerSText; + SpeakerQText _speakerQText; + DisplayHotspot _item0, _item1, _item2; + DisplayHotspot _item3, _item4, _item5; + + Scene50(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene60 : public Scene { + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class PrevObject : public SceneObject { + public: + virtual void doAction(int action); + }; + class NextObject : public SceneObject { + public: + virtual void doAction(int action); + }; + class ExitObject : public SceneObject { + public: + virtual void doAction(int action); + }; + class MessageObject : public SceneObject { + public: + virtual void doAction(int action); + }; + class ControlObject : public SceneObject { + public: + virtual void doAction(int action); + }; + class SlaveObject : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class MasterObject : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class FloppyDrive : public SceneObject { + public: + virtual void doAction(int action); + }; + class Item1 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class Item : public SceneHotspot { + public: + int _messageNum, _sceneMode; + + Item(int sceneRegionId, int messageNum, int sceneMode) { + _sceneRegionId = sceneRegionId; + _messageNum = messageNum; + _sceneMode = sceneMode; + } + virtual void doAction(int action); + }; + +public: + GfxButton _gfxButton; + SequenceManager _sequenceManager; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + Action1 _action1; + Action2 _action2; + SceneObject _rose; + PrevObject _prevButton; + NextObject _nextButton; + ExitObject _exitButton; + MessageObject _message; + ControlObject _controlButton; + SlaveObject _slaveButton; + MasterObject _masterButton; + FloppyDrive _floppyDrive; + SceneObject _redLights; + Item1 _item1; + Item _item2, _item3, _item4, _item5, _item6; + ASound _soundHandler1; + ASound _soundHandler2; + ASound _soundHandler3; + + Scene60(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene90 : public Scene { + class Action1 : public Action { + public: + virtual void signal(); + }; + class Object1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object2 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SpeakerSText _speakerSText; + SpeakerQText _speakerQText; + SpeakerQL _speakerQL; + SpeakerSR _speakerSR; + SpeakerMText _speakerMText; + Action1 _action1; + Object1 _object1; + Object2 _object2; + DisplayObject _object3, _object4, _object5; + SceneObject _object6; + DisplayHotspot _item1, _item2, _item3; + ASound _soundHandler1, _soundHandler2; + + Scene90(); + + virtual void stripCallback(int v); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene95 : public Scene { + class Action1 : public ActionExt { + public: + virtual void signal(); + }; + +public: + Action1 _action1; + SceneObject _object1, _object2, _object3; + ASound _soundHandler; + + Scene95(); + virtual void postInit(SceneObjectList *OwnerList); +}; + +class Scene6100 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void dispatch(); + }; + class GetBoxAction : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Object : public SceneObject { + public: + FloatSet _floats; + + virtual void synchronize(Serializer &s); + }; + class ProbeMover : public NpcMover { + public: + virtual void dispatch(); + }; + + /* Items */ + class Item1 : public SceneItem { + public: + virtual void doAction(int action); + }; + +public: + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + GetBoxAction _getBoxAction; + Action7 _action7; + ASound _soundHandler; + Speaker _speaker1; + SpeakerQR _speakerQR; + SpeakerSL _speakerSL; + SceneObject _object1, _object2, _object3; + Object _rocks, _probe; + Object _sunflower1, _sunflower2, _sunflower3; + SceneText _sceneText; + SceneItem _item1; + + int _turnAmount, _angle, _speed, _fadePercent; + int _hitCount; + bool _rocksCheck; + Object *_objList[4]; + bool _msgActive; + + Scene6100(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual void dispatch(); + void showMessage(const Common::String &msg, int color, Action *action); + +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp new file mode 100644 index 0000000000..1cff5d0aaf --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes10.cpp @@ -0,0 +1,2089 @@ +/* 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. + * + */ + +#include "graphics/cursorman.h" +#include "tsage/ringworld/ringworld_scenes10.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +Scene2::Scene2() : Scene() { + _sceneState = 0; +} + +/*--------------------------------------------------------------------------*/ + +void Object9350::postInit(SceneObjectList *OwnerList) { + //SceneObject::postInit(&_globals->_sceneManager._altSceneObjects); + SceneObject::postInit(OwnerList); +} + +void Object9350::draw() { + reposition(); + Rect destRect = _bounds; + destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); + Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum); + GfxSurface frame = getFrame(); + _globals->gfxManager().copyFrom(frame, destRect, priorityRegion); +} + +/*-------------------------------------------------------------------------- + * Scene 9100 - Near beach: Slave washing clothes + * + *--------------------------------------------------------------------------*/ +void Scene9100::SceneHotspot1::doAction(int action) { + Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + + if (action == CURSOR_TALK) { + if (_globals->getFlag(23)) { + _globals->_player.disableControl(); + scene->_sceneMode = 9104; + } else { + _globals->setFlag(23); + _globals->_player.disableControl(); + scene->_sceneMode = 9105; + } + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9100::dispatch() { + Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + + if (!_action) { + if (_globals->_player._position.x < 25) { + _globals->_player.disableControl(); + if (!_globals->getFlag(23) || _globals->getFlag(11)) + _sceneMode = 9106; + else { + _sceneMode = 9108; + _globals->setFlag(11); + } + + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL); + } + } else { + Scene::dispatch(); + } +} + +void Scene9100::signal() { + Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + + switch (scene->_sceneMode) { + case 9102: + case 9106: + case 9108: + _globals->_sceneManager.changeScene(9150); + break; + case 9105: + _sceneHotspot3.remove(); + // No break on purpose + case 9103: + case 9104: + case 9107: + case 9109: + default: + _globals->_player.enableControl(); + break; + } +} + +void Scene9100::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + _object1.postInit(); + _object1.setVisage(9100); + _object1._strip = 1; + _object1._numFrames = 6; + _object1.setPosition(Common::Point(279, 132)); + _object1.animate(ANIM_MODE_2, NULL); + _object1.fixPriority(10); + + _globals->_player.postInit(); + + _object2.postInit(); + _object2.hide(); + + _object3.postInit(); + _object3.hide(); + + _object4.postInit(); + _object4.hide(); + + _object5.postInit(); + _object5.hide(); + + if (!_globals->getFlag(23)) { + _object6.postInit(); + _object6.setVisage(9111); + _object6.setStrip(6); + _object6.setFrame(1); + _object6.setPosition(Common::Point(138, 166)); + _sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43); + } + _sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37); + _sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39); + _sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1); + _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46); + _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48); + + _globals->_soundHandler.play(251); + if (_globals->_sceneManager._previousScene == 9150) { + if (_globals->getFlag(20)) { + _globals->_player.disableControl(); + if (_globals->getFlag(11)) + _sceneMode = 9107; + else + _sceneMode = 9109; + setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL); + } else { + _sceneMode = 9103; + _globals->_player.disableControl(); + setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); + _globals->setFlag(20); + } + } else { + _sceneMode = 9102; + _globals->_player.disableControl(); + setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 9150 - Castle: Outside the bulwarks + * + *--------------------------------------------------------------------------*/ +void Scene9150::Object3::signal() { + switch (_signalFlag++) { + case 0: + _timer = 10 + _globals->_randomSource.getRandomNumber(90); + break; + default: + animate(ANIM_MODE_5, this); + _signalFlag = 0; + break; + } +} + +void Scene9150::Object3::dispatch() { + SceneObject::dispatch(); + if ((_timer != 0) && (--_timer == 0)) + signal(); +} + +void Scene9150::signal() { + switch (_sceneMode) { + case 9151: + case 9157: + _globals->_sceneManager.changeScene(9100); + break; + case 9153: + _globals->_sceneManager.changeScene(9300); + break; + case 9152: + case 9155: + case 9156: + _globals->_player.enableControl(); + break; + case 9154: + default: + break; + } +} + +void Scene9150::dispatch() { + + if ((_sceneState != 0) && (_sceneBounds.left == 0)) { + _object3._timer = 0; + _sceneState = 0; + _object3.setAction(&_sequenceManager2, NULL, 9154, &_object3, NULL); + _sceneHotspot10.remove(); + } + + if (_action) { + _action->dispatch(); + } else { + if (_globals->_player._position.x >= 160) { + if (_globals->_player._position.x > 630) { + _globals->_player.disableControl(); + _sceneMode = 9157; + setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + } + } else { + _globals->_player.disableControl(); + if (_globals->getFlag(11)) { + _globals->_soundHandler.play(286); + _sceneMode = 9153; + } else { + _sceneMode = 9156; + } + setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + } + } +} + +void Scene9150::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + _globals->_player.postInit(); + + _object3.postInit(); + _sceneState = 1; + _object3.setVisage(9151); + _object3._strip = 1; + _object3._frame = 1; + _object3.setPosition(Common::Point(312, 95)); + _object3.signal(); + + _sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1); + _sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1); + _sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49); + _sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51); + _sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53); + _sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55); + _sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1); + _sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1); + _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1); + _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59); + + _globals->_soundHandler.play(285); + _globals->_player.disableControl(); + + if (_globals->getFlag(20)) { + // Walking alone + _globals->_scrollFollower = &_globals->_player; + if (_globals->getFlag(11)) + // Hero wearing peasan suit + _sceneMode = 9155; + else + // Hero wearing Purple suit + _sceneMode = 9152; + setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + } else { + // Walking with the tiger + _sceneMode = 9151; + _object2.postInit(); + _object2.hide(); + _object1.postInit(); + setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 9200 - Castle: Near the fountain + * + *--------------------------------------------------------------------------*/ +void Scene9200::SceneHotspot1::doAction(int action) { + Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene; + + if (action == OBJECT_TUNIC) { + _globals->_player.disableControl(); + if (_globals->getFlag(93)) { + scene->_sceneState = 9214; + scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); + } else { + _globals->setFlag(93); + scene->_sceneState = 9213; + scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL); + } + } else if (action <= 100) { + _globals->_player.disableControl(); + scene->_sceneState = 9214; + scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9200::signal() { + switch (_sceneState++) { + case 9207: + _globals->_sceneManager.changeScene(9700); + break; + case 9208: + case 9211: + case 9212: + _globals->_sceneManager.changeScene(9500); + break; + case 9209: + _globals->_sceneManager.changeScene(9360); + break; + case 9210: + _hotspot1.remove(); + // No break on purpose + case 9201: + case 9202: + case 9203: + case 9204: + case 9205: + case 9206: + default: + _globals->_player.enableControl(); + break; + } +} + +void Scene9200::process(Event &event) { + Scene::process(event); +} + +void Scene9200::dispatch() { +// Rect rect9200 = Rect(320, 175, 250, 154); + Rect rect9200 = Rect(250, 154, 320, 175); + + if (_action) { + _action->dispatch(); + } else { + if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) { + _globals->_player.disableControl(); + _sceneState = 9209; + setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL); + } else { + if (rect9200.contains(_globals->_player._position)) { + if (_globals->getFlag(93)) { + if (_globals->getFlag(86)) { + _sceneState = 9215; + setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL); + } else { + _sceneState = 9208; + setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL); + } + } else { + _globals->_player.disableControl(); + _sceneState = 9204; + setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL); + } + } else { + if (_globals->_player._position.y < 140) { + _globals->_player.disableControl(); + _sceneState = 9207; + setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL); + } + } + } + } +} + +void Scene9200::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(130, 50, 200, 150); + + _globals->_player.postInit(); + _object3.postInit(); + _object3.hide(); + _object1.postInit(); + // Water animation + _object1.setVisage(9200); + _object1._strip = 3; + _object1.animate(ANIM_MODE_2, NULL); + _object1.setPosition(Common::Point(132, 114)); + _object1.fixPriority(140); + _soundHandler.play(297); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerGR); + _stripManager.addSpeaker(&_speakerGText); + + if (!_globals->getFlag(86)) { + _object2.postInit(); + _hotspot1.setup(96, 194, 160, 234, 9200, 29, 31); + } + _hotspot2.setup(164, 0, 200, 282, 9200, 0, 1); + _hotspot3.setup(140, 39, 165, 153, 9200, 2, 3); + _hotspot4.setup(92, 122, 139, 152, 9200, 4, 5); + _hotspot5.setup(33, 20, 142, 115, 9200, 6, 7); + _hotspot6.setup(104, 235, 153, 265, 9200, 8, 9); + _hotspot7.setup(107, 262, 153, 286, 9200, 10, 11); + _hotspot8.setup(69, 276, 164, 320, 9200, 12, 13); + + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + + switch (_globals->_sceneManager._previousScene) { + case 9500: + if (_globals->getFlag(85)) { + if (RING_INVENTORY._helmet._sceneNumber == 1) { + _globals->setFlag(86); + _globals->_player.disableControl(); + _sceneState = 9210; + setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL); + } else { + _globals->_player.disableControl(); + _sceneState = 9212; + setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL); + } + } else { + if (RING_INVENTORY._helmet._sceneNumber == 1) { + _globals->_player.disableControl(); + _sceneState = 9211; + setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL); + } else { + _globals->_player.disableControl(); + _sceneState = 9202; + setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL); + } + } + break; + case 9700: + if (_globals->getFlag(86)) { + _sceneState = 9206; + setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL); + } else { + _sceneState = 9203; + setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL); + } + break; + case 9360: + default: + if (_globals->getFlag(86)) { + _sceneState = 9205; + setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL); + } else { + _sceneState = 9201; + setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL); + } + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 9300 - Castle: In front of a large guarded door + * + *--------------------------------------------------------------------------*/ +void Scene9300::signal() { + switch (_sceneMode++) { + case 9301: + _globals->setFlag(84); + // No break on purpose + case 9303: + _globals->_soundHandler.play(295); + _globals->_sceneManager.changeScene(9350); + break; + case 9302: + _globals->_player.enableControl(); + break; + default: + break; + } +} + +void Scene9300::dispatch() { + if (_action) { + _action->dispatch(); + } else if (_globals->_player._position.y < 145) { + _globals->_player.disableControl(); + _sceneMode = 9303; + setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL); + } +} + +void Scene9300::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(130, 75, 230, 150); + + _sceneMode = 0; + _globals->_player.postInit(); + _globals->_player.changeZoom(-1); + _object1.postInit(); + _object2.postInit(); + _globals->_soundHandler.play(289); + + _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1); + _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3); + _hotspot3.setup(78, 142, 146, 216, 9300, 4, 5); + _hotspot4.setup(3, 43, 91, 74, 9300, 6, 7); + _hotspot5.setup(82, 19, 157, 65, 9300, 8, 9); + _hotspot6.setup(5, 218, 84, 274, 9300, 10, 11); + _hotspot7.setup(86, 233, 168, 293, 9300, 12, 13); + _hotspot8.setup(157, 0, 200, 230, 9300, 14, 15); + _hotspot9.setup(169, 227, 200, 320, 9300, 16, 17); + _hotspot10.setup(145, 97, 166, 225, 9300, 18, 19); + _hotspot11.setup(81, 75, 145, 145, 9300, 20, 21); + _hotspot12.setup(0, 0, 94, 35, 9300, 22, 23); + _hotspot13.setup(12, 268, 149, 320, 9300, 24, 25); + + if (_globals->_sceneManager._previousScene == 9350) { + _globals->_player.disableControl(); + _sceneMode = 9302; + setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL); + } else { + _globals->_player.disableControl(); + _sceneMode = 9301; + setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 9350 - Castle: In a hallway + * + *--------------------------------------------------------------------------*/ + +void Scene9350::signal() { + switch (_sceneState ++) { + case 0: + case 9352: + case 9353: + case 9354: + _globals->_player.enableControl(); + break; + case 9355: + _globals->_sceneManager.changeScene(9300); + break; + case 9356: + _globals->_sceneManager.changeScene(9360); + break; + case 9357: + case 9359: + _globals->_sceneManager.changeScene(9400); + break; + default: + break; + } +} + +void Scene9350::dispatch() { + if (_action == 0) { + if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { + _globals->_player.disableControl(); + _sceneState = 9356; + setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL); + } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { + _globals->_player.disableControl(); + _sceneState = 9357; + setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL); + } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { + _globals->_player.disableControl(); + _sceneState = 9355; + setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL); + } + } else { + Scene::dispatch(); + } +} + +void Scene9350::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(95, 80, 200, 100); + _globals->_player.postInit(); + + _object1.setup(9351, 1, 3, 139, 97, 0); + _sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1); + _sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1); + _sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1); + _sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1); + _sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1); + + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + + if (_globals->_sceneManager._previousScene == 9360) { + _globals->_player.disableControl(); + _sceneState = 9352; + setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL); + } else if (_globals->_sceneManager._previousScene == 9400) { + _globals->_player.disableControl(); + _sceneState = 9353; + setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL); + } else { + if (_globals->getFlag(84)) { + _globals->clearFlag(84); + _object2.postInit(); + _globals->_player.disableControl(); + _sceneState = 9359; + setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL); + } else { + _globals->_player.disableControl(); + _sceneState = 9354; + setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 9360 - Castle: In a hallway + * + *--------------------------------------------------------------------------*/ + +void Scene9360::signal() { + switch (_sceneState ++) { + case 0: + case 9362: + case 9363: + case 9364: + _globals->_player.enableControl(); + break; + case 9365: + _globals->_sceneManager.changeScene(9350); + break; + case 9366: + _globals->_sceneManager.changeScene(9200); + break; + case 9367: + _globals->_sceneManager.changeScene(9450); + break; + default: + break; + } +} + +void Scene9360::dispatch() { + if (_action == 0) { + if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { + _globals->_player.disableControl(); + _sceneState = 9366; + setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL); + } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { + _globals->_player.disableControl(); + _sceneState = 9367; + setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL); + } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { + _globals->_player.disableControl(); + _sceneState = 9365; + setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL); + } + } else { + Scene::dispatch(); + } +} + +void Scene9360::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(95, 80, 200, 100); + _globals->_player.postInit(); + + _hotspot1.setup(37, 92, 93, 173, 9360, 0, 1); + _hotspot2.setup(42, 0, 100, 63, 9360, 2, -1); + _hotspot3.setup(36, 205, 82, 260, 9360, 3, -1); + _hotspot4.setup(103, 2, 200, 320, 9360, 4, -1); + _hotspot5.setup(0, 0, 37, 320, 9360, 4, -1); + _hotspot6.setup(35, 61, 103, 92, 9360, 4, -1); + _hotspot7.setup(33, 174, 93, 207, 9360, 4, -1); + _hotspot8.setup(28, 257, 149, 320, 9360, 4, -1); + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + if (_globals->_sceneManager._previousScene == 9350) { + _globals->_player.disableControl(); + _sceneState = 9364; + setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL); + } else if (_globals->_sceneManager._previousScene == 9450) { + _globals->_player.disableControl(); + _sceneState = 9363; + setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL); + } else { + _globals->_player.disableControl(); + _sceneState = 9362; + setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL); + } + _object1.setup(9351, 1, 1, 131, 90, 0); +} + +/*-------------------------------------------------------------------------- + * Scene 9400 - Castle: Black-Smith room + * + *--------------------------------------------------------------------------*/ +Scene9400::Scene9400() { + _field1032 = 0; +} + +void Scene9400::SceneHotspot7::doAction(int action) { + Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + + if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) { + scene->_sceneState = 1; + RING_INVENTORY._straw._sceneNumber = 1; + scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9400::SceneHotspot8::doAction(int action) { + Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + + if (action == CURSOR_TALK) { + _globals->_player.disableControl(); + scene->_sceneState = 2; + scene->signal(); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9400::signal() { + switch (_sceneState ++) { + case 0: + _object1._numFrames = 6; + _stripManager.start(9400, this); + break; + case 1: + _object1._numFrames = 6; + _object1.animate(ANIM_MODE_2, NULL); + _globals->_player.enableControl(); + break; + case 2: + _object1.animate(ANIM_MODE_5, this); + break; + case 3: + _stripManager.start(9405, this); + break; + case 4: + _object1.animate(ANIM_MODE_2, this); + _globals->_player.enableControl(); + break; + case 9350: + _globals->_sceneManager.changeScene(9350); + break; + default: + break; + } +} + +void Scene9400::dispatch() { + if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){ + if (_field1032 == 0) { + _soundHandler.play(296); + _field1032 = 1; + } + } else { + _field1032 = 0; + } + if (_action == 0) { + if (_globals->_player._position.y < 120) { + _sceneState = 9350; + _globals->_player.disableControl(); + setAction(&_action1); + Common::Point pt(-45, 88); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } + } else { + Scene::dispatch(); + } +} + +void Scene9400::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + _screenNumber = 9400; + setZoomPercents(0, 100, 200, 100); + _globals->_player.postInit(); + _object1.postInit(); + _object3.postInit(); + _speakerQText._textPos.x = 20; + + _hotspot7.setup(157, 66, 180, 110, 9400, 21, 23); + _hotspot5.setup(130, 133, 152, 198, 9400, 22, -1); + _hotspot1.setup(33, 280, 69, 297, 9400, 1, 2); + _hotspot2.setup(73, 96, 87, 159, 9400, 3, 4); + _hotspot3.setup(89, 253, 111, 305, 9400, 5, 6); + _hotspot4.setup(46, 0, 116, 35, 9400, 7, 8); + _hotspot8.setup(58, 169, 122, 200, 9400, 9, 10); + _hotspot6.setup(0, 0, 199, 319, 9400, 16, 0); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerOR); + _stripManager.addSpeaker(&_speakerOText); + + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + + // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350) + _sceneState = 2; + if (!_globals->getFlag(89)) { + _globals->setFlag(89); + _sceneState = 0; + } + + setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL); +} + +void Scene9400::synchronize(Serializer &s) { + Scene::synchronize(s); + if (s.getVersion() >= 3) + s.syncAsSint16LE(_field1032); +} + +/*-------------------------------------------------------------------------- + * Scene 9450 - Castle: Dining room + * + *--------------------------------------------------------------------------*/ +void Scene9450::Object2::signal() { + Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + + this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL); +} + +void Scene9450::Object3::dispatch() { + SceneObject::dispatch(); + _percent = (_percent * 20) / 30; +} + +void Scene9450::Hotspot1::doAction(int action) { + Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + if (scene->_object2._action) + scene->_object2._action->remove(); + scene->_sceneMode = 9459; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9450::Hotspot3::doAction(int action) { + Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_CLOAK: + case OBJECT_JACKET: + case OBJECT_TUNIC2: + scene->_sceneMode = 9460; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); + break; + case OBJECT_TUNIC: + SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + case CURSOR_WALK: + // nothing + break; + case CURSOR_LOOK: + SceneItem::display(9450, 41, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + case CURSOR_USE: + case CURSOR_TALK: + if (RING_INVENTORY._tunic._sceneNumber == 9450) { + if (scene->_object2._action) + scene->_object2._action->remove(); + scene->_sceneMode = 9459; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); + } else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) { + SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else { + scene->_sceneMode = 9460; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); + } + break; + default: + SceneItem::display(9450, 45, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + } +} + +void Scene9450::signal() { + switch (_sceneMode++) { + case 1002: + case 1004: + // Drink + setAction(&_sequenceManager1, this, 9456, &_object2, &_object1, &_object3, NULL); + break; + case 1005: + // Bring me more wine + setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL); + break; + case 9451: + if (_globals->getFlag(87)) { + _globals->_player.enableControl(); + } else { + _sceneMode = 1001; + if (_object2._action) + _object2._action->remove(); + // Eat + setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL); + } + break; + case 1001: + case 1003: + // Eat + setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL); + break; + case 9453: + _globals->_sceneManager.changeScene(9360); + break; + case 9459: + RING_INVENTORY._tunic._sceneNumber = 1; + _object2.signal(); + _globals->_player.enableControl(); + _globals->_events.setCursor(CURSOR_WALK); + _hotspot1.remove(); + break; + case 1006: + _globals->setFlag(87); + // No break on purpose + default: + _globals->_player.enableControl(); + break; + } +} + +void Scene9450::dispatch() { + if (_action) { + _action->dispatch(); + } else { + if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) { + _globals->_player.disableControl(); + _sceneMode = 9452; + setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL); + } else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) { + _globals->_player.disableControl(); + _sceneMode = 9453; + setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL); + } + } +} + +void Scene9450::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(84, 75, 167, 150); + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.postInit(); + + _object2.postInit(); + _object1.postInit(); + _object1.hide(); + + _globals->_player.disableControl(); + _sceneMode = 9451; + setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL); + + if (_globals->getFlag(87)) { + if (RING_INVENTORY._tunic._sceneNumber == 1) { + _object2.signal(); + } else { + _object2.setPosition(Common::Point(184, 144)); + _object2.setVisage(9451); + _object2.fixPriority(250); + _object2._strip = 5; + _object2._frame = 10; + } + } else { + _object3.postInit(); + _object3.hide(); + _object3.setAction(&_sequenceManager2, NULL, 9455, &_object2, &_object1, NULL); + } + + if (RING_INVENTORY._tunic._sceneNumber != 1) + _hotspot1.setup(123, 139, 138, 170, 9450, 37, -1); + + _hotspot2.setup(153, 102, 176, 141, 9450, 39, 40); + _hotspot3.setup(97, 198, 130, 229, 9450, 41, 42); + _hotspot15.setup(131, 190, 145, 212, 9450, 43, 44); + _hotspot4.setup(33, 144, 105, 192, 9450, 0, 1); + _hotspot5.setup(20, 236, 106, 287, 9450, 2, 3); + _hotspot6.setup(137, 119, 195, 320, 9450, 4, 5); + _hotspot7.setup(20, 59, 99, 111, 9450, 6, -1); + _hotspot8.setup(110, 0, 199, 117, 9450, 7, 8); + _hotspot9.setup(101, 104, 130, 174, 9450, 9, 10); + _hotspot10.setup(110, 246, 149, 319, 9450, 11, 12); + _hotspot11.setup(16, 34, 74, 62, 6450, 13, 14); + _hotspot12.setup(19, 108, 72, 134, 9450, 15, 16); + _hotspot13.setup(18, 215, 71, 237, 9450, 17, 18); + _hotspot14.setup(15, 288, 76, 314, 9450, 19, 20); + _hotspot16.setup(0, 0, 200, 320, 9450, 46, -1); +} + +/*-------------------------------------------------------------------------- + * Scene 9500 - Castle: Bedroom + * + *--------------------------------------------------------------------------*/ +void Scene9500::Hotspot1::doAction(int action) { + Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + + if (action == OBJECT_SWORD) { + scene->_sceneMode = 9510; + _globals->setFlag(92); + RING_INVENTORY._sword._sceneNumber = 9500; + _globals->_player.disableControl(); + _globals->_sceneItems.remove(this); + scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); + scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9500::Hotspot2::doAction(int action) { + Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + scene->_sceneMode = 9511; + _globals->_player.disableControl(); + _globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9500::Hotspot3::doAction(int action) { + Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + + if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){ + scene->_sceneMode = 9505; + _globals->_player.disableControl(); + _globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9500::Hotspot4::doAction(int action) { + Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + + if (action == OBJECT_CANDLE) { + _globals->_player.disableControl(); + if (RING_INVENTORY._straw._sceneNumber == 9500) { + scene->_sceneMode = 9506; + _globals->_sceneItems.remove(&scene->_hotspot5); + _globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL); + RING_INVENTORY._candle._sceneNumber = 9850; + } else { + scene->_sceneMode = 9507; + scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL); + } + } else if (action == OBJECT_STRAW) { + scene->_sceneMode = 9512; + _globals->_player.disableControl(); + RING_INVENTORY._straw._sceneNumber = 9500; + scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9500::signal() { + switch (_sceneMode) { + case 9503: + _globals->_sceneManager.changeScene(9200); + _globals->_soundHandler.play(295); + break; + case 9504: + _globals->_sceneManager.changeScene(9850); + break; + case 9505: + _candle.setStrip(2); + RING_INVENTORY._candle._sceneNumber = 1; + _globals->_player.enableControl(); + break; + case 9506: + _globals->setFlag(85); + _globals->_player.enableControl(); + break; + case 9511: + RING_INVENTORY._helmet._sceneNumber = 1; + _globals->_player.enableControl(); + if (!_globals->getFlag(51)) { + _globals->setFlag(51); + _globals->_player.disableControl(); + _sceneMode = 9514; + setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL); + } + break; + case 0: + case 9514: + default: + _globals->_player.enableControl(); + break; + } +} + +void Scene9500::dispatch() { + if (_action) { + _action->dispatch(); + } else { + if (_globals->_player._position.y >= 199) { + _globals->_player.disableControl(); + _sceneMode = 9503; + setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL); + } else if (_globals->_player._position.y < 127) { + _globals->_player.disableControl(); + _sceneMode = 9504; + setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL); + } + } + +} + +void Scene9500::process(Event &event) { + Scene::process(event); +} + +void Scene9500::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(110, 75, 200, 150); + + _globals->_player.postInit(); + _globals->_soundHandler.play(305); + + _candle.postInit(); + _candle.setVisage(9500); + _candle.setStrip(1); + _candle.animate(ANIM_MODE_2); + _candle.setPosition(Common::Point(30, 105)); + if (RING_INVENTORY._candle._sceneNumber != 9500) + _candle.setStrip(2); + + _object3.postInit(); + _object3.hide(); + _object3.fixPriority(150); + _object3.setPosition(Common::Point(166, 133)); + if (RING_INVENTORY._straw._sceneNumber == 9500) { + _object3.show(); + _object3.setVisage(5); + _object3._strip = 2; + _object3._frame = 9; + _object3.setPosition(Common::Point(168, 128)); + if (_globals->getFlag(85)) { + _object3.setVisage(9500); + _object3.setStrip(4); + _object3.animate(ANIM_MODE_8, 0, NULL); + _object3.setPosition(Common::Point(166, 133)); + } + } + + _object2.postInit(); + _object2.hide(); + if (_globals->getFlag(92)) { + _object2.show(); + _object2.setVisage(9501); + _object2.setStrip(1); + _object2.setFrame(_object2.getFrameCount()); + _object2.setPosition(Common::Point(303, 130)); + _object2.fixPriority(132); + if (RING_INVENTORY._helmet._sceneNumber == 1) { + _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); + } else { + _object2.setStrip(2); + _object2.setFrame(1); + } + } else { + _hotspot1.setup(105, 295, 134, 313, 9500, 9, 10); + } + + _hotspot17.setup(101, 293, 135, 315, 9500, 9, 10); + _hotspot3.setup(84, 12, 107, 47, 9500, 15, 15); + _hotspot6.setup(93, 11, 167, 46, 9500, 0, 1); + _hotspot7.setup(100, 70, 125, 139, 9500, 2, 3); + + if (!_globals->getFlag(85)) { + _hotspot5.setup(111, 68, 155, 244, 9500, 17, -1); + _hotspot4.setup(57, 71, 120, 126, 9500, 16, -1); + } + + _hotspot8.setup(60, 24, 90, 53, 9500, 4, 5); + _hotspot9.setup(72, 143, 93, 163, 9500, 4, 5); + _hotspot10.setup(70, 205, 92, 228, 9500, 4, 5); + _hotspot11.setup(66, 291, 90, 317, 9500, 4, 5); + _hotspot12.setup(22, 58, 101, 145, 9500, 6, 7); + _hotspot13.setup(121, 57, 163, 249, 9500, 6, 7); + _hotspot14.setup(115, 133, 135, 252, 9500, 6, 7); + _hotspot15.setup(55, 240, 125, 254, 9500, 6, 7); + _hotspot16.setup(53, 251, 132, 288, 9500, 8, -1); + _hotspot19.setup(101, 207, 120, 225, 9500, 9, 10); + _hotspot18.setup(98, 144, 117, 162, 9500, 9, 10); + _hotspot20.setup(102, 27, 132, 50, 9500, 9, 10); + + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + + if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) { + _sceneMode = 0; + if (RING_INVENTORY._helmet._sceneNumber != 1) { + setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL); + } else { + RING_INVENTORY._helmet._sceneNumber = 9500; + _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); + setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL); + } + } else { + _sceneMode = 0; + setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 9700 - Castle: Balcony + * + *--------------------------------------------------------------------------*/ +void Scene9700::signal() { + switch (_sceneMode ++) { + case 9703: + _globals->setFlag(88); + // No break on purpose + case 9701: + case 9702: + _gfxButton1.setText(EXIT_MSG); + _gfxButton1._bounds.center(50, 190); + _gfxButton1.draw(); + _gfxButton1._bounds.expandPanes(); + _globals->_player.enableControl(); + _globals->_player._canWalk = false; + _globals->_events.setCursor(CURSOR_USE); + break; + case 9704: + _globals->_soundHandler.play(323); + _globals->_sceneManager.changeScene(9750); + break; + } +} + +void Scene9700::process(Event &event) { + Scene::process(event); + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + if (_gfxButton1.process(event)) { + _globals->_sceneManager.changeScene(9200); + } else if (_globals->_events._currentCursor == OBJECT_SCANNER) { + event.handled = true; + if (RING_INVENTORY._helmet._sceneNumber == 1) { + _globals->_player.disableControl(); + _sceneMode = 9704; + setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL); + } else { + _globals->_player.disableControl(); + _sceneMode = 9703; + setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL); + } + } + } +} + +void Scene9700::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1); + _sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1); + _sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16); + _sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1); + _sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1); + _sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1); + + _object1.postInit(); + _object1.hide(); + _globals->_player.postInit(); + if (!_globals->getFlag(97)) { + _globals->_player.disableControl(); + _sceneMode = 9701; + setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL); + _globals->setFlag(97); + } else { + _globals->_player.disableControl(); + _sceneMode = 9702; + setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 9750 - Castle: In the garden + * + *--------------------------------------------------------------------------*/ +void Scene9750::signal() { + switch (_sceneMode ++) { + case 9751: + _globals->_soundHandler.fadeOut(this); + break; + case 9752: + _globals->_sceneManager.changeScene(2100); + default: + break; + } +} + +void Scene9750::dispatch() { + Scene::dispatch(); +} + +void Scene9750::postInit(SceneObjectList *OwnerList) { + loadScene(9750); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _globals->_player.postInit(); + _object1.postInit(); + _object1.hide(); + _object2.postInit(); + _object2.hide(); + _globals->_player.disableControl(); + _sceneMode = 9751; + setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL); +} + + +/*-------------------------------------------------------------------------- + * Scene 9850 - Castle: Dressing room + * + *--------------------------------------------------------------------------*/ +void Scene9850::Object6::doAction(int action) { + if ((_flags & OBJFLAG_HIDE) == 0) { + if (action == CURSOR_LOOK) { + SceneItem::display(9850, 27, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else if (action == CURSOR_USE) { + RING_INVENTORY._scimitar._sceneNumber = 1; + hide(); + } else { + SceneHotspot::doAction(action); + } + } +} +void Scene9850::Object7::doAction(int action) { + if ((_flags & OBJFLAG_HIDE) == 0) { + if (action == CURSOR_LOOK) { + SceneItem::display(9850, 28, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else if (action == CURSOR_USE) { + RING_INVENTORY._sword._sceneNumber = 1; + hide(); + } else { + SceneHotspot::doAction(action); + } + } +} + +// Hair covered tunic +void Scene9850::Hotspot12::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + if (RING_INVENTORY._tunic2._sceneNumber != 1) { + RING_INVENTORY._tunic2._sceneNumber = 1; + _globals->_player.disableControl(); + scene->_sceneMode = 9858; + scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL); + } else { + RING_INVENTORY._tunic2._sceneNumber = 9850; + _globals->_player.disableControl(); + scene->_sceneMode = 9861; + scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL); + } + } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) { + NamedHotspot::doAction(action); + } else { + SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } +} + +void Scene9850::Hotspot14::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + if (RING_INVENTORY._jacket._sceneNumber != 1) { + RING_INVENTORY._jacket._sceneNumber = 1; + _globals->_player.disableControl(); + scene->_sceneMode = 9857; + scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL); + } else { + RING_INVENTORY._jacket._sceneNumber = 9850; + _globals->_player.disableControl(); + scene->_sceneMode = 9860; + scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL); + } + } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) { + NamedHotspot::doAction(action); + } else { + SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } +} + +void Scene9850::Hotspot16::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + if (RING_INVENTORY._cloak._sceneNumber != 1) { + RING_INVENTORY._cloak._sceneNumber = 1; + _globals->_player.disableControl(); + scene->_sceneMode = 9862; + scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL); + } else { + RING_INVENTORY._cloak._sceneNumber = 9850; + _globals->_player.disableControl(); + scene->_sceneMode = 9859; + scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL); + } + } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) { + NamedHotspot::doAction(action); + } else { + SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } +} + +void Scene9850::Hotspot17::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == OBJECT_SCANNER) { + SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else { + if (action == CURSOR_USE) + scene->_soundHandler.play(306); + NamedHotspot::doAction(action); + } +} + +void Scene9850::Hotspot18::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == OBJECT_SCANNER) { + SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else { + if (action == CURSOR_USE) + scene->_soundHandler.play(306); + NamedHotspot::doAction(action); + } +} + +void Scene9850::Hotspot19::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == OBJECT_SCANNER) { + SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else { + if (action == CURSOR_USE) + scene->_soundHandler.play(313); + NamedHotspot::doAction(action); + } +} + +// Arrow on Statue +void Scene9850::Hotspot20::doAction(int action) { + Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + _globals->_player.disableControl(); + if (scene->_objSword._state == 0) { + if (RING_INVENTORY._scimitar._sceneNumber == 9850) + scene->_objScimitar.show(); + if (RING_INVENTORY._sword._sceneNumber == 9850) + scene->_objSword.show(); + scene->_sceneMode = 11; + setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); + } else { + scene->_sceneMode = 10; + setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); + } + scene->_objSword._state ^= 1; + } else { + NamedHotspot::doAction(action); + } +} + +void Scene9850::signal() { + switch (_sceneMode ++) { + case 10: + // Hidden closet closed + if (RING_INVENTORY._scimitar._sceneNumber == 9850) + _objScimitar.hide(); + if (RING_INVENTORY._sword._sceneNumber == 9850) + _objSword.hide(); + _globals->_sceneItems.remove(&_objScimitar); + _globals->_sceneItems.remove(&_objSword); + _globals->_sceneItems.addItems(&_hotspot19, NULL); + _globals->_player.enableControl(); + break; + case 11: + // Hidden closet opened + if (RING_INVENTORY._scimitar._sceneNumber == 9850) + _globals->_sceneItems.addItems(&_objScimitar, NULL); + if (RING_INVENTORY._sword._sceneNumber == 9850) + _globals->_sceneItems.addItems(&_objSword, NULL); + _globals->_sceneItems.remove(&_hotspot19); + _globals->_player.enableControl(); + break; + case 9500: + _globals->_sceneManager.changeScene(_sceneMode - 1); + break; + case 0: + default: + _globals->_player.enableControl(); + break; + } +} + +void Scene9850::process(Event &event) { + Scene::process(event); + if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) { + event.handled = true; + _globals->_player.disableControl(); + if (_objSword._state == 0) { + _sceneMode = 0; + setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL); + } else { + _sceneMode = 10; + setAction(&_sequenceManager, this, 9854, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL); + } + _objSword._state ^= 1; + } +} + +void Scene9850::dispatch() { + if (_action) { + _action->dispatch(); + } else if (_globals->_player._position.y >= 198) { + _globals->_player.disableControl(); + _sceneMode = 9500; + setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL); + } +} + +void Scene9850::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + _objSword._state = 0; + + _objDoor.postInit(); + _objDoor.setVisage(9850); + _objDoor.setStrip(1); + _objDoor.setFrame(1); + _objDoor.setPosition(Common::Point(28, 118)); + _objDoor.fixPriority(90); + + _objLever.postInit(); + _objLever.setVisage(9850); + _objLever.setStrip(4); + _objLever.setFrame(1); + _objLever.setPosition(Common::Point(256, 35)); + + _objCloak.postInit(); + _objCloak.setVisage(9850); + _objCloak.setStrip(5); + _objCloak.setFrame(1); + _objCloak.fixPriority(90); + _objCloak.setPosition(Common::Point(157, 81)); + if (RING_INVENTORY._cloak._sceneNumber != 9850) + _objCloak.hide(); + + _objJacket.postInit(); + _objJacket.setVisage(9850); + _objJacket.setStrip(5); + _objJacket.setFrame(2); + _objJacket.fixPriority(90); + _objJacket.setPosition(Common::Point(201, 84)); + if (RING_INVENTORY._jacket._sceneNumber != 9850) + _objJacket.hide(); + + _objTunic2.postInit(); + _objTunic2.setVisage(9850); + _objTunic2.setStrip(5); + _objTunic2.setFrame(3); + _objTunic2.fixPriority(90); + _objTunic2.setPosition(Common::Point(295, 90)); + if (RING_INVENTORY._tunic2._sceneNumber != 9850) + _objTunic2.hide(); + + if (RING_INVENTORY._scimitar._sceneNumber == 9850) { + _objScimitar.postInit(); + _objScimitar.setVisage(9850); + _objScimitar.setStrip(2); + _objScimitar.setFrame(1); + _objScimitar.setPosition(Common::Point(55, 83)); + _objScimitar.fixPriority(80); + _objScimitar.hide(); + } + + if (RING_INVENTORY._sword._sceneNumber == 9850) { + _objSword.postInit(); + _objSword.setVisage(9850); + _objSword.setStrip(3); + _objSword.setFrame(1); + _objSword.setPosition(Common::Point(56, 101)); + _objSword.fixPriority(80); + _objSword.hide(); + } + + _spotLever.setup(30, 251, 45, 270, 9850, 26, -1); + _hotspot1.setup(123, 0, 200, 320, 9850, 0, 1); + _hotspot2.setup(107, 87, 133, 308, 9850, 0, 1); + _hotspot3.setup(2, 28, 53, 80, 9850, 2, 3); + _hotspot4.setup(13, 0, 55, 27, 9850, 2, 3); + _hotspot5.setup(8, 74, 27, 91, 9850, 4, 5); + _hotspot17.setup(61, 0, 125, 28, 9850, 6, 7); + _hotspot18.setup(51, 95, 105, 145, 9850, 6, 7); + _hotspot19.setup(56, 28, 115, 97, 9850, 6, 8); + _hotspot6.setup(0, 223, 115, 257, 9850, 9, 10); + _hotspot7.setup(15, 254, 33, 268, 9850, 9, -1); + _hotspot8.setup(17, 218, 37, 233, 9850, 9, 10); + _hotspot9.setup(8, 113, 26, 221, 9850, 11, 12); + _hotspot10.setup(14, 94, 53, 112, 9850, 13, 14); + _hotspot11.setup(5, 269, 29, 303, 9850, 15, 16); + _hotspot12.setup(43, 278, 91, 317, 9850, 17, 18); + _hotspot13.setup(47, 263, 112, 282, 9850, 19, 20); + _hotspot14.setup(43, 188, 86, 224, 9850, 21, 22); + _hotspot15.setup(43, 162, 92, 191, 9850, 23, 24); + _hotspot16.setup(40, 146, 90, 169, 9850, 25, -1); + + _globals->_player.postInit(); + _globals->_player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL); +} + +/*-------------------------------------------------------------------------- + * Scene 9900 - Ending + * + *--------------------------------------------------------------------------*/ +void Scene9900::strAction1::signal() { + const byte mask1[3] = {0xff, 0xff, 0xff}; + const byte mask2[3] = {0, 0, 0}; + + Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_soundHandler.play(351); + _object9.postInit(); + _object9.setVisage(18); + _object9._frame = 1; + _object9._strip = 6; + _object9.fixPriority(250); + _object9.setPosition(Common::Point(171, 59)); + _object9.animate(ANIM_MODE_5, NULL); + _globals->_scenePalette.addRotation(67, 111, 1, 1, this); + scene->_object2.hide(); + break; + case 1: + _palette1.getPalette(); + _globals->_scenePalette.addFader(&mask1[0], 1, 10, this); + break; + case 2: + _object9.remove(); + _globals->_scenePalette.addFader(&mask2[0], 1, 5, this); + break; + case 3: + _globals->_soundHandler.play(377); + setDelay(120); + break; + case 4: + _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this); + break; + case 5: + remove(); + break; + default: + break; + } +} + +void Scene9900::strAction2::signal() { + switch (_actionIndex++) { + case 0: + _lineNum = 0; + _txtArray1Index = 0; + _txtArray1[0]._position.y = 200; + _txtArray1[1]._position.y = 300; + _txtArray2[0]._position.y = 400; + _txtArray2[1]._position.y = 500; + _var3 = 0; + // No break on purpose + case 1: { + Common::String msg = _resourceManager->getMessage(8030, _lineNum++); + if (msg.compareTo("LASTCREDIT")) { + if (_var3) { + // Not used? + // int x = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); + _txtArray1[_txtArray1Index]._moveDiff.y = 10; + + NpcMover *mover = new NpcMover(); + Common::Point pt(_txtArray1[_txtArray1Index]._position.x, -100); + _txtArray1[_txtArray1Index].addMover(mover, &pt, NULL); + + // Not used? + // int x = _txtArray2[_txtArray1Index].getFrame().getBounds().height(); + _txtArray2[_txtArray1Index]._moveDiff.y = 10; + _txtArray1Index = (_txtArray1Index + 1) % 2; + } + _var3 = 1; + _txtArray1[_txtArray1Index]._textMode = ALIGN_CENTER; + _txtArray1[_txtArray1Index]._width = 240; + _txtArray1[_txtArray1Index]._fontNumber = 2; + _txtArray1[_txtArray1Index]._color1 = 7; + _txtArray1[_txtArray1Index].setup(msg); + _txtArray1[_txtArray1Index]._moveRate = 20; + _txtArray1[_txtArray1Index]._moveDiff.y = 2; + _txtArray1[_txtArray1Index].fixPriority(255); + int frameWidth = _txtArray1[_txtArray1Index].getFrame().getBounds().width(); + int frameHeight = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); + _txtArray1[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200)); + + NpcMover *mover2 = new NpcMover(); + Common::Point pt2(_txtArray1[_txtArray1Index]._position.x, 100); + _txtArray1[_txtArray1Index].addMover(mover2, &pt2, this); + + _txtArray2[_txtArray1Index]._textMode = ALIGN_CENTER; + _txtArray2[_txtArray1Index]._width = 240; + _txtArray2[_txtArray1Index]._fontNumber = 2; + _txtArray2[_txtArray1Index]._color1 = 23; + + msg = _resourceManager->getMessage(8030, _lineNum++); + _txtArray2[_txtArray1Index].setup(msg); + _txtArray2[_txtArray1Index]._moveRate = 20; + _txtArray2[_txtArray1Index]._moveDiff.y = 2; + _txtArray2[_txtArray1Index].fixPriority(255); + frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width(); + _txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight)); + } else { + // WORKAROUND: Fix inventory becoming available at end of credits + _globals->_events.setCursor(CURSOR_WALK); + _actionIndex = 3; + signal(); + } + break; + } + case 2: + setDelay(60); + _actionIndex = 1; + break; + case 3: + setDelay(7200); + break; + case 4: + _txtArray1[0].remove(); + _txtArray1[1].remove(); + _txtArray2[0].remove(); + _txtArray2[1].remove(); + remove(); + break; + default: + break; + } +} +void Scene9900::strAction2::dispatch() { +// if (this->_txtArray1[0]._textSurface != 0) { + int frameHeight = _txtArray1[0].getFrame().getBounds().height(); + _txtArray2[0]._position.y = frameHeight + _txtArray1[0]._position.y; + _txtArray2[0]._flags |= OBJFLAG_PANES; +// } +// if (this->_txtArray1[1]._textSurface != 0) { + frameHeight = _txtArray1[1].getFrame().getBounds().height(); + _txtArray2[1]._position.y = frameHeight + _txtArray1[1]._position.y; + _txtArray2[1]._flags |= OBJFLAG_PANES; +// } + Action::dispatch(); +} + +void Scene9900::strAction2::synchronize(Serializer &s) { + Action::synchronize(s); + if (s.getVersion() >= 3) { + s.syncAsSint16LE(_lineNum); + s.syncAsSint16LE(_txtArray1Index); + s.syncAsSint16LE(_var3); + } +} + +void Scene9900::strAction3::signal() { + const byte mask3[3] = {0xff, 0, 0}; + const byte mask4[3] = {0, 0, 0}; + + switch (_actionIndex++) { + case 0: + _palette2.getPalette(); + _palette3.loadPalette(2003); + _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this); + break; + case 1: + _globals->_scenePalette.addFader(&mask3[0], 1, 10, this); + break; + case 2: + _globals->_scenePalette.addFader(&mask4[0], 1, 1, this); + break; + case 3: + _palette2.loadPalette(17); + _globals->_sceneManager._scene->loadScene(17); + _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this); + break; + case 4: + _globals->_game->endGame(9900, 61); + remove(); + default: + break; + } +} + +void Scene9900::signal() { + if ((_sceneMode != 9913) && (_sceneMode != 9905) && (_sceneMode != 9904) && (_sceneMode != 9912)) { + _object1.hide(); + _object2.hide(); + _object3.hide(); + _object4.hide(); + _object5.hide(); + _object6.hide(); + } + + _object1.animate(ANIM_MODE_NONE, NULL); + _object2.animate(ANIM_MODE_NONE, NULL); + _object3.animate(ANIM_MODE_NONE, NULL); + _object4.animate(ANIM_MODE_NONE, NULL); + _object5.animate(ANIM_MODE_NONE, NULL); + _object6.animate(ANIM_MODE_NONE, NULL); + + _object1.setObjectWrapper(NULL); + _object2.setObjectWrapper(NULL); + _object3.setObjectWrapper(NULL); + _object4.setObjectWrapper(NULL); + _object5.setObjectWrapper(NULL); + _object6.setObjectWrapper(NULL); + + _object1.addMover(NULL); + _object2.addMover(NULL); + _object3.addMover(NULL); + _object4.addMover(NULL); + _object5.addMover(NULL); + _object6.addMover(NULL); + + switch (_sceneMode){ + case 150: + _globals->_soundHandler.play(380); + _object8.postInit(); + _object8.setVisage(2002); + _object8.setStrip(1); + _object8.setFrame(1); + _object8.fixPriority(200); + _object8.setPosition(Common::Point(64, 199)); + _globals->_player.disableControl(); + _sceneMode = 9908; + setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 162: + warning("TBC: shutdown();"); + _globals->_game->quitGame(); + break; + case 9901: + _globals->_player.disableControl(); + _sceneMode = 9906; + setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + break; + case 9902: + _globals->_player.disableControl(); + _sceneMode = 9901; + setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9903: + _globals->_player.disableControl(); + _sceneMode = 9902; + setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9904: + _globals->_soundHandler.play(390); + _sceneMode = 9912; + setAction(&_strAction2, this); + break; + case 9905: + _sceneMode = 150; + setAction(&_strAction1, this); + break; + case 9906: + if (_object8._state == 0) { + _globals->_player.disableControl(); + _sceneMode = 9913; + setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + } else { + _globals->_player.disableControl(); + _sceneMode = 9905; + setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + } + break; + case 9907: + _globals->_player.disableControl(); + _sceneMode = 9903; + setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9908: + _object8.remove(); + _globals->_player.disableControl(); + _sceneMode = 9904; + setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9909: + _globals->_soundHandler.play(375); + _globals->_player.disableControl(); + _sceneMode = 9907; + setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9910: + _globals->_player.disableControl(); + _sceneMode = 9911; + setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9911: + _globals->_soundHandler.play(367); + _globals->_player.disableControl(); + _sceneMode = 9909; + setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9912: + _globals->_player.disableControl(); + _sceneMode = 9912; + setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + _sceneMode = 162; + _globals->_player.enableControl(); + _globals->_player._canWalk = false; + break; + case 9913: + _sceneMode = 200; + setAction(&_strAction3, this); + break; + default: + break; + } +} + +void Scene9900::process(Event &event) { + if (event.handled) + return; + Scene::process(event); + if (_sceneMode == 9906) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) { + _object8._state = 1; + RING_INVENTORY._items._sceneNumber = 9900; + _globals->_events.setCursor(CURSOR_USE); + } + } +} + +void Scene9900::dispatch() { + if (_action) + _action->dispatch(); +} + +void Scene9900::postInit(SceneObjectList *OwnerList) { + _object1.postInit(); + _object1.hide(); + _object2.postInit(); + _object2.hide(); + _object3.postInit(); + _object3.hide(); + _object4.postInit(); + _object4.hide(); + _object5.postInit(); + _object5.hide(); + _object6.postInit(); + _object6.hide(); + + _object8._state = 0; + + RING_INVENTORY._concentrator._sceneNumber = 9900; + RING_INVENTORY._items._rlbNum = 3; + RING_INVENTORY._items._cursorNum = 6; + RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge."); + + _stripManager.addSpeaker(&_speakerMR); + _globals->_player.disableControl(); + _sceneMode = 9910; + setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); +} + +/*-------------------------------------------------------------------------- + * Scene 9999 - Space travel + * + *--------------------------------------------------------------------------*/ + +void Scene9999::Action1::signal() { + switch (_actionIndex++) { + case 0: + setDelay(600); + break; + case 1: + _globals->_sceneManager.changeScene(3500); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene9999::Action2::signal() { + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + SceneItem::display(9999, 0, SET_Y, 10, SET_X, 30, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 23, SET_WIDTH, 260, SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(300); + break; + case 2: + _globals->_stripNum = 3600; + _globals->_sceneManager.changeScene(3600); + default: + break; + } +} + +void Scene9999::postInit(SceneObjectList *OwnerList) { + loadScene(9998); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _object1.postInit(); + _object1.setVisage(1303); + _object1.setStrip2(3); + _object1.setPosition(Common::Point(160, 152)); + + _globals->_player.postInit(); + _globals->_player.setVisage(1303); + _globals->_player.setStrip2(1); + _globals->_player.fixPriority(250); + _globals->_player.animate(ANIM_MODE_2, NULL); + _globals->_player.setPosition(Common::Point(194, 98)); + _globals->_player._numFrames = 20; + _globals->_player.disableControl(); + + _object2.postInit(); + _object2.setVisage(1303); + _object2.setStrip2(2); + _object2.fixPriority(2); + _object2.setPosition(Common::Point(164, 149)); + + _object3.postInit(); + _object3.setVisage(1303); + _object3.setStrip2(2); + _object3.fixPriority(2); + _object3.setFrame(2); + _object3.setPosition(Common::Point(292, 149)); + _object3.setAction(&_action3); + + if (_globals->_sceneManager._previousScene == 3500) + setAction(&_action2); + else + setAction(&_action1); + + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + + if (_globals->_sceneManager._previousScene == 3500) + _globals->_stripNum = 2222; + else + _globals->_stripNum = 2121; + + _globals->_soundHandler.play(118); + +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h new file mode 100644 index 0000000000..792234cc91 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes10.h @@ -0,0 +1,532 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES10_H +#define TSAGE_RINGWORLD_SCENES10_H + +#include "common/scummsys.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +class SceneObject9150 : public SceneObject { +public: + int _timer, _signalFlag; + + virtual void synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_timer); + s.syncAsSint16LE(_signalFlag); + } + virtual Common::String getClassName() { return "SceneObject9150"; } +}; + +class Scene2 : public Scene { +public : + int _sceneState; + + Scene2(); + virtual void synchronize(Serializer &s) { + Scene::synchronize(s); + s.syncAsSint16LE(_sceneState); + } +}; + +class Object9350 : public SceneObject { +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void draw(); +}; + +class Scene9100 : public Scene { + /* Items */ + class SceneHotspot1 : public NamedHotspot { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneHotspot1 _sceneHotspot1; + NamedHotspot _sceneHotspot2; + NamedHotspot _sceneHotspot3; + NamedHotspot _sceneHotspot4; + NamedHotspot _sceneHotspot5; + NamedHotspot _sceneHotspot6; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9150 : public Scene2 { + class Object3 : public SceneObject9150 { + public: + virtual void signal(); + virtual void dispatch(); + }; +public: + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + SceneObject _object1; + SceneObject _object2; + Object3 _object3; + NamedHotspot _sceneHotspot1; + NamedHotspot _sceneHotspot2; + NamedHotspot _sceneHotspot3; + NamedHotspot _sceneHotspot4; + NamedHotspot _sceneHotspot5; + NamedHotspot _sceneHotspot6; + NamedHotspot _sceneHotspot7; + NamedHotspot _sceneHotspot8; + NamedHotspot _sceneHotspot9; + NamedHotspot _sceneHotspot10; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9200 : public Scene2 { + class SceneHotspot1 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + Action _action1; + SpeakerGText _speakerGText; + SpeakerGR _speakerGR; + SpeakerQText _speakerQText; + ASound _soundHandler; + SceneHotspot1 _hotspot1; + NamedHotspot _hotspot2; + NamedHotspot _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void process(Event &event); +}; + +class Scene9300 : public Scene { +public: + SequenceManager _sequenceManager; + SceneObject _object1; + SceneObject _object2; + NamedHotspot _hotspot1; + NamedHotspot _hotspot2; + NamedHotspot _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + NamedHotspot _hotspot9; + NamedHotspot _hotspot10; + NamedHotspot _hotspot11; + NamedHotspot _hotspot12; + NamedHotspot _hotspot13; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9350 : public Scene2 { +public: + SequenceManager _sequenceManager; + Object9350 _object1; + SceneObject _object2; + NamedHotspot _sceneHotspot1; + NamedHotspot _sceneHotspot2; + NamedHotspot _sceneHotspot3; + NamedHotspot _sceneHotspot4; + NamedHotspot _sceneHotspot5; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9360 : public Scene2 { +public: + SequenceManager _sequenceManager; + Action _action1; + Object9350 _object1; + NamedHotspot _hotspot1; + NamedHotspot _hotspot2; + NamedHotspot _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9400 : public Scene2 { + class SceneHotspot7 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class SceneHotspot8 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; +public: + Scene9400(); + SequenceManager _sequenceManager; + Action _action1; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SpeakerOText _speakerOText; + SpeakerOR _speakerOR; + SpeakerQText _speakerQText; + NamedHotspot _hotspot1; + NamedHotspot _hotspot2; + NamedHotspot _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + ASound _soundHandler; + int _field1032; + SceneHotspot7 _hotspot7; + SceneHotspot8 _hotspot8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +class Scene9450 : public Scene2 { + class Object2 : public SceneObject { + public: + virtual void signal(); + }; + + class Object3 : public SceneObject9150 { + public: + virtual void dispatch(); + }; + + class Hotspot1 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot3 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; +public: + SceneObject _object1; + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + Object2 _object2; + SequenceManager _sequenceManager3; + Object3 _object3; + Hotspot1 _hotspot1; + NamedHotspot _hotspot2; + Hotspot3 _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + NamedHotspot _hotspot9; + NamedHotspot _hotspot10; + NamedHotspot _hotspot11; + NamedHotspot _hotspot12; + NamedHotspot _hotspot13; + NamedHotspot _hotspot14; + NamedHotspot _hotspot15; + NamedHotspot _hotspot16; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9500 : public Scene2 { + class Hotspot1 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot2 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot3 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot4 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + +public: + SequenceManager _sequenceManager; + SceneObject _candle; + SceneObject _object2; + SceneObject _object3; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + Hotspot3 _hotspot3; + Hotspot4 _hotspot4; + Hotspot4 _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + NamedHotspot _hotspot9; + NamedHotspot _hotspot10; + NamedHotspot _hotspot11; + NamedHotspot _hotspot12; + NamedHotspot _hotspot13; + NamedHotspot _hotspot14; + NamedHotspot _hotspot15; + NamedHotspot _hotspot16; + NamedHotspot _hotspot17; + NamedHotspot _hotspot18; + NamedHotspot _hotspot19; + NamedHotspot _hotspot20; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void process(Event &event); +}; + +class Scene9700 : public Scene2 { + SequenceManager _sequenceManager; + SceneObject _object1; + NamedHotspot _sceneHotspot1; + NamedHotspot _sceneHotspot2; + NamedHotspot _sceneHotspot3; + NamedHotspot _sceneHotspot4; + NamedHotspot _sceneHotspot5; + NamedHotspot _sceneHotspot6; + GfxButton _gfxButton1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene9750 : public Scene { +public: + SequenceManager _sequenceManager; + SceneObject _object1; + SceneObject _object2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene9850 : public Scene { + class Object6 : public SceneObject{ + public: + virtual void doAction(int action); + }; + + class Object7 : public SceneObjectExt{ + public: + virtual void doAction(int action); + }; + + class Hotspot12 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot14 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot16 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot17 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot18 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot19 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; + + class Hotspot20 : public NamedHotspot{ + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SceneObject _objDoor; + SceneObject _objCloak; + SceneObject _objJacket; + SceneObject _objTunic2; + SceneObject _objLever; + Object6 _objScimitar; + Object7 _objSword; + ASound _soundHandler; + NamedHotspot _hotspot1; + NamedHotspot _hotspot2; + NamedHotspot _hotspot3; + NamedHotspot _hotspot4; + NamedHotspot _hotspot5; + NamedHotspot _hotspot6; + NamedHotspot _hotspot7; + NamedHotspot _hotspot8; + NamedHotspot _hotspot9; + NamedHotspot _hotspot10; + NamedHotspot _hotspot11; + Hotspot12 _hotspot12; + NamedHotspot _hotspot13; + Hotspot14 _hotspot14; + NamedHotspot _hotspot15; + Hotspot16 _hotspot16; + Hotspot17 _hotspot17; + Hotspot18 _hotspot18; + Hotspot19 _hotspot19; + Hotspot20 _spotLever; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene9900 : public Scene { + class strAction1 : public Action { + public: + SceneObject _object9; + ScenePalette _palette1; + + virtual void signal(); + }; + + class strAction2 : public Action { + public: + SceneText _txtArray1[2]; + SceneText _txtArray2[2]; + int _lineNum, _txtArray1Index, _var3; + + virtual void signal(); + virtual void dispatch(); + virtual void synchronize(Serializer &s); + }; + + class strAction3 : public Action { + public: + SceneObject _object10; + ScenePalette _palette2; + ScenePalette _palette3; + + virtual void signal(); + }; + +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneObject _object7; + SceneObjectExt _object8; + strAction1 _strAction1; + strAction2 _strAction2; + strAction3 _strAction3; + SpeakerMR _speakerMR; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void process(Event &event); +}; + +class Scene9999 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + +public: + + Action1 _action1; + Action2 _action2; + Action _action3; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes2.cpp b/engines/tsage/ringworld/ringworld_scenes2.cpp new file mode 100644 index 0000000000..2dadaf4c30 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes2.cpp @@ -0,0 +1,928 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/ringworld/ringworld_scenes2.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 1000 - Title Screen + * + *--------------------------------------------------------------------------*/ + +void Scene1000::Action1::signal() { + Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(10); + break; + case 1: + scene->_object4.postInit(); + scene->_object4.setVisage(1001); + scene->_object4._frame = 1; + scene->_object4.setStrip2(5); + scene->_object4.changeZoom(100); + scene->_object4.animate(ANIM_MODE_2, NULL); + scene->_object4.setPosition(Common::Point(403, 163)); + setDelay(90); + break; + case 2: { + SceneItem::display(0, 0); + scene->_object4.remove(); + scene->_object1.changeZoom(-1); + NpcMover *mover = new NpcMover(); + Common::Point pt(180, 100); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_sceneManager.changeScene(1400); + break; + } + +} + +void Scene1000::Action2::signal() { + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(10); + break; + case 1: + SceneItem::display(1000, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, + SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(180); + break; + case 2: + SceneItem::display(0, 0); + _globals->_sceneManager.changeScene(2000); + break; + default: + break; + } +} + +void Scene1000::Action3::signal() { + Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_sceneManager._scene->loadBackground(0, 0); + setDelay(60); + break; + case 1: { + NpcMover *mover = new NpcMover(); + Common::Point pt(158, 31); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 2: + case 3: + setDelay(60); + break; + case 4: + _globals->_player.show(); + setDelay(240); + break; + case 5: { + _globals->_player.enableControl(); + + const char *SEEN_INTRO = "seen_intro"; + if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { + // First time being played, so show the introduction + ConfMan.setBool(SEEN_INTRO, true); + ConfMan.flushToDisk(); + + setDelay(1); + } else { + // Prompt user for whether to start play or watch introduction + _globals->_player.enableControl(); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + _actionIndex = 20; + _globals->_soundHandler.fadeOut(this); + } else { + setDelay(1); + } + } + + _globals->_player.disableControl(); + break; + } + case 6: { + scene->_object3.remove(); + _globals->_player.setStrip2(2); + NpcMover *mover = new NpcMover(); + Common::Point pt(480, 100); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 7: + _globals->_scenePalette.loadPalette(1002); + _globals->_scenePalette.refresh(); + _globals->_scenePalette.addRotation(80, 95, -1); + scene->_object3.postInit(); + scene->_object3.setVisage(1002); + scene->_object3.setStrip(1); + scene->_object3.setPosition(Common::Point(284, 122)); + scene->_object3.changeZoom(1); + + zoom(true); + setDelay(200); + break; + case 8: + zoom(false); + setDelay(10); + break; + case 9: + scene->_object3.setStrip(2); + scene->_object3.setPosition(Common::Point(285, 155)); + + zoom(true); + setDelay(400); + break; + case 10: + zoom(false); + setDelay(10); + break; + case 11: + scene->_object3.setStrip(3); + scene->_object3.setPosition(Common::Point(279, 172)); + + zoom(true); + setDelay(240); + break; + case 12: + zoom(false); + setDelay(10); + break; + case 13: + scene->_object3.setStrip(4); + scene->_object3.setPosition(Common::Point(270, 128)); + + zoom(true); + setDelay(300); + break; + case 14: + zoom(false); + setDelay(10); + break; + case 15: + scene->_object3.setStrip(1); + scene->_object3.setFrame(2); + scene->_object3.setPosition(Common::Point(283, 137)); + + zoom(true); + setDelay(300); + break; + case 16: + zoom(false); + setDelay(10); + break; + case 17: + scene->_object3.setStrip(5); + scene->_object3.setFrame(1); + scene->_object3.setPosition(Common::Point(292, 192)); + + zoom(true); + setDelay(300); + break; + case 18: + zoom(false); + _globals->_scenePalette.clearListeners(); + _globals->_soundHandler.fadeOut(this); + break; + case 19: + _globals->_sceneManager.changeScene(10); + break; + case 20: + _globals->_sceneManager.changeScene(30); + break; + default: + break; + } +} + +void Scene1000::Action3::zoom(bool up) { + Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + + if (up) { + while ((scene->_object3._percent < 100) && !_vm->shouldQuit()) { + scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100)); + _globals->_sceneObjects->draw(); + _globals->_events.delay(1); + } + } else { + while ((scene->_object3._percent > 0) && !_vm->shouldQuit()) { + scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0)); + _globals->_sceneObjects->draw(); + _globals->_events.delay(1); + } + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene1000::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + loadScene(1000); + + if (_globals->_sceneManager._previousScene == 2000) { + setZoomPercents(150, 10, 180, 100); + _object1.postInit(); + _object1.setVisage(1001); + _object1._strip = 7; + _object1.animate(ANIM_MODE_2, 0); + _object1._moveDiff = Common::Point(1, 1); + _object1.setPosition(Common::Point(120, 180)); + + setAction(&_action2); + + _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + _globals->_soundHandler.play(114); + } else if (_globals->_sceneManager._previousScene == 2222) { + setZoomPercents(150, 10, 180, 100); + _object1.postInit(); + _object1.setVisage(1001); + _object1._strip = 7; + _object1.animate(ANIM_MODE_2, 0); + _object1._moveDiff = Common::Point(2, 2); + _object1.setPosition(Common::Point(120, 180)); + + _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + + setAction(&_action1); + } else { + _globals->_soundHandler.play(4); + setZoomPercents(0, 10, 30, 100); + _object3.postInit(); + _object3.setVisage(1050); + _object3.changeZoom(-1); + _object3.setPosition(Common::Point(158, 0)); + + _globals->_player.postInit(); + _globals->_player.setVisage(1050); + _globals->_player.setStrip(3); + _globals->_player.setPosition(Common::Point(160, 191)); + _globals->_player._moveDiff.x = 12; + _globals->_player.hide(); + _globals->_player.disableControl(); + + _globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y); + + setAction(&_action3); + } +} + +/*-------------------------------------------------------------------------- + * Scene 1001 - Fleeing planet cutscene + * + *--------------------------------------------------------------------------*/ + +void Scene1001::Action1::signal() { + Scene1001 *scene = (Scene1001 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 2: { + Common::Point pt(108, 171); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 3: { + Common::Point pt(170, 159); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 4: { + scene->_object2.postInit(); + scene->_object2.setVisage(16); + scene->_object2.setStrip2(4); + scene->_object2.setPosition(Common::Point(61, 177)); + scene->_object2.animate(ANIM_MODE_5, this); + + Common::Point pt(320, 100); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 5: { + Common::Point pt(82, 166); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 6: { + Common::Point pt(64, 149); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 7: { + Common::Point pt(15, 136); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 8: { + Common::Point pt(-5, 120); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 9: { + scene->_object1.postInit(); + scene->_object1.setVisage(16); + scene->_object1.setStrip2(1); + scene->_object1.setFrame(1); + scene->_object1.setPosition(Common::Point(-75, 87)); + scene->_object1.animate(ANIM_MODE_2, NULL); + + Common::Point pt(0, 100); + NpcMover *mover = new NpcMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 10: { + Common::Point pt1(107, 115); + NpcMover *mover1 = new NpcMover(); + scene->_object1.addMover(mover1, &pt1, NULL); + + scene->_object3.setVisage(16); + scene->_object3.setStrip2(5); + scene->_object3.setFrame2(2); + scene->_object3.setPosition(Common::Point(220, 200)); + + Common::Point pt2(187, 181); + NpcMover *mover2 = new NpcMover(); + scene->_object3.addMover(mover2, &pt2, this); + break; + } + case 11: { + scene->_object2.setVisage(16); + scene->_object2.setStrip2(5); + scene->_object2.setFrame2(1); + scene->_object2.setPosition(Common::Point(211, 0)); + + Common::Point pt(189, 30); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 12: + scene->_stripManager.start(100, this); + break; + case 13: { + scene->_object4.postInit(); + scene->_object4.setVisage(16); + scene->_object4.setStrip2(2); + scene->_object4.setFrame(4); + scene->_object4.setPosition(Common::Point(360, 80)); + scene->_object4.animate(ANIM_MODE_2, NULL); + + Common::Point pt(303, 97); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, this); + break; + } + case 14: + scene->_stripManager.start(110, this); + break; + case 15: + setDelay(10); + break; + case 16: { + scene->_soundHandler1.play(90); + + scene->_object6.postInit(); + scene->_object6.setVisage(16); + scene->_object6.setStrip2(6); + scene->_object6.setFrame2(2); + scene->_object6._moveDiff = Common::Point(20, 20); + scene->_object6.fixPriority(20); + scene->_object6.setPosition(Common::Point(scene->_object2._position.x - 6, scene->_object2._position.y + 7)); + scene->_object6.animate(ANIM_MODE_5, NULL); + + Common::Point pt(scene->_object6._position.x - 70, scene->_object6._position.y + 70); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + break; + } + case 17: { + scene->_soundHandler1.play(90); + scene->_object6.remove(); + + scene->_object7.postInit(); + scene->_object7.setVisage(16); + scene->_object7.setStrip2(6); + scene->_object7.setFrame2(1); + scene->_object7._moveDiff = Common::Point(20, 20); + scene->_object7.setPosition(Common::Point(scene->_object3._position.x - 28, scene->_object3._position.y - 11)); + scene->_object7.fixPriority(200); + scene->_object7.animate(ANIM_MODE_5, NULL); + + Common::Point pt(scene->_object7._position.x - 70, scene->_object7._position.y - 70); + NpcMover *mover = new NpcMover(); + scene->_object7.addMover(mover, &pt, this); + break; + } + case 18: + scene->_object7.remove(); + + scene->_object5.postInit(); + scene->_object5.setVisage(16); + scene->_object5.setPosition(Common::Point(306, 93)); + scene->_object5._strip = 3; + scene->_object5.fixPriority(200); + scene->_object5.animate(ANIM_MODE_2, NULL); + setDelay(30); + break; + case 19: { + _globals->_soundHandler.play(91); + byte adjustData[4] = {0xff, 0xff, 0xff, 0}; + _globals->_scenePalette.fade(adjustData, false, 0); + + scene->_object1._strip = 7; + scene->_object1._frame = 1; + scene->_object1.setPosition(Common::Point(314, 112)); + scene->_object1.addMover(NULL); + setDelay(2); + break; + } + case 20: + _globals->_scenePalette.loadPalette(16); + _globals->_scenePalette.refresh(); + setDelay(6); + break; + case 21: + scene->_object1._numFrames = 15; + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 22: + _globals->_soundHandler.play(92); + scene->_stripManager.start(111, this); + break; + case 23: + setDelay(60); + break; + case 24: + _globals->_sceneManager.changeScene(2000); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene1001::postInit(SceneObjectList *OwnerList) { + loadScene(16); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerCText); + _stripManager.addSpeaker(&_speakerCR); + _stripManager.addSpeaker(&_speakerSL); + _speakerQText._color1 = 11; + + _object3.postInit(); + _object3.setVisage(16); + _object3.setStrip2(4); + _object3.setPosition(Common::Point(61, 177)); + + _globals->_soundHandler.play(85); + setAction(&_action1); +} + + +/*-------------------------------------------------------------------------- + * Scene 1250 - + * + *--------------------------------------------------------------------------*/ + +void Scene1250::Action1::signal() { + Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(120) + 60); + break; + case 1: + scene->_object1.animate(ANIM_MODE_5, this); + _actionIndex = 0; + break; + } +} + +void Scene1250::Action2::signal() { + Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + switch (_globals->_randomSource.getRandomNumber(2)) { + case 0: + scene->_object2.setPosition(Common::Point(163, 75)); + break; + case 1: + scene->_object2.setPosition(Common::Point(109, 65)); + break; + case 2: + scene->_object2.setPosition(Common::Point(267, 20)); + break; + } + + setDelay(30); + break; + case 1: + scene->_object2.animate(ANIM_MODE_5, this); + _actionIndex = 0; + break; + } +} + +void Scene1250::Action3::signal() { + Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_stripManager.start(1251, this); + break; + case 2: + setDelay(6); + break; + case 3: + _globals->_sceneManager.changeScene(1000); + break; + } +} + +void Scene1250::Action4::signal() { + Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_stripManager.start(1250, this); + break; + case 2: + setDelay(6); + break; + case 3: + _globals->_sceneManager.changeScene(2000); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene1250::postInit(SceneObjectList *OwnerList) { + loadScene(1250); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQText); + _speakerQText._textPos = Common::Point(120, 120); + _speakerQText._textWidth = 180; + + _object1.postInit(); + _object1.setVisage(1250); + _object1.setPosition(Common::Point(126, 69)); + _object1.setStrip2(1); + _object1._frame = 1; + _object1.setAction(&_action1); + + _object2.postInit(); + _object2.setVisage(1250); + _object2.setPosition(Common::Point(126, 69)); + _object2.setStrip2(2); + _object2.fixPriority(255); + _object2._frame = 1; + _object2.setAction(&_action2); + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + + if ((_globals->_sceneManager._previousScene != 2000) || (_globals->_stripNum != 1250)) { + setAction(&_action4); + } else { + setAction(&_action3); + _globals->_soundHandler.play(114); + } +} + +/*-------------------------------------------------------------------------- + * Scene 1400 - Ringworld Wall + * + *--------------------------------------------------------------------------*/ + +void Scene1400::Action1::signal() { + Scene1400 *scene = (Scene1400 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: { + SceneItem::display(1400, 0, SET_X, 120, SET_Y, 610, SET_FONT, 2, SET_EXT_BGCOLOR, 23, SET_KEEP_ONSCREEN, -1, LIST_END); + + Common::Point pt(160, 700); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: { + _globals->_player.setStrip2(3); + _globals->_player.changeZoom(100); + + Common::Point pt(160, 100); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + + SceneItem::display(0, 0); + setDelay(360); + break; + } + case 3: + SceneItem::display(1400, 2, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, + SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); + setDelay(420); + break; + case 4: + SceneItem::display(0, 0); + setDelay(360); + break; + case 5: + SceneItem::display(1400, 3, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, + SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); + setDelay(360); + break; + case 6: + SceneItem::display(0, 0); + break; + case 7: { + _globals->_player._frame = 1; + _globals->_player.setStrip2(1); + _globals->_player._numFrames = 5; + _globals->_player.animate(ANIM_MODE_5, this); + + Common::Point pt(205, 70); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, NULL); + _globals->_sceneManager._fadeMode = FADEMODE_NONE; + + scene->loadScene(1402); + break; + } + case 8: + _globals->_player.setStrip2(2); + _globals->_player._numFrames = 10; + _globals->_player.animate(ANIM_MODE_2, NULL); + + SceneItem::display(1400, 4, SET_X, 30, SET_Y, _globals->_player._position.y + 10, SET_FONT, 2, + SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); + setDelay(300); + break; + case 9: { + SceneItem::display(0, 0); + Common::Point pt(450, 45); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 10: + _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180); + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_stripNum = 1500; + _globals->_soundHandler.stop(); + + _globals->_sceneManager.changeScene(1500); + break; + } +} + +void Scene1400::Action1::dispatch() { + Action::dispatch(); + + if ((_actionIndex > 3) && (_actionIndex < 9)) + _globals->_sceneText.setPosition(Common::Point(60, _globals->_sceneManager._scene->_sceneBounds.bottom - 80)); + + if ((_actionIndex <= 2) && (_globals->_player._percent > 22)) + _globals->_player.changeZoom(100 - (800 - _globals->_player._position.y)); + + if ((_actionIndex >= 9) && (_globals->_player._percent > 22)) + _globals->_player.changeZoom(100 - (_globals->_player._position.x - 205)); +} + +/*--------------------------------------------------------------------------*/ + +void Scene1400::postInit(SceneObjectList *OwnerList) { + if (_globals->_stripNum != 1400) { + loadScene(1401); + } else { + loadScene(1402); + } + Scene::postInit(); + + _globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180); + _globals->_player.postInit(); + _globals->_player.setVisage(1401); + _globals->_player.animate(ANIM_MODE_2, 0); + _globals->_player.setStrip2(4); + _globals->_player.fixPriority(4); + _globals->_player.disableControl(); + + _globals->_player._moveDiff = Common::Point(4, 2); + _globals->_player.setPosition(Common::Point(160, 800)); + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100; + + setAction(&_action1); + _globals->_soundHandler.play(118); +} + +/*-------------------------------------------------------------------------- + * Scene 1500 - Ringworld Space-port + * + *--------------------------------------------------------------------------*/ + +void Scene1500::Action1::signal() { + Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_object1.postInit(); + scene->_object1.setVisage(1501); + scene->_object1._moveDiff = Common::Point(2, 1); + scene->_object1.setPosition(Common::Point(204, 85)); + scene->_object1.animate(ANIM_MODE_2, NULL); + scene->_object1._numFrames = 3; + scene->_object1.changeZoom(-1); + + Common::Point pt(238, 121); + PlayerMover *mover = new PlayerMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 1: { + Common::Point pt(312, 145); + PlayerMover *mover = new PlayerMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object1.setStrip(2); + scene->_object1.setFrame(1); + scene->_object1._moveDiff.y = 2; + scene->_object1._numFrames = 5; + + Common::Point pt(310, 150); + PlayerMover *mover = new PlayerMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 3: { + Common::Point pt(304, 165); + PlayerMover *mover = new PlayerMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 4: { + scene->_object1._numFrames = 3; + scene->_object1.setStrip2(3); + scene->_object1.animate(ANIM_MODE_2, this); + + Common::Point pt(94, 175); + PlayerMover *mover = new PlayerMover(); + scene->_object1.addMover(mover, &pt, this); + break; + } + case 5: + setDelay(30); + break; + case 6: + scene->_soundHandler.play(123); + scene->_object1.setStrip2(4); + scene->_object1.setFrame(1); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 7: + scene->_object1.setStrip2(5); + scene->_object1.animate(ANIM_MODE_2, NULL); + scene->_soundHandler.play(124, this); + break; + case 8: + _globals->_soundHandler.play(126, this); + break; + case 9: + _globals->_soundHandler.play(127); + _globals->_sceneManager.changeScene(2000); + break; + } +} + +void Scene1500::Action2::signal() { + Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: { + scene->_object2.postInit(); + scene->_object2.setVisage(1502); + scene->_object2.fixPriority(255); + scene->_object2.changeZoom(5); + scene->_object2._frame = 1; + scene->_object2._moveDiff = Common::Point(1, 1); + scene->_object2.setPosition(Common::Point(104, 184)); + scene->_object2.animate(ANIM_MODE_2, NULL); + + Common::Point pt(118, 147); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object2._moveDiff.x = 5; + scene->_object2.changeZoom(-1); + Common::Point pt(-55, 200); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 3: + scene->_soundHandler.release(); + _globals->_stripNum = 1505; + _globals->_sceneManager.changeScene(2400); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene1500::postInit(SceneObjectList *OwnerList) { + loadScene(1500); + Scene::postInit(); + + if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) { + _globals->_soundHandler.play(120); + setZoomPercents(105, 20, 145, 100); + + setAction(&_action1); + } else { + setZoomPercents(150, 5, 200, 100); + + _object1.postInit(); + _object1.setVisage(1501); + _object1.setStrip2(5); + _object1.setPosition(Common::Point(94, 175)); + _object1.animate(ANIM_MODE_2, NULL); + + setAction(&_action2); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h new file mode 100644 index 0000000000..ef3158bbb9 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes2.h @@ -0,0 +1,149 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES2_H +#define TSAGE_RINGWORLD_SCENES2_H + +#include "common/scummsys.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +class Scene1000 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + private: + void zoom(bool up); + public: + virtual void signal(); + }; + +public: + SceneObject _object1, _object2, _object3, _object4; + Action1 _action1; + Action2 _action2; + Action3 _action3; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene1001 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; +public: + SpeakerQText _speakerQText; + SpeakerSL _speakerSL; + SpeakerCText _speakerCText; + SpeakerCR _speakerCR; + Action1 _action1; + SceneObject _object1, _object2, _object3, _object4; + SceneObject _object5, _object6, _object7; + ASound _soundHandler1, _soundHandler2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene1250 : public Scene { +public: + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; +public: + SpeakerQText _speakerQText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + SceneObject _object1, _object2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene1400 : public Scene { +public: + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; +public: + Action1 _action1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + +}; + +class Scene1500 : public Scene { +public: + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; +public: + ASound _soundHandler; + Action1 _action1; + Action2 _action2; + SceneObject _object1, _object2, _object3; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + + + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp new file mode 100644 index 0000000000..3d8f151c35 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes3.cpp @@ -0,0 +1,6133 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/ringworld/ringworld_scenes3.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 2000 - Cockpit cutscenes + * + *--------------------------------------------------------------------------*/ + +void Scene2000::Action1::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + error("Old stuff"); + break; + case 1: + scene->_stripManager.start(2075, this); + break; + case 2: + setDelay(4); + break; + case 3: + _globals->_stripNum = 0; + _globals->_sceneManager.changeScene(1250); + break; + } +} + +void Scene2000::Action2::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object2.animate(ANIM_MODE_6, NULL); + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + break; + case 1: + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + if (_globals->_randomSource.getRandomNumber(4) >= 2) + _actionIndex = 0; + break; + case 2: + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + _actionIndex = _globals->_randomSource.getRandomNumber(1); + break; + } +} + +void Scene2000::Action3::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object6.animate(ANIM_MODE_5, NULL); + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + break; + case 1: + scene->_object6.animate(ANIM_MODE_6, NULL); + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + _actionIndex = 0; + break; + } +} + +void Scene2000::Action4::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object4.animate(ANIM_MODE_5, NULL); + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + break; + case 1: + scene->_object4.animate(ANIM_MODE_6, NULL); + setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + _actionIndex = 0; + break; + } +} + +void Scene2000::Action5::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object3.animate(ANIM_MODE_5, NULL); + setDelay(_globals->_randomSource.getRandomNumber(125) + 300); + break; + case 1: + scene->_object3.animate(ANIM_MODE_6, NULL); + setDelay(_globals->_randomSource.getRandomNumber(125) + 300); + _actionIndex = 0; + break; + } +} + +void Scene2000::Action6::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(130); + break; + case 1: + scene->_soundHandler2.play(79); + scene->_stripManager.start(2000, this); + break; + case 2: + _globals->_soundHandler.play(81); + scene->_object6.postInit(); + scene->_object6.setVisage(2003); + scene->_object6.setAction(NULL); + scene->_object6.setStrip2(2); + scene->_object6.setPosition(Common::Point(184, 137)); + scene->_object6.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_stripManager.start(95, this); + break; + case 4: + scene->_object6.animate(ANIM_MODE_6, this); + break; + case 5: + _globals->_soundHandler.play(80); + scene->_object6.remove(); + _globals->_sceneManager.changeScene(1001); + break; + } +} + +void Scene2000::Action7::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_stripManager.start(2072, this); + break; + case 2: + setDelay(3); + break; + case 3: + _globals->_sceneManager.changeScene(2222); + break; + } +} + +void Scene2000::Action8::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + error("Old stuff"); + break; + case 1: + scene->_stripManager.start(2073, this); + break; + case 2: + setDelay(10); + break; + case 3: + _globals->_stripNum = 2005; + _globals->_sceneManager.changeScene(1000); + break; + } +} + +void Scene2000::Action9::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + error("Old stuff"); + break; + case 1: + scene->_stripManager.start(2074, this); + break; + case 2: + setDelay(3); + break; + case 3: + _globals->_stripNum = 2008; + _globals->_sceneManager.changeScene(9999); + break; + } +} + +void Scene2000::Action10::signal() { + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + error("Old stuff"); + break; + case 2: + SceneItem::display(2000, 17, SET_Y, 20, SET_X, 110, SET_FONT, 2, SET_BG_COLOR, -1, + SET_FG_COLOR, 17, SET_WIDTH, 200, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, 1, LIST_END); + break; + case 3: + SceneItem::display(0, 0); + _globals->_stripNum = 0; + _globals->_sceneManager.changeScene(9999); + break; + } +} + +void Scene2000::Action11::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + error("Old stuff"); + break; + case 1: + scene->_stripManager.start(2076, this); + break; + case 2: + scene->_stripManager.start(2077, this); + break; + case 3: + _globals->_stripNum = 0; + _globals->_sceneManager.changeScene(1400); + break; + } +} + +void Scene2000::Action12::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(2020, this); + break; + case 2: + _globals->_player.disableControl(); + setDelay(10); + break; + case 3: + _globals->_sceneManager.changeScene(2300); + break; + } +} + +void Scene2000::Action13::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_stripManager.start(2078, this); + break; + case 2: + SceneItem::display(0, 0); + _globals->_stripNum = 2751; + _globals->_sceneManager.changeScene(1500); + break; + } +} + +void Scene2000::Action14::signal() { + Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(30); + break; + case 1: + scene->_stripManager.start(2070, this); + break; + case 2: + setDelay(60); + break; + case 3: + _globals->_soundHandler.play(99); + scene->_object8.show(); + scene->_object8.animate(ANIM_MODE_5, this); + break; + case 4: + _globals->_soundHandler.play(12); + scene->_object8.setStrip(2); + scene->_object8.setFrame(1); + scene->_object9.show(); + scene->_object10.show(); + setDelay(60); + break; + case 5: + scene->_stripManager.start(2001, this, scene); + break; + case 6: + _globals->_soundHandler.fadeOut(NULL); + scene->_object8.setStrip(1); + scene->_object8.setFrame(scene->_object8.getFrameCount()); + scene->_object8.animate(ANIM_MODE_6, this); + + scene->_object9.remove(); + scene->_object10.remove(); + break; + case 7: + _globals->_soundHandler.play(111); + scene->_object8.remove(); + setDelay(5); + break; + case 8: + scene->_stripManager.start(2071, this); + break; + case 9: + _globals->_stripNum = 1250; + _globals->_sceneManager.changeScene(1000); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2000::postInit(SceneObjectList *OwnerList) { + loadScene(2000); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerMR); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + _stripManager.addSpeaker(&_speakerHText); + + _speakerQText._npc = &_object2; + _speakerSText._npc = &_object3; + _speakerMText._npc = &_object6; + _speakerHText._npc = &_object6; + _stripManager.setCallback(this); + + _object3.postInit(); + _object3.setVisage(2002); + _object3.setPosition(Common::Point(65, 199)); + + _object4.postInit(); + _object4.setVisage(2002); + _object4.setStrip(2); + _object4.setPosition(Common::Point(125, 199)); + _object4.setAction(&_action4); + + _object2.postInit(); + _object2.setVisage(2001); + _object2.setPosition(Common::Point(43, 115)); + _object2.setAction(&_action2); + + _globals->_player.disableControl(); + + _object6.postInit(); + _object6.setVisage(2003); + _object6.setPosition(Common::Point(267, 170)); + _object6.setAction(&_action3); + + _object8.postInit(); + _object8.setVisage(2005); + _object8.setPosition(Common::Point(169, 133)); + _object8.setPriority(133); + _object8.hide(); + + _object9.postInit(); + _object9.setVisage(2005); + _object9.setStrip2(3); + _object9.setFrame(4); + _object9.setPosition(Common::Point(136, 86)); + _object9.fixPriority(190); + _object9.hide(); + + _object10.postInit(); + _object10.setVisage(2005); + _object10.setStrip2(5); + _object10.setFrame(4); + _object10.setPosition(Common::Point(202, 86)); + _object10.fixPriority(195); + _object10.hide(); + + switch (_globals->_sceneManager._previousScene) { + case 1000: + setAction(&_action7); + break; + case 1001: + _object6.remove(); + setAction(&_action12); + break; + case 1500: + setAction(&_action13); + break; + case 2200: + _globals->_soundHandler.play(111); + setAction(&_action14); + break; + case 2222: + _globals->_soundHandler.play(115); + setAction(&_action8); + break; + case 3500: + setAction(&_action11); + break; + default: + _object6.remove(); + _globals->_soundHandler.play(80); + setAction(&_action6); + break; + } + + _soundHandler1.play(78); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2000::stripCallback(int v) { + switch (v) { + case 0: + _object9.setStrip(3); + _object9.animate(ANIM_MODE_7, NULL); + _object10.setStrip(6); + _object10.setFrame(1); + _object10.animate(ANIM_MODE_5, NULL); + break; + case 1: + _object10.setStrip(5); + _object10.animate(ANIM_MODE_7, NULL); + _object9.setStrip(4); + _object9.setFrame(1); + _object9.animate(ANIM_MODE_5, NULL); + break; + case 2: + _object9.animate(ANIM_MODE_NONE, NULL); + break; + case 3: + _object10.setStrip(6); + _object10.setFrame(1); + _object10.animate(ANIM_MODE_5, NULL); + _object9.setStrip(4); + _object9.setFrame(1); + _object9.animate(ANIM_MODE_5, NULL); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2100 - Starcraft Cockpit + * + *--------------------------------------------------------------------------*/ + +void Scene2100::Action1::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + if (!scene->_sitFl) + setDelay(1); + else { + setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + scene->_sitFl = 0; + } + break; + case 1: { + Common::Point pt(157, 62); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point pt(157, 56); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 4: + _globals->_player._strip = 3; + setDelay(3); + break; + case 5: + _globals->_player.fixPriority(1); + scene->_area1.display(); + scene->_area2.display(); + scene->_area3.display(); + scene->_area4.display(); + + scene->_area1.draw(true); + _state = 0; + _globals->_events.setCursor(CURSOR_USE); + + while (!_state && !_vm->shouldQuit()) { + // Wait for an event + Event event; + if (!_globals->_events.getEvent(event)) { + g_system->updateScreen(); + g_system->delayMillis(10); + continue; + } + + if (scene->_area1._bounds.contains(event.mousePos)) { + scene->_area1.draw(true); + _state = scene->_area1._actionId; + } + if (scene->_area2._bounds.contains(event.mousePos)) { + scene->_area1.draw(false); + scene->_area2.draw(true); + _state = scene->_area2._actionId; + } + if (scene->_area3._bounds.contains(event.mousePos)) { + scene->_area1.draw(false); + scene->_area3.draw(true); + _state = scene->_area3._actionId; + } + } + + scene->_soundHandler.play(161); + scene->_area1.restore(); + scene->_area2.restore(); + scene->_area3.restore(); + scene->_area4.restore(); + + if (_state == 2100) { + setDelay(1); + } else { + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + } + break; + case 6: + if (_state == 2100) { + Common::Point pt(157, 65); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } else { + _globals->_sceneManager.changeScene(_state); + } + break; + case 7: + _globals->_player.fixPriority(-1); + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 8: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2100::Action2::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object3._numFrames = 5; + setDelay(_globals->_randomSource.getRandomNumber(59)); + break; + case 1: + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 2: + setDelay(_globals->_randomSource.getRandomNumber(59)); + break; + case 3: + scene->_object3.animate(ANIM_MODE_6, this); + _actionIndex = 0; + break; + } +} + +void Scene2100::Action3::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + case 2: + setDelay(_globals->_randomSource.getRandomNumber(119)); + break; + case 1: + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_object2.animate(ANIM_MODE_6, this); + _actionIndex = 0; + break; + } +} + +void Scene2100::Action4::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + if (!scene->_sitFl) + setDelay(1); + else + setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + break; + case 1: { + Common::Point pt(80, 66); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_player.setVisage(2109); + _globals->_player._frame = 1; + _globals->_player._strip = 2; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_sceneManager.changeScene(2120); + break; + } +} + +void Scene2100::Action5::signal() { + // Quinn enters the cokpit after Seeker decided to enter the cave alone + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + break; + case 2: { + Common::Point pt(272, 127); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_player.checkAngle(&scene->_object3); + setDelay(30); + break; + case 4: + _globals->_sceneManager.changeScene(3700); + break; + } +} + +void Scene2100::Action6::signal() { + // Seeker stands up and walks to the elevator + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_object2.setVisage(2806); + scene->_object2.setStrip(1); + scene->_object2.setStrip2(-1); + scene->_object2.changeZoom(-1); + scene->_object2.setPosition(Common::Point(155, 116)); + scene->_object2.setObjectWrapper(new SceneObjectWrapper()); + scene->_object2.setAction(NULL); + scene->_object2.animate(ANIM_MODE_1, NULL); + + Common::Point pt(130, 116); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 1: { + scene->_object2.fixPriority(-1); + Common::Point pt(153, 67); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 2: + remove(); + break; + } +} + +void Scene2100::Action7::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + break; + case 2: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, NULL); + break; + case 3: + _globals->_sceneManager.changeScene(8100); + break; + } +} + +void Scene2100::Action8::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + break; + case 2: { + Common::Point pt(200, 174); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_player.checkAngle(&scene->_object3); + scene->_stripManager.start((RING_INVENTORY._translator._sceneNumber == 1) ? 7720 : 7710, this); + break; + case 4: + if (RING_INVENTORY._translator._sceneNumber != 1) + _globals->_sceneManager.changeScene(7600); + else { + _globals->setFlag(24); + _globals->_player.enableControl(); + remove(); + } + break; + } +} + +void Scene2100::Action9::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + scene->_stripManager.start(6050, this); + break; + case 2: + scene->_soundHandler.play(99); + scene->_object4.show(); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_soundHandler.play(12); + scene->_object4.setStrip(2); + scene->_stripManager.start(6051, this, scene); + break; + case 4: + scene->_soundHandler.fadeOut(NULL); + scene->_object4.setStrip(1); + scene->_object4.setFrame(scene->_object4.getFrameCount()); + scene->_object4.animate(ANIM_MODE_6, this); + break; + case 5: + scene->_object4.hide(); + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(6010, this); + break; + case 6: + if (scene->_stripManager._field2E8 != 165) + setAction(&scene->_action10); + else + setAction(&scene->_action11); + break; + } +} + +void Scene2100::Action10::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + break; + case 2: { + _globals->_player.disableControl(); + Common::Point pt(155, 64); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + scene->_object3.setVisage(2105); + scene->_object3.setStrip(2); + scene->_object3.setFrame(1); + scene->_object3._numFrames = 10; + scene->_object3.setAction(NULL); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 4: { + scene->_object3.setVisage(2705); + scene->_object3.setStrip2(-1); + scene->_object3.changeZoom(-1); + scene->_object3.fixPriority(-1); + scene->_object3.setPosition(Common::Point(260, 156)); + scene->_object3.setObjectWrapper(new SceneObjectWrapper()); + scene->_object3.animate(ANIM_MODE_1, NULL); + + Common::Point pt(166, 64); + PlayerMover *mover = new PlayerMover(); + scene->_object3.addMover(mover, &pt, this); + + setAction(&scene->_action6, NULL); + break; + } + case 5: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 6: { + _globals->_player.fixPriority(1); + Common::Point pt(144, 54); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 7: { + scene->_object3.fixPriority(2); + Common::Point pt1(163, 55); + NpcMover *mover1 = new NpcMover(); + scene->_object3.addMover(mover1, &pt1, NULL); + + scene->_object2.fixPriority(2); + Common::Point pt2(158, 55); + NpcMover *mover2 = new NpcMover(); + scene->_object2.addMover(mover2, &pt2, this); + break; + } + case 8: + _globals->_player.fixPriority(1); + _globals->_player.setStrip(1); + scene->_object3.fixPriority(1); + scene->_object3.setStrip(2); + scene->_object2.fixPriority(2); + scene->_object2.setStrip(3); + + setDelay(45); + break; + case 9: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 10: + _globals->setFlag(70); + _globals->_stripNum = 2101; + _globals->_sceneManager.changeScene(2320); + break; + } +} + +void Scene2100::Action11::signal() { + // Miranda stands up and walks to the elevator + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + scene->_object3._numFrames = 10; + scene->_object3.setAction(NULL); + scene->_object3.setVisage(2105); + scene->_object3.setStrip(2); + scene->_object3.setFrame(1); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 2: { + scene->_object3.setVisage(2705); + scene->_object3.setStrip2(-1); + scene->_object3.changeZoom(-1); + scene->_object3.fixPriority(-1); + scene->_object3.setPosition(Common::Point(260, 156)); + scene->_object3.setObjectWrapper(new SceneObjectWrapper()); + scene->_object3.animate(ANIM_MODE_1, NULL); + + Common::Point pt(158, 62); + PlayerMover *mover = new PlayerMover(); + scene->_object3.addMover(mover, &pt, this); + + setAction(&scene->_action6, NULL); + break; + } + case 3: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 4: { + scene->_object3.fixPriority(1); + Common::Point pt1(163, 55); + NpcMover *mover1 = new NpcMover(); + scene->_object3.addMover(mover1, &pt1, NULL); + + scene->_object2.fixPriority(1); + Common::Point pt2(158, 55); + NpcMover *mover2 = new NpcMover(); + scene->_object2.addMover(mover2, &pt2, this); + break; + } + case 5: + scene->_object3.setStrip(2); + scene->_object2.setStrip(3); + setDelay(45); + break; + case 6: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 7: + scene->_object3.remove(); + scene->_object2.remove(); + _globals->setFlag(70); + _globals->_stripNum = 2102; + _globals->_player.enableControl(); + _globals->_player._canWalk = false; + break; + } +} + +void Scene2100::Action12::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_stripManager.start(6000, this); + break; + case 2: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point pt1(158, 74); + NpcMover *mover1 = new NpcMover(); + _globals->_player.addMover(mover1, &pt1, this); + + Common::Point pt2(158, 68); + NpcMover *mover2 = new NpcMover(); + scene->_object2.addMover(mover2, &pt2, NULL); + break; + } + case 4: { + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, NULL); + + _globals->_player.fixPriority(-1); + Common::Point pt1(277, 84); + PlayerMover *mover1 = new PlayerMover(); + _globals->_player.addMover(mover1, &pt1, this); + + scene->_object2.fixPriority(-1); + Common::Point pt2(255, 76); + PlayerMover *mover2 = new PlayerMover(); + scene->_object2.addMover(mover2, &pt2, this); + break; + } + case 6: + _globals->_player.setStrip(4); + scene->_object2.setStrip(4); + setDelay(60); + break; + case 7: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(6052, this); + break; + case 8: + if (scene->_stripManager._field2E8 == 320) + _globals->setFlag(74); + setDelay(30); + break; + case 9: + _globals->_events.setCursor(OBJECT_STUNNER); + scene->_object2.setAction(&scene->_action13); + setDelay(60); + break; + case 10: + if (_globals->getFlag(74)) + setDelay(1); + else + setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + break; + case 11: + scene->_stripManager.start(2170, this); + break; + case 12: + setDelay(5); + break; + case 13: + scene->_stripManager.start(_globals->getFlag(74) ? 2172 : 2174, this); + break; + case 14: + if (_globals->getFlag(74)) { + _globals->_stripNum = 6100; + _globals->_sceneManager.changeScene(2320); + } else { + _globals->_sceneManager.changeScene(6100); + } + remove(); + break; + } +} + +void Scene2100::Action13::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: { + scene->_object2.fixPriority(113); + Common::Point pt(178, 116); + PlayerMover *mover = new PlayerMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 2: { + Common::Point pt(150, 116); + NpcMover *mover = new NpcMover(); + scene->_object2.addMover(mover, &pt, this); + break; + } + case 3: + scene->_object2.setVisage(2108); + scene->_object2._strip = 3; + scene->_object2.setPosition(Common::Point(150, 100)); + scene->_object2.animate(ANIM_MODE_NONE, NULL); + scene->_object2.changeZoom(100); + scene->_object2.setAction(&scene->_action3); + setDelay(15); + break; + case 4: + remove(); + break; + } +} + +void Scene2100::Action14::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + break; + case 2: + setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + break; + case 3: + scene->_stripManager.start(6008, this); + break; + case 4: + scene->_soundHandler.play(99); + scene->_object4.show(); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_object4.setStrip(2); + scene->_stripManager.start(6009, this, scene); + break; + case 6: + scene->_soundHandler.fadeOut(NULL); + scene->_object4.setStrip(1); + scene->_object4.setFrame(scene->_object4.getFrameCount()); + scene->_object4.animate(ANIM_MODE_6, this); + break; + case 7: + scene->_stripManager.start(6060, this); + break; + case 8: + scene->_object3._numFrames = 10; + scene->_object3.setAction(NULL); + scene->_object3.setVisage(2105); + scene->_object3.setStrip(2); + scene->_object3.setFrame(1); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 9: { + scene->_object3.setVisage(2705); + scene->_object3.setStrip2(-1); + scene->_object3.changeZoom(-1); + scene->_object3.fixPriority(-1); + scene->_object3.setPosition(Common::Point(260, 156)); + scene->_object3.setObjectWrapper(new SceneObjectWrapper()); + scene->_object3.animate(ANIM_MODE_1, NULL); + + Common::Point pt(157, 65); + PlayerMover *mover = new PlayerMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 10: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 11: { + Common::Point pt(159, 51); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 12: + scene->_object3.setStrip(2); + setDelay(30); + break; + case 13: + scene->_object3.fixPriority(1); + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 14: + setDelay(90); + break; + case 15: + _globals->_sceneManager.changeScene(7000); + remove(); + break; + } +} + +void Scene2100::Action15::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: + scene->_object3.postInit(); + scene->_object3.setVisage(2705); + scene->_object3.animate(ANIM_MODE_1, NULL); + scene->_object3.setObjectWrapper(new SceneObjectWrapper()); + scene->_object3.setPosition(Common::Point(157, 56)); + scene->_object3.fixPriority(1); + scene->_object3.changeZoom(-1); + + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 2: { + scene->_object3.fixPriority(-1); + Common::Point pt(177, 68); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 3: { + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + + Common::Point pt(272, 140); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 4: { + Common::Point pt(266, 150); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 5: { + scene->_object3.fixPriority(156); + + Common::Point pt(260, 156); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 6: + scene->_object3.setVisage(2105); + scene->_object3._strip = 1; + scene->_object3._frame = 1; + scene->_object3.setPosition(Common::Point(256, 156)); + scene->_object3.animate(ANIM_MODE_5, this); + scene->_object3.changeZoom(100); + + scene->_object3.animate(ANIM_MODE_NONE, NULL); + break; + case 7: + remove(); + break; + } +} + +void Scene2100::Action16::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + case 4: + setDelay(3); + break; + case 1: + scene->_stripManager.start(7001, this); + break; + case 2: + setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + break; + case 3: { + _globals->_player.disableControl(); + Common::Point pt(155, 63); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 5: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 6: { + Common::Point pt(160, 54); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 7: + _globals->_player.fixPriority(1); + _globals->_player.setStrip(3); + setDelay(45); + break; + case 8: + scene->_soundHandler.play(162); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 9: + _globals->setFlag(15); + _globals->setFlag(36); + _globals->_sceneManager.changeScene(7000); + remove(); + break; + } +} + +void Scene2100::Action17::signal() { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + break; + case 2: + setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + break; + case 3: + scene->_stripManager.start(7070, this); + break; + case 4: + scene->_soundHandler.play(99); + scene->_object4.show(); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_soundHandler.play(12); + scene->_object4.setStrip(2); + scene->_stripManager.start(7071, this, scene); + break; + case 6: + scene->_soundHandler.fadeOut(NULL); + scene->_object4.setStrip(1); + scene->_object4.setFrame(scene->_object4.getFrameCount()); + scene->_object4.animate(ANIM_MODE_6, this); + break; + case 7: + scene->_stripManager.start(7072, this); + break; + case 8: + RING_INVENTORY._stasisNegator._sceneNumber = 1; + _globals->_sceneManager.changeScene(9100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2100::Hotspot2::doAction(int action) { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 3); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2100, 29); + else { + _globals->_player.disableControl(); + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Hotspot3::doAction(int action) { + // Computer, on the left + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 4); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2100, 29); + else { + _globals->_player.disableControl(); + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Hotspot4::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 5); + break; + case CURSOR_USE: + SceneItem::display2(2100, 6); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Hotspot8::doAction(int action) { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 12); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2100, 29); + else { + _globals->_player.disableControl(); + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Hotspot10::doAction(int action) { + // Quinn's Console + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 13); + break; + case CURSOR_USE: + if (scene->_sitFl) { + _globals->_player.disableControl(); + scene->_sceneMode = 2102; + scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL); + } else if (_globals->getFlag(13)) { + SceneItem::display2(2100, 28); + } else { + _globals->_player.disableControl(); + scene->_sceneMode = 2101; + scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Hotspot14::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(0)) + SceneItem::display2(2100, 19); + else + SceneItem::display2(2100, 18); + break; + case CURSOR_USE: + if (_globals->getFlag(1)) + SceneItem::display2(2100, 21); + else + SceneItem::display2(2100, 20); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Object1::doAction(int action) { + // Elevator + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 1); + break; + case CURSOR_USE: + scene->setAction(&scene->_action1); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Object2::doAction(int action) { + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2100, 30); + break; + case CURSOR_TALK: + if (_globals->getFlag(72)) { + _globals->_player.disableControl(); + if (!_globals->getFlag(52)) { + scene->_sceneMode = 2111; + scene->setAction(&scene->_sequenceManager, scene, 2111, NULL); + } else { + scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL); + } + } else if (_globals->getFlag(13)) { + SceneItem::display2(2100, 31); + } else if (_globals->getFlag(14)) { + SceneItem::display2(2100, 32); + } else { + _globals->setFlag(14); + _globals->_player.disableControl(); + scene->_sceneMode = 2108; + scene->setAction(&scene->_sequenceManager, scene, 2109, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2100::Object3::doAction(int action) { + // Miranda + Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(59)) + SceneItem::display2(2100, 34); + else + error("***I have no response."); + break; + + case CURSOR_TALK: + if (_globals->getFlag(59)) { + _globals->_player.disableControl(); + scene->_sceneMode = 2108; + scene->setAction(&scene->_sequenceManager, scene, 2108, NULL); + } else { + error("***I have no response."); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene2100::Scene2100() : + _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), + _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), + _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), + _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), + _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), + _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), + _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), + _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, OBJECT_TRANSLATOR); + _area4._pt = Common::Point(237, 77); +} + +void Scene2100::postInit(SceneObjectList *OwnerList) { + loadScene(2100); + Scene::postInit(); + setZoomPercents(60, 80, 200, 100); + + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerMR); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerSAL); + _stripManager.addSpeaker(&_speakerHText); + _stripManager.addSpeaker(&_speakerGameText); + _speakerMText._npc = &_object3; + _speakerQText._npc = &_globals->_player; + _speakerSText._npc = &_object2; + + _object1.postInit(); + _object1.setVisage(2100); + _object1.animate(ANIM_MODE_NONE, NULL); + _object1.setPosition(Common::Point(157, 57)); + _object1.fixPriority(5); + + _hotspot3.postInit(); + _hotspot3.setVisage(2101); + _hotspot3._frame = 1; + _hotspot3.animate(ANIM_MODE_2, NULL); + _hotspot3.setPosition(Common::Point(53, 44)); + _hotspot3.changeZoom(100); + _hotspot3.fixPriority(1); + + _hotspot4.postInit(); + _hotspot4.setVisage(2101); + _hotspot4._frame = 1; + _hotspot4._strip = 3; + _hotspot4.animate(ANIM_MODE_8, 0, NULL); + _hotspot4.setPosition(Common::Point(274, 52)); + _hotspot4.changeZoom(100); + _hotspot4.fixPriority(1); + + _hotspot5.postInit(); + _hotspot5.setVisage(2101); + _hotspot5._frame = 1; + _hotspot5._strip = 4; + _hotspot5.animate(ANIM_MODE_8, 0, NULL); + _hotspot5.setPosition(Common::Point(219, 141)); + _hotspot5.changeZoom(100); + _hotspot5.fixPriority(160); + + _hotspot6.postInit(); + _hotspot6.setVisage(2101); + _hotspot6._frame = 1; + _hotspot6._strip = 5; + _hotspot6.fixPriority(175); + _hotspot6.animate(ANIM_MODE_8, 0, NULL); + _hotspot6.setPosition(Common::Point(97, 142)); + _hotspot6.changeZoom(100); + + _hotspot7.postInit(); + _hotspot7.setVisage(2101); + _hotspot7._frame = 1; + _hotspot7._strip = 6; + _hotspot7.animate(ANIM_MODE_NONE, NULL); + _hotspot7.setPosition(Common::Point(133, 46)); + _hotspot7.changeZoom(100); + _hotspot7.fixPriority(1); + + _hotspot8.postInit(); + _hotspot8.setVisage(2101); + _hotspot8._frame = 1; + _hotspot8._strip = 7; + _hotspot8.animate(ANIM_MODE_8, 0, NULL); + _hotspot8.setPosition(Common::Point(20, 45)); + _hotspot8.changeZoom(100); + _hotspot8.fixPriority(1); + + _hotspot2.postInit(); + _hotspot2.setVisage(2101); + _hotspot2._frame = 1; + _hotspot2._strip = 8; + _hotspot2.animate(ANIM_MODE_8, 0, NULL); + _hotspot2.setPosition(Common::Point(88, 41)); + _hotspot2.changeZoom(100); + _hotspot2.fixPriority(1); + + _hotspot11.setBounds(Rect(139, 74, 173, 96)); + _hotspot10.setBounds(Rect(71, 100, 91, 135)); + _hotspot9.setBounds(Rect(225, 110, 251, 136)); + _hotspot14.setBounds(Rect(100, 97, 216, 130)); + _hotspot13.setBounds(Rect(13, 124, 94, 168)); + _hotspot12.setBounds(Rect(217, 141, 307, 155)); + _hotspot15.setBounds(Rect(14, 90, 46, 107)); + _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + + if (!_globals->getFlag(36) && !_globals->getFlag(70) && !_globals->getFlag(43)) { + _object3.postInit(); + _object3.setPosition(Common::Point(246, 156)); + _object3.animate(ANIM_MODE_NONE, NULL); + _object3.changeZoom(100); + _object3.fixPriority(156); + _object3.setVisage(2107); + _object3.setStrip(1); + _object3.setAction(&_action2); + _globals->_sceneItems.push_back(&_object3); + } + + if (!_globals->getFlag(59) && !_globals->getFlag(70) && !_globals->getFlag(37) && !_globals->getFlag(114)) { + _object2.postInit(); + _object2.setVisage(2108); + _object2._strip = 3; + _object2.setPosition(Common::Point(150, 100)); + _object2.animate(ANIM_MODE_NONE, NULL); + _object2.changeZoom(100); + _object2.fixPriority(113); + _object2.setAction(&_action3); + _globals->_sceneItems.push_back(&_object2); + } + + _globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14, + &_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, + &_hotspot6, &_hotspot7, &_hotspot1, NULL); + + _globals->_player.postInit(); + if (_globals->getFlag(13)) { + _globals->_player.setVisage(2170); + _globals->_player._moveDiff.y = 1; + } else { + _globals->_player.setVisage(0); + _globals->_player._moveDiff.y = 3; + } + + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._moveDiff.x = 4; + _globals->_player.changeZoom(-1); + _globals->_player.disableControl(); + _sitFl = 0; + + switch (_globals->_sceneManager._previousScene) { + case 2120: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _object1.fixPriority(-1); + _globals->_player.fixPriority(-1); + _globals->_player.setPosition(Common::Point(80, 66)); + _globals->_player.enableControl(); + break; + case 2150: + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(157, 56)); + _sceneMode = 2104; + setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); + break; + case 2222: + if (_globals->_sceneObjects->contains(&_object3)) + _object3.remove(); + + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(144, 55)); + + _object2.setVisage(2806); + _object2.changeZoom(-1); + _object2.setPosition(Common::Point(158, 55)); + _object2.fixPriority(1); + _object2.setAction(NULL); + _object2.setObjectWrapper(new SceneObjectWrapper()); + _object2.animate(ANIM_MODE_1, NULL); + _object2.setStrip(3); + setAction(&_action12); + break; + case 2320: + if (_globals->_stripNum == 2321) { + if (_globals->_sceneObjects->contains(&_object3)) + _object3.remove(); + + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(144, 55)); + + _object2.postInit(); + _object2.setVisage(2806); + _object2.setStrip(1); + _object2.changeZoom(-1); + _object2.setPosition(Common::Point(158, 55)); + _object2.fixPriority(1); + _object2.setAction(NULL); + _object2.setObjectWrapper(new SceneObjectWrapper()); + _object2.animate(ANIM_MODE_1, NULL); + + setAction(&_action12); + } else if (_globals->_stripNum == 6100) { + _globals->_player.setPosition(Common::Point(157, 56)); + _globals->_player.fixPriority(1); + + _object4.postInit(); + _object4.setVisage(2102); + _object4.setPosition(Common::Point(160, 199)); + _object4.hide(); + + setAction(&_action14); + } else { + _globals->_player.disableControl(); + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(157, 56)); + _sceneMode = 2104; + + setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); + } + break; + case 3700: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + Scene::setZoomPercents(80, 75, 100, 90); + + if (_globals->_sceneObjects->contains(&_object2)) + _object2.remove(); + + _globals->_player._angle = 225; + _globals->_player.setStrip(6); + _globals->_player.setFrame(1); + _globals->_player.fixPriority(-1); + _globals->_player.setPosition(Common::Point(272, 127)); + + _object3.setPosition(Common::Point(246, 156)); + _object3.fixPriority(156); + _sceneMode = 2105; + setAction(&_sequenceManager, this, 2105, &_object3, NULL); + break; + case 4250: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _globals->clearFlag(43); + + _globals->_player.setVisage(2104); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(65, 149)); + _globals->_player.fixPriority(152); + _globals->_player.setStrip(2); + + _object4.postInit(); + _object4.setVisage(2102); + _object4.setPosition(Common::Point(160, 199)); + _object4.hide(); + + _sceneMode = 2107; + setAction(&_sequenceManager, this, 2107, &_object4, NULL); + break; + case 5000: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + if (_globals->_sceneObjects->contains(&_object2)) + _object2.remove(); + + _globals->_player.setStrip(3); + _globals->_player.setFrame(1); + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(157, 56)); + + _object3.setPosition(Common::Point(246, 156)); + _object3.fixPriority(156); + + setAction(&_action5); + break; + case 5100: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _globals->_player.setVisage(2104); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(65, 149)); + _globals->_player.fixPriority(152); + _globals->_player.setStrip(2); + + _sitFl = 1; + + _object4.postInit(); + _object4.setVisage(2102); + _object4.setPosition(Common::Point(160, 199)); + _object4.hide(); + + RING_INVENTORY._stasisBox._sceneNumber = 0; + setAction(&_action9); + break; + case 7000: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + if (RING_INVENTORY._stasisBox2._sceneNumber == 1) { + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(157, 56)); + + _object4.postInit(); + _object4.setVisage(2102); + _object4.setPosition(Common::Point(160, 199)); + _object4.hide(); + _globals->clearFlag(15); + _globals->clearFlag(109); + _globals->clearFlag(72); + + setAction(&_action17); + } else { + _globals->_player.setVisage(2104); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(65, 149)); + _globals->_player.fixPriority(152); + _globals->_player.setStrip(2); + + _sitFl = 1; + setAction(&_action16); + } + break; + case 7600: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + if (_globals->_sceneObjects->contains(&_object2)) + _object2.remove(); + + _globals->_player.fixPriority(1); + _globals->_player.setPosition(Common::Point(157, 56)); + + setAction(&_action8); + break; + case 8100: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + _globals->_player.setVisage(2104); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(65, 149)); + _globals->_player.fixPriority(152); + _globals->_player.setStrip(2); + + _sceneMode = 2106; + setAction(&_sequenceManager, this, 2106, NULL); + break; + case 9750: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + _globals->_player.setVisage(2104); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(65, 149)); + _globals->_player.fixPriority(152); + _globals->_player.setStrip(2); + + _object4.postInit(); + _object4.setVisage(2102); + _object4.setPosition(Common::Point(160, 199)); + _object4.hide(); + + _sceneMode = 2103; + setAction(&_sequenceManager, this, 2103, &_object4, NULL); + break; + default: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + _globals->_player._uiEnabled = true; + break; + } + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2100::stripCallback(int v) { + switch (v) { + case 1: + _object4._numFrames = 4; + _object4.animate(ANIM_MODE_7, NULL); + break; + case 2: + _object4.animate(ANIM_MODE_NONE, NULL); + break; + } +} + +void Scene2100::signal() { + switch (_sceneMode) { + case 2101: + _sitFl = 1; + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + break; + case 2102: + _sitFl = 0; + _globals->_player.enableControl(); + break; + case 2103: + _globals->_stripNum = 9000; + _globals->_sceneManager.changeScene(4000); + break; + case 2106: + _globals->_sceneManager.changeScene(7000); + break; + case 2107: + _globals->_sceneManager.changeScene(5000); + break; + case 2104: + case 2105: + case 2108: + case 2110: + case 2111: + case 2112: + _globals->_player.enableControl(); + break; + } +} + +void Scene2100::synchronize(Serializer &s) { + Scene::synchronize(s); + if (s.getVersion() >= 3) + s.syncAsSint16LE(_sitFl); +} + +/*-------------------------------------------------------------------------- + * Scene 2120 - Encyclopedia + * + *--------------------------------------------------------------------------*/ + +Scene2120::Action1::Action1() { + _entries.push_back(Entry(0, 0, 0)); + _entries.push_back(Entry(0, 0, 0)); + _entries.push_back(Entry(4, 1, 2123)); + _entries.push_back(Entry(1, 6, 0)); + _entries.push_back(Entry(2, 8, 0)); + _entries.push_back(Entry(1, 11, 0)); + _entries.push_back(Entry(4, 13, 2131)); + _entries.push_back(Entry(2, 18, 0)); + _entries.push_back(Entry(4, 21, 0)); + _entries.push_back(Entry(7, 26, 2128)); + _entries.push_back(Entry(3, 34, 0)); + _entries.push_back(Entry(0, 38, 0)); + _entries.push_back(Entry(3, 39, 2126)); + _entries.push_back(Entry(3, 43, 0)); + _entries.push_back(Entry(4, 47, 2125)); + _entries.push_back(Entry(3, 52, 0)); + _entries.push_back(Entry(4, 56, 2129)); + _entries.push_back(Entry(7, 61, 0)); + _entries.push_back(Entry(2, 69, 2127)); + _entries.push_back(Entry(7, 72, 2122)); + _entries.push_back(Entry(0, 80, 2124)); + _entries.push_back(Entry(0, 81, 0)); + _entries.push_back(Entry(0, 82, 0)); + _entries.push_back(Entry(1, 83, 0)); + _entries.push_back(Entry(2, 85, 2132)); + _entries.push_back(Entry(1, 88, 2133)); + _entries.push_back(Entry(2, 90, 2136)); + _entries.push_back(Entry(1, 93, 0)); + _entries.push_back(Entry(10, 95, 2135)); + _entries.push_back(Entry(5, 106, 0)); + _entries.push_back(Entry(2, 112, 2134)); + _entries.push_back(Entry(1, 115, 2130)); + _entries.push_back(Entry(0, 117, 0)); +} + +void Scene2120::Action1::signal() { + Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + _globals->_events.setCursor(CURSOR_WALK); + break; + case 1: + // First page of index + SceneItem::display(2120, 0, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, + SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); + break; + case 2: + // Second page of index + SceneItem::display(2120, 1, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, + SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); + break; + case 3: + // Display an image associated with the encyclopedia entry + SceneItem::display(0, 0); + + scene->_visageHotspot.postInit(); + scene->_visageHotspot.setVisage(_entries[scene->_subjectIndex]._visage); + scene->_visageHotspot.setPosition(Common::Point(129, 180)); + scene->_visageHotspot.animate(ANIM_MODE_NONE, NULL); + scene->_visageVisable = true; + break; + case 4: + // Display page of text + SceneItem::display(2121, _entries[scene->_subjectIndex]._lineNum + scene->_lineOffset, + SET_X, 130, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, SET_WIDTH, 200, + SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); + _actionIndex = 4; + break; + } +} + +void Scene2120::Action1::dispatch() { + Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; + + Event event; + if (_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) { + if (scene->_listRect.contains(event.mousePos) && (scene->_dbMode != 2)) { + scene->_topicArrowHotspot.setPosition(Common::Point(scene->_topicArrowHotspot._position.x, event.mousePos.y)); + } + + // Subject button handling + if (scene->_subjectButton._bounds.contains(event.mousePos) && (scene->_dbMode != 2)) { + scene->_arrowHotspot.setPosition(Common::Point(291, 34)); + scene->_arrowHotspot._strip = 1; + scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); + + if (scene->_dbMode == 0) + scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 48) / 8; + else + scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 44) / 8 + 16; + + if ((scene->_subjectIndex == 27) && _globals->getFlag(70)) + _globals->setFlag(75); + + scene->_topicArrowHotspot.hide(); + scene->_prevDbMode = scene->_dbMode; + scene->_dbMode = 2; + scene->_lineOffset = 0; + + _actionIndex = !_entries[scene->_subjectIndex]._visage ? 4 : 3; + setDelay(30); + scene->_soundHandler.play(159); + } + + // Next Page button handling + if (scene->_nextPageButton._bounds.contains(event.mousePos)) { + if (!scene->_dbMode) { + scene->_arrowHotspot._strip = 2; + scene->_arrowHotspot.setPosition(Common::Point(291, 76)); + scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); + scene->_dbMode = 1; + + _actionIndex = 2; + setDelay(30); + } + + if ((scene->_dbMode == 2) && (scene->_lineOffset < _entries[scene->_subjectIndex]._size)) { + if (!scene->_visageVisable) { + ++scene->_lineOffset; + } else { + scene->_visageVisable = false; + scene->_visageHotspot.remove(); + } + setDelay(30); + } + + if ((scene->_subjectIndex == 20) && scene->_visageVisable) { + scene->_visageVisable = false; + scene->_visageHotspot.remove(); + setDelay(30); + } + + scene->_soundHandler.play(159); + } + + // Previous Page button handling + if (scene->_previousPageButton._bounds.contains(event.mousePos)) { + switch (scene->_dbMode) { + case 1: + scene->_arrowHotspot._strip = 3; + scene->_arrowHotspot.setPosition(Common::Point(291, 117)); + scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); + + scene->_dbMode = 0; + _actionIndex = 1; + setDelay(30); + break; + case 2: + if (scene->_lineOffset > 0) { + --scene->_lineOffset; + setDelay(20); + } + if ((_entries[scene->_subjectIndex]._visage != 0) && (scene->_lineOffset == 0)) { + _actionIndex = 3; + setDelay(30); + } + break; + } + + scene->_soundHandler.play(159); + } + + // Exit button handling + if (scene->_exitButton._bounds.contains(event.mousePos)) { + if (scene->_dbMode != 2) { + // In the index, so return to the previous scene + setAction(NULL); + SceneItem::display(0, 0); + + _globals->_gfxManagerInstance._font.setFontNumber(2); + _globals->_sceneText._fontNumber = 2; + _globals->_sceneManager.changeScene(_globals->_sceneManager._previousScene); + } else { + // Exit out of topic display to index + SceneItem::display(0, 0); + + if (_entries[scene->_subjectIndex]._visage) + scene->_visageHotspot.remove(); + + scene->_arrowHotspot._strip = 4; + scene->_arrowHotspot.setPosition(Common::Point(291, 159)); + scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); + scene->_dbMode = scene->_prevDbMode; + _actionIndex = scene->_prevDbMode + 1; + + scene->_topicArrowHotspot.show(); + setDelay(1); + } + + scene->_soundHandler.play(159); + } + } + + Action::dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +Scene2120::Scene2120(): Scene() { + _listRect = Rect(18, 48, 260, 177); + _dbMode = 0; + _prevDbMode = 0; + _visageVisable = false; + _subjectIndex = 0; +} + +void Scene2120::postInit(SceneObjectList *OwnerList) { + loadScene(2120); + setZoomPercents(0, 100, 200, 100); + _globals->_player.disableControl(); + + _subjectButton.setBounds(Rect(266, 13, 320, 56)); + _nextPageButton.setBounds(Rect(266, 56, 320, 98)); + _previousPageButton.setBounds(Rect(266, 98, 320, 140)); + _exitButton.setBounds(Rect(266, 140, 320, 182)); + + _topicArrowHotspot.postInit(); + _topicArrowHotspot.setVisage(2120); + _topicArrowHotspot.animate(ANIM_MODE_NONE, NULL); + _topicArrowHotspot.setPosition(Common::Point(240, 55)); + + _arrowHotspot.postInit(); + _arrowHotspot.setVisage(2121); + _arrowHotspot.animate(ANIM_MODE_NONE, NULL); + _arrowHotspot._frame = 1; + _arrowHotspot.setPosition(Common::Point(400, 200)); + + setAction(&_action1); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2120::synchronize(Serializer &s) { + Scene::synchronize(s); + + s.syncAsSint16LE(_dbMode); + s.syncAsSint16LE(_prevDbMode); + s.syncAsSint16LE(_visageVisable); + s.syncAsSint16LE(_subjectIndex); + s.syncAsSint16LE(_lineOffset); +} + +/*-------------------------------------------------------------------------- + * Scene 2150 - Starcraft Level 2 + * + *--------------------------------------------------------------------------*/ + +void Scene2150::Action1::signal() { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(158, 103); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler.play(162); + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 2: { + _globals->_player.setStrip2(4); + Common::Point pt(158, 95); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_player.setStrip2(-1); + _globals->_player._strip = 3; + setDelay(10); + break; + case 4: + scene->_area1.display(); + scene->_area2.display(); + scene->_area3.display(); + scene->_area4.display(); + + scene->_area2.draw(true); + _state = 0; + _globals->_events.setCursor(CURSOR_USE); + + while (!_state && !_vm->shouldQuit()) { + // Wait for an event + Event event; + if (!_globals->_events.getEvent(event)) { + g_system->updateScreen(); + g_system->delayMillis(10); + continue; + } + + if (scene->_area1._bounds.contains(event.mousePos)) { + scene->_area2.draw(false); + scene->_area1.draw(true); + _state = scene->_area1._actionId; + } + if (scene->_area2._bounds.contains(event.mousePos)) { + scene->_area2.draw(true); + _state = scene->_area2._actionId; + } + if (scene->_area3._bounds.contains(event.mousePos)) { + scene->_area2.draw(false); + scene->_area3.draw(true); + _state = scene->_area3._actionId; + } + } + + scene->_soundHandler.play(161); + scene->_area1.restore(); + scene->_area2.restore(); + scene->_area3.restore(); + scene->_area4.restore(); + + if (_state == 2150) { + setDelay(1); + } else { + scene->_soundHandler.play(162); + scene->_hotspot1.animate(ANIM_MODE_6, this); + } + break; + case 5: + if (_state == 2150) { + Common::Point pt(158, 103); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } else { + _globals->_sceneManager.changeScene(_state); + } + break; + case 6: + scene->_soundHandler.play(162); + scene->_hotspot1.animate(ANIM_MODE_6, this); + break; + case 7: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2150::Action2::signal() { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(47, 85); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_player.setVisage(2152); + _globals->_player.setFrame(1); + _globals->_player.setStrip(8); + _globals->_player.animate(ANIM_MODE_8, 1, this); + + scene->_soundHandler.play(163); + break; + case 2: + scene->_soundHandler.play(164); + scene->_hotspot10.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start((RING_INVENTORY._ale._sceneNumber == 2150) ? 2151 : 2152, this); + break; + case 4: + scene->_hotspot14.postInit(); + scene->_hotspot14.setVisage(2152); + scene->_hotspot14.setStrip(6); + scene->_hotspot14.setPosition(Common::Point(59, 54)); + + if (scene->_stripManager._field2E8 == 15) { + scene->_hotspot14.setFrame(5); + RING_INVENTORY._ale._sceneNumber = 1; + } else { + scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5); + } + + _globals->_player.setFrame(1); + _globals->_player.setStrip(7); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_soundHandler.play(164); + scene->_hotspot10.animate(ANIM_MODE_6, NULL); + scene->_hotspot14.remove(); + + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 6: + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.enableControl(); + + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2150::Hotspot1::doAction(int action) { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2150, 0); + break; + case CURSOR_USE: + scene->setAction(&scene->_action1); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2150::Hotspot2::doAction(int action) { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2150, 1); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 2156; + scene->setAction(&scene->_sequenceManager, scene, 2156, &_globals->_player, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2150::Hotspot4::doAction(int action) { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2150, 3); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 2155; + scene->setAction(&scene->_sequenceManager, scene, 2155, &_globals->_player, &scene->_hotspot4, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2150::Hotspot7::doAction(int action) { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2150, 7); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2150, 19); + else { + _globals->_player.disableControl(); + scene->_sceneMode = 2154; + scene->setAction(&scene->_sequenceManager, scene, 2154, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2150::Hotspot10::doAction(int action) { + Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2150, 10); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2150, 19); + else + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene2150::Scene2150() : + _hotspot3(18, CURSOR_LOOK, 2150, 2, CURSOR_USE, 2150, 18, LIST_END), + _hotspot5(17, CURSOR_LOOK, 2150, 4, CURSOR_USE, 2150, 18, LIST_END), + _hotspot6(0, CURSOR_LOOK, 2150, 5, CURSOR_USE, 2150, 18, LIST_END), + _hotspot8(16, CURSOR_LOOK, 2150, 8, LIST_END), + _hotspot9(0, CURSOR_LOOK, 2150, 9, CURSOR_USE, 2150, 13, LIST_END), + _hotspot11(0, CURSOR_LOOK, 2150, 12, LIST_END) { + _rect1 = Rect(260, 70, 270, 77); + _rect2 = Rect(222, 142, 252, 150); + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, 10); + _area4._pt = Common::Point(237, 77); + +} + +void Scene2150::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(55, 85, 200, 100); + loadScene(2150); + + _stripManager.addSpeaker(&_speakerGameText); + + _hotspot7.postInit(); + _hotspot7.setVisage(2152); + _hotspot7._frame = 1; + _hotspot7._strip = 2; + _hotspot7.animate(ANIM_MODE_8, 0, NULL); + _hotspot7.setPosition(Common::Point(122, 62)); + _hotspot7.changeZoom(100); + _hotspot7.fixPriority(76); + + _hotspot2.postInit(); + _hotspot2.setVisage(2151); + _hotspot2._frame = 1; + _hotspot2._strip = 3; + _hotspot2.animate(ANIM_MODE_NONE, NULL); + _hotspot2.setPosition(Common::Point(257, 67)); + _hotspot2.changeZoom(100); + _hotspot2.fixPriority(60); + + _hotspot1.postInit(); + _hotspot1.setVisage(2151); + _hotspot1._frame = 1; + _hotspot1._strip = 2; + _hotspot1.animate(ANIM_MODE_NONE, NULL); + _hotspot1.setPosition(Common::Point(158, 99)); + _hotspot1.changeZoom(100); + _hotspot1.fixPriority(99); + + _hotspot4.postInit(); + _hotspot4.setVisage(2150); + _hotspot4._frame = 1; + _hotspot4._strip = 2; + _hotspot4.animate(ANIM_MODE_NONE, NULL); + _hotspot4.setPosition(Common::Point(218, 200)); + _hotspot4.changeZoom(100); + _hotspot4.fixPriority(200); + + _hotspot10.postInit(); + _hotspot10.setVisage(2152); + _hotspot10.setStrip(5); + _hotspot10.setPosition(Common::Point(59, 56)); + + _globals->_player.postInit(); + _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.fixPriority(-1); + _globals->_player.changeZoom(-1); + _globals->_player._moveDiff.y = 3; + + _hotspot8.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot9.setBounds(Rect(133, 0, 198, 91)); + _hotspot11.setBounds(Rect(142, 119, 176, 158)); + + _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, + &_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL); + + switch (_globals->_sceneManager._previousScene) { + case 2120: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _globals->_player.setPosition(Common::Point(108, 99)); + break; + case 2200: + _globals->_player.disableControl(); + _globals->_player.setPosition(Common::Point(159, 240)); + _sceneMode = 2152; + setAction(&_sequenceManager, this, 2152, &_globals->_player, NULL); + break; + case 2280: + _globals->_player.disableControl(); + _globals->_player._angle = 180; + _globals->_player.setPosition(Common::Point(265, 80)); + + _hotspot2._frame = _hotspot2.getFrameCount(); + _sceneMode = 2157; + setAction(&_sequenceManager, this, 2157, &_hotspot2, NULL); + break; + case 2230: + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player._strip = 4; + _globals->_player.setPosition(Common::Point(229, 139)); + break; + case 2100: + default: + _globals->_player.disableControl(); + _globals->_player.setPosition(Common::Point(158, 95)); + _globals->_player.setStrip(3); + _sceneMode = 2151; + + setAction(&_sequenceManager, this, 2151, &_globals->_player, &_hotspot1, NULL); + break; + } + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2150::synchronize(Serializer &s) { + Scene::synchronize(s); + _rect1.synchronize(s); + _rect2.synchronize(s); +} + +void Scene2150::signal() { + switch (_sceneMode) { + case 2151: + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.enableControl(); + break; + case 2152: + case 2153: + case 2157: + _globals->_player.enableControl(); + break; + case 2154: + _globals->_sceneManager.changeScene(2120); + break; + case 2155: + _globals->_sceneManager.changeScene(2230); + break; + case 2156: + _globals->_sceneManager.changeScene(2280); + break; + } +} + +void Scene2150::dispatch() { + Scene::dispatch(); + + if (!_action) { + if (_rect1.contains(_globals->_player._position)) { + _globals->_player.disableControl(); + _sceneMode = 2156; + setAction(&_sequenceManager, this, 2156, &_globals->_player, &_hotspot2, NULL); + } + if (_rect2.contains(_globals->_player._position)) { + _globals->_player.disableControl(); + _sceneMode = 2155; + setAction(&_sequenceManager, this, 2155, &_globals->_player, &_hotspot4, NULL); + } + if (_globals->_player._position.y >= 196) { + _globals->_player.disableControl(); + SceneItem::display2(2150, 20); + + _sceneMode = 2153; + setAction(&_sequenceManager, this, 2153, &_globals->_player, NULL); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 2200 - Starcraft - AutoDoc + * + *--------------------------------------------------------------------------*/ + +void Scene2200::Action1::signal() { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(6); + break; + case 1: + scene->_hotspot4.animate(ANIM_MODE_5, this); + break; + case 2: + SceneItem::display2(2200, 7); + _globals->_sceneManager.changeScene(2150); + remove(); + break; + } +} + +void Scene2200::Action2::signal() { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + setDelay(30); + break; + case 2: + scene->_hotspot4.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_hotspot4.setStrip(4); + setDelay(30); + break; + case 4: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(2040, this, scene); + break; + case 5: + scene->_hotspot4.setStrip(4); + scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); + _globals->_player._uiEnabled = true; + remove(); + break; + } +} + +void Scene2200::Action3::signal() { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_soundHandler2.play(103); + + scene->_hotspot4.setStrip(4); + scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); + _globals->_player.disableControl(); + + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(2201); + scene->_hotspot2._strip = 2; + scene->_hotspot2.setPosition(Common::Point(218, 0)); + + Common::Point pt(218, 63); + NpcMover *mover = new NpcMover(); + scene->_hotspot2.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler2.play(104); + scene->_hotspot4.setStrip(2); + scene->_hotspot4.setFrame(2); + setDelay(120); + break; + case 2: + if (_globals->getFlag(83)) { + _actionIndex = 8; + setDelay(5); + } else { + for (SynchronizedList::iterator i = _globals->_sceneObjects->begin(); + i != _globals->_sceneObjects->end(); ++i) { + (*i)->hide(); + } + + _globals->_sceneManager._scene->loadScene(66); + + scene->_hotspot6.postInit(); + scene->_hotspot6.setVisage(66); + scene->_hotspot6.setPosition(Common::Point(160, 197)); + + scene->_hotspot7.postInit(); + scene->_hotspot7.setVisage(65); + scene->_hotspot7.setStrip(4); + scene->_hotspot7.setFrame(1); + scene->_hotspot7.setPosition(Common::Point(145, 165)); + + SceneItem::display(60, 1, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34, + SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); + _state = 1; + setDelay(1800); + } + break; + case 3: + case 4: + case 5: + SceneItem::display(60, _actionIndex - 2, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34, + SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); + setDelay(1800); + break; + case 6: + scene->_hotspot7.remove(); + SceneItem::display(0, 0); + _state = 0; + setDelay(5); + break; + case 7: + for (SynchronizedList::iterator i = _globals->_sceneObjects->begin(); + i != _globals->_sceneObjects->end(); ++i) + (*i)->show(); + + scene->_hotspot6.remove(); + _globals->_sceneManager._scene->loadScene(2200); + setDelay(5); + break; + case 8: + scene->_stripManager.start(2060, this, scene); + break; + case 9: + scene->_hotspot4.setStrip(4); + scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); + break; + case 10: + _globals->_sceneManager.changeScene(2000); + remove(); + break; + } +} + +void Scene2200::Action3::process(Event &event) { + if (!event.handled && ((event.eventType == EVENT_KEYPRESS) || (event.eventType == EVENT_BUTTON_DOWN))) { + _state = 0; + event.handled = true; + setDelay(1); + } + + Action::process(event); +} + +void Scene2200::Action4::signal() { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + scene->_stripManager.start(2202, this, scene); + break; + case 2: + scene->_hotspot4.setStrip(4); + scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); + setDelay(10); + break; + case 3: + _globals->_player._uiEnabled = true; + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2200::Hotspot3::doAction(int action) { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2200, 10); + break; + case CURSOR_USE: + SceneItem::display2(2200, 11); + break; + case CURSOR_TALK: + _globals->_player._uiEnabled = false; + scene->setAction(&scene->_action4); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2200::Hotspot5::doAction(int action) { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2200, 8); + break; + case CURSOR_USE: + SceneItem::display2(2200, 9); + break; + case CURSOR_TALK: + scene->_sceneMode = 2201; + _globals->_player._uiEnabled = false; + scene->setAction(&scene->_sequenceManager, scene, 2201, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2200::Hotspot9::doAction(int action) { + Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2200, _globals->getFlag(8) ? 1 : 0); + break; + case CURSOR_USE: + SceneItem::display2(2200, 3); + break; + case OBJECT_INFODISK: + if (_globals->_sceneManager._previousScene == 2310) { + scene->_soundHandler2.play(35); + _globals->_player.disableControl(); + scene->setAction(&scene->_action3); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + + +Scene2200::Scene2200() : + _hotspot1(0, CURSOR_LOOK, 2200, 5, CURSOR_USE, 2200, 6, LIST_END), + _hotspot10(0, CURSOR_LOOK, 2200, 4, LIST_END) { +} + +void Scene2200::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 200, 200, 200); + loadScene(2200); + + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerMR); + _stripManager.addSpeaker(&_speakerGameText); + + _speakerQText._npc = &_globals->_player; + _speakerSText._npc = &_hotspot5; + _speakerMText._npc = &_hotspot3; + + _stripManager.setCallback(this); + + _hotspot5.postInit(); + _hotspot5.setVisage(2840); + _hotspot5.setPosition(Common::Point(50, 235)); + + _hotspot8.postInit(); + _hotspot8.setVisage(2840); + _hotspot8.setStrip(2); + _hotspot8.setPosition(Common::Point(96, 184)); + _hotspot8.fixPriority(236); + + _globals->_player.postInit(); + _globals->_player.setVisage(2640); + _globals->_player.setFrame2(3); + _globals->_player.setPosition(Common::Point(110, 233)); + _globals->_player.disableControl(); + + switch (_globals->_sceneManager._previousScene) { + case 2150: + _hotspot5.remove(); + _hotspot8.remove(); + break; + case 4000: + _globals->_soundHandler.play(100); + _globals->_soundHandler.holdAt(true); + _globals->_player.remove(); + _hotspot5.remove(); + _hotspot8.remove(); + + _hotspot1.postInit(); + _hotspot1.setVisage(2202); + _hotspot1.setPosition(Common::Point(175, 173)); + _hotspot1.fixPriority(99); + + _hotspot3.postInit(); + _hotspot3.setVisage(2202); + _hotspot3._strip = 2; + _hotspot3.setPosition(Common::Point(152, 76)); + _hotspot3.fixPriority(100); + + _hotspot4.postInit(); + _hotspot4.setVisage(2202); + _hotspot4._strip = 3; + _hotspot4.setPosition(Common::Point(115, 76)); + _hotspot4.fixPriority(200); + + setAction(&_action1); + break; + case 2310: + default: + RING_INVENTORY._infoDisk._sceneNumber = 1; + + _hotspot3.postInit(); + _hotspot3.setVisage(2215); + _hotspot3.setPosition(Common::Point(144, 132)); + _globals->_sceneItems.push_back(&_hotspot3); + + _hotspot4.postInit(); + _hotspot4.setVisage(2215); + _hotspot4._strip = 2; + _hotspot4.setPosition(Common::Point(120, 78)); + _hotspot4.fixPriority(255); + _globals->_sceneItems.push_back(&_hotspot4); + + _soundHandler1.play(101); + _soundHandler2.play(100); + _globals->_soundHandler.holdAt(true); + + _globals->_sceneItems.push_back(&_hotspot5); + setAction(&_action2); + break; + } + + _exitRect = Rect(0, 0, 35, SCREEN_HEIGHT); + _hotspot9.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot10.setBounds(Rect(87, 43, 149, 109)); + + _globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2200::stripCallback(int v) { + switch (v) { + case 1: + _hotspot4.setStrip(3); + _hotspot4.animate(ANIM_MODE_7, 0, NULL); + break; + case 2: + _hotspot4.setStrip(4); + _hotspot4.animate(ANIM_MODE_NONE, NULL); + break; + } +} + +void Scene2200::synchronize(Serializer &s) { + Scene::synchronize(s); + _exitRect.synchronize(s); +} + +void Scene2200::signal() { + if ((_sceneMode == 2201) || (_sceneMode == 2202)) + _globals->_player._uiEnabled = true; +} + +void Scene2200::dispatch() { + Scene::dispatch(); + + if (!_action) { + if (_exitRect.contains(_globals->_player._position)) + _globals->_sceneManager.changeScene(2150); + } +} + +/*-------------------------------------------------------------------------- + * Scene 2222 - Stasis Field Map + * + *--------------------------------------------------------------------------*/ + +void Scene2222::Action1::signal() { + Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + scene->_stripManager.start(2222, this); + break; + case 2: + setDelay(30); + break; + case 3: + _globals->_sceneManager.changeScene(1000); + break; + } +} + +void Scene2222::Action2::signal() { + Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + scene->_stripManager.start(5700, this); + break; + case 2: + setDelay(120); + break; + case 3: + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_sceneManager.changeScene(2100); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2222::postInit(SceneObjectList *OwnerList) { + loadScene((_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerML); + + _hotspot1.postInit(); + _hotspot1.setVisage(3401); + _hotspot1.setStrip2(1); + _hotspot1._frame = 1; + _hotspot1.animate(ANIM_MODE_2, 0); + + _hotspot2.postInit(); + _hotspot2.setVisage(3401); + _hotspot2.setStrip2(2); + _hotspot2._frame = 2; + _hotspot2.animate(ANIM_MODE_2, 0); + + _hotspot3.postInit(); + _hotspot3.setVisage(3401); + _hotspot3.setStrip2(2); + _hotspot3._frame = 3; + _hotspot3.animate(ANIM_MODE_2, 0); + + _hotspot4.postInit(); + _hotspot4.setVisage(3401); + _hotspot4.setStrip2(2); + _hotspot4._frame = 4; + _hotspot4.animate(ANIM_MODE_2, 0); + + _hotspot5.postInit(); + _hotspot5.setVisage(3401); + _hotspot5.setStrip2(2); + _hotspot5.setFrame(5); + _hotspot5.animate(ANIM_MODE_2, 0); + + if (_globals->_sceneManager._previousScene == 2100) { + _hotspot1.setPosition(Common::Point(61, 101)); + _hotspot2.setPosition(Common::Point(239, 149)); + _hotspot3.setPosition(Common::Point(184, 85)); + _hotspot4.setPosition(Common::Point(105, 165)); + _hotspot5.remove(); + + setAction(&_action2); + } else { + _hotspot1.setPosition(Common::Point(110, 108)); + _hotspot2.setPosition(Common::Point(175, 136)); + _hotspot3.setPosition(Common::Point(162, 96)); + _hotspot4.setPosition(Common::Point(118, 141)); + _hotspot5.setPosition(Common::Point(124, 107)); + + setAction(&_action1); + } + + _soundHandler.play(116); + _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position); + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + + +/*-------------------------------------------------------------------------- + * Scene 2230 - Starcraft - Quinn's Room + * + *--------------------------------------------------------------------------*/ + +void Scene2230::Action1::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + switch (scene->_field30A) { + case 1: + scene->setAction(&scene->_action3); + break; + case 2: + scene->setAction(&scene->_action6); + break; + default: + setDelay(10); + break; + } + break; + case 1: { + Common::Point pt(84, 74); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point pt(63, 60); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 4: + scene->_hotspot1.animate(ANIM_MODE_6, this); + break; + case 5: + _globals->_sceneManager.changeScene(2150); + break; + } +} + +void Scene2230::Action2::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + switch (scene->_field30A) { + case 2: + scene->setAction(&scene->_action6, this); + break; + default: + setDelay(10); + break; + } + break; + case 1: { + _globals->_player.disableControl(); + scene->_field30A = 1; + _globals->_player._regionBitList |= ~0x80; + Common::Point pt(160, 96); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_player.setVisage(2235); + _globals->_player.setStrip2(1); + _globals->_player.fixPriority(100); + _globals->_player._frame = 1; + _globals->_player.setPosition(Common::Point(200, 68)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_soundHandler.play(157); + _globals->_player._moveDiff = Common::Point(1, 1); + _globals->_player.setAction(&scene->_action4); + _globals->_player._uiEnabled = true; + + _globals->_events.setCursor(CURSOR_USE); + remove(); + break; + } +} + +void Scene2230::Action3::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.setAction(NULL); + _globals->_player._moveDiff = Common::Point(5, 3); + _globals->_player.setStrip2(_globals->_player._strip); + + Common::Point pt(190, 74); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + + scene->_soundHandler.stop(); + break; + } + case 1: + _globals->_player._strip = 3; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player._regionBitList |= 0x80; + scene->_field30A = 0; + + _globals->_player.setVisage(0); + _globals->_player.setStrip2(-1); + _globals->_player.fixPriority(-1); + _globals->_player.setPosition(Common::Point(164, 96)); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._canWalk = true; + + _globals->_events.setCursor(CURSOR_USE); + remove(); + } +} + +void Scene2230::Action4::signal() { + switch (_actionIndex++) { + case 0: + Common::Point pt(190 + _globals->_randomSource.getRandomNumber(9), 68); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + _actionIndex = 0; + break; + } +} + +void Scene2230::Action5::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + switch (scene->_field30A) { + case 2: + scene->setAction(&scene->_action3, this); + break; + default: + setDelay(10); + break; + } + break; + case 1: { + _globals->_player.disableControl(); + Common::Point pt(209, 124); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_player.fixPriority(1430); + _globals->_player.setVisage(2232); + _globals->_player._strip = 1; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_events.setCursor(CURSOR_USE); + _globals->_player._uiEnabled = true; + scene->_field30A = 2; + remove(); + break; + } +} + +void Scene2230::Action6::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player._strip = 2; + _globals->_player._frame = 1; + _globals->_player.fixPriority(-1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_field30A = 0; + _globals->_player.setVisage(0); + _globals->_player._strip = 1; + _globals->_player._canWalk = true; + _globals->_player.animate(ANIM_MODE_1, NULL); + remove(); + break; + } +} + +void Scene2230::Action7::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + + switch (scene->_field30A) { + case 1: + scene->setAction(&scene->_action3, this); + break; + case 2: + scene->setAction(&scene->_action6, this); + break; + default: + setDelay(10); + break; + } + break; + case 1: { + Common::Point pt(140, 119); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_soundHandler.play(158); + scene->_hotspot8.setStrip2(2); + + Common::Point pt(scene->_hotspot8._position.x, 97); + NpcMover *mover = new NpcMover(); + scene->_hotspot8.addMover(mover, &pt, this); + break; + } + case 3: + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(2231); + scene->_hotspot2._strip = 3; + scene->_hotspot2.setPosition(Common::Point(166, 116)); + scene->_hotspot2.fixPriority(131); + scene->_hotspot2.animate(ANIM_MODE_5, this); + + scene->_hotspot8._frame = 2; + break; + case 4: + _globals->_sceneItems.push_front(&scene->_hotspot10); + _globals->_sceneItems.push_front(&scene->_hotspot11); + _globals->_sceneItems.push_front(&scene->_hotspot12); + + scene->_hotspot2.remove(); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2230::Action8::signal() { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + + switch (scene->_field30A) { + case 1: + scene->setAction(&scene->_action3, this); + break; + case 2: + scene->setAction(&scene->_action6, this); + break; + default: + setDelay(10); + break; + } + break; + case 1: { + Common::Point pt(140, 119); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: { + _globals->_sceneItems.remove(&scene->_hotspot10); + _globals->_sceneItems.remove(&scene->_hotspot11); + _globals->_sceneItems.remove(&scene->_hotspot12); + + switch (scene->_field30A) { + case 1: + scene->setAction(&scene->_action3, this); + break; + case 2: + scene->setAction(&scene->_action6, this); + break; + default: + setDelay(10); + break; + } + break; + } + case 3: + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(2231); + scene->_hotspot2._strip = 3; + scene->_hotspot2._frame = scene->_hotspot2.getFrameCount(); + scene->_hotspot2.setPosition(Common::Point(166, 116)); + scene->_hotspot2.fixPriority(131); + scene->_hotspot2.animate(ANIM_MODE_6, this); + break; + case 4: { + scene->_soundHandler.play(158); + scene->_hotspot2.remove(); + scene->_hotspot8._frame = 1; + + Common::Point pt(scene->_hotspot8._position.x, 133); + NpcMover *mover = new NpcMover(); + scene->_hotspot8.addMover(mover, &pt, this); + break; + } + case 5: + scene->_hotspot8.setStrip2(1); + _globals->_player.enableControl(); + + remove(); + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +void Scene2230::Hotspot1::doAction(int action) { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2230, 0); + break; + case CURSOR_USE: + scene->setAction(&scene->_action1); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot3::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(4)) + SceneItem::display2(2230, 1); + else { + SceneItem::display2(2230, 1); + SceneItem::display2(2230, 2); + SceneItem::display2(2230, 3); + _globals->setFlag(4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot4::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(30)) + SceneItem::display2(2230, 6); + else if (_globals->getFlag(29)) { + SceneItem::display2(2230, 5); + _globals->setFlag(30); + } else { + SceneItem::display2(2230, 4); + _globals->setFlag(29); + } + break; + case CURSOR_USE: + SceneItem::display2(2230, 7); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot5::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(5)) + SceneItem::display2(2230, 9); + else { + _globals->setFlag(5); + SceneItem::display2(2230, 8); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot6::doAction(int action) { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(6)) + SceneItem::display2(2230, 11); + else { + _globals->setFlag(6); + SceneItem::display2(2230, 10); + } + break; + case CURSOR_USE: + if (scene->_field30A == 1) + scene->setAction(&scene->_action3); + else if (_globals->getFlag(13)) + SceneItem::display2(2230, 28); + else + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot7::doAction(int action) { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(7)) + SceneItem::display2(2230, 13); + else { + _globals->setFlag(6); + SceneItem::display2(2230, 12); + } + break; + case CURSOR_USE: + if (scene->_field30A == 2) + scene->setAction(&scene->_action6); + else if (_globals->getFlag(13)) + SceneItem::display2(2230, 29); + else + scene->setAction(&scene->_action5); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot8::doAction(int action) { + Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (scene->_hotspot8._strip == 1) { + if (_globals->getFlag(22)) + SceneItem::display2(2230, 19); + else { + _globals->setFlag(22); + SceneItem::display2(2230, 14); + } + } else { + if (_globals->getFlag(25)) + SceneItem::display2(2230, 21); + else { + _globals->setFlag(25); + SceneItem::display2(2230, 20); + } + } + break; + case CURSOR_USE: + if (scene->_hotspot8._strip == 1) + scene->setAction(&scene->_action7); + else + scene->setAction(&scene->_action8); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot10::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(26)) + SceneItem::display2(2230, 25); + else { + _globals->setFlag(26); + SceneItem::display2(2230, 24); + } + break; + case CURSOR_USE: + SceneItem::display2(2230, 28); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot11::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(27)) + SceneItem::display2(2230, 23); + else { + _globals->setFlag(27); + SceneItem::display2(2230, 22); + } + break; + case CURSOR_USE: + SceneItem::display2(2230, 28); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2230::Hotspot12::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(28)) + SceneItem::display2(2230, 27); + else { + _globals->setFlag(28); + SceneItem::display2(2230, 26); + } + break; + case CURSOR_USE: + SceneItem::display2(2230, 28); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene2230::Scene2230() : + _hotspot9(0, CURSOR_LOOK, 2230, 16, CURSOR_USE, 2230, 18, LIST_END) { +} + +void Scene2230::postInit(SceneObjectList *OwnerList) { + loadScene(2230); + Scene::postInit(); + setZoomPercents(75, 80, 120, 100); + + _hotspot1.postInit(); + _hotspot1.setVisage(2230); + _hotspot1._frame = 1; + _hotspot1.animate(ANIM_MODE_NONE, 0); + _hotspot1.setPosition(Common::Point(72, 69)); + _hotspot1.changeZoom(100); + + _hotspot8.postInit(); + _hotspot8.setVisage(2231); + _hotspot8._frame = 1; + _hotspot8.animate(ANIM_MODE_NONE, 0); + _hotspot8.setPosition(Common::Point(164, 133)); + _hotspot8.changeZoom(100); + _hotspot8.fixPriority(129); + + _rect1 = Rect(59, 64, 89, 74); + + _globals->_player.postInit(); + _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); + _globals->_player.animate(ANIM_MODE_1, 0); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(80, 80)); + _globals->_player._moveDiff.y = 3; + _globals->_player._regionBitList |= 0x80; + _globals->_player.changeZoom(-1); + + _field30A = 0; + _globals->_player.enableControl(); + + _hotspot5.setBounds(Rect(108, 34, 142, 76)); + _hotspot4.setBounds(Rect(92, 14, 106, 57)); + _hotspot6.setBounds(Rect(169, 58, 261, 95)); + _hotspot7.setBounds(Rect(111, 117, 222, 158)); + _hotspot3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot10.setBounds(Rect(170, 96, 176, 106)); + _hotspot11.setBounds(Rect(158, 109, 164, 115)); + _hotspot12.setBounds(Rect(170, 109, 177, 115)); + + _globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7, + &_hotspot1, &_hotspot3, NULL); + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2230::synchronize(Serializer &s) { + Scene::synchronize(s); + _rect1.synchronize(s); + s.syncAsSint16LE(_field30A); +} + +void Scene2230::dispatch() { + Scene::dispatch(); + + if (!_action) { + if (_rect1.contains(_globals->_player._position)) + setAction(&_action1); + } +} + +/*-------------------------------------------------------------------------- + * Scene 2280 - Starcraft - Storage Room + * + *--------------------------------------------------------------------------*/ + +void Scene2280::Action1::signal() { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(192, 97); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler.play(162); + scene->_hotspot16.animate(ANIM_MODE_5, this); + break; + case 2: { + Common::Point pt(218, 87); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_player.setStrip(3); + setDelay(10); + break; + case 4: + _globals->_player.fixPriority(1); + scene->_soundHandler.play(162); + scene->_hotspot16.animate(ANIM_MODE_6, this); + break; + case 5: + _globals->_sceneManager.changeScene(7000); + break; + } +} + +void Scene2280::Action2::signal() { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(94, 117); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler.play(265); + + _globals->_player.setVisage(2162); + _globals->_player._frame = 1; + _globals->_player._strip = 1; + _globals->_player.animate(ANIM_MODE_5, this); + + scene->_hotspot8.remove(); + scene->_hotspot10.remove(); + break; + case 2: + _globals->_player._frame = 1; + _globals->_player._strip = 2; + _globals->_player.animate(ANIM_MODE_4, 3, 1, this); + break; + case 3: + _globals->_player.animate(ANIM_MODE_5, this); + scene->_hotspot12.remove(); + break; + case 4: + scene->_soundHandler.play(266); + _globals->_player.setVisage(2170); + _globals->_player._frame = 1; + _globals->_player._strip = 4; + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._moveDiff = Common::Point(4, 1); + + _globals->setFlag(13); + SceneItem::display2(2280, 37); + + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2280::Action3::signal() { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + Common::Point pt(94, 117); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler.play(265); + + _globals->_player.setVisage(2162); + _globals->_player._frame = 6; + _globals->_player._strip = 2; + _globals->_player.animate(ANIM_MODE_4, 3, -1, this); + break; + case 2: + scene->_hotspot12.postInit(); + scene->_hotspot12.setVisage(2280); + scene->_hotspot12._strip = 2; + scene->_hotspot12._frame = 3; + scene->_hotspot12.setPosition(Common::Point(88, 76)); + scene->_hotspot12.fixPriority(1); + + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player._strip = 1; + _globals->_player._frame = 12; + + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 4: + scene->_hotspot8.postInit(); + scene->_hotspot8.setVisage(2280); + scene->_hotspot8._strip = 2; + scene->_hotspot8._frame = 1; + scene->_hotspot8.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot8.setPosition(Common::Point(79, 108)); + scene->_hotspot8.changeZoom(100); + scene->_hotspot8.fixPriority(1); + + scene->_hotspot10.postInit(); + scene->_hotspot10.setVisage(2280); + scene->_hotspot10._strip = 2; + scene->_hotspot10._frame = 2; + scene->_hotspot10.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot10.setPosition(Common::Point(79, 104)); + scene->_hotspot10.changeZoom(100); + scene->_hotspot10.fixPriority(1); + + _globals->clearFlag(13); + + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._strip = 4; + _globals->_player._moveDiff = Common::Point(3, 5); + + SceneItem::display2(2280, 38); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2280::Action4::signal() { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + switch (_state) { + case 1: + case 51: { + Common::Point pt(163, 67); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: + case 50: { + Common::Point pt(173, 63); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + } + break; + } + case 1: + _globals->_player.setVisage(2161); + _globals->_player._strip = 1; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + switch (_state) { + case 1: + scene->_hotspot18.remove(); + RING_INVENTORY._scanner._sceneNumber = 1; + break; + case 6: + scene->_hotspot17.remove(); + RING_INVENTORY._medkit._sceneNumber = 1; + break; + case 50: + scene->_hotspot17.postInit(); + scene->_hotspot17.setVisage(2161); + scene->_hotspot17._strip = 2; + scene->_hotspot17._frame = 1; + scene->_hotspot17.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot17.setPosition(Common::Point(162, 39)); + scene->_hotspot17.changeZoom(100); + scene->_hotspot17.fixPriority(1); + + RING_INVENTORY._medkit._sceneNumber = 2280; + _globals->_sceneItems.push_front(&scene->_hotspot17); + break; + case 51: + scene->_hotspot18.postInit(); + scene->_hotspot18.setVisage(2161); + scene->_hotspot18._strip = 2; + scene->_hotspot18._frame = 2; + scene->_hotspot18.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot18.setPosition(Common::Point(152, 43)); + scene->_hotspot18.changeZoom(100); + scene->_hotspot18.fixPriority(1); + + RING_INVENTORY._scanner._sceneNumber = 2280; + _globals->_sceneItems.push_front(&scene->_hotspot18); + break; + } + + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player.enableControl(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._strip = 2; + + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2280::Hotspot1::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(16)) + SceneItem::display2(2280, 22); + else { + _globals->setFlag(16); + SceneItem::display2(2230, 21); + } + break; + case CURSOR_USE: + if (!_globals->getFlag(15)) + SceneItem::display2(2280, 23); + else if (!_globals->getFlag(13)) + SceneItem::display2(2280, 46); + else { + _globals->_player.disableControl(); + scene->setAction(&scene->_action1); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot2::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(2)) + SceneItem::display2(2280, 1); + else { + _globals->setFlag(2); + SceneItem::display2(2280, 0); + } + break; + case CURSOR_USE: + SceneItem::display2(2280, 2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot4::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(21)) + SceneItem::display2(2280, 33); + else { + _globals->setFlag(21); + SceneItem::display2(2280, 32); + } + break; + case CURSOR_USE: + SceneItem::display2(2280, 34); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot7::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2280, 24); + break; + case OBJECT_SCANNER: + if (_globals->getFlag(13)) + SceneItem::display2(2280, 43); + else { + _globals->_player.disableControl(); + scene->_action4._state = 51; + _globals->_events.setCursor(CURSOR_WALK); + _globals->_events._currentCursor = CURSOR_700; + scene->setAction(&scene->_action4); + } + break; + case OBJECT_MEDKIT: + if (_globals->getFlag(13)) + SceneItem::display2(2280, 43); + else { + _globals->_player.disableControl(); + scene->_action4._state = 50; + _globals->_events.setCursor(CURSOR_WALK); + _globals->_events._currentCursor = CURSOR_700; + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot8::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2280, 3); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot10::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2280, 4); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot12::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2280, 11); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot14::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2280, 3); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + if (_globals->getFlag(13)) + scene->setAction(&scene->_action3); + else + scene->setAction(&scene->_action2); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot17::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(18)) + SceneItem::display2(2280, 26); + else { + _globals->setFlag(18); + SceneItem::display2(2280, 25); + } + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2280, 29); + else { + _globals->_player.disableControl(); + scene->_action4._state = 6; + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2280::Hotspot18::doAction(int action) { + Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(19)) + SceneItem::display2(2280, 28); + else { + _globals->setFlag(19); + SceneItem::display2(2280, 27); + } + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2280, 29); + else { + _globals->_player.disableControl(); + scene->_action4._state = 1; + scene->setAction(&scene->_action4); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene2280::Scene2280() : + _hotspot3(0, CURSOR_LOOK, 2280, 30, CURSOR_USE, 2280, 31, LIST_END), + _hotspot5(0, CURSOR_LOOK, 2280, 35, CURSOR_USE, 2280, 36, LIST_END), + _hotspot6(0, CURSOR_LOOK, 2280, 19, CURSOR_USE, 2280, 20, LIST_END), + _hotspot9(0, CURSOR_LOOK, 2280, 5, CURSOR_USE, 2280, 6, LIST_END), + _hotspot11(0, CURSOR_LOOK, 2280, 7, CURSOR_USE, 2280, 8, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2280, 9, CURSOR_USE, 2280, 10, LIST_END), + _hotspot15(0, CURSOR_LOOK, 2280, 45, LIST_END), + _hotspot16(0, CURSOR_LOOK, 2280, 16, CURSOR_USE, 2280, 42, LIST_END) { +} + +void Scene2280::postInit(SceneObjectList *OwnerList) { + loadScene(2280); + Scene::postInit(); + setZoomPercents(0, 70, 200, 100); + + _hotspot16.postInit(); + _hotspot16.setVisage(2281); + _hotspot16.setPosition(Common::Point(208, 90)); + _hotspot16.fixPriority(80); + + if (RING_INVENTORY._medkit._sceneNumber == 2280) { + _hotspot17.postInit(); + _hotspot17.setVisage(2161); + _hotspot17._strip = 2; + _hotspot17.setPosition(Common::Point(162, 39)); + _hotspot17.fixPriority(1); + + _globals->_sceneItems.push_back(&_hotspot17); + } + + if (RING_INVENTORY._scanner._sceneNumber == 2280) { + _hotspot18.postInit(); + _hotspot18.setVisage(2161); + _hotspot18._strip = 2; + _hotspot18._frame = 2; + _hotspot17.setPosition(Common::Point(152, 43)); + _hotspot17.fixPriority(1); + + _globals->_sceneItems.push_back(&_hotspot17); + } + + if (!_globals->getFlag(13)) { + _hotspot8.postInit(); + _hotspot8.setVisage(2280); + _hotspot8._strip = 2; + _hotspot8.setPosition(Common::Point(79, 108)); + _hotspot8.fixPriority(1); + + _hotspot10.postInit(); + _hotspot10.setVisage(2280); + _hotspot10._strip = 2; + _hotspot10._frame = 2; + _hotspot10.setPosition(Common::Point(79, 104)); + _hotspot10.fixPriority(2); + + _hotspot12.postInit(); + _hotspot12.setVisage(2280); + _hotspot12._strip = 2; + _hotspot12._frame = 3; + _hotspot12.setPosition(Common::Point(88, 76)); + _hotspot12.fixPriority(1); + + _globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL); + } + + _hotspot14.setBounds(Rect(70, 50, 90, 104)); + + _hotspot9.postInit(); + _hotspot9.setVisage(2280); + _hotspot9.setPosition(Common::Point(104, 96)); + _hotspot9.fixPriority(1); + + _hotspot11.postInit(); + _hotspot11.setVisage(2280); + _hotspot11._frame = 2; + _hotspot11.setPosition(Common::Point(130, 79)); + _hotspot11.fixPriority(1); + + _hotspot13.postInit(); + _hotspot13.setVisage(2280); + _hotspot13._frame = 3; + _hotspot13.setPosition(Common::Point(113, 63)); + _hotspot13.fixPriority(1); + + _hotspot1.setBounds(Rect(225, 70, 234, 80)); + _hotspot2.setBounds(Rect(44, 78, 56, 105)); + _hotspot3.setBounds(Rect(47, 108, 56, 117)); + _hotspot4.setBounds(Rect(56, 78, 69, 101)); + _hotspot5.setBounds(Rect(56, 108, 66, 113)); + _hotspot6.setBounds(Rect(261, 39, 276, 90)); + _hotspot7.setBounds(Rect(142, 19, 174, 38)); + _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + + _exitRect = Rect(145, 180, 195, 195); + + _globals->_player.postInit(); + _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(146, 161)); + _globals->_player.changeZoom(-1); + _globals->_player._moveDiff = Common::Point(4, 3); + + if ((_globals->_sceneManager._previousScene != 7300) && (_globals->_sceneManager._previousScene != 7000)) { + _globals->_player.enableControl(); + } else { + _globals->setFlag(109); + _globals->_player.fixPriority(76); + _globals->_player.disableControl(); + + _sceneMode = 2281; + setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL); + + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + } + + _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, + &_hotspot6, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot1, &_hotspot16, &_hotspot15, NULL); + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; +} + +void Scene2280::signal() { + if (_sceneMode == 2281) { + _globals->_player.fixPriority(-1); + _globals->_player.enableControl(); + } +} + +void Scene2280::dispatch() { + Scene::dispatch(); + if (!_action) { + if (_exitRect.contains(_globals->_player._position)) + _globals->_sceneManager.changeScene(2150); + } +} + +void Scene2280::synchronize(Serializer &s) { + Scene::synchronize(s); + _exitRect.synchronize(s); +} + +/*-------------------------------------------------------------------------- + * Scene 2300 - Starcraft - Hanger Bay + * + *--------------------------------------------------------------------------*/ + +void Scene2300::Action1::signal() { + // Quinn and Seeker + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: { + Common::Point pt(SCREEN_WIDTH, SCREEN_HEIGHT); + NpcMover *mover = new NpcMover(); + scene->_hotspot2.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_hotspot8.setAction(&scene->_action4); + scene->_soundHandler2.play(21); + + Common::Point pt1(95, scene->_hotspot5._position.y); + NpcMover *mover1 = new NpcMover(); + scene->_hotspot5.addMover(mover1, &pt1, this); + + Common::Point pt2(99, scene->_hotspot6._position.y); + NpcMover *mover2 = new NpcMover(); + scene->_hotspot6.addMover(mover2, &pt2, NULL); + break; + } + case 3: + setDelay(2); + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_WALK); + break; + case 4: { + scene->_hotspot5.setVisage(93); + scene->_hotspot6.setVisage(94); + scene->_hotspot5.setStrip(1); + scene->_hotspot6.setStrip(1); + scene->_hotspot5.changeZoom(50); + scene->_hotspot6.changeZoom(50); + scene->_hotspot5._moveDiff.x = 5; + scene->_hotspot6._moveDiff.x = 5; + scene->_hotspot5.animate(ANIM_MODE_1, NULL); + scene->_hotspot6.animate(ANIM_MODE_1, NULL); + + Common::Point pt1(178, 147); + NpcMover *mover1 = new NpcMover(); + scene->_hotspot5.addMover(mover1, &pt1, this); + + Common::Point pt2(170, 145); + NpcMover *mover2 = new NpcMover(); + scene->_hotspot6.addMover(mover2, &pt2, this); + break; + } + case 6: + scene->_soundHandler1.play(28); + _globals->_player.disableControl(); + + scene->_hotspot2.setVisage(40); + scene->_hotspot2.setStrip(4); + scene->_hotspot2.setFrame(1); + scene->_hotspot2.animate(ANIM_MODE_5, NULL); + + _globals->_player.setVisage(40); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 7: + _globals->_soundHandler.play(77, this); + break; + case 8: + _globals->_game->endGame(2300, 0); + remove(); + break; + case 9: + if (scene->_hotspot5._mover) + scene->_hotspot5.addMover(NULL); + if (scene->_hotspot6._mover) + scene->_hotspot6.addMover(NULL); + + scene->_hotspot5.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot6.animate(ANIM_MODE_NONE, NULL); + + _globals->_player.disableControl(); + _globals->_player.setVisage(2672); + _globals->_player._strip = 5; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 10: + _globals->_player.setVisage(2674); + _globals->_player._strip = 5; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 11: + scene->_soundHandler1.play(28); + + scene->_hotspot5._strip = 2; + scene->_hotspot6._strip = 2; + scene->_hotspot5._frame = 1; + scene->_hotspot6._frame = 1; + scene->_hotspot5.animate(ANIM_MODE_5, NULL); + scene->_hotspot6.animate(ANIM_MODE_5, NULL); + scene->_hotspot5.fixPriority(20); + scene->_hotspot6.fixPriority(20); + + _globals->_player.setVisage(2672); + _globals->_player._strip = 5; + _globals->_player._frame = _globals->_player.getFrameCount(); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 12: + scene->_soundHandler1.play(77); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(4); + _globals->_player._uiEnabled = false; + setDelay(60); + break; + case 13: + scene->_stripManager.start(2300, this); + break; + case 14: + setDelay(5); + _actionIndex = 16; + break; + case 15: { + Common::Point pt1(101, 148); + PlayerMover *mover1 = new PlayerMover(); + _globals->_player.addMover(mover1, &pt1, this); + + Common::Point pt2(scene->_hotspot5._position.x + 5, scene->_hotspot5._position.y + 5); + NpcMover *mover2 = new NpcMover(); + scene->_hotspot2.addMover(mover2, &pt2, NULL); + break; + } + case 16: + _globals->_sceneManager.changeScene(2000); + remove(); + break; + } +} + +void Scene2300::Action2::signal() { + // Miranda tearing cables + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(30); + break; + case 1: { + Common::Point pt(153, 135); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(2030, this); + break; + case 3: + _globals->_player.enableControl(); + setDelay(600); + break; + case 4: { + _globals->_player.disableControl(); + + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(2801); + scene->_hotspot2.setPosition(Common::Point(109, 145)); + scene->_hotspot2.changeZoom(50); + scene->_hotspot2.animate(ANIM_MODE_1, NULL); + scene->_hotspot2.setObjectWrapper(new SceneObjectWrapper()); + + Common::Point pt(160, 145); + NpcMover *mover = new NpcMover(); + scene->_hotspot2.addMover(mover, &pt, this); + break; + } + case 5: + scene->_stripManager.start(2032, this); + break; + case 6: + scene->_hotspot2.setVisage(93); + scene->_hotspot2.setStrip(3); + scene->_hotspot2.setFrame(1); + scene->_hotspot2.animate(ANIM_MODE_5, this); + + scene->_soundHandler1.play(28); + scene->_soundHandler2.play(97); + break; + case 7: + scene->_hotspot7._strip = 2; + scene->_hotspot7._frame = 1; + scene->_hotspot7.animate(ANIM_MODE_5, this); + break; + case 8: + scene->_hotspot2.animate(ANIM_MODE_6, this); + break; + case 9: + scene->_stripManager.start(2035, this); + break; + case 10: + _globals->_sceneManager.changeScene(2310); + break; + } +} + +void Scene2300::Action3::signal() { + // Stunned Miranda + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + Common::Point pt(153, 135); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + _globals->_player.disableControl(); + _globals->_player.setVisage(2672); + _globals->_player._strip = 2; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player.setVisage(2674); + _globals->_player._strip = 2; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_soundHandler1.play(97); + scene->_soundHandler2.play(28); + + scene->_hotspot7._strip = 2; + scene->_hotspot7._frame = 1; + scene->_hotspot7.animate(ANIM_MODE_5, this); + + _globals->_player.setVisage(2672); + _globals->_player._strip = 2; + _globals->_player._frame = _globals->_player.getFrameCount(); + _globals->_player.animate(ANIM_MODE_6, NULL); + break; + case 4: + scene->_soundHandler2.play(97); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(1); + scene->_stripManager.start(2034, this); + break; + case 5: + setDelay(10); + break; + case 6: + _globals->_sceneManager.changeScene(2310); + break; + } +} + +void Scene2300::Action4::signal() { + // Ennemies coming + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_hotspot8.animate(ANIM_MODE_5, this); + scene->_soundHandler1.play(11); + break; + case 1: + scene->_hotspot9.postInit(); + scene->_hotspot9.setVisage(2301); + scene->_hotspot9.setStrip2(2); + scene->_hotspot9.setFrame(3); + scene->_hotspot9.setPosition(Common::Point(273, 199)); + scene->_hotspot9.fixPriority(19); + scene->_hotspot9.animate(ANIM_MODE_5, this); + scene->_soundHandler1.play(11); + break; + case 2: + scene->_hotspot8.remove(); + + scene->_hotspot10.postInit(); + scene->_hotspot10.setVisage(2301); + scene->_hotspot10.setStrip(3); + scene->_hotspot10.setFrame(4); + scene->_hotspot10.setPosition(Common::Point(292, 113)); + scene->_hotspot10.animate(ANIM_MODE_5, this); + scene->_soundHandler1.play(11); + break; + case 3: + scene->_soundHandler1.play(13); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2300::Hotspot5::doAction(int action) { + // Ennemies + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + _globals->_player.disableControl(); + _globals->_player.addMover(NULL); + scene->_action1.setActionIndex(9); + scene->_action1.setDelay(1); + break; + case CURSOR_LOOK: + SceneItem::display2(2300, 3); + break; + case CURSOR_USE: + SceneItem::display2(2300, 4); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2300::Hotspot7::doAction(int action) { + // Miranda + Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + scene->setAction(&scene->_action3); + break; + case CURSOR_LOOK: + SceneItem::display2(2300, 2); + break; + case CURSOR_USE: + SceneItem::display2(2300, 21); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene2300::Scene2300() : + _hotspot11(0, CURSOR_LOOK, 2300, 6, CURSOR_USE, 2300, 14, LIST_END), + _hotspot12(0, CURSOR_LOOK, 2300, 5, CURSOR_USE, 2300, 13, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2300, 9, CURSOR_USE, 2300, 20, LIST_END), + _hotspot14(0, CURSOR_LOOK, 2300, 7, CURSOR_USE, 2300, 15, LIST_END), + _hotspot15(0, CURSOR_LOOK, 2300, 1, LIST_END) { +} + +void Scene2300::postInit(SceneObjectList *OwnerList) { + loadScene(2300); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + + RING_INVENTORY._stunner._sceneNumber = 1; + RING_INVENTORY._infoDisk._sceneNumber = 1; + + _hotspot8.postInit(); + _hotspot8.setVisage(2301); + _hotspot8.setPosition(Common::Point(288, 74)); + + _globals->_soundHandler.play(96); + if (_globals->_sceneManager._previousScene == 2000) { + _hotspot8.remove(); + + _hotspot9.postInit(); + _hotspot9.setVisage(2301); + _hotspot9.setStrip2(2); + _hotspot9._frame = _hotspot9.getFrameCount(); + _hotspot9.setPosition(Common::Point(273, 199)); + _hotspot9.fixPriority(1); + + _hotspot10.postInit(); + _hotspot10.setVisage(2301); + _hotspot10.setStrip(3); + _hotspot10._frame = _hotspot10.getFrameCount(); + _hotspot10.setPosition(Common::Point(292, 113)); + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.setPosition(Common::Point(109, 139)); + _globals->_player.changeZoom(40); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.disableControl(); + + _hotspot7.postInit(); + _hotspot7.setVisage(2302); + _hotspot7.animate(ANIM_MODE_2, NULL); + _hotspot7.setPosition(Common::Point(229, 125)); + _hotspot7._numFrames = 5; + + _soundHandler1.play(95); + _soundHandler2.play(96); + _globals->_sceneItems.push_back(&_hotspot7); + + setAction(&_action2); + } else { + _hotspot8._numFrames = 3; + + _hotspot3.postInit(); + _hotspot3.setVisage(2331); + _hotspot3.setStrip(7); + _hotspot3.setPosition(Common::Point(231, 190)); + _hotspot3.changeZoom(40); + + _hotspot2.postInit(); + _hotspot2.setVisage(2801); + _hotspot2.setPosition(Common::Point(269, 195)); + _hotspot2.changeZoom(50); + _hotspot2.animate(ANIM_MODE_1, NULL); + _hotspot2.setObjectWrapper(new SceneObjectWrapper()); + + _hotspot1.postInit(); + _hotspot1.setVisage(2331); + _hotspot1.setStrip(7); + _hotspot1.setPosition(Common::Point(255, 190)); + _hotspot1.changeZoom(40); + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.setPosition(Common::Point(203, 191)); + _globals->_player.changeZoom(40); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.disableControl(); + + _hotspot5.postInit(); + _hotspot5.setVisage(91); + _hotspot5.setPosition(Common::Point(343, 145)); + _hotspot5._moveDiff = Common::Point(35, 35); + _hotspot5.changeZoom(40); + _hotspot5.setObjectWrapper(new SceneObjectWrapper()); + + _hotspot6.postInit(); + _hotspot6.setVisage(92); + _hotspot6.setPosition(Common::Point(343, 130)); + _hotspot6._moveDiff = Common::Point(35, 35); + _hotspot6.changeZoom(40); + _hotspot6.setObjectWrapper(new SceneObjectWrapper()); + + _globals->_sceneItems.push_back(&_hotspot5); + setAction(&_action1); + } + + _hotspot12._sceneRegionId = 8; + _hotspot11._sceneRegionId = 9; + _hotspot13._sceneRegionId = 10; + _hotspot14._sceneRegionId = 11; + + _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL); +} + +/*-------------------------------------------------------------------------- + * Scene 2310 - Starcraft - Copy Protection Screen + * + *--------------------------------------------------------------------------*/ + +Scene2310::Scene2310() { + _pageList[0].set(0, 0, 0, 0, 0, 0); + _pageList[1].set(1, 0, 3, 2, 1, 4); + _pageList[2].set(2, 1, 4, 3, 2, 0); + _pageList[3].set(3, 2, 0, 4, 3, 1); + _pageList[4].set(4, 3, 1, 0, 2, 4); + _pageList[5].set(5, 4, 2, 1, 3, 0); + _pageList[6].set(6, 0, 4, 2, 3, 1); + _pageList[7].set(7, 1, 0, 2, 4, 3); + _pageList[8].set(8, 2, 1, 3, 0, 4); + _pageList[9].set(9, 3, 2, 4, 1, 0); + _pageList[10].set(10, 4, 1, 2, 0, 3); + _pageList[11].set(11, 0, 2, 3, 4, 1); + _pageList[12].set(12, 1, 2, 0, 4, 3); + _pageList[13].set(13, 2, 4, 0, 3, 1); + _pageList[14].set(14, 3, 4, 1, 0, 2); + _pageList[15].set(15, 4, 3, 1, 2, 0); + _pageList[16].set(16, 0, 1, 4, 2, 3); + _pageList[17].set(17, 1, 3, 4, 0, 2); + _pageList[18].set(18, 2, 3, 0, 1, 4); + _pageList[19].set(19, 3, 0, 1, 4, 2); + _pageList[20].set(20, 4, 0, 3, 1, 2); + + _rectList[0].set(135, 70, 151, 140); + _rectList[1].set(151, 70, 167, 140); + _rectList[2].set(167, 70, 183, 140); + _rectList[3].set(183, 70, 199, 140); + _rectList[4].set(199, 70, 215, 140); + + _wireIndex = 5; +} + +void Scene2310::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + loadScene(2301); + Common::Point pointList[5] = { Common::Point(142, 82), Common::Point(158, 82), Common::Point(174, 82), + Common::Point(190, 82), Common::Point(205, 82) }; + + for (int idx = 0; idx < 5; ++idx) { + _wireList[idx].postInit(); + _wireList[idx].setVisage(2300); + _wireList[idx]._strip = idx + 1; + _wireList[idx]._frame = 1; + _wireList[idx].setPosition(pointList[idx]); + } + + _globals->_player.disableControl(); + _globals->_events.setCursor(CURSOR_WALK); + + if (_vm->getFeatures() & GF_CD) + _pageIndex = _globals->_randomSource.getRandomNumber(14) + 2; + else + _pageIndex = _globals->_randomSource.getRandomNumber(19) + 1; + signal(); +} + +void Scene2310::signal() { + switch (_sceneMode++) { + case 0: { + Common::String fmtString = _resourceManager->getMessage(2300, 22); + Common::String msg = Common::String::format(fmtString.c_str(), _pageList[_pageIndex]._pageNumber); + + _sceneText._width = 280; + _sceneText._textMode = ALIGN_CENTER; + _sceneText._color1 = 35; + _sceneText._fontNumber = 2; + _sceneText.setup(msg); + _sceneText.fixPriority(255); + _sceneText.setPosition(Common::Point(30, 20)); + break; + } + case 1: { + Common::String msg = _resourceManager->getMessage(2300, 23); + _sceneText.setup(msg); + _sceneText.fixPriority(255); + _sceneText.setPosition(Common::Point(30, 170)); + + _globals->_sceneObjects->draw(); + _globals->_events.waitForPress(); + + _sceneText.hide(); + _globals->_sceneObjects->draw(); + + _globals->_sceneManager.changeScene(2200); + break; + } + } +} + +void Scene2310::synchronize(Serializer &s) { + Scene::synchronize(s); + + s.syncAsSint16LE(_wireIndex); + s.syncAsSint16LE(_pageIndex); +} + +void Scene2310::process(Event &event) { + int frameNum = 0; + + if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) { + int idx = 0; + while (idx < 5) { + if (_rectList[idx].contains(event.mousePos)) + break; + ++idx; + } + + if (idx < 5) { + // In handled rectangle area + if (_wireIndex == 5) { + // No wire is currently active, so start moving designated wire + _wireIndex = idx; + frameNum = idx + 2; + + if (event.mousePos.y > 105) + idx = findObject(idx); + + if (idx != 5) { + _wireList[idx].hide(); + _globals->_sceneObjects->draw(); + _wireList[idx].setFrame(frameNum); + + _wireList[idx].show(); + _globals->_sceneObjects->draw(); + } + } else { + // End the moving of the currently active wire + _wireList[_wireIndex].setFrame(idx + 2); + _wireIndex = 5; + + // Check if solution has been reached + int idx2 = 0; + do { + int objIndex = findObject(idx2); + if (_pageList[_pageIndex]._connectionList[idx2] != objIndex) + // Mismatch + break; + } while (++idx2 < 5); + + if (idx2 == 5) + // All the entries are correct + signal(); + } + + event.handled = true; + } else if (_wireIndex != 5) { + // Reset the active wire back to unplugged + _wireList[_wireIndex].setFrame(1); + _wireIndex = 5; + } + } +} + +void Scene2310::dispatch() { + if (_wireIndex != 5) { + for (int idx = 0; idx < 5; ++idx) { + if (_rectList[idx].contains(_globals->_events._mousePos)) { + _wireList[_wireIndex].setFrame(idx + 2); + return; + } + } + + _wireList[_wireIndex].setFrame(1); + } +} + +int Scene2310::findObject(int objIndex) { + for (int idx = 0; idx < 5; ++idx) { + if (_wireList[idx]._frame == (objIndex + 2)) + return idx; + } + + return 5; +} + +/*-------------------------------------------------------------------------- + * Scene 2320 - Starcraft - Lander Bay + * + *--------------------------------------------------------------------------*/ + +void Scene2320::Action1::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + if (_globals->_sceneManager._previousScene == 2120) + _actionIndex = 3; + break; + case 1: { + Common::Point pt(513, 144); + NpcMover *mover = new NpcMover(); + scene->_hotspot11.addMover(mover, &pt, this); + break; + } + case 2: { + Common::Point pt(510, 164); + NpcMover *mover = new NpcMover(); + scene->_hotspot11.addMover(mover, &pt, this); + break; + } + case 3: + setAction(&scene->_sequenceManager2, this, 2328, &scene->_hotspot11, NULL); + break; + case 4: + scene->_hotspot11.animate(ANIM_MODE_NONE); + setDelay(120); + _actionIndex = 3; + break; + } +} + +void Scene2320::Action2::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_soundHandler.play(253); + scene->_hotspot13.fixPriority(99); + + Common::Point pt(scene->_hotspot13._position.x, 200); + NpcMover *mover = new NpcMover(); + scene->_hotspot13.addMover(mover, &pt, this); + break; + } + case 1: + scene->_hotspot13.hide(); + remove(); + break; + } +} + +void Scene2320::Action3::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + Common::Point pt(320, 86); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 1: + scene->_soundHandler.play(162); + scene->_hotspot6.animate(ANIM_MODE_5, this); + break; + case 2: { + Common::Point pt(320, 79); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_player.fixPriority(scene->_hotspot6._priority - 1); + _globals->_player._strip = 3; + setDelay(10); + break; + case 4: + scene->_area1.display(); + scene->_area2.display(); + scene->_area3.display(); + scene->_area4.display(); + + scene->_area3.draw(true); + _state = 0; + _globals->_events.setCursor(CURSOR_USE); + + while (!_state && !_vm->shouldQuit()) { + // Wait for an event + Event event; + if (!_globals->_events.getEvent(event)) { + g_system->updateScreen(); + g_system->delayMillis(10); + continue; + } + + if (scene->_area1._bounds.contains(event.mousePos)) { + scene->_area1.draw(true); + scene->_area3.draw(false); + _state = scene->_area1._actionId; + } + if (scene->_area2._bounds.contains(event.mousePos)) { + scene->_area3.draw(false); + scene->_area2.draw(true); + _state = scene->_area2._actionId; + } + if (scene->_area3._bounds.contains(event.mousePos)) { + scene->_area3.draw(true); + _state = scene->_area3._actionId; + } + } + + scene->_soundHandler.play(161); + scene->_area1.restore(); + scene->_area2.restore(); + scene->_area3.restore(); + scene->_area4.restore(); + + if (_state == 2320) { + setDelay(10); + } else { + scene->_soundHandler.play(162); + scene->_hotspot6.animate(ANIM_MODE_6, this); + } + break; + case 5: { + if (_state == 2320) + _globals->_player.fixPriority(-1); + else + _globals->_sceneManager.changeScene(_state); + + Common::Point pt(320, 86); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: + scene->_soundHandler.play(162); + scene->_hotspot6.animate(ANIM_MODE_6, this); + break; + case 7: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2320::Action4::signal() { + // Fly Cycle actions + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: { + Common::Point pt(213, 84); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + case 16: + _globals->_player.setVisage(2109); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_player.animate(ANIM_MODE_6, NULL); + setAction(&scene->_action2, this); + break; + case 4: { + scene->_hotspot16.postInit(); + scene->_hotspot16.setVisage(2331); + scene->_hotspot16.setStrip(3); + scene->_hotspot16.fixPriority(149); + scene->_hotspot16.setPosition(Common::Point(320, 202)); + scene->_hotspot16.show(); + + Common::Point pt(320, 121); + NpcMover *mover = new NpcMover(); + scene->_hotspot16.addMover(mover, &pt, this); + break; + } + case 5: { + scene->_hotspot16.fixPriority(200); + Common::Point pt(320, 180); + NpcMover *mover = new NpcMover(); + scene->_hotspot16.addMover(mover, &pt, this); + break; + } + case 6: { + scene->_hotspot16.fixPriority(-1); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + + Common::Point pt(233, 176); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 7: { + Common::Point pt(291, 194); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 8: + _globals->_player.setStrip(5); + _globals->_player.setFrame(1); + setDelay(13); + break; + case 9: + // Quinn sits in the flycycle + scene->_hotspot16.hide(); + _globals->_player.setVisage(2323); + _globals->_player.setPosition(Common::Point(303, 176)); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 10: + if (_globals->getFlag(109)) { + _globals->_soundHandler.play(40); + _globals->_soundHandler.holdAt(true); + + Common::Point pt(303, 240); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } else { + setDelay(3); + } + break; + case 11: + if (_globals->getFlag(109)) { + _globals->_sceneManager.changeScene(7600); + } else { + SceneItem::display2(2320, 19); + setDelay(3); + } + break; + case 12: + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 13: + _globals->_player.setVisage(0); + _globals->_player.setPosition(Common::Point(291, 194)); + _globals->_player.setStrip(5); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_1, NULL); + + scene->_hotspot16.show(); + setDelay(3); + break; + case 14: { + Common::Point pt(233, 176); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 15: { + Common::Point pt(213, 85); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 17: { + _globals->_player.animate(ANIM_MODE_6, NULL); + scene->_hotspot16.fixPriority(160); + + Common::Point pt(320, 121); + NpcMover *mover = new NpcMover(); + scene->_hotspot16.addMover(mover, &pt, this); + break; + } + case 18: { + scene->_hotspot16.fixPriority(149); + Common::Point pt(320, 202); + PlayerMover *mover = new PlayerMover(); + scene->_hotspot16.addMover(mover, &pt, this); + break; + } + case 19: { + scene->_hotspot16.remove(); + scene->_soundHandler.play(253); + + scene->_hotspot13.show(); + Common::Point pt(319, 157); + NpcMover *mover = new NpcMover(); + scene->_hotspot13.addMover(mover, &pt, this); + break; + } + case 20: + _globals->_player.enableControl(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + + scene->_hotspot13.fixPriority(1); + remove(); + break; + } +} + +void Scene2320::Action5::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_PLAYER_MOVER(163, 126); + break; + case 1: + ADD_PLAYER_MOVER(165, 132); + break; + case 2: + setDelay(2); + break; + case 3: + if (!_globals->getFlag(59)) + setDelay(10); + else + scene->_stripManager.start(2323, this); + break; + case 4: + _globals->_player.setVisage(2347); + _globals->_player.setStrip(1); + _globals->_player.setFrame(1); + _globals->_player.fixPriority(137); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 5: + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 6: + if (_globals->getFlag(72)) + _globals->_sceneManager.changeScene(7000); + else if (_globals->getFlag(59)) + _globals->_sceneManager.changeScene(5000); + else if (!_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1)) + setDelay(10); + else { + scene->_hotspot11.setAction(NULL); + scene->_hotspot11.setVisage(2705); + scene->_hotspot11.animate(ANIM_MODE_1, NULL); + scene->_hotspot11.setObjectWrapper(new SceneObjectWrapper()); + + Common::Point pt(185, 135); + NpcMover *mover = new NpcMover(); + scene->_hotspot11.addMover(mover, &pt, NULL); + + _globals->clearFlag(43); + scene->_stripManager.start(2325, this); + } + break; + case 7: + setDelay(10); + break; + case 8: + _globals->_sceneManager.changeScene(4000); + break; + } +} + +void Scene2320::Action6::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 2: + _globals->_player.setStrip(1); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player.setVisage(0); + _globals->_player.setStrip(3); + _globals->_player.fixPriority(-1); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.animate(ANIM_MODE_1, NULL); + + setDelay(60); + break; + case 4: + if ((_globals->_sceneManager._previousScene != 4000) || _globals->getFlag(43)) + setDelay(3); + else if (_globals->getFlag(35)) { + _globals->setFlag(43); + scene->_stripManager.start(4200, this); + _globals->setFlag(69); + } else if (_globals->getFlag(36)) { + setDelay(3); + } else { + _globals->setFlag(43); + scene->_stripManager.start(4210, this); + break; + } + break; + case 5: + if (_globals->_sceneObjects->contains(&scene->_hotspot11)) { + scene->_hotspot11.setAction(&scene->_action1); + + if (_globals->_sceneObjects->contains(&scene->_hotspot10)) { + ADD_MOVER(scene->_hotspot10, 491, 160); + } else { + setDelay(60); + } + + _globals->_sceneItems.push_front(&scene->_hotspot11); + } else { + setDelay(3); + } + break; + case 6: + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene2320::Action7::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + _globals->_soundHandler.play(162); + scene->_hotspot6.animate(ANIM_MODE_5, this); + break; + case 2: + scene->_hotspot10.fixPriority(-1); + ADD_MOVER_NULL(scene->_hotspot10, 321, 94); + scene->_hotspot11.fixPriority(-1); + ADD_MOVER_NULL(scene->_hotspot11, 346, 85); + + _globals->_player.fixPriority(-1); + ADD_MOVER(_globals->_player, 297, 89); + break; + case 3: + ADD_PLAYER_MOVER(462, 182); + break; + case 4: + ADD_MOVER(scene->_hotspot11, 391, 88); + break; + case 5: + ADD_MOVER(scene->_hotspot11, 500, 164); + ADD_MOVER(scene->_hotspot10, 382, 93); + _globals->_player.setStrip(3); + break; + case 6: + ADD_MOVER_NULL(scene->_hotspot10, 491, 160); + ADD_MOVER(_globals->_player, 391, 88); + break; + case 7: + ADD_PLAYER_MOVER(462, 182); + break; + case 8: + _globals->_player.setStrip(7); + setDelay(15); + break; + case 9: + scene->_stripManager.start(6020, this); + break; + case 10: + setDelay(6); + break; + case 11: + scene->_stripManager.start(6022, this); + break; + case 12: + _globals->_player.enableControl(); + RING_INVENTORY._stasisBox._sceneNumber = 2320; + break; + } +} + +void Scene2320::Action8::signal() { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + ADD_PLAYER_MOVER(462, 182); + break; + case 2: + _globals->_player.setStrip(7); + setDelay(5); + break; + case 3: + scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); + scene->_stripManager.start(_globals->getFlag(75) ? 6030 : 2320, this); + break; + case 4: + if (_globals->getFlag(75)) + setDelay(3); + else + _globals->_player.enableControl(); + break; + case 5: + RING_INVENTORY._stasisBox._sceneNumber = 2320; + scene->_sceneMode = 2326; + scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); + scene->setAction(&scene->_sequenceManager1, scene, 2326, &_globals->_player, &scene->_hotspot11, NULL); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene2320::Hotspot5::doAction(int action) { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 13); + break; + case CURSOR_USE: + if (_globals->getFlag(70)) + SceneItem::display2(2320, 33); + else if (_globals->getFlag(13)) + SceneItem::display2(2320, 18); + else + scene->setAction(&scene->_action5); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot6::doAction(int action) { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 2); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot8::doAction(int action) { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 23); + break; + case CURSOR_USE: + scene->_sceneMode = 2336; + scene->setAction(&scene->_sequenceManager1, scene, 2336, &_globals->_player, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot10::doAction(int action) { + // Seeker + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 26); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->_sceneMode = 2329; + + if (_globals->getFlag(13)) { + scene->_stripManager.start(2337, scene); + } else if (_globals->getFlag(70)) { + scene->setAction(&scene->_action8); + } else if (_globals->getFlag(109)) { + scene->setAction(&scene->_sequenceManager1, scene, 2337, NULL); + } else if (!_state) { + ++_state; + scene->setAction(&scene->_sequenceManager1, scene, 2334, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 2335, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot11::doAction(int action) { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 25); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->_sceneMode = 2329; + + if (_globals->getFlag(13)) { + _globals->_player.disableControl(); + scene->_sceneMode = 5000; + scene->_stripManager.start(2336, scene); + } else if (_globals->getFlag(70)) { + scene->setAction(&scene->_action8); + } else { + scene->_sceneMode = 2329; + + if (RING_INVENTORY._ale._sceneNumber == 1) { + scene->setAction(&scene->_sequenceManager1, scene, 2329, NULL); + } else if (!_globals->getFlag(110)) { + _globals->setFlag(110); + scene->setAction(&scene->_sequenceManager1, scene, 2330, NULL); + } else if (RING_INVENTORY._peg._sceneNumber != 1) { + scene->setAction(&scene->_sequenceManager1, scene, 2331, NULL); + } else if (!_state) { + ++_state; + scene->setAction(&scene->_sequenceManager1, scene, 2332, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 2333, NULL); + } + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot12::doAction(int action) { + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 5); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2320, 24); + else { + _globals->_player.disableControl(); + scene->_sceneMode = 2322; + scene->setAction(&scene->_sequenceManager1, scene, 2322, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot14::doAction(int action) { + // Right Console + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 17); + break; + case CURSOR_USE: + if (_globals->getFlag(24)) { + _globals->clearFlag(24); + _globals->_player.disableControl(); + + scene->_hotspot8.postInit(); + scene->_hotspot8.setVisage(2345); + scene->_hotspot8.setPosition(Common::Point(634, 65)); + scene->_hotspot8.hide(); + + _globals->_sceneItems.push_front(&scene->_hotspot8); + RING_INVENTORY._waldos._sceneNumber = 2320; + + scene->_hotspot9.postInit(); + scene->_hotspot9.setVisage(2345); + scene->_hotspot9._strip = 6; + scene->_hotspot9.setPosition(Common::Point(536, 103)); + scene->_hotspot9.fixPriority(200); + scene->_hotspot9.hide(); + + scene->_hotspot16.postInit(); + scene->_hotspot16.setVisage(2345); + scene->_hotspot16.setStrip(8); + scene->_hotspot16.setPosition(Common::Point(536, 103)); + scene->_hotspot16.hide(); + + scene->_sceneMode = 2324; + scene->setAction(&scene->_sequenceManager1, scene, 2324, &_globals->_player, &scene->_hotspot7, + &scene->_hotspot8, &scene->_hotspot9, &scene->_hotspot16, NULL); + } else if (_globals->getFlag(13)) { + SceneItem::display2(2320, 24); + } else if (!_globals->getFlag(76)) { + SceneItem::display2(2320, 28); + } else if (!RING_INVENTORY._waldos._sceneNumber) { + SceneItem::display2(2320, 27); + } else { + SceneItem::display2(2320, 29); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene2320::Hotspot15::doAction(int action) { + // Left console (Flycycle console) + Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(2320, 16); + break; + case CURSOR_USE: + if (_globals->getFlag(13)) + SceneItem::display2(2320, 24); + else + scene->setAction(&scene->_action4); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +Scene2320::Scene2320() : + _hotspot1(0, CURSOR_LOOK, 2320, 0, LIST_END), + _hotspot2(0, CURSOR_LOOK, 2320, 1, LIST_END), + _hotspot3(0, CURSOR_LOOK, 2320, 11, LIST_END), + _hotspot4(0, CURSOR_LOOK, 2320, 14, LIST_END), + _hotspot13(0, CURSOR_LOOK, 2320, 12, LIST_END) +{ + _area1.setup(2153, 2, 1, 2100); + _area1._pt = Common::Point(200, 31); + _area2.setup(2153, 3, 1, 2150); + _area2._pt = Common::Point(200, 50); + _area3.setup(2153, 4, 1, 2320); + _area3._pt = Common::Point(200, 75); + _area4.setup(2153, 1, 1, 10); + _area4._pt = Common::Point(237, 77); +} + +void Scene2320::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(60, 75, 100, 100); + + _stripManager.addSpeaker(&_speakerMR); + _stripManager.addSpeaker(&_speakerML); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerSAL); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + + _speakerMText._npc = &_hotspot11; + _speakerQText._npc = &_globals->_player; + _hotspotPtr = &_hotspot10; + + _hotspot6.postInit(); + _hotspot6.setVisage(2321); + _hotspot6.setPosition(Common::Point(320, 67)); + + _hotspot7.postInit(); + _hotspot7.setVisage(2344); + _hotspot7.setPosition(Common::Point(604, 92)); + + _hotspot13.postInit(); + _hotspot13.setVisage(2323); + _hotspot13.setPosition(Common::Point(319, 157)); + _hotspot13.fixPriority(1); + + _hotspot12.postInit(); + _hotspot12.setVisage(2321); + _hotspot12._strip = 4; + _hotspot12.animate(ANIM_MODE_8, 0, NULL); + _hotspot12.setPosition(Common::Point(412, 46)); + + if (RING_INVENTORY._waldos._sceneNumber == 2320) { + _hotspot8.postInit(); + _hotspot8.setVisage(2345); + _hotspot8.setStrip(5); + _hotspot8.setFrame(8); + _hotspot8.setPosition(Common::Point(541, 103)); + _hotspot8.fixPriority(201); + + _globals->_sceneItems.push_back(&_hotspot8); + } + + if (_globals->getFlag(43)) { + _hotspot11.postInit(); + _hotspot11.setVisage(2705); + _hotspot11._strip = 3; + _hotspot11.setPosition(Common::Point(510, 156)); + _globals->_sceneItems.push_back(&_hotspot11); + _hotspot11._state = 0; + _hotspot11.setAction(&_action1); + } + + _globals->_player.postInit(); + if (_globals->getFlag(13)) + _globals->_player.setVisage(2170); + else + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(320, 79)); + _globals->_player.fixPriority(10); + _globals->_player.changeZoom(-1); + _globals->_player._moveDiff.y = 3; + _globals->_player.disableControl(); + + if (_globals->getFlag(114)) { + _hotspot10.postInit(); + _hotspot10.setVisage(2806); + _hotspot10.setPosition(Common::Point(481, 162)); + _hotspot10.changeZoom(-1); + _hotspot10.setStrip(5); + _hotspot10._state = 0; + + _globals->_sceneItems.push_back(&_hotspot10); + } + + if (_globals->getFlag(70)) { + _hotspot11.postInit(); + _hotspot11.setVisage(2705); + _hotspot11.setPosition(Common::Point(500, 164)); + + _hotspot10.postInit(); + _hotspot10.setVisage(2806); + _hotspot10.setPosition(Common::Point(481, 162)); + _hotspot10.changeZoom(-1); + _hotspot10.setStrip(5); + + _globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL); + } + + switch (_globals->_sceneManager._previousScene) { + case 2120: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + _globals->_player.fixPriority(-1); + _globals->_player.setPosition(Common::Point(389, 72)); + _globals->_player.enableControl(); + break; + case 4000: + if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + _hotspot11.postInit(); + _hotspot11.setVisage(2705); + _hotspot11.setPosition(Common::Point(178, 118)); + _hotspot11.animate(ANIM_MODE_1, NULL); + } + // Deliberate fall-through + case 4250: + case 5000: + case 7000: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80)) + _globals->setFlag(36); + + _globals->_player.disableControl(); + _globals->_player.animate(ANIM_MODE_NONE, NULL); + _globals->_player.setObjectWrapper(NULL); + _globals->_player.setVisage(2347); + _globals->_player.setStrip(2); + _globals->_player.setFrame(5); + _globals->_player.fixPriority(137); + _globals->_player.setPosition(Common::Point(165, 132)); + + setAction(&_action6); + break; + case 6100: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + + _hotspot8.postInit(); + _hotspot8.setVisage(2345); + _hotspot8.setPosition(Common::Point(634, 65)); + _hotspot8.hide(); + + _sceneMode = 2325; + setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); + break; + case 7600: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _soundHandler.play(21); + + _globals->_player.setVisage(2323); + _globals->_player.setStrip(2); + _globals->_player.setFrame(_globals->_player.getFrameCount()); + _globals->_player.setPosition(Common::Point(303, 176)); + _globals->_player.fixPriority(-1); + _globals->_player.disableControl(); + + _hotspot13.setPosition(Common::Point(319, 199)); + + _hotspot16.postInit(); + _hotspot16.setVisage(2331); + _hotspot16._strip = 3; + _hotspot16.fixPriority(160); + _hotspot16.setPosition(Common::Point(320, 202)); + _hotspot16.hide(); + + _sceneMode = 2338; + setAction(&_sequenceManager1, this, 2338, &_globals->_player, &_hotspot16, &_hotspot13, NULL); + break; + default: + switch (_globals->_stripNum) { + case 2101: + _globals->_player.disableControl(); + _globals->_player.setStrip(3); + _globals->_player.setPosition(Common::Point(307, 84)); + + _hotspot11.postInit(); + _hotspot11.setVisage(2705); + _hotspot11._strip = 2; + _hotspot11.fixPriority(10); + _hotspot11.setPosition(Common::Point(322, 80)); + _hotspot11.setObjectWrapper(new SceneObjectWrapper()); + _hotspot11.animate(ANIM_MODE_1, NULL); + + _hotspot10.postInit(); + _hotspot10.setVisage(2806); + _hotspot10.setObjectWrapper(new SceneObjectWrapper()); + _hotspot10.changeZoom(-1); + _hotspot10.fixPriority(10); + _hotspot10.setPosition(Common::Point(318, 89)); + _hotspot10._strip = 3; + _hotspot10.animate(ANIM_MODE_1, NULL); + + setAction(&_action7); + break; + case 6100: + _hotspot8.postInit(); + _hotspot8.setVisage(2345); + _hotspot8.setPosition(Common::Point(634, 65)); + _hotspot8.hide(); + + _sceneMode = 2325; + setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); + break; + default: + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _sceneMode = 2321; + + _globals->_player.setStrip(3); + setAction(&_sequenceManager1, this, 2321, &_globals->_player, &_hotspot6, NULL); + break; + } + } + + _globals->_stripNum = 0; + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + loadScene(2320); + + _hotspot14._sceneRegionId = 8; + _hotspot1.setBounds(Rect(0, 0, 640, 200)); + _hotspot2.setBounds(Rect(278, 0, 362, 61)); + _hotspot3.setBounds(Rect(282, 62, 367, 98)); + _hotspot4.setBounds(Rect(67, 38, 112, 113)); + _hotspot5.setBounds(Rect(104, 122, 174, 157)); + _hotspot15.setBounds(Rect(191, 53, 205, 63)); + + _globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12, + &_hotspot13, &_hotspot4, &_hotspot3, &_hotspot2, &_hotspot1, NULL); +} + +void Scene2320::synchronize(Serializer &s) { + Scene::synchronize(s); + SYNC_POINTER(_hotspotPtr); +} + +void Scene2320::signal() { + switch (_sceneMode) { + case 2321: + case 2327: + case 2329: + if (_globals->getFlag(43) && !_hotspot11._action) + _hotspot11.setAction(&_action1); + _globals->_player.enableControl(); + break; + case 2322: + _globals->_sceneManager.changeScene(2120); + break; + case 2323: + _globals->_player.disableControl(); + break; + case 2338: + case 2324: + _hotspot16.remove(); + _globals->_player.enableControl(); + break; + case 2325: + _globals->setFlag(76); + _globals->clearFlag(70); + _globals->_stripNum = 6100; + _globals->_sceneManager.changeScene(2100); + break; + case 2326: + _globals->clearFlag(70); + RING_INVENTORY._nullifier._sceneNumber = 1; + _globals->_stripNum = 2321; + _globals->_sceneManager.changeScene(2100); + break; + case 2336: + _globals->setFlag(77); + RING_INVENTORY._waldos._sceneNumber = 1; + _hotspot8.remove(); + break; + case 5000: + _globals->_player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2400 - Descending in Lander + * + *--------------------------------------------------------------------------*/ + +void Scene2400::Action1::signal() { + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + ADD_MOVER(_globals->_player, 160, 71); + break; + case 2: + ADD_MOVER(_globals->_player, 160, 360); + break; + case 3: + _globals->_player._moveDiff = Common::Point(1, 1); + ADD_MOVER(_globals->_player, 140, 375); + break; + case 4: + ADD_MOVER(_globals->_player, 87, 338); + break; + case 5: + _globals->_player.hide(); + setDelay(60); + break; + case 6: + _globals->_sceneManager.changeScene(4000); + break; + } +} + +void Scene2400::Action1::dispatch() { + Action::dispatch(); + if ((_actionIndex == 4) && (_globals->_player._percent > 5)) + _globals->_player.changeZoom(_globals->_player._percent - 2); +} + +/*--------------------------------------------------------------------------*/ + +void Scene2400::postInit(SceneObjectList *OwnerList) { + loadScene(2400); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _globals->_player.postInit(); + _globals->_player.setVisage(2410); + _globals->_player.setPosition(Common::Point(340, -10)); + _globals->_player.animate(ANIM_MODE_2, NULL); + _globals->_player.disableControl(); + + setAction(&_action1); + + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + + _globals->_soundHandler.play(153); +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h new file mode 100644 index 0000000000..4f8f559091 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes3.h @@ -0,0 +1,895 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES3_H +#define TSAGE_RINGWORLD_SCENES3_H + +#include "common/scummsys.h" +#include "tsage/core.h" +#include "tsage/converse.h" +#include "tsage/ringworld/ringworld_logic.h" + +namespace tSage { + +class Scene2000 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + class Action9 : public Action { + public: + virtual void signal(); + }; + class Action10 : public Action { + public: + virtual void signal(); + }; + class Action11 : public Action { + public: + virtual void signal(); + }; + class Action12 : public Action { + public: + virtual void signal(); + }; + class Action13 : public Action { + public: + virtual void signal(); + }; + class Action14 : public Action { + public: + virtual void signal(); + }; + +public: + SpeakerSL _speakerSL; + SpeakerQR _speakerQR; + SpeakerMR _speakerMR; + SpeakerQText _speakerQText; + SpeakerMText _speakerMText; + SpeakerSText _speakerSText; + SpeakerHText _speakerHText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + Action10 _action10; + Action11 _action11; + Action12 _action12; + Action13 _action13; + Action14 _action14; + SceneObject _object1, _object2, _object3, _object4, _object5; + SceneObject _object6, _object7, _object8, _object9, _object10; + ASound _soundHandler1, _soundHandler2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void stripCallback(int v); +}; + +class Scene2100 : public Scene { + /* Actions */ + class Action1 : public ActionExt { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + class Action9 : public Action { + public: + virtual void signal(); + }; + class Action10 : public Action { + public: + virtual void signal(); + }; + class Action11 : public Action { + public: + virtual void signal(); + }; + class Action12 : public Action { + public: + virtual void signal(); + }; + class Action13 : public Action { + public: + virtual void signal(); + }; + class Action14 : public Action { + public: + virtual void signal(); + }; + class Action15 : public Action { + public: + virtual void signal(); + }; + class Action16 : public Action { + public: + virtual void signal(); + }; + class Action17 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot14 : public SceneObject { + public: + virtual void doAction(int action); + }; + + /* Objects */ + class Object1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object3 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + ASound _soundHandler; + SpeakerMText _speakerMText; + SpeakerMR _speakerMR; + SpeakerQL _speakerQL; + SpeakerQR _speakerQR; + SpeakerQText _speakerQText; + SpeakerGameText _speakerGameText; + SpeakerSText _speakerSText; + SpeakerSL _speakerSL; + SpeakerSAL _speakerSAL; + SpeakerHText _speakerHText; + + DisplayHotspot _hotspot1; + Hotspot2 _hotspot2; + Hotspot3 _hotspot3; + Hotspot4 _hotspot4; + DisplayHotspot _hotspot5, _hotspot6, _hotspot7; + Hotspot8 _hotspot8; + DisplayHotspot _hotspot9; + Hotspot10 _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13; + Hotspot14 _hotspot14; + DisplayHotspot _hotspot15; + + Object1 _object1; + Object2 _object2; + Object3 _object3; + SceneObject _object4; + + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + Action10 _action10; + Action11 _action11; + Action12 _action12; + Action13 _action13; + Action14 _action14; + Action15 _action15; + Action16 _action16; + Action17 _action17; + int _sitFl; + SceneArea _area1, _area2, _area3, _area4; + + Scene2100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void stripCallback(int v); + virtual void signal(); + virtual void synchronize(Serializer &s); +}; + +class Scene2120 : public Scene { + /* Actions */ + class Entry { + public: + int _size; + int _lineNum; + int _visage; + + Entry() { _size = 0; _lineNum = 0; _visage = 0; } + Entry(int size, int lineNum, int visage) { _size = size; _lineNum = lineNum; _visage = visage; } + }; + + class Action1 : public Action { + private: + Common::Array _entries; + public: + Action1(); + + virtual void signal(); + virtual void dispatch(); + }; + +public: + ASound _soundHandler; + SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot; + SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton; + Action1 _action1; + Rect _listRect; + int _dbMode, _prevDbMode; + bool _visageVisable; + int _subjectIndex; + int _lineOffset; + + Scene2120(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); +}; + +class Scene2150 : public Scene { + /* Actions */ + class Action1 : public ActionExt { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + SpeakerGameText _speakerGameText; + + Rect _rect1, _rect2; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + DisplayHotspot _hotspot3; + Hotspot4 _hotspot4; + DisplayHotspot _hotspot5, _hotspot6; + Hotspot7 _hotspot7; + DisplayHotspot _hotspot8, _hotspot9; + Hotspot10 _hotspot10; + DisplayHotspot _hotspot11; + SceneObject _hotspot12, _hotspot13, _hotspot14; + SceneArea _area1, _area2, _area3, _area4; + Action1 _action1; + Action2 _action2; + + Scene2150(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene2200 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public ActionExt { + public: + virtual void signal(); + virtual void process(Event &event); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot5 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot9 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SpeakerMText _speakerMText; + SpeakerSText _speakerSText; + SpeakerQText _speakerQText; + SpeakerSL _speakerSL; + SpeakerQR _speakerQR; + SpeakerQL _speakerQL; + SpeakerMR _speakerMR; + SpeakerGameText _speakerGameText; + Rect _exitRect; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + DisplayHotspot _hotspot1; + Hotspot3 _hotspot3; + Hotspot5 _hotspot5; + Hotspot9 _hotspot9; + DisplayHotspot _hotspot10; + SceneObject _hotspot2, _hotspot4; + SceneObject _hotspot6, _hotspot7, _hotspot8; + ASound _soundHandler1, _soundHandler2; + + Scene2200(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void stripCallback(int v); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene2222 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + +public: + ASound _soundHandler; + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SpeakerQText _speakerQText; + SpeakerML _speakerML; + SpeakerSR _speakerSR; + Action1 _action1; + Action2 _action2; + SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene2230 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot5 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot6 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot11 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot12 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Hotspot1 _hotspot1; + Hotspot3 _hotspot3; + Hotspot4 _hotspot4; + SceneObject _hotspot2; + Hotspot5 _hotspot5; + Hotspot6 _hotspot6; + Hotspot7 _hotspot7; + Hotspot8 _hotspot8; + DisplayHotspot _hotspot9; + Hotspot10 _hotspot10; + Hotspot11 _hotspot11; + Hotspot12 _hotspot12; + Rect _rect1; + int _field30A; + + Scene2230(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void dispatch(); +}; + +class Scene2280 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public ActionExt { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot12 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot14 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot15 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot16 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot17 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot18 : public SceneObject { + public: + virtual void doAction(int action); + }; + +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + Rect _exitRect; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + DisplayHotspot _hotspot3; + Hotspot4 _hotspot4; + DisplayHotspot _hotspot5, _hotspot6; + Hotspot7 _hotspot7; + Hotspot8 _hotspot8; + DisplayHotspot _hotspot9; + Hotspot10 _hotspot10; + DisplayHotspot _hotspot11; + Hotspot12 _hotspot12; + DisplayHotspot _hotspot13; + Hotspot14 _hotspot14; + DisplayHotspot _hotspot15, _hotspot16; + Hotspot17 _hotspot17; + Hotspot18 _hotspot18; + + Scene2280(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene2300 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public ActionExt { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot5 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler1, _soundHandler2; + SpeakerSL _speakerSL; + SpeakerMText _speakerMText; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4; + Hotspot5 _hotspot5; + SceneObject _hotspot6; + Hotspot7 _hotspot7; + SceneObject _hotspot8, _hotspot9, _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15; + + Scene2300(); + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene2310 : public Scene { +private: + int findObject(int objIndex); + + /* Custom classes */ + class ProtectionEntry { + public: + int _pageNumber; + int _connectionList[5]; + + void set(int pageNumber, int v1, int v2, int v3, int v4, int v5) { + _pageNumber = pageNumber; + _connectionList[0] = v1; _connectionList[1] = v2; _connectionList[2] = v3; + _connectionList[3] = v4; _connectionList[4] = v5; + } + }; + +public: + SequenceManager _sequenceManager; + int _wireIndex, _pageIndex; + SceneObject _wireList[5]; + Rect _rectList[5]; + SceneText _sceneText; + ProtectionEntry _pageList[21]; + + Scene2310(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene2320 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public ActionExt { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot5 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot6 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class Hotspot11 : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class Hotspot12 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot14 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot15 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerMText _speakerMText; + SpeakerMR _speakerMR; + SpeakerML _speakerML; + SpeakerQText _speakerQText; + SpeakerQL _speakerQL; + SpeakerQR _speakerQR; + SpeakerSAL _speakerSAL; + SpeakerSL _speakerSL; + SpeakerSR _speakerSR; + SpeakerSText _speakerSText; + SpeakerGameText _speakerGameText; + SceneArea _area1, _area2, _area3, _area4; + DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4; + Hotspot5 _hotspot5; + Hotspot6 _hotspot6; + SceneObject _hotspot7, _hotspot9; + Hotspot8 _hotspot8; + Hotspot10 _hotspot10; + Hotspot11 _hotspot11; + Hotspot12 _hotspot12; + DisplayHotspot _hotspot13; + Hotspot14 _hotspot14; + Hotspot15 _hotspot15; + SceneObject _hotspot16; + SceneItem *_hotspotPtr; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + + Scene2320(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); +}; + +class Scene2400 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; +public: + Action1 _action1; + SceneObject _object; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes4.cpp b/engines/tsage/ringworld/ringworld_scenes4.cpp new file mode 100644 index 0000000000..83dd559a6d --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes4.cpp @@ -0,0 +1,250 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/ringworld/ringworld_scenes4.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 3500 - Ringworld Scan + * + *--------------------------------------------------------------------------*/ + +void Scene3500::Action1::signal() { + Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_stripManager.start(3500, this); + break; + case 2: + setDelay(3); + break; + case 3: + _globals->_sceneManager.changeScene(9999); + break; + } +} + +void Scene3500::Action2::signal() { + Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_stripManager.start(3501, this); + break; + case 2: + setDelay(3); + break; + case 3: + _globals->_sceneManager.changeScene(2012); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene3500::postInit(SceneObjectList *OwnerList) { + loadScene((_globals->_stripNum == 3600) ? 3600 : 3500); + Scene::postInit(); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerSText); + + _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160; + + setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 3700 - Remote Viewer + * + *--------------------------------------------------------------------------*/ + +#define VIEW_FRAME_DELAY 10 + +Scene3700::Viewer::Viewer() { + _images1.setVisage(3705, 1); + _images2.setVisage(3705, 2); + + _frameList[0] = 1; + for (int idx = 1; idx <= 3; ++idx) + _frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1; + + _active = true; + _countdownCtr = 0; + _percentList[0] = 120; + _percentList[1] = 50; + _percentList[2] = 75; + _percentList[3] = 114; +} + +void Scene3700::Viewer::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsByte(_active); + s.syncAsSint16LE(_countdownCtr); + for (int idx = 0; idx < 4; ++idx) { + s.syncAsSint16LE(_frameList[idx]); + s.syncAsSint16LE(_percentList[idx]); + } +} + +void Scene3700::Viewer::dispatch() { + if (_active) { + if (_countdownCtr-- <= 0) { + _countdownCtr = VIEW_FRAME_DELAY; + + for (int idx = 3; idx > 1; --idx) + _frameList[idx] = _frameList[idx - 1]; + + int newFrame; + do { + newFrame = _globals->_randomSource.getRandomNumber(4) + 1; + } while (newFrame == _frameList[2]); + + _frameList[1] = newFrame; + _flags |= OBJFLAG_PANES; + } + } +} + +void Scene3700::Viewer::reposition() { + _bounds = Rect(123, 40, 285, 123); +} + +void Scene3700::Viewer::draw() { + Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1); + + for (int idx = 0; idx < 4; ++idx) { + Visage &v = (idx == 0) ? _images1 : _images2; + + GfxSurface img = v.getFrame(_frameList[idx]); + Rect destRect = img.getBounds(); + destRect.resize(img, (_position.x - _globals->_sceneOffset.x), + (_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]); + + destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left, + -_globals->_sceneManager._scene->_sceneBounds.top); + + _globals->gfxManager().copyFrom(img, destRect, priorityRegion); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene3700::Action1::signal() { + Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_stripManager.start(2162, this); + break; + case 2: + scene->_viewer._active = false; + setDelay(90); + break; + case 3: + scene->_soundHandler.play(196); + scene->_viewer.hide(); + + scene->_hotspot1.postInit(); + scene->_hotspot1.setVisage(3710); + scene->_hotspot1.setStrip(1); + scene->_hotspot1.setFrame(1); + scene->_hotspot1.setPosition(Common::Point(204, 120)); + + setDelay(90); + break; + case 4: + scene->_soundHandler.play(197); + scene->_hotspot1.hide(); + + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(3710); + scene->_hotspot2.setStrip(2); + scene->_hotspot2.setFrame(1); + scene->_hotspot2.setPosition(Common::Point(204, 120)); + + setDelay(30); + break; + case 5: + scene->_soundHandler.play(198); + scene->_hotspot2.hide(); + scene->_hotspot1.show(); + setDelay(90); + break; + case 6: + scene->_stripManager.start(2166, this); + break; + case 7: + setDelay(60); + break; + case 8: + scene->_hotspot1.remove(); + scene->_hotspot2.show(); + _globals->setFlag(59); + setDelay(30); + break; + case 9: + _globals->_sceneManager.changeScene(2100); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene3700::postInit(tSage::SceneObjectList *OwnerList) { + Scene::postInit(); + loadScene(3700); + + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerMR); + _speakerSText.setTextPos(Common::Point(20, 15)); + _speakerMText.setTextPos(Common::Point(20, 15)); + + _viewer.postInit(); + _viewer.setVisage(3705); + _viewer.setStrip(1); + _viewer.setFrame(2); + _viewer.setPosition(Common::Point(195, 83)); + + setAction(&_action1); + _globals->_soundHandler.play(195); +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h new file mode 100644 index 0000000000..6c706d2dab --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes4.h @@ -0,0 +1,92 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES4_H +#define TSAGE_RINGWORLD_SCENES4_H + +#include "common/scummsys.h" +#include "tsage/core.h" +#include "tsage/converse.h" +#include "tsage/ringworld/ringworld_logic.h" + +namespace tSage { + +class Scene3500 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; +public: + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SpeakerQText _speakerQText; + Action1 _action1; + Action2 _action2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene3700 : public Scene { + /* Custom classes */ + class Viewer : public SceneObject { + public: + Visage _images1; + Visage _images2; + + int _frameList[4]; + int _percentList[4]; + bool _active; + int _countdownCtr; + + Viewer(); + virtual Common::String getClassName() { return "Viewer"; } + virtual void synchronize(Serializer &s); + virtual void dispatch(); + virtual void reposition(); + virtual void draw(); + }; + + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; +public: + Viewer _viewer; + Action1 _action1; + SceneObject _hotspot1, _hotspot2; + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SpeakerMR _speakerMR; + ASound _soundHandler; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp new file mode 100644 index 0000000000..0803a2039a --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes5.cpp @@ -0,0 +1,4441 @@ +/* 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. + * + */ + +#include "common/config-manager.h" +#include "tsage/ringworld/ringworld_scenes5.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 4000 - Village + * + *--------------------------------------------------------------------------*/ + +void Scene4000::Action1::signal() { + // Quinn has the peg. Everybody enter the screen. + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_hotspot5.postInit(); + scene->_hotspot5.setVisage(2870); + scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); + scene->_hotspot5.animate(ANIM_MODE_1, NULL); + scene->_hotspot5.setPosition(Common::Point(116, 160)); + + Common::Point pt(208, 169); + NpcMover *mover = new NpcMover(); + scene->_hotspot5.addMover(mover, &pt, this); + + RING_INVENTORY._ale._sceneNumber = 0; + _globals->clearFlag(42); + _globals->clearFlag(36); + _globals->clearFlag(43); + _globals->clearFlag(37); + break; + } + case 1: { + scene->_guardRock.postInit(); + scene->_guardRock.setVisage(4001); + scene->_guardRock.animate(ANIM_MODE_1, NULL); + scene->_guardRock.setObjectWrapper(new SceneObjectWrapper()); + scene->_guardRock.setPosition(Common::Point(314, 132)); + scene->_guardRock._moveDiff = Common::Point(4, 2); + + ADD_PLAYER_MOVER_NULL(scene->_guardRock, 288, 167); + + scene->_olo.postInit(); + scene->_olo.setVisage(4006); + scene->_olo.animate(ANIM_MODE_1, NULL); + scene->_olo.setStrip(1); + scene->_olo.setPosition(Common::Point(207, 136)); + + ADD_PLAYER_MOVER_NULL(scene->_olo, 220, 151); + + scene->_miranda.postInit(); + scene->_miranda.setVisage(2701); + scene->_miranda.animate(ANIM_MODE_1, NULL); + scene->_miranda.setObjectWrapper(new SceneObjectWrapper()); + scene->_miranda._moveDiff = Common::Point(4, 2); + scene->_miranda.setPosition(Common::Point(300, 135)); + + ADD_PLAYER_MOVER_THIS(scene->_miranda, 266, 169); + + ADD_PLAYER_MOVER_NULL(_globals->_player, 241, 155); + break; + } + case 2: + scene->_stripManager.start(4400, this); + break; + case 3: { + Common::Point pt1(30, 86); + PlayerMover *mover1 = new PlayerMover(); + scene->_miranda.addMover(mover1, &pt1, this); + + ADD_PLAYER_MOVER_NULL(scene->_hotspot5, 3, 86); + break; + } + case 4: + ADD_MOVER(scene->_miranda, -30, 86); + ADD_MOVER_NULL(scene->_hotspot5, -40, 86); + break; + case 5: + _globals->_soundHandler.play(155); + _globals->setFlag(43); + _globals->setFlag(114); + scene->_stripManager.start(4430, this); + break; + case 6: + ADD_PLAYER_MOVER_THIS(scene->_olo, 277, 175); + ADD_PLAYER_MOVER_NULL(_globals->_player, 258, 187); + break; + case 7: + scene->_stripManager.start(4440, this); + break; + case 8: + setDelay(30); + break; + case 9: + _globals->setFlag(96); + _globals->_sceneManager.changeScene(4025); + break; + } +} + +void Scene4000::Action2::signal() { + // Quinn, Seeker and Miranda walks down to the village + // Then, they talk to Rock, and enter the priest hut + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + + scene->_hotspot5.postInit(); + scene->_hotspot5.setVisage(2801); + scene->_hotspot5.animate(ANIM_MODE_1, NULL); + scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); + scene->_hotspot5._moveDiff.x = 5; + scene->_hotspot5.setPosition(Common::Point(-8, 88)); + + scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL); + scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); + break; + case 1: + _globals->_player.disableControl(); + + scene->_lander.remove(); + ADD_MOVER(scene->_guardRock, scene->_hotspot5._position.x + 30, scene->_hotspot5._position.y - 10); + break; + case 2: + _globals->_player.checkAngle(&scene->_guardRock); + scene->_hotspot5.checkAngle(&scene->_guardRock); + scene->_miranda.checkAngle(&scene->_guardRock); + scene->_stripManager.start(4000, this); + break; + case 3: + scene->_hotspot2.setVisage(4017); + scene->_hotspot2.animate(ANIM_MODE_1, NULL); + scene->_hotspot2.setStrip(2); + + ADD_MOVER(scene->_hotspot2, 116, 160); + ADD_MOVER(scene->_hotspot5, 116, 160); + + _globals->setFlag(37); + break; + case 4: + break; + case 5: + scene->_stripManager.start(4010, this); + break; + case 6: + ADD_PLAYER_MOVER_NULL(scene->_guardRock, 230, 149); + ADD_PLAYER_MOVER(210, 136); + ADD_PLAYER_MOVER_NULL(scene->_miranda, 210, 133); + break; + case 7: + _globals->_sceneManager.changeScene(4045); + break; + } +} + +void Scene4000::Action3::signal() { + // The guard walks to the left and exits the screen + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_hotspot8.setVisage(4017); + scene->_hotspot8.setFrame2(-1); + scene->_hotspot8.animate(ANIM_MODE_1, NULL); + scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper()); + ADD_MOVER(scene->_hotspot8, 118, 145); + break; + case 1: + scene->_hotspot8.remove(); + remove(); + break; + } +} + +void Scene4000::Action4::signal() { + // Quinn ties the rope to the rock + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player._uiEnabled = false; + ADD_MOVER(_globals->_player, 257, 57); + break; + case 1: + _globals->_player.setVisage(4008); + _globals->_player.setPosition(Common::Point(258, 83)); + _globals->_player._frame = 1; + _globals->_player._strip = 3; + _globals->_player.animate(ANIM_MODE_4, 2, 1, this); + break; + case 2: + scene->_rope.postInit(); + scene->_rope.setVisage(4000); + scene->_rope.setStrip(7); + scene->_rope.setFrame(3); + scene->_rope.setPosition(Common::Point(268, 44)); + + RING_INVENTORY._rope._sceneNumber = 4000; + _globals->_events.setCursor(CURSOR_USE); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player.setVisage(2602); + _globals->_player.setPosition(Common::Point(257, 57)); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._uiEnabled = true; + + _globals->setFlag(41); + remove(); + break; + } +} + +void Scene4000::Action5::signal() { + // Chat with Miranda + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(15); + break; + case 1: + scene->_stripManager.start(_globals->_stripNum, this); + break; + case 2: + setDelay(10); + break; + case 3: + scene->_hotspot8.setVisage(4017); + scene->_hotspot8.animate(ANIM_MODE_1, NULL); + scene->_hotspot8.setFrame2(-1); + scene->_hotspot8.setAction(&scene->_action3); + + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4000::Action6::signal() { + // Quinn and Miranda enter the screen and walk to the village. + // Rock comes and notices the alcohol. They all enter his hut. + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(30); + break; + case 1: + setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + + if (!_globals->getFlag(36)) + scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); + break; + case 2: + _globals->_player.disableControl(); + ADD_MOVER(scene->_guardRock, _globals->_player._position.x + 30, _globals->_player._position.y - 5); + break; + case 3: + scene->_stripManager.start(_globals->getFlag(35) ? 4500 : 4502, this); + break; + case 4: + _globals->clearFlag(35); + ADD_MOVER_NULL(scene->_guardRock, 292, 138); + ADD_PLAYER_MOVER(283, 147); + + if (!_globals->getFlag(36)) + ADD_PLAYER_MOVER_NULL(scene->_miranda, 280, 150); + RING_INVENTORY._ale._sceneNumber = 4100; + break; + case 5: + _globals->_sceneManager.changeScene(4100); + break; + } +} + +void Scene4000::Action7::signal() { + // Climb down left Chimney using a rope + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + + scene->_rope.setFrame(1); + ADD_MOVER(_globals->_player, 247, 53); + break; + case 1: + _globals->_player.setVisage(4008); + _globals->_player.setStrip(4); + _globals->_player.setFrame(1); + _globals->_player.fixPriority(16); + _globals->_player.setPosition(Common::Point(260, 55)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_sceneManager.changeScene(4050); + break; + } +} + +void Scene4000::Action8::signal() { + // Climb down right Chimney using a rope + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + if (_globals->getFlag(41)) + scene->_rope.setFrame(2); + + ADD_MOVER(_globals->_player, 289, 53); + break; + case 1: + _globals->_player.setVisage(4008); + _globals->_player.setStrip(5); + _globals->_player.fixPriority(16); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(283, 52)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player.remove(); + setDelay(60); + break; + case 3: + _globals->_soundHandler.play(170); + scene->_smoke2.setVisage(4000); + scene->_smoke2.setStrip(6); + scene->_smoke2.animate(ANIM_MODE_2, NULL); + setDelay(60); + break; + case 4: + _globals->_soundHandler.play(77, this); + break; + case 5: + _globals->_game->endGame(4000, 15); + remove(); + break; + } +} + +void Scene4000::Action9::signal() { + // Villager animations + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(119) + 240); + break; + case 1: + static_cast(_owner)->animate(ANIM_MODE_8, 1, this); + _actionIndex = 0; + break; + } +} + +void Scene4000::Action10::signal() { + // Villager animations + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(119) + 240); + break; + case 1: + static_cast(_owner)->animate(ANIM_MODE_8, 1, this); + _actionIndex = 0; + break; + } +} + +void Scene4000::Action11::signal() { + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_MOVER(scene->_lander, -30, 70); + break; + case 1: + setDelay(60); + break; + case 2: + scene->_hotspot5.postInit(); + scene->_hotspot5.setVisage(2801); + scene->_hotspot5.animate(ANIM_MODE_1, NULL); + scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); + scene->_hotspot5._moveDiff.x = 4; + scene->_hotspot5.setPosition(Common::Point(-8, 88)); + + setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + + scene->_miranda.setPosition(Common::Point(-210, 139)); + scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); + scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL); + break; + case 3: + scene->_stripManager.start(8000, this); + break; + case 4: + ADD_MOVER(scene->_olo, 263, 187); + scene->_olo.animate(ANIM_MODE_1, NULL); + break; + case 5: + scene->_soundHandler1.stop(); + scene->_forceField.remove(); + + ADD_MOVER(_globals->_player, 340, 163); + ADD_MOVER_NULL(scene->_miranda, 340, 169); + ADD_MOVER_NULL(scene->_hotspot5, 340, 165); + break; + case 6: + _globals->_sceneManager.changeScene(4250); + break; + } +} + +void Scene4000::Action12::signal() { + // Quinn enter Rock's hut + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(5); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(4015, this); + break; + case 2: + _globals->setFlag(32); + if (scene->_stripManager._field2E8 == 275) { + _globals->setFlag(82); + ADD_MOVER_NULL(scene->_guardRock, 292, 138); + ADD_PLAYER_MOVER(283, 147); + } else { + setDelay(30); + } + break; + case 3: + if (scene->_stripManager._field2E8 == 275) { + _globals->_sceneManager.changeScene(4100); + } else { + ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132); + } + break; + case 4: + scene->_guardRock.hide(); + scene->_stripManager.start(4020, this); + break; + case 5: + _globals->setFlag(35); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4000::Action13::signal() { + // Lander is landing + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + scene->_soundHandler2.play(151); + scene->_soundHandler2.holdAt(true); + ADD_MOVER(scene->_lander, -30, 70); + break; + case 2: + scene->_soundHandler2.release(); + _globals->_sceneManager.changeScene(4010); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4000::Miranda::doAction(int action) { + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(4000, 31); + break; + case CURSOR_LOOK: + SceneItem::display2(4000, 29); + break; + case CURSOR_TALK: + if (_globals->getFlag(31)) { + if (!_globals->getFlag(111)) { + _globals->setFlag(111); + _globals->_stripNum = 4070; + } else if (!_globals->getFlag(33)) + _globals->_stripNum = 4094; + else if (!_globals->getFlag(112)) { + _globals->setFlag(112); + _globals->_stripNum = 4300; + } else if (!_globals->getFlag(113)) { + _globals->setFlag(113); + _globals->_stripNum = 4093; + } else + _globals->_stripNum = 4094; + } else { + if (!_globals->getFlag(33)) + _globals->_stripNum = 4094; + else if (!_globals->getFlag(112)) { + _globals->setFlag(112); + _globals->_stripNum = 4300; + } else + _globals->_stripNum = 4094; + } + + scene->setAction(&scene->_action5); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot8::doAction(int action) { + // Guard + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(4000, 26); + break; + case CURSOR_LOOK: + SceneItem::display2(4000, 25); + break; + case CURSOR_TALK: + if (RING_INVENTORY._peg._sceneNumber == 1) + SceneItem::display2(4000, 34); + else { + switch (_ctr) { + case 0: + _globals->_stripNum = 4090; + break; + case 1: + _globals->_stripNum = 4091; + break; + case 2: + _globals->_stripNum = 4092; + break; + default: + SceneItem::display2(4000, 34); + break; + } + + if (_globals->_stripNum) { + setAction(NULL); + addMover(NULL); + ++_ctr; + scene->setAction(&scene->_action5); + } + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::GuardRock::doAction(int action) { + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(4000, 28); + break; + case CURSOR_LOOK: + SceneItem::display2(4000, 27); + break; + case CURSOR_TALK: + error("*** Do we need dialog."); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Ladder::doAction(int action) { + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 30); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + if (_globals->getFlag(40)) { + scene->_sceneMode = 4005; + scene->setAction(&scene->_sequenceManager1, scene, 4005, &_globals->_player, NULL); + } else { + scene->_sceneMode = 4004; + scene->setAction(&scene->_sequenceManager1, scene, 4004, &_globals->_player, &scene->_ladder, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::TheTech::doAction(int action) { + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 13); + break; + case OBJECT_SCANNER: + SceneItem::display2(4000, 19); + break; + case OBJECT_STUNNER: + SceneItem::display2(4000, 20); + break; + case CURSOR_USE: + if (_globals->getFlag(40)) + SceneItem::display2(4000, 37); + else { + _globals->_player.disableControl(); + if (_globals->_sceneObjects->contains(&scene->_miranda)) + _globals->clearFlag(96); + + scene->_sceneMode = 4012; + scene->setAction(&scene->_sequenceManager1, scene, 4012, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot13::doAction(int action) { + // Rock between the two chimneys + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 21); + break; + case OBJECT_ROPE: + if (_globals->getFlag(40)) + scene->setAction(&scene->_action4); + else + SceneItem::display2(4000, 22); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot::doAction(int action) { + // Wall between the two doors + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 16); + break; + case OBJECT_SCANNER: + SceneItem::display2(4000, 17); + break; + case OBJECT_STUNNER: + SceneItem::display2(4000, 18); + break; + case OBJECT_LADDER: { + _globals->_player.disableControl(); + + scene->_ladder.postInit(); + scene->_ladder.setVisage(4000); + scene->_ladder.setStrip(5); + scene->_ladder.setPosition(Common::Point(245, 147)); + scene->_ladder.hide(); + _globals->_sceneItems.push_front(&scene->_ladder); + + if (_globals->_sceneObjects->contains(&scene->_hotspot8)) { + scene->_hotspot8.setAction(NULL); + Common::Point pt(118, 145); + NpcMover *mover = new NpcMover(); + scene->_hotspot18.addMover(mover, &pt, NULL); + } + + scene->_sceneMode = 4004; + scene->setAction(&scene->_sequenceManager1, scene, 4011, &_globals->_player, &scene->_ladder, NULL); + break; + } + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot17::doAction(int action) { + // Left Chimney + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 23); + break; + case CURSOR_USE: + if (_globals->getFlag(40)) + scene->setAction(&scene->_action7); + else + SceneItem::display2(4000, 24); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot18::doAction(int action) { + // Right Chimney + Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, 36); + break; + case CURSOR_USE: + if (_globals->getFlag(40)) + scene->setAction(&scene->_action8); + else + SceneItem::display2(4000, 24); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4000::Hotspot23::doAction(int action) { + // Door of the temple + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4000::Scene4000() : + _forceField(0, CURSOR_LOOK, 4000, 14, CURSOR_USE, 4000, 32, OBJECT_STUNNER, 4000, 33, + OBJECT_SCANNER, 4000, 19, LIST_END), + _hotspot19(0, CURSOR_LOOK, 4000, 7, LIST_END), + _hotspot20(0, CURSOR_LOOK, 4000, 3, LIST_END), + _hotspot21(0, CURSOR_LOOK, 4000, 1, LIST_END), + _hotspot22(0, CURSOR_LOOK, 4000, 8, LIST_END), + _hotspot24(0, CURSOR_LOOK, 4000, 11, LIST_END), + _hotspot25(0, CURSOR_LOOK, 4000, 4, LIST_END), + _hotspot26(0, CURSOR_LOOK, 4000, 0, LIST_END) { +} + +void Scene4000::postInit(SceneObjectList *OwnerList) { + loadScene(4000); + Scene::postInit(); + setZoomPercents(0, 20, 70, 50); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerML); + _stripManager.addSpeaker(&_speakerMR); + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerCHFL); + _stripManager.addSpeaker(&_speakerPL); + _stripManager.addSpeaker(&_speakerPText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerCHFR); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerCHFText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerMText); + + _speakerCHFText._npc = &_guardRock; + _speakerSText._npc = &_hotspot5; + _speakerMText._npc = &_miranda; + _speakerPText._npc = &_olo; + _speakerQText._npc = &_globals->_player; + + _hotspot13.setBounds(Rect(263, 41, 278, 55)); + _hotspot14.setBounds(Rect(96 /*140*/, 177, 140 /*96*/, 204)); + _hotspot15.setBounds(Rect(227, 101, 264, 143)); + _hotspot16.setBounds(Rect(306, 100, 319, 148)); + _hotspot17.setBounds(Rect(231, 53, 254, 60)); + _hotspot18.setBounds(Rect(285, 51, 310, 60)); + _hotspot26.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot21.setBounds(Rect(28, 7, 53, 64)); + _hotspot22.setBounds(Rect(125, 155, 140, 189)); + _hotspot23.setBounds(Rect(205, 102, 220, 142)); + _hotspot24.setBounds(Rect(270, 111, 297, 147)); + + _hotspot19._sceneRegionId = 16; + _hotspot20._sceneRegionId = 18; + _hotspot25._sceneRegionId = 17; + + _smoke1.postInit(); + _smoke1.setVisage(4000); + _smoke1.fixPriority(1); + _smoke1.setFrame(2); + _smoke1.setPosition(Common::Point(242, 59)); + _smoke1.animate(ANIM_MODE_2, NULL); + + _smoke2.postInit(); + _smoke2.setVisage(4000); + _smoke2.setStrip(2); + _smoke2.fixPriority(1); + _smoke2.setFrame(2); + _smoke2.setPosition(Common::Point(299, 59)); + _smoke2.animate(ANIM_MODE_2, NULL); + + if (RING_INVENTORY._ladder._sceneNumber != 4000) { + // if ladder is not in the scene, activate the hotspot on the wall + _hotspot8.postInit(); + _hotspot8.setVisage(4018); + _hotspot8.setObjectWrapper(new SceneObjectWrapper()); + _hotspot8._strip = 2; + _hotspot8._numFrames = 5; + _hotspot8.setPosition(Common::Point(306, 154)); + _hotspot8.setAction(&_action9); + } + + _theTech.postInit(); + _theTech.setVisage(4000); + _theTech.setStrip(3); + _theTech.setFrame(3); + _theTech.fixPriority(200); + _theTech.setPosition(Common::Point(281, 176)); + + if (_globals->getFlag(34)) { + _soundHandler1.play(156); + + _forceField.postInit(); + _forceField.setVisage(4000); + _forceField.setStrip(4); + _forceField.setPosition(Common::Point(312, 174)); + _forceField.fixPriority(200); + _forceField.animate(ANIM_MODE_8, 0, NULL); + + _globals->_sceneItems.push_back(&_forceField); + } + + _globals->_player.postInit(); + _globals->_player.setVisage(2602); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(-28, 86)); + + if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + _miranda.postInit(); + _miranda.setVisage(2701); + _miranda.animate(ANIM_MODE_1, NULL); + _miranda.setObjectWrapper(new SceneObjectWrapper()); + _miranda._moveDiff = Common::Point(4, 2); + _miranda.setPosition(Common::Point(-210, 139)); + + _globals->_sceneItems.push_back(&_miranda); + } + + _globals->clearFlag(40); + + switch (_globals->_sceneManager._previousScene) { + case 2320: + _globals->_soundHandler.play(155); + + if (RING_INVENTORY._ale._sceneNumber == 1) { + _guardRock.postInit(); + _guardRock.setVisage(4001); + _guardRock.animate(ANIM_MODE_1, NULL); + _guardRock.setObjectWrapper(new SceneObjectWrapper()); + _guardRock.setPosition(Common::Point(314, 132)); + + setAction(&_action6); + } else { + _globals->_player.disableControl(); + _sceneMode = 4001; + setAction(&_sequenceManager1, this, 4001, &_globals->_player, NULL); + + if (!_globals->getFlag(36) && !_globals->getFlag(43)) + _miranda.setAction(&_sequenceManager2, NULL, 4002, &_miranda, NULL); + } + + if (_globals->getFlag(42)) + _hotspot8.setAction(&_action3); + else if (_globals->getFlag(91)) + _hotspot8.remove(); + break; + + case 4010: + _miranda.setPosition(Common::Point(-210, 139)); + + _guardRock.postInit(); + _guardRock.setVisage(4001); + _guardRock.animate(ANIM_MODE_1, NULL); + _guardRock.setObjectWrapper(new SceneObjectWrapper()); + _guardRock.setPosition(Common::Point(314, 132)); + + _hotspot2.postInit(); + _hotspot2.setVisage(4018); + _hotspot2._strip = 1; + _hotspot2._numFrames = 5; + _hotspot2.setPosition(Common::Point(182, 146)); + _hotspot2.setAction(&_action10); + + setAction(&_action2); + break; + + case 4025: + if (RING_INVENTORY._ladder._sceneNumber == 4000) + _hotspot8.remove(); + + _globals->_player.setPosition(Common::Point(260, 185)); + + if (!_globals->getFlag(36) && !_globals->getFlag(43)) + _miranda.setPosition(Common::Point(246, 146)); + + if (_globals->getFlag(96)) { + _olo.postInit(); + _olo.setVisage(4006); + _olo.animate(ANIM_MODE_1, NULL); + _olo.setObjectWrapper(new SceneObjectWrapper()); + _olo.setPosition(Common::Point(290, 163)); + } + + if (_globals->_stripNum == 4025) { + _soundHandler1.play(182); + _forceField.remove(); + + _hotspot5.postInit(); + _hotspot5.setVisage(2801); + _hotspot5.animate(ANIM_MODE_1, NULL); + _hotspot5.setObjectWrapper(new SceneObjectWrapper()); + _hotspot5._moveDiff.x = 4; + _hotspot5.setPosition(Common::Point(-18, 86)); + + _globals->_player.disableControl(); + + if (!_globals->getFlag(96)) { + _olo.postInit(); + _olo.setVisage(4006); + _olo.animate(ANIM_MODE_1, NULL); + _olo.setObjectWrapper(new SceneObjectWrapper()); + _olo.setPosition(Common::Point(195, 128)); + + Common::Point pt(268, 157); + PlayerMover *mover = new PlayerMover(); + _olo.addMover(mover, &pt, NULL); + } + + _sceneMode = 4003; + setAction(&_sequenceManager1, this, 4003, &_hotspot5, NULL); + } else if (_globals->getFlag(96)) { + _globals->_player.disableControl(); + _sceneMode = 4013; + setAction(&_sequenceManager1, this, 4013, &_olo, NULL); + } + + _globals->clearFlag(96); + break; + + case 4045: + _globals->_player.enableControl(); + + if (RING_INVENTORY._ladder._sceneNumber != 4000) { + _hotspot8.setVisage(4017); + _hotspot8.animate(ANIM_MODE_1, NULL); + _hotspot8.setPosition(Common::Point(199, 188)); + _hotspot8.setAction(&_action3); + } + + _globals->_player.setPosition(Common::Point(208, 153)); + if (!_globals->getFlag(36) && !_globals->getFlag(43)) + _miranda.setPosition(Common::Point(246, 146)); + + if (_globals->getFlag(39)) { + // Ollo follows Quinn and gives explanations on the Tech. + _globals->clearFlag(39); + + _olo.postInit(); + _olo.setVisage(4006); + _olo.animate(ANIM_MODE_1, NULL); + _olo.setObjectWrapper(new SceneObjectWrapper()); + _olo.setPosition(Common::Point(219, 150)); + + _sceneMode = 4010; + _globals->_player.disableControl(); + // This is the buggy animation where Miranda comments the Tech even + // if she's not in the room but in the lander. + setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL); + } + + if (_globals->_stripNum == 4000) { + _globals->_stripNum = 0; + + _guardRock.postInit(); + _guardRock.setVisage(4001); + _guardRock.animate(ANIM_MODE_1, NULL); + _guardRock.setObjectWrapper(new SceneObjectWrapper()); + _guardRock.setPosition(Common::Point(231, 159)); + _guardRock.setStrip(4); + + setAction(&_action12); + } + break; + + case 4050: + _globals->_soundHandler.play(155); + _globals->_player.disableControl(); + + if (_globals->_stripNum == 4050) { + _globals->_player.setVisage(4008); + _globals->_player.setStrip(4); + _globals->_player.setFrame(_globals->_player.getFrameCount()); + _globals->_player.fixPriority(16); + _globals->_player.setPosition(Common::Point(260, 55)); + + _sceneMode = 4007; + setAction(&_sequenceManager1, this, 4007, &_globals->_player, NULL); + } else { + _globals->_player.setPosition(Common::Point(208, 153)); + _globals->_player.enableControl(); + } + + if (RING_INVENTORY._ladder._sceneNumber != 4000) + _hotspot8.remove(); + break; + + case 4100: + _globals->_player.enableControl(); + _globals->_player.setPosition(Common::Point(270, 155)); + + if (_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) { + _hotspot8.setVisage(4017); + _hotspot8.animate(ANIM_MODE_1, NULL); + _hotspot8.setPosition(Common::Point(244, 151)); + _hotspot8.setAction(&_action3); + } + + if (!_globals->getFlag(36) && !_globals->getFlag(43)) + _miranda.setPosition(Common::Point(246, 146)); + break; + + default: + _globals->_soundHandler.play(155); + + _lander.postInit(); + _lander.setVisage(4002); + _lander._moveDiff = Common::Point(10, 10); + _lander.setPosition(Common::Point(-100, 80)); + _lander.changeZoom(-1); + _lander.setPosition(Common::Point(130, -1)); + _lander.animate(ANIM_MODE_2, NULL); + + if (_globals->_stripNum == 9000) { + _olo.postInit(); + _olo.setVisage(4006); + _olo.setPosition(Common::Point(235, 153)); + + _guardRock.postInit(); + _guardRock.setVisage(4001); + _guardRock.setStrip(3); + _guardRock.setPosition(Common::Point(255, 153)); + + setAction(&_action11); + RING_INVENTORY._ladder._sceneNumber = 4100; + RING_INVENTORY._rope._sceneNumber = 4150; + + _soundHandler1.play(156); + + _forceField.postInit(); + _forceField.setVisage(4000); + _forceField.setStrip(4); + _forceField.setPosition(Common::Point(312, 174)); + _forceField.fixPriority(200); + _forceField.animate(ANIM_MODE_8, 0, NULL); + } else { + if (!_globals->getFlag(37)) { + _hotspot2.postInit(); + _hotspot2.setVisage(4018); + _hotspot2._strip = 1; + _hotspot2._numFrames = 5; + _hotspot2.setPosition(Common::Point(182, 146)); + _hotspot2.setAction(&_action10); + } + _miranda.setPosition(Common::Point(-210, 139)); + setAction(&_action13); + } + + break; + } + + if (RING_INVENTORY._ladder._sceneNumber == 4000) { + _ladder.postInit(); + _ladder.setVisage(4000); + _ladder.setStrip(5); + _ladder.setPosition(Common::Point(245, 147)); + + _globals->_sceneItems.push_back(&_ladder); + } + + if (RING_INVENTORY._rope._sceneNumber == 4000) { + _rope.postInit(); + _rope.setVisage(4000); + _rope.setStrip(7); + _rope.fixPriority(1); + _rope.setPosition(Common::Point(268, 44)); + } + + _globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15, + &_hotspot16, &_theTech, &_hotspot13, &_hotspot21, &_hotspot20, &_hotspot22, &_hotspot23, + &_hotspot24, &_hotspot25, &_hotspot19, &_hotspot26, NULL); +} + +void Scene4000::signal() { + switch (_sceneMode) { + case 4010: + _globals->setFlag(38); + _olo.remove(); + // Deliberate fall-through + case 4001: + _globals->_player.enableControl(); + break; + case 4002: + case 4011: + break; + case 4003: + _sceneMode = 4014; + setAction(&_sequenceManager1, this, 4014, &_globals->_player, &_hotspot5, NULL); + break; + case 4004: + RING_INVENTORY._ladder._sceneNumber = 4000; + // Deliberate fall-through + case 4007: + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + _globals->setFlag(40); + break; + case 4005: + _globals->_player.enableControl(); + _globals->_events.setCursor(CURSOR_WALK); + _globals->clearFlag(40); + break; + case 4006: + _globals->_sceneManager.changeScene(4045); + break; + case 4008: + _globals->_sceneManager.changeScene(2320); + break; + case 4009: + _globals->_sceneManager.changeScene(2200); + break; + case 4012: + _globals->_player.checkAngle(&_theTech); + _globals->_sceneManager.changeScene(4025); + break; + case 4013: + _globals->_player.enableControl(); + _olo.remove(); + break; + case 4014: + _globals->_sceneManager.changeScene(4250); + break; + case 4015: + ADD_MOVER_NULL(_miranda, 0, _miranda._position.y - 5); + break; + } +} + +void Scene4000::dispatch() { + Scene::dispatch(); + + if ((_globals->_player.getRegionIndex() == 10) || (_globals->_player.getRegionIndex() == 6)) + _globals->_player.fixPriority(200); + if (_globals->_player.getRegionIndex() == 11) + _globals->_player.fixPriority(-1); + if (_globals->_player.getRegionIndex() == 5) + _globals->_player.fixPriority(94); + + if (_globals->_sceneObjects->contains(&_hotspot5)) { + if ((_hotspot5.getRegionIndex() == 10) || (_hotspot5.getRegionIndex() == 6)) + _hotspot5.fixPriority(200); + if (_hotspot5.getRegionIndex() == 11) + _hotspot5.fixPriority(-1); + if (_hotspot5.getRegionIndex() == 5) + _hotspot5.fixPriority(94); + } + + if (_globals->_sceneObjects->contains(&_miranda)) { + if (!_miranda._mover) + _miranda.checkAngle(&_globals->_player); + if (!_action && _globals->_player.getRegionIndex() == 23) { + ADD_MOVER_NULL(_miranda, 204, 186); + } + + if ((_miranda.getRegionIndex() == 10) || (_miranda.getRegionIndex() == 6)) + _miranda.fixPriority(200); + if (_miranda.getRegionIndex() == 11) + _miranda.fixPriority(-1); + if (_miranda.getRegionIndex() == 5) + _miranda.fixPriority(94); + } + + if (!_action) { + if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) && + _globals->getFlag(37) && !_globals->getFlag(40)) { + _globals->_player.disableControl(); + _soundHandler1.play(177); + _globals->_soundHandler.play(178); + + setAction(&_action1); + } + + if (_globals->_player.getRegionIndex() == 2) + _globals->_sceneManager.changeScene(4045); + if (_globals->_player.getRegionIndex() == 15) + _globals->_sceneManager.changeScene(4100); + + if ((_globals->_player._position.x <= 5) && (_globals->_player._position.y < 100)) { + _globals->_player.disableControl(); + + if (!_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) { + _sceneMode = 4008; + setAction(&_sequenceManager1, this, 4008, &_globals->_player, NULL); + } else { + _sceneMode = 4015; + _globals->_player.addMover(NULL); + setAction(&_sequenceManager1, this, 4015, &_globals->_player, &_miranda, NULL); + } + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 4010 - Village - Outside Lander + * + *--------------------------------------------------------------------------*/ + +void Scene4010::postInit(SceneObjectList *OwnerList) { + loadScene(4010); + Scene::postInit(); + setZoomPercents(0, 20, 70, 50); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerMText); + _speakerSText._npc = &_hotspot1; + _speakerMText._npc = &_hotspot2; + _speakerQText._npc = &_globals->_player; + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(-38, 175)); + _globals->_player.changeZoom(75); + + _hotspot2.postInit(); + _hotspot2.setVisage(2705); + _hotspot2.animate(ANIM_MODE_1, NULL); + _hotspot2.setObjectWrapper(new SceneObjectWrapper()); + _hotspot2._moveDiff = Common::Point(4, 2); + _hotspot2.setPosition(Common::Point(-50, 185)); + _hotspot2.changeZoom(75); + + _hotspot1.postInit(); + _hotspot1.setVisage(2806); + _hotspot1.setPosition(Common::Point(-20, 175)); + _hotspot1.changeZoom(75); + _hotspot1.animate(ANIM_MODE_1, NULL); + _hotspot1.setObjectWrapper(new SceneObjectWrapper()); + + _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 4017, &_globals->_player, &_hotspot1, &_hotspot2, NULL); +} + +void Scene4010::signal() { + _globals->_sceneManager.changeScene(4000); +} + +/*-------------------------------------------------------------------------- + * Scene 4025 - Village - Puzzle Board + * + *--------------------------------------------------------------------------*/ + +void Scene4025::Action1::signal() { + Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_armHotspot._strip = scene->_pegPtr->_armStrip; + scene->_armHotspot._frame = 4; + scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this); + + if (scene->_pegPtr->_armStrip > 3) { + if (scene->_hole1._armStrip == scene->_pegPtr->_armStrip) + scene->_hole1._pegPtr = NULL; + if (scene->_hole2._armStrip == scene->_pegPtr->_armStrip) + scene->_hole2._pegPtr = NULL; + if (scene->_hole3._armStrip == scene->_pegPtr->_armStrip) + scene->_hole3._pegPtr = NULL; + if (scene->_hole4._armStrip == scene->_pegPtr->_armStrip) + scene->_hole4._pegPtr = NULL; + if (scene->_hole5._armStrip == scene->_pegPtr->_armStrip) + scene->_hole5._pegPtr = NULL; + } + break; + case 1: + scene->_pegPtr->hide(); + + if (scene->_pegPtr2) { + if (scene->_pegPtr->_armStrip == 3) + scene->_pegPtr2->_strip = 2; + + scene->_pegPtr2->setPosition(scene->_pegPtr->_position); + scene->_pegPtr2->show(); + scene->_pegPtr2->_armStrip = scene->_pegPtr->_armStrip; + } + + scene->_pegPtr->_armStrip = 0; + scene->_pegPtr->setPosition(Common::Point(-10, -10)); + scene->_pegPtr2 = scene->_pegPtr; + scene->_armHotspot.animate(ANIM_MODE_5, this); + break; + + case 2: + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + remove(); + break; + } +} + +void Scene4025::Action2::signal() { + Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_armHotspot._strip = scene->_holePtr->_armStrip; + scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this); + break; + case 1: + if (!scene->_pegPtr2) { + // Getting a peg from a hole + scene->_holePtr->_pegPtr->hide(); + scene->_pegPtr = scene->_holePtr->_pegPtr; + scene->_pegPtr->_armStrip = 0; + scene->_pegPtr->setPosition(Common::Point(-10, -10)); + scene->_pegPtr2 = scene->_holePtr->_pegPtr; + scene->_holePtr->_pegPtr = NULL; + } else { + // Placing a peg into a hole + scene->_pegPtr2 = NULL; + if (scene->_holePtr->_pegPtr) { + scene->_holePtr->_pegPtr->hide(); + scene->_pegPtr2 = scene->_holePtr->_pegPtr; + } + + assert(scene->_pegPtr); + scene->_pegPtr->setPosition(scene->_holePtr->_newPosition); + scene->_pegPtr->setStrip(1); + scene->_pegPtr->show(); + scene->_pegPtr->_armStrip = scene->_holePtr->_armStrip; + + scene->_holePtr->_pegPtr = scene->_pegPtr; + scene->_pegPtr = scene->_pegPtr2; + } + scene->_armHotspot.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + remove(); + break; + } +} + +void Scene4025::Action3::signal() { + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + _globals->_scenePalette.addRotation(64, 111, -1); + setDelay(120); + break; + case 1: + _globals->clearFlag(34); + _globals->_stripNum = 4025; + _globals->_sceneManager.changeScene(4000); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4025::Hole::synchronize(Serializer &s) { + SceneObject::synchronize(s); + SYNC_POINTER(_pegPtr); + s.syncAsSint16LE(_armStrip); + s.syncAsSint16LE(_newPosition.x); + s.syncAsSint16LE(_newPosition.y); +} + +void Scene4025::Hole::doAction(int action) { + Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4025, 3); + break; + case CURSOR_USE: + if (!scene->_pegPtr && !_pegPtr) { + setAction(&scene->_sequenceManager, scene, 4028, NULL); + } else { + _globals->_player.disableControl(); + scene->_holePtr = this; + scene->setAction(&scene->_action2); + } + break; + case OBJECT_PEG: + if (!scene->_pegPtr2) { + _globals->_player.disableControl(); + _globals->_events.setCursor(CURSOR_USE); + RING_INVENTORY._peg._sceneNumber = 4025; + + scene->_pegPtr = &scene->_peg5; + scene->_holePtr = this; + scene->_pegPtr->_armStrip = 0; + scene->_pegPtr2 = scene->_pegPtr; + + scene->setAction(&scene->_action2); + } else { + scene->_sceneMode = 4027; + scene->setAction(&scene->_sequenceManager, scene, 4027, NULL); + } + break; + } +} + +void Scene4025::Peg::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_field88); + s.syncAsSint16LE(_armStrip); +} + +void Scene4025::Peg::doAction(int action) { + Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4025, 1); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_pegPtr = this; + scene->setAction(&scene->_action1); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4025::Scene4025() : Scene() { + _holePtr = NULL; + _pegPtr = _pegPtr2 = NULL; +} + +void Scene4025::postInit(SceneObjectList *OwnerList) { + loadScene(4025); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _globals->_events.setCursor(CURSOR_USE); + _pegPtr = _pegPtr2 = NULL; + + _peg1.postInit(); + _peg1._field88 = 1; + _peg1.setVisage(4025); + _peg1.setStrip(2); + _peg1.setFrame(1); + _peg1.setPosition(Common::Point(203, 61)); + + _peg2.postInit(); + _peg2._field88 = 4; + _peg2.setVisage(4025); + _peg2.setStrip(2); + _peg2.setFrame(2); + _peg2.setPosition(Common::Point(195, 57)); + + _peg3.postInit(); + _peg3._field88 = 0; + _peg3.setVisage(4025); + _peg3.setStrip(2); + _peg3.setFrame(3); + _peg3.setPosition(Common::Point(202, 66)); + + _peg4.postInit(); + _peg4._field88 = 3; + _peg4.setVisage(4025); + _peg4.setStrip(2); + _peg4.setFrame(4); + _peg4.setPosition(Common::Point(194, 68)); + + _peg5.postInit(); + _peg5._field88 = 2; + _peg5.setVisage(4025); + _peg5.setStrip(1); + _peg5.setFrame(5); + _peg5.hide(); + + // Hole N-W + _hole1.postInit(); + _hole1.setVisage(4025); + _hole1.setStrip(1); + _hole1.setFrame2(6); + _hole1.setPosition(Common::Point(123, 51)); + _hole1._pegPtr = NULL; + _hole1._newPosition = Common::Point(123, 44); + _hole1._armStrip = 8; + + // Hole N-E + _hole2.postInit(); + _hole2.setVisage(4025); + _hole2.setStrip(1); + _hole2.setFrame2(7); + _hole2.setPosition(Common::Point(167, 51)); + _hole2._pegPtr = NULL; + _hole2._newPosition = Common::Point(166, 44); + _hole2._armStrip = 7; + + // Hole Center + _hole3.postInit(); + _hole3.setVisage(4025); + _hole3.setStrip(1); + _hole3.setFrame2(8); + _hole3.setPosition(Common::Point(145, 69)); + _hole3._pegPtr = NULL; + _hole3._newPosition = Common::Point(145, 60); + _hole3._armStrip = 6; + + // Hole S-W + _hole4.postInit(); + _hole4.setVisage(4025); + _hole4.setStrip(1); + _hole4.setFrame2(9); + _hole4.setPosition(Common::Point(123, 87)); + _hole4._pegPtr = NULL; + _hole4._newPosition = Common::Point(123, 80); + _hole4._armStrip = 5; + + // Hole S-E + _hole5.postInit(); + _hole5.setVisage(4025); + _hole5.setStrip(1); + _hole5.setFrame2(10); + _hole5.setPosition(Common::Point(167, 87)); + _hole5._pegPtr = NULL; + _hole5._newPosition = Common::Point(166, 80); + _hole5._armStrip = 4; + + _hole1.fixPriority(1); + _hole2.fixPriority(1); + _hole3.fixPriority(1); + _hole4.fixPriority(1); + _hole5.fixPriority(1); + + _armHotspot.postInit(); + _armHotspot.setVisage(4025); + _armHotspot.setPosition(Common::Point(190, 161)); + _armHotspot.setStrip(3); + _armHotspot.setFrame(4); + + _globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5, + &_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL); + + _globals->_player._uiEnabled = true; + _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 4026, NULL); +} + +void Scene4025::synchronize(Serializer &s) { + Scene::synchronize(s); + SYNC_POINTER(_pegPtr); + SYNC_POINTER(_pegPtr2); + SYNC_POINTER(_holePtr); +} + +void Scene4025::remove() { + _globals->_scenePalette.clearListeners(); + Scene::remove(); +} + +void Scene4025::signal() { + if (_sceneMode != 4027) { + if (_sceneMode != 4028) { + _gfxButton.setText(EXIT_MSG); + _gfxButton._bounds.center(144, 107); + _gfxButton.draw(); + _gfxButton._bounds.expandPanes(); + } + + _globals->_player._uiEnabled = true; + } + + _globals->_events.setCursor(CURSOR_USE); +} + +void Scene4025::process(Event &event) { + Scene::process(event); + + if (_gfxButton.process(event)) { + if (RING_INVENTORY._peg._sceneNumber == 4025) + RING_INVENTORY._peg._sceneNumber = 1; + + _globals->_sceneManager.changeScene(4000); + } +} + +void Scene4025::dispatch() { + if (!_action && (_peg1._armStrip == 7) && (_peg2._armStrip == 4) && (_peg3._armStrip == 8) && + (_peg4._armStrip == 5) && (_peg5._armStrip == 6)) + setAction(&_action3); + + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 4045 - Village - Temple Antechamber + * + *--------------------------------------------------------------------------*/ + +void Scene4045::Action1::signal() { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(60); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(4040, this, scene); + break; + case 2: + scene->_olloFace.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot4.animate(ANIM_MODE_5, this); + break; + case 3: + setDelay(60); + break; + case 4: + scene->_hotspot4.animate(ANIM_MODE_6, this); + break; + case 5: + ADD_MOVER(_globals->_player, 150, 300); + break; + case 6: + _globals->_stripNum = 4000; + _globals->_sceneManager.changeScene(4000); + remove(); + break; + } +} + +void Scene4045::Action2::signal() { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(15); + break; + case 1: + scene->_stripManager.start(_globals->_stripNum, this, scene); + break; + case 2: + scene->_olloFace.animate(ANIM_MODE_NONE, NULL); + setDelay(10); + break; + case 3: + if (_globals->getFlag(38)) { + _globals->_player.enableControl(); + remove(); + } else { + ADD_MOVER(_globals->_player, 150, 300); + } + break; + case 4: + _globals->setFlag(39); + _globals->_sceneManager.changeScene(4000); + break; + } +} + +void Scene4045::Action3::signal() { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + scene->_hotspot4.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_stripManager.start(4504, this, scene); + break; + case 2: + scene->_hotspot4.animate(ANIM_MODE_6, NULL); + scene->_olloFace.animate(ANIM_MODE_NONE, NULL); + ADD_MOVER(_globals->_player, 91, 1264); + break; + case 3: + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4045::OlloStand::doAction(int action) { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(4045, 19); + break; + case CURSOR_LOOK: + SceneItem::display2(4045, (_strip == 1) ? 5 : 14); + break; + case CURSOR_USE: + SceneItem::display2(4045, 18); + break; + case CURSOR_TALK: + if (_strip == 5) { + setStrip(6); + animate(ANIM_MODE_NONE, NULL); + } + if (_globals->_player._position.y < 135) { + scene->_sceneMode = 4046; + _numFrames = 10; + _globals->_player.disableControl(); + + scene->setAction(&scene->_sequenceManager, this, 4046, &_globals->_player, this, NULL); + } else { + if (!_globals->getFlag(31)) { + _globals->setFlag(31); + _globals->_stripNum = 4080; + } else if (!_globals->getFlag(38)) + _globals->_stripNum = 4060; + else + _globals->_stripNum = 4503; + + scene->setAction(&scene->_action2); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4045::Miranda::doAction(int action) { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4045, 9); + break; + case CURSOR_TALK: + scene->_sceneMode = 4102; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 4104, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4045::Necklace::doAction(int action) { + Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4045, 17); + break; + case CURSOR_USE: + if (_globals->_player._position.y < 135) { + SceneItem::display2(4045, 16); + RING_INVENTORY._peg._sceneNumber = 1; + _globals->_events.setCursor(CURSOR_WALK); + remove(); + } else { + scene->_sceneMode = 4047; + _globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 4047, &_globals->_player, &scene->_olloStand, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4045::Scene4045() : + _flame(0, CURSOR_LOOK, 4045, 1, CURSOR_USE, 4100, 21, LIST_END), + _hotspot7(9, CURSOR_LOOK, 4045, 0, CURSOR_USE, 4045, 15, LIST_END), + _hotspot8(10, CURSOR_LOOK, 4045, 2, LIST_END), + _hotspot9(11, CURSOR_LOOK, 4045, 3, CURSOR_USE, 4045, 15, LIST_END), + _hotspot10(12, CURSOR_LOOK, 4045, 4, CURSOR_USE, 4100, 19, LIST_END), + _hotspot11(13, CURSOR_LOOK, 4045, 6, CURSOR_USE, 4045, 15, LIST_END), + _hotspot12(14, CURSOR_LOOK, 4045, 7, CURSOR_USE, 4150, 29, LIST_END), + _hotspot13(15, CURSOR_LOOK, 4045, 8, CURSOR_USE, 4100, 19, LIST_END), + _hotspot14(0, CURSOR_LOOK, 4045, 10, LIST_END) { + + _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); +} + +void Scene4045::postInit(SceneObjectList *OwnerList) { + loadScene(4045); + Scene::postInit(); + setZoomPercents(100, 60, 200, 100); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerML); + _stripManager.addSpeaker(&_speakerPR); + _stripManager.addSpeaker(&_speakerPText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.setCallback(this); + + _speakerQText._textPos.y = 140; + + _flame.postInit(); + _flame.setVisage(4045); + _flame.setPosition(Common::Point(47, 111)); + _flame.animate(ANIM_MODE_2, NULL); + _flame.fixPriority(156); + _globals->_sceneItems.push_back(&_flame); + + _globals->_player.postInit(); + _globals->_player.setVisage(4200); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._moveDiff = Common::Point(7, 4); + + _olloStand.postInit(); + _olloStand.setVisage(4051); + + _olloFace.postInit(); + _olloFace.setVisage(4051); + _olloFace.setStrip(4); + _olloFace.fixPriority(152); + + if(_globals->_sceneManager._previousScene == 4050) { + _globals->_soundHandler.play(155); + _globals->_player.setPosition(Common::Point(72, 128)); + _globals->_player.enableControl(); + + _olloStand.setStrip(5); + _olloStand.setPosition(Common::Point(173, 99)); + _olloStand._numFrames = 1; + _olloStand.animate(ANIM_MODE_2, NULL); + + _olloFace.setPosition(Common::Point(177, 40)); + + if (RING_INVENTORY._peg._sceneNumber == 4045) { + _necklace.postInit(); + _necklace.setVisage(4045); + _necklace.setStrip(2); + _necklace.setPosition(Common::Point(108, 82)); + _globals->_sceneItems.push_back(&_necklace); + } + } else { + _globals->_player.setPosition(Common::Point(108, 192)); + _globals->_player.setStrip(4); + + if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + _miranda.postInit(); + _miranda.setVisage(4102); + _miranda.animate(ANIM_MODE_NONE, NULL); + _miranda.setStrip(3); + _miranda.setFrame(2); + _miranda.changeZoom(-1); + + _miranda.setPosition(Common::Point(66, 209)); + _globals->_sceneItems.push_back(&_miranda); + } + + if (_globals->getFlag(31)) { + // Olo asleep + _olloStand.setVisage(4051); + _olloStand.setStrip(5); + _olloStand.setPosition(Common::Point(173, 99)); + _olloStand._numFrames = 1; + _olloStand.animate(ANIM_MODE_2, NULL); + + _olloFace.setPosition(Common::Point(177, 40)); + + if (RING_INVENTORY._peg._sceneNumber == 4045) { + _necklace.postInit(); + _necklace.setVisage(4045); + _necklace.setStrip(2); + _necklace.setPosition(Common::Point(108, 82)); + _globals->_sceneItems.push_back(&_necklace); + } + } else { + _olloStand.setPosition(Common::Point(186, 149)); + + _hotspot4.postInit(); + _hotspot4.setVisage(4051); + _hotspot4.setStrip(2); + _hotspot4.fixPriority(152); + _hotspot4.setPosition(Common::Point(202, 80)); + + _olloFace.setPosition(Common::Point(192, 77)); + _globals->setFlag(31); + setAction(&_action1); + + _globals->_player.disableControl(); + } + } + + _globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10, + &_hotspot13, &_hotspot11, &_hotspot12, &_hotspot14, NULL); +} + +void Scene4045::stripCallback(int v) { + switch (v) { + case 1: + _olloFace.animate(ANIM_MODE_7, 0, NULL); + break; + case 2: + _olloFace.animate(ANIM_MODE_NONE, NULL); + break; + } +} + +void Scene4045::signal() { + switch (_sceneMode) { + case 4046: + case 4047: + _olloFace.animate(ANIM_MODE_NONE, NULL); + break; + case 4050: + _globals->_sceneManager.changeScene(4000); + break; + case 4102: + _globals->_player.enableControl(); + break; + } +} + +void Scene4045::dispatch() { + if (!_action) { + if (_globals->_player.getRegionIndex() == 8) { + _globals->_player.addMover(NULL); + if (_olloStand._strip != 1) { + _globals->_player.disableControl(); + _sceneMode = 4046; + _olloStand._numFrames = 10; + setAction(&_sequenceManager, this, 4046, &_globals->_player, &_olloStand, NULL); + } else { + setAction(&_action3); + } + } + + if (_globals->_player.getRegionIndex() == 10) + _globals->_sceneManager.changeScene(4050); + if (_globals->_player._position.y >= 196) { + _sceneMode = 4050; + _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); + } + } + + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 4050 - Village - Outside + * + *--------------------------------------------------------------------------*/ + +void Scene4050::Action1::signal() { + // "Map" on the wall + Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: { + Common::Point pt(204, 152); + PlayerMover *mover = new PlayerMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_player.checkAngle(&scene->_hotspot17); + + scene->_hotspot14.postInit(); + scene->_hotspot14.setVisage(4050); + scene->_hotspot14.setStrip(2); + scene->_hotspot14.setPosition(Common::Point(91, 154)); + scene->_hotspot14.fixPriority(200); + setDelay(10); + break; + case 3: + _globals->_events.waitForPress(); + _globals->setFlag(45); + scene->_hotspot14.remove(); + + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4050::Action2::signal() { + // Climb down the rope + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(120); + break; + case 1: + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player.setVisage(4202); + _globals->_player.changeZoom(100); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(192, 130)); + + ADD_MOVER(_globals->_player, 215, 130); + break; + case 3: + _globals->_player.setVisage(4052); + _globals->_player.setStrip(5); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(236, 130)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 4: + _globals->_player.setVisage(4202); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setPosition(Common::Point(210, 185)); + _globals->_player.fixPriority(-1); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4050::Action3::signal() { + // Climb up the rope + switch (_actionIndex++) { + case 0: + ADD_PLAYER_MOVER(210, 185); + break; + case 1: + _globals->_player.fixPriority(200); + _globals->_player.setVisage(4052); + _globals->_player.setStrip(5); + _globals->_player.changeZoom(100); + _globals->_player.setFrame(_globals->_player.getFrameCount()); + _globals->_player.setPosition(Common::Point(236, 130)); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 2: + _globals->_player.setVisage(4202); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(215, 130)); + ADD_MOVER(_globals->_player, 212, 130); + break; + case 3: + _globals->_stripNum = 4050; + _globals->_sceneManager.changeScene(4000); + break; + } +} + +void Scene4050::Action4::signal() { + Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_MOVER(_globals->_player, 189, 135); + _globals->_player.fixPriority(200); + break; + case 1: + _globals->_player._moveDiff.y = 3; + _globals->_player.setStrip2(3); + _globals->_player._frame = 1; + _globals->_player.setPosition(Common::Point(189, 129)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + _globals->_player.setVisage(4202); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(192, 130)); + _globals->_player.changeZoom(100); + ADD_MOVER(_globals->_player, 215, 130); + + scene->_hotspot16.postInit(); + scene->_hotspot16.setVisage(4052); + scene->_hotspot16.animate(ANIM_MODE_1, NULL); + scene->_hotspot16.setStrip2(6); + scene->_hotspot16.setPosition(Common::Point(160, 240)); + ADD_MOVER(scene->_hotspot16, 172, 188); + break; + case 3: + _globals->_player.setVisage(4052); + _globals->_player.setStrip(5); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(238, 130)); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 4: + _globals->_player.setVisage(4052); + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(216, 184)); + _globals->_player.fixPriority(-1); + break; + case 5: + scene->_hotspot16.setStrip2(4); + scene->_hotspot16.setFrame(1); + scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);; + break; + case 6: + scene->_hotspot16.animate(ANIM_MODE_5, NULL); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 7: + _globals->_player.setVisage(4202); + _globals->_player.setStrip(6); + _globals->_player.setFrame(1); + + scene->_stripManager.start(4051, this); + break; + case 8: + setDelay(15); + break; + case 9: + _globals->_sceneManager.changeScene(4000); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4050::Hotspot15::doAction(int action) { + Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4050, 14); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4050::Hotspot17::doAction(int action) { + Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + scene->setAction(&scene->_action1); + break; + case CURSOR_USE: + SceneItem::display2(4050, 24); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4050::Scene4050() : + _hotspot1(0, CURSOR_LOOK, 4050, 0, LIST_END), + _hotspot2(0, CURSOR_LOOK, 4050, 1, CURSOR_USE, 4050, 15, LIST_END), + _hotspot3(0, CURSOR_LOOK, 4050, 2, CURSOR_USE, 4050, 16, LIST_END), + _hotspot4(0, CURSOR_LOOK, 4050, 4, LIST_END), + _hotspot5(0, CURSOR_LOOK, 4050, 5, LIST_END), + _hotspot6(0, CURSOR_LOOK, 4050, 5, LIST_END), + _hotspot7(0, CURSOR_LOOK, 4050, 6, CURSOR_USE, 4050, 18, LIST_END), + _hotspot8(0, CURSOR_LOOK, 4050, 7, CURSOR_USE, 4050, 19, LIST_END), + _hotspot9(0, CURSOR_LOOK, 4050, 8, CURSOR_USE, 4050, 20, LIST_END), + _hotspot10(0, CURSOR_LOOK, 4050, 9, CURSOR_USE, 4050, 21, LIST_END), + _hotspot11(0, CURSOR_LOOK, 4050, 10, CURSOR_USE, 4050, 22, LIST_END), + _hotspot12(0, CURSOR_LOOK, 4050, 11, CURSOR_USE, 4050, 23, LIST_END), + _hotspot13(0, CURSOR_LOOK, 4050, 3, CURSOR_USE, 4050, 17, LIST_END) { +} + +void Scene4050::postInit(SceneObjectList *OwnerList) { + loadScene(4050); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerPText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerGameText); + + _globals->_player.postInit(); + + switch (_globals->_sceneManager._previousScene) { + case 4000: + if (_globals->getFlag(41)) { + // Using a rope + _hotspot15.postInit(); + _hotspot15.setVisage(4054); + _hotspot15.setPosition(Common::Point(206, 103)); + _globals->_sceneItems.push_back(&_hotspot15); + + _globals->_player.setVisage(4008); + _globals->_player.setPosition(Common::Point(206, 62)); + _globals->_player.changeZoom(130); + _globals->_player.fixPriority(200); + _globals->_player.setStrip(2); + + setAction(&_action2); + _globals->_soundHandler.play(175); + } else { + // Without the rope + _globals->_player.setVisage(5315); + _globals->_player.setPosition(Common::Point(189, 83)); + _globals->_player.changeZoom(130); + _globals->_player.setStrip2(2); + _globals->_player._moveDiff.y = 10; + _globals->_player.animate(ANIM_MODE_2, NULL); + + setAction(&_action4); + _globals->_soundHandler.play(176); + } + break; + case 4045: + _hotspot15.postInit(); + _hotspot15.setVisage(4054); + _hotspot15.setPosition(Common::Point(206, 103)); + _globals->_sceneItems.push_back(&_hotspot15); + + _globals->_player.setVisage(4202); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(193, 193)); + + _globals->_soundHandler.play(175); + break; + default: + break; + } + + _hotspot13.postInit(); + _hotspot13.setVisage(4053); + _hotspot13.animate(ANIM_MODE_2, NULL); + _hotspot13.setPosition(Common::Point(190, 97)); + + _hotspot17.postInit(); + _hotspot17.setVisage(4050); + _hotspot17.setPosition(Common::Point(209, 119)); + _hotspot17.fixPriority(2); + + _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot2.setBounds(Rect(150, 25, 198, 125)); + _hotspot3.setBounds(Rect(56, 94, 88, 153)); + _hotspot4.setBounds(Rect(170, 7, 209, 18)); + _hotspot5.setBounds(Rect(190, 72, 212, 92)); + _hotspot6.setBounds(Rect(122, 75, 145, 93)); + _hotspot7.setBounds(Rect(109, 103, 263, 158)); + _hotspot8.setBounds(Rect(157, 160, 213, 173)); + _hotspot9.setBounds(Rect(95, 157, 120, 178)); + _hotspot10.setBounds(Rect(278, 43, 310, 115)); + _hotspot11.setBounds(Rect(263, 105, 279, 147)); + _hotspot12.setBounds(Rect(258, 154, 307, 180)); + + _globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13, + &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot8, &_hotspot9, + &_hotspot7, &_hotspot1, NULL); +} + +void Scene4050::signal() { + if (_sceneMode == 4050) + _globals->_sceneManager.changeScene(4045); +} + +void Scene4050::dispatch() { + if (!_action) { + if ((_globals->_player._canWalk) && (_globals->_player._position.y > 196)) { + _sceneMode = 4050; + _globals->_player.disableControl(); + + Common::Point pt(160, 275); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } + } + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 4100 - Village - Hut + * + *--------------------------------------------------------------------------*/ + +void Scene4100::Action1::signal() { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(10); + break; + case 1: + scene->_stripManager.start(_globals->_stripNum, this); + break; + case 2: + setDelay(30); + break; + case 3: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4100::Action2::signal() { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_hotspot2.postInit(); + scene->_hotspot2.changeZoom(95); + scene->_hotspot2.setVisage(4120); + scene->_hotspot2.animate(ANIM_MODE_1, NULL); + scene->_hotspot2.setStrip2(4); + scene->_hotspot2.fixPriority(100); + scene->_hotspot2.setPosition(Common::Point(214, 119)); + + setDelay(3); + break; + case 1: + ADD_MOVER(scene->_hotspot2, 249, 131); + break; + case 2: + scene->_hotspot2.setStrip2(3); + scene->_hotspot2.setFrame2(5); + scene->_hotspot2.animate(ANIM_MODE_NONE, NULL); + setDelay(3); + break; + case 3: + remove(); + break; + } +} + + +void Scene4100::Action3::signal() { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->clearFlag(43); + _globals->setFlag(36); + setDelay(15); + break; + case 1: + scene->_stripManager.start(4505, this); + break; + case 2: + setAction(&scene->_action2, this); + break; + case 3: + scene->_stripManager.start(4510, this); + break; + case 4: + setDelay(15); + break; + case 5: + _globals->_sceneManager.changeScene(4150); + break; + default: + break; + } +} + +void Scene4100::Action4::signal() { + // Rock getting drunk + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 2: + scene->_hotspot1.setVisage(4105); + scene->_hotspot1.setFrame(1); + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->clearFlag(43); + _globals->setFlag(42); + scene->_stripManager.start(4119, this); + break; + case 4: + setDelay(15); + break; + case 5: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4100::Action5::signal() { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_PLAYER_MOVER(58, 151); + break; + case 1: + if (RING_INVENTORY._ladder._sceneNumber == 4100) { + RING_INVENTORY._ladder._sceneNumber = 1; + scene->_ladder.remove(); + } else { + scene->_ladder.postInit(); + scene->_ladder.setVisage(4101); + scene->_ladder.setPosition(Common::Point(49, 144)); + + RING_INVENTORY._ladder._sceneNumber = 4100; + _globals->_sceneItems.push_front(&scene->_ladder); + } + + _globals->_player.enableControl(); + remove(); + break; + } +} + + +void Scene4100::Action6::signal() { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + scene->_stripManager.start(4103, this); + ADD_PLAYER_MOVER(245, 167); + break; + case 1: + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4100::Hotspot1::doAction(int action) { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_STUNNER: + SceneItem::display2(4100, 16); + break; + case OBJECT_ALE: + _globals->_player.disableControl(); + scene->setAction(&scene->_action3); + break; + case CURSOR_LOOK: + SceneItem::display2(4100, _globals->getFlag(42) ? 24 : 12); + break; + case CURSOR_USE: + SceneItem::display2(4100, 22); + break; + case CURSOR_TALK: + if (RING_INVENTORY._peg._sceneNumber == 1) { + _globals->_player.disableControl(); + scene->_sceneMode = 4109; + scene->setAction(&scene->_sequenceManager, scene, 4109, NULL); + } else if (_globals->getFlag(42)) { + scene->_sceneMode = 4102; + scene->setAction(&scene->_sequenceManager, scene, 4102, NULL); + } else { + if (_globals->getFlag(33)) + _globals->_stripNum = 4077; + else if (_globals->getFlag(82)) { + _globals->clearFlag(82); + _globals->_stripNum = 4100; + } else { + _globals->_stripNum = 4075; + _globals->setFlag(33); + } + + scene->setAction(&scene->_action1); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4100::Hotspot2::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + error("*** The Chief's daughter... WOW!"); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4100::Miranda::doAction(int action) { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4100, 14); + break; + case CURSOR_TALK: + scene->_sceneMode = 4102; + scene->setAction(&scene->_sequenceManager, scene, 4104, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4100::Ladder::doAction(int action) { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4100, 2); + break; + case CURSOR_USE: + if (_globals->getFlag(42)) { + _globals->_player.disableControl(); + scene->setAction(&scene->_action5); + } else { + scene->_sceneMode = 4102; + scene->setAction(&scene->_sequenceManager, scene, 4103, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/** + Exit hotspot, South + */ +void Scene4100::Hotspot14::doAction(int action) { + Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4100, 0); + break; + case OBJECT_LADDER: + _globals->_player.disableControl(); + scene->setAction(&scene->_action5); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +Scene4100::Scene4100() : + _hotspot3(0, CURSOR_LOOK, 4100, 10, CURSOR_USE, 4100, 21, LIST_END), + _hotspot4(0, CURSOR_LOOK, 4100, 8, LIST_END), + _hotspot7(0, CURSOR_USE, 4100, 3, CURSOR_USE, 4150, 29, LIST_END), + _hotspot8(0, CURSOR_LOOK, 4100, 5, LIST_END), + _hotspot9(0, CURSOR_LOOK, 4100, 6, CURSOR_USE, 4100, 20, LIST_END), + _hotspot10(0, CURSOR_LOOK, 4100, 7, CURSOR_USE, 4100, 19, LIST_END), + _hotspot11(0, CURSOR_LOOK, 4100, 8, CURSOR_USE, 4100, 18, LIST_END), + _hotspot12(0, CURSOR_LOOK, 4100, 9, LIST_END), + _hotspot13(0, CURSOR_LOOK, 4100, 11, CURSOR_USE, 4100, 17, LIST_END) { +} + +void Scene4100::postInit(SceneObjectList *OwnerList) { + loadScene(4100); + Scene::postInit(); + setZoomPercents(135, 80, 190, 100); + + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerCHFText); + _stripManager.addSpeaker(&_speakerCDRText); + _stripManager.addSpeaker(&_speakerCDR); + _stripManager.addSpeaker(&_speakerML); + _stripManager.addSpeaker(&_speakerQR); + + _globals->_player.postInit(); + _globals->_player.setVisage(4200); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(4); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(88, 180)); + _globals->_player._moveDiff = Common::Point(7, 4); + + _hotspot1.postInit(); + _hotspot1.setVisage(4102); + _hotspot1.fixPriority(129); + _hotspot1.setPosition(Common::Point(171, 120)); + + _hotspot3.postInit(); + _hotspot3.setVisage(4130); + _hotspot3.animate(ANIM_MODE_2, NULL); + _hotspot3.fixPriority(200); + _hotspot3.setPosition(Common::Point(272, 110)); + + _hotspot4.postInit(); + _hotspot4.setVisage(4130); + _hotspot4.animate(ANIM_MODE_2, NULL); + _hotspot4.setStrip2(2); + _hotspot4.setPosition(Common::Point(152, 167)); + + if (_globals->getFlag(36)) { + _hotspot1.setVisage(4105); + _hotspot1.setStrip(1); + _hotspot1.setFrame(4); + } else if (!_globals->getFlag(43)) { + _miranda.postInit(); + _miranda.setVisage(4102); + _miranda.setStrip2(3); + _miranda.setFrame(2); + _miranda.setPosition(Common::Point(65, 188)); + + _globals->_sceneItems.push_back(&_miranda); + } + + if (RING_INVENTORY._ladder._sceneNumber == 4100) { + _ladder.postInit(); + _ladder.setVisage(4101); + _ladder.setPosition(Common::Point(49, 144)); + + _globals->_sceneItems.push_back(&_ladder); + } + + _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot7._sceneRegionId = 16; + _hotspot8.setBounds(Rect(90, 0, 211, 113)); + _hotspot9.setBounds(Rect(207, 96, 235, 115)); + _hotspot10.setBounds(Rect(87, 81, 212, 107)); + _hotspot11.setBounds(Rect(61, 148, 243, 168)); + _hotspot12.setBounds(Rect(229, 59, 256, 122)); + _hotspot13.setBounds(Rect(255, 152, 286, 183)); + + _globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4, + &_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL); + + if (_globals->_sceneManager._previousScene == 4150) { + _globals->_soundHandler.play(155); + + if (!_globals->getFlag(42)) { + _hotspot1.setVisage(4104); + _hotspot1.setPosition(Common::Point(152, 118)); + _hotspot1.setStrip2(-1); + _hotspot1.setFrame2(-1); + _hotspot1.setFrame(1); + + _globals->_player.setStrip(2); + _globals->_player.disableControl(); + setAction(&_action4); + + _globals->clearFlag(43); + } else { + // Workaround: In the original, the mouse is hidden when Quinn + // goes back to scene 4150 then to scene 4100. This enables everything. + _globals->_player.enableControl(); + } + + _globals->_player.setPosition(Common::Point(252, 139)); + _globals->_player.setStrip(2); + } else { + if ((RING_INVENTORY._ale._sceneNumber == 4100) && !_globals->getFlag(42)) { + _globals->_player.disableControl(); + setAction(&_action3); + } + if (_globals->getFlag(35)) { + _globals->_player.disableControl(); + _sceneMode = 4101; + setAction(&_sequenceManager, this, 4101, &_globals->_player, NULL); + } + } +} + +void Scene4100::signal() { + switch (_sceneMode) { + case 4101: + _globals->_sceneManager.changeScene(4000); + break; + case 4102: + case 4103: + case 4109: + _globals->_player.enableControl(); + break; + } +} + +void Scene4100::dispatch() { + if (!_action) { + if ((_globals->_player.getRegionIndex() == 15) && !_globals->getFlag(42)) + setAction(&_action6); + + if (_globals->_player.getRegionIndex() == 8) + _globals->_sceneManager.changeScene(4150); + + if (_globals->_player._position.y >= 196) { + _globals->_player.disableControl(); + _sceneMode = 4101; + setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); + } + } + + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 4150 - Village - Bedroom + * + *--------------------------------------------------------------------------*/ + +void Scene4150::Action1::signal() { + Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + byte adjustData[4] = {0, 0, 0, 0}; + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: + scene->_stripManager.start(4520, this); + break; + case 2: + setDelay(15); + break; + case 3: + setAction(&scene->_action2, this); + break; + case 4: { + for (int idx = 100; idx >= 0; idx -= 5) { + _globals->_scenePalette.fade(adjustData, false, idx); + g_system->updateScreen(); + g_system->delayMillis(10); + } + + scene->_hotspot4.postInit(); + scene->_hotspot4.setVisage(4150); + scene->_hotspot4.setStrip(2); + scene->_hotspot4.setPosition(Common::Point(166, 157)); + + scene->_hotspot1.postInit(); + scene->_hotspot1.setVisage(4156); + scene->_hotspot1.setStrip(1); + scene->_hotspot1.setFrame(1); + + setDelay(120); + break; + } + case 5: + _globals->_scenePalette.loadPalette(4150); + _globals->_scenePalette.refresh(); + setDelay(60); + break; + case 6: + scene->_stripManager.start(4522, this); + break; + case 7: + for (int idx = 100; idx >= 0; idx -= 5) { + _globals->_scenePalette.fade(adjustData, false, idx); + g_system->updateScreen(); + g_system->delayMillis(10); + } + + scene->_hotspot4.remove(); + scene->_hotspot1.setVisage(4157); + scene->_hotspot1.animate(ANIM_MODE_NONE, NULL); + scene->_hotspot1.setStrip(1); + scene->_hotspot1.setFrame(1); + scene->_hotspot1.show(); + + _globals->_player.setVisage(4200); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(3); + _globals->_player.setPosition(Common::Point(139, 166)); + _globals->_player._moveDiff = Common::Point(7, 3); + _globals->_player.show(); + + setDelay(120); + break; + case 8: + _globals->_scenePalette.loadPalette(4150); + _globals->_scenePalette.refresh(); + setDelay(30); + break; + case 9: + scene->_stripManager.start(4523, this); + break; + case 10: + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player._moveDiff = Common::Point(7, 4); + _globals->_player.setStrip(3); + _globals->_player.enableControl(); + + remove(); + break; + } +} + +void Scene4150::Action2::signal() { + Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_hotspot1.setVisage(4152); + scene->_hotspot1.setStrip(1); + scene->_hotspot1.setFrame(1); + scene->_hotspot1.animate(ANIM_MODE_5, this); + + _globals->_player.animate(ANIM_MODE_5, NULL); + break; + case 2: + _globals->_player.hide(); + scene->_hotspot1.setVisage(4153); + scene->_hotspot1.setStrip(1); + scene->_hotspot1.setFrame(1); + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 3: + remove(); + break; + } +} + +void Scene4150::Action3::signal() { + Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(15); + break; + case 1: + _globals->_player.checkAngle(&scene->_hotspot3); + + if (RING_INVENTORY._rope._sceneNumber == 1) { + scene->_hotspot3.postInit(); + scene->_hotspot3.setVisage(4150); + scene->_hotspot3.setPosition(Common::Point(175, 70)); + + RING_INVENTORY._rope._sceneNumber = 4150; + _globals->_sceneItems.push_front(&scene->_hotspot3); + } else { + RING_INVENTORY._rope._sceneNumber = 1; + scene->_hotspot3.remove(); + } + + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4150::HotspotGroup1::doAction(int action) { + Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4150, 0); + break; + case OBJECT_ROPE: + scene->setAction(&scene->_action3); + break; + } +} + +void Scene4150::HotspotGroup3::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4150, _globals->getFlag(46) ? 9 : 8); + _globals->setFlag(46); + break; + case CURSOR_USE: + SceneItem::display2(4150, 30); + break; + } +} + +void Scene4150::HotspotGroup6::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4150, _globals->getFlag(47) ? 16 : 15); + _globals->setFlag(47); + break; + case CURSOR_USE: + SceneItem::display2(4150, 31); + break; + } +} + +void Scene4150::Hotspot3::doAction(int action) { + Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4150, 20); + break; + case CURSOR_USE: + scene->setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4150::Scene4150() : + _hotspot1(0, CURSOR_LOOK, 4150, 17, CURSOR_USE, 4150, 21, CURSOR_TALK, 4150, 21, + OBJECT_SCANNER, 4150, 22, OBJECT_STUNNER, 4150, 23, LIST_END), + _hotspot2(0, CURSOR_LOOK, 4150, 4, CURSOR_USE, 4150, 24, LIST_END), + _hotspot7(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END), + _hotspot8(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END), + _hotspot9(0, CURSOR_LOOK, 4150, 2, CURSOR_USE, 4150, 27, OBJECT_SCANNER, 4150, 28, + OBJECT_STUNNER, 4150, 32, LIST_END), + _hotspot10(0, CURSOR_LOOK, 4150, 5, CURSOR_USE, 4150, 29, LIST_END), + _hotspot11(0, CURSOR_LOOK, 4150, 6, CURSOR_USE, 4150, 29, LIST_END), + _hotspot12(0, CURSOR_LOOK, 4150, 7, CURSOR_USE, 4150, 29, LIST_END), + _hotspot17(0, CURSOR_LOOK, 4150, 10, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), + _hotspot18(0, CURSOR_LOOK, 4150, 11, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), + _hotspot19(0, CURSOR_LOOK, 4150, 12, CURSOR_USE, 4150, 29, LIST_END), + _hotspot20(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), + _hotspot21(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), + _hotspot22(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), + _hotspot23(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), + _hotspot24(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END) + { +} + +void Scene4150::postInit(SceneObjectList *OwnerList) { + loadScene(4150); + Scene::postInit(); + setZoomPercents(60, 85, 200, 100); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerCDL); + _stripManager.addSpeaker(&_speakerQText); + + _hotspot2.postInit(); + _hotspot2.setVisage(4171); + _hotspot2.animate(ANIM_MODE_2, NULL); + _hotspot2.fixPriority(100); + _hotspot2.setPosition(Common::Point(76, 147)); + + _hotspot1.postInit(); + _hotspot1.setPosition(Common::Point(177, 201)); + + if (_globals->getFlag(44)) { + _globals->_player.postInit(); + _globals->_player.setVisage(4200); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setStrip(2); + _globals->_player.setPosition(Common::Point(328, 160)); + _globals->_player._moveDiff = Common::Point(7, 4); + _globals->_player.disableControl(); + + _sceneMode = 4151; + setAction(&_sequenceManager, this, 4151, &_globals->_player, NULL); + + _hotspot1.setVisage(4157); + _hotspot1.setPosition(Common::Point(177, 201)); + } else { + _globals->_player.postInit(); + _globals->_player.setVisage(4154); + _globals->_player._canWalk = false; + _globals->_player.setPosition(Common::Point(198, 202)); + _globals->_player.disableControl(); + + _hotspot1.setVisage(4152); + setAction(&_action1); + _globals->setFlag(44); + } + + if (RING_INVENTORY._rope._sceneNumber == 4150) { + _hotspot3.postInit(); + _hotspot3.setVisage(4150); + _hotspot3.setPosition(Common::Point(175, 70)); + + _globals->_sceneItems.push_back(&_hotspot3); + } + + _globals->_sceneItems.push_back(&_hotspot1); + + _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot6.setBounds(Rect(28, 121, 80, 148)); + _hotspot7.setBounds(Rect(27, 17, 127, 100)); + _hotspot8.setBounds(Rect(62, 11, 117, 22)); + _hotspot9.setBounds(Rect(48, 78, 104, 94)); + _hotspot10.setBounds(Rect(32, 107, 58, 119)); + _hotspot11.setBounds(Rect(1, 130, 17, 163)); + _hotspot12.setBounds(Rect(1, 158, 78, 197)); + _hotspot13.setBounds(Rect(253, 11, 274, 188)); + _hotspot14.setBounds(Rect(4, 15, 29, 153)); + _hotspot15.setBounds(Rect(127, 22, 146, 133)); + _hotspot16.setBounds(Rect(165, 22, 181, 141)); + _hotspot17.setBounds(Rect(186, 31, 217, 52)); + _hotspot18.setBounds(Rect(200, 31, 251, 86)); + _hotspot19.setBounds(Rect(183, 81, 234, 111)); + _hotspot20.setBounds(Rect(188, 120, 219, 142)); + _hotspot21.setBounds(Rect(235, 122, 249, 145)); + _hotspot22.setBounds(Rect(283, 125, 320, 146)); + _hotspot23.setBounds(Rect(284, 27, 306, 160)); + _hotspot24.setBounds(Rect(257, 72, 284, 99)); + _hotspot25.setBounds(Rect(183, 155, 316, 190)); + _hotspot26.setBounds(Rect(98, 169, 238, 198)); + + _globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25, + &_hotspot26, &_hotspot19, &_hotspot22, &_hotspot20, &_hotspot17, &_hotspot16, + &_hotspot15, &_hotspot11, &_hotspot14, &_hotspot18, &_hotspot21, &_hotspot12, + &_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2, + &_hotspot5, NULL); + + _globals->_soundHandler.play(165); + _soundHandler.play(311); +} + +void Scene4150::signal() { + if (_sceneMode == 4151) + _globals->_player.enableControl(); + else if (_sceneMode == 4152) + _globals->_sceneManager.changeScene(4100); +} + +void Scene4150::dispatch() { + Scene::dispatch(); + + if (!_action && (_globals->_player._position.x >= 316)) { + _globals->_soundHandler.fadeOut(NULL); + _soundHandler.fadeOut(NULL); + _globals->_player.disableControl(); + _sceneMode = 4152; + setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 4000 - Village + * + *--------------------------------------------------------------------------*/ + +void Scene4250::Action1::signal() { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + ADD_MOVER_NULL(_globals->_player, 6, 190); + ADD_MOVER_NULL(scene->_hotspot3, 9, 195); + ADD_MOVER(scene->_hotspot1, 12, 185); + break; + case 2: + setDelay(30); + break; + case 3: + scene->_stripManager.start(4450, this); + break; + case 4: + case 7: + setDelay(15); + break; + case 5: + ADD_PLAYER_MOVER(220, 175); + scene->_hotspot1.fixPriority(105); + ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173); + break; + case 6: + scene->_stripManager.start(4470, this); + break; + case 8: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4250::Action2::signal() { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_PLAYER_MOVER(247, 182); + break; + case 1: + _globals->_player.setVisage(2670); + _globals->_player.changeZoom(50); + _globals->_player.setStrip(3); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { + scene->_stripManager.start(4205, this); + } else { + scene->_stripManager.start(4490, this); + } + break; + case 3: + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 4: + _globals->_player.setVisage(2602); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.changeZoom(70); + + if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { + _globals->_player.enableControl(); + remove(); + } else { + ADD_PLAYER_MOVER(6, 180); + ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 12, 185); + } + break; + case 5: + ADD_PLAYER_MOVER(-16, 180); + ADD_PLAYER_MOVER_NULL(scene->_hotspot1, -12, 185); + scene->_hotspot3.setStrip2(2); + ADD_MOVER_NULL(scene->_hotspot5, -30, 195); + break; + case 6: + _globals->clearFlag(59); + _globals->clearFlag(70); + _globals->clearFlag(37); + _globals->clearFlag(114); + _globals->clearFlag(36); + _globals->clearFlag(43); + _globals->_sceneManager.changeScene(2100); + break; + } +} + +void Scene4250::Action3::signal() { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_stripManager.start(4480, this); + break; + case 2: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4250::Action4::signal() { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + _globals->_player.addMover(NULL); + scene->_stripManager.start((RING_INVENTORY._helmet._sceneNumber == 4250) ? 4259 : 4256, this); + break; + case 2: + ADD_PLAYER_MOVER(_globals->_player._position.x + 5, _globals->_player._position.y); + break; + case 3: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene4250::Action5::signal() { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + scene->_hotspot4.fixPriority(195); + scene->_hotspot1.fixPriority(105); + ADD_MOVER_NULL(_globals->_player, 6, 185); + ADD_MOVER_NULL(scene->_hotspot4, 9, 190); + ADD_MOVER(scene->_hotspot1, 12, 180); + break; + case 2: + ADD_PLAYER_MOVER(252, 176); + ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173); + ADD_PLAYER_MOVER_NULL(scene->_hotspot4, 239, 195); + break; + case 3: + scene->_hotspot4.fixPriority(-1); + scene->_hotspot1.setStrip(5); + scene->_hotspot4.setStrip(7); + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4250::Hotspot1::doAction(int action) { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 19 : 14); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + if (!_globals->_sceneObjects->contains(&scene->_hotspot4)) { + scene->setAction(&scene->_action3); + } else { + scene->_sceneMode = 4260; + if (RING_INVENTORY._helmet._sceneNumber == 4250) { + scene->_sceneMode = 4265; + scene->setAction(&scene->_sequenceManager, scene, 4265, this, NULL); + } else { + scene->setAction(&scene->_sequenceManager, scene, + _globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL); + } + } + break; + case OBJECT_SCANNER: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + SceneItem::display2(4250, 21); + else + SceneHotspot::doAction(action); + break; + case OBJECT_STUNNER: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + SceneItem::display2(4250, 22); + else + SceneHotspot::doAction(action); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4250::Hotspot2::doAction(int action) { + //Ship with stasis field + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + case CURSOR_USE: + SceneItem::display2(4250, 16); + break; + case OBJECT_SCANNER: + if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) + scene->setAction(&scene->_action2); + else if (_globals->getFlag(55)) + SceneItem::display2(4250, 17); + else { + _globals->setFlag(55); + scene->setAction(&scene->_action2); + } + break; + case OBJECT_STASIS_NEGATOR: + _globals->_player.disableControl(); + scene->_sceneMode = 4252; + scene->setAction(&scene->_sequenceManager, scene, 4252, &_globals->_player, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4250::Hotspot4::doAction(int action) { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 18 : 5); + break; + case OBJECT_SCANNER: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + SceneItem::display2(4250, 21); + else + SceneHotspot::doAction(action); + break; + case OBJECT_STUNNER: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + SceneItem::display2(4250, 22); + else + SceneHotspot::doAction(action); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + if (!_globals->_sceneObjects->contains(&scene->_hotspot6)) { + scene->_sceneMode = 4254; + scene->setAction(&scene->_sequenceManager, scene, 4263, NULL); + } else { + scene->_sceneMode = 4254; + + if (RING_INVENTORY._helmet._sceneNumber == 4250) { + scene->_sceneMode = 4266; + scene->setAction(&scene->_sequenceManager, scene, 4266, this, NULL); + } else { + scene->setAction(&scene->_sequenceManager, scene, + (RING_INVENTORY._concentrator._sceneNumber == 1) ? 4255 : 4254, NULL); + } + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4250::Hotspot6::doAction(int action) { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 7 : 6); + break; + case OBJECT_SCANNER: + SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 1 : 2); + break; + case OBJECT_STUNNER: + SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3); + break; + case OBJECT_HELMET: + _globals->_soundHandler.play(354); + _globals->_player.disableControl(); + RING_INVENTORY._helmet._sceneNumber = 4250; + + if (RING_INVENTORY._concentrator._sceneNumber == 1) { + if (_globals->getFlag(115)) { + scene->_sceneMode = 4269; + scene->setAction(&scene->_sequenceManager, scene, 4269, this, NULL); + } else { + _globals->setFlag(115); + _globals->_events.setCursor(CURSOR_WALK); + scene->_sceneMode = 4256; + scene->setAction(&scene->_sequenceManager, scene, 4256, this, NULL); + } + } else if (RING_INVENTORY._keyDevice._sceneNumber == 1) { + scene->_sceneMode = 4267; + scene->setAction(&scene->_sequenceManager, scene, 4267, this, NULL); + } else if (RING_INVENTORY._keyDevice._sceneNumber == 4300) { + scene->_sceneMode = 4268; + scene->setAction(&scene->_sequenceManager, scene, 4268, this, NULL); + } else { + _globals->_events.setCursor(CURSOR_WALK); + ADD_MOVER_NULL(scene->_hotspot1, 241, 169); + scene->_sceneMode = 4261; + scene->setAction(&scene->_sequenceManager, scene, 4261, &_globals->_player, this, NULL); + } + break; + case OBJECT_NULLIFIER: + if (RING_INVENTORY._helmet._sceneNumber == 4250) { + _globals->_soundHandler.play(353); + _globals->_player.disableControl(); + RING_INVENTORY._helmet._sceneNumber = 1; + + scene->_sceneMode = 4257; + scene->setAction(&scene->_sequenceManager, scene, 4257, &_globals->_player, this, NULL); + } else { + SceneItem::display2(4250, 4); + } + break; + case CURSOR_TALK: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + doAction(OBJECT_HELMET); + else { + _globals->_player.disableControl(); + scene->_sceneMode = 4264; + scene->setAction(&scene->_sequenceManager, scene, 4264, this, NULL); + } + break; + case CURSOR_USE: + if (RING_INVENTORY._helmet._sceneNumber == 4250) + doAction(OBJECT_HELMET); + else { + _globals->_player.disableControl(); + if ((RING_INVENTORY._items._sceneNumber != 1) || (RING_INVENTORY._concentrator._sceneNumber != 1)) { + scene->_sceneMode = 4258; + scene->setAction(&scene->_sequenceManager, scene, 4258, this, NULL); + } else { + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(4251); + scene->_hotspot2.setFrame(scene->_hotspot2.getFrameCount()); + scene->_hotspot2.setPosition(Common::Point(267, 172)); + scene->_hotspot2.hide(); + + scene->_sceneMode = 4259; + scene->setAction(&scene->_sequenceManager, scene, 4259, &_globals->_player, this, &scene->_hotspot2, NULL); + } + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4250::Hotspot8::doAction(int action) { + Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + case CURSOR_USE: + _globals->_sceneManager.changeScene(4300); + break; + case OBJECT_SCANNER: + SceneItem::display2(4250, 24); + break; + case OBJECT_STUNNER: + SceneItem::display2(4250, 25); + break; + case OBJECT_STASIS_NEGATOR: + _globals->_player.disableControl(); + scene->_sceneMode = 4270; + scene->setAction(&scene->_sequenceManager, scene, + (RING_INVENTORY._helmet._sceneNumber == 4250) ? 4270 : 4271, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4250::Scene4250() : + _hotspot7(0, CURSOR_LOOK, 4250, 0, LIST_END) { +} + +void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { + loadScene(4250); + Scene::postInit(); + setZoomPercents(160, 90, 185, 100); + + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerPText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerFLText); + + _speakerSText.setTextPos(Common::Point(40, 40)); + _speakerPText.setTextPos(Common::Point(40, 100)); + _hotspot8._sceneRegionId = 16; + + _globals->_player.postInit(); + _globals->_player.setVisage(2602); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(-13, 190)); + _globals->_player.changeZoom(-1); + _globals->_player._moveDiff = Common::Point(4, 1); + + _hotspot1.postInit(); + _hotspot1.setVisage(2801); + _hotspot1.animate(ANIM_MODE_1, NULL); + _hotspot1.setObjectWrapper(new SceneObjectWrapper()); + _hotspot1.setPosition(Common::Point(-18, 185)); + _hotspot1.changeZoom(-1); + _hotspot1._moveDiff = Common::Point(4, 1); + _globals->_sceneItems.push_back(&_hotspot1); + + if (_globals->_sceneManager._previousScene == 4300) { + _hotspot5.postInit(); + _hotspot5.setVisage(4250); + _hotspot5.setPosition(Common::Point(268, 168)); + _hotspot5.fixPriority(1); + + _hotspot4.postInit(); + _hotspot4.setVisage(2701); + _hotspot4.animate(ANIM_MODE_1, NULL); + _hotspot4.setObjectWrapper(new SceneObjectWrapper()); + _hotspot4.setPosition(Common::Point(272, 175)); + _hotspot4.setStrip(2); + _hotspot4._moveDiff = Common::Point(4, 1); + _hotspot4.changeZoom(70); + _globals->_sceneItems.push_back(&_hotspot4); + + _hotspot1.setPosition(Common::Point(197, 173)); + _hotspot1.changeZoom(70); + + _globals->_player.setPosition(Common::Point(252, 176)); + _globals->_player.changeZoom(70); + + _hotspot6.postInit(); + _hotspot6.setVisage(4302); + _hotspot6.setStrip(4); + _hotspot6.setFrame(3); + _hotspot6.changeZoom(50); + _hotspot6.fixPriority(70); + _hotspot6.setPosition(Common::Point(261, 175)); + + if (RING_INVENTORY._helmet._sceneNumber == 4250) { + _hotspot6.setStrip(6); + _hotspot6.setFrame(_hotspot6.getFrameCount()); + } + + if (_globals->getFlag(98)) { + _globals->_sceneItems.push_front(&_hotspot6); + } else { + _hotspot6.hide(); + if ((_globals->_stripNum == 4300) || (_globals->_stripNum == 4301)) { + _globals->setFlag(98); + _globals->_player.setVisage(4302); + _globals->_player.setStrip(5); + _globals->_player.changeZoom(50); + _globals->_player.disableControl(); + + _hotspot4.setPosition(Common::Point(239, 195)); + _sceneMode = 4253; + _globals->_sceneItems.push_front(&_hotspot6); + + setAction(&_sequenceManager, this, 4253, &_globals->_player, &_hotspot6, &_hotspot4, NULL); + } + } + } else if (_globals->_stripNum == 9000) { + _hotspot4.postInit(); + _hotspot4.setVisage(2701); + _hotspot4.animate(ANIM_MODE_1, NULL); + _hotspot4.setObjectWrapper(new SceneObjectWrapper()); + _hotspot4.setPosition(Common::Point(-15, 195)); + _hotspot4._moveDiff = Common::Point(4, 1); + _globals->_sceneItems.push_back(&_hotspot4); + + setAction(&_action5); + } else { + _hotspot3.postInit(); + _hotspot3.setVisage(4006); + _hotspot3.animate(ANIM_MODE_1, NULL); + _hotspot3.setObjectWrapper(new SceneObjectWrapper()); + _hotspot3.setPosition(Common::Point(-15, 195)); + _hotspot3.setStrip2(3); + _hotspot3._moveDiff = Common::Point(4, 1); + + setAction(&_action1); + _globals->clearFlag(43); + _globals->clearFlag(114); + _globals->clearFlag(36); + } + + if (_globals->getFlag(17)) { + _globals->_sceneItems.push_back(&_hotspot8); + } else { + _hotspot2.postInit(); + _hotspot2.setVisage(4251); + _hotspot2.setStrip2(1); + _hotspot2.fixPriority(2); + _hotspot2.setFrame(1); + _hotspot2.setPosition(Common::Point(267, 172)); + + _globals->_sceneItems.push_back(&_hotspot2); + } + + _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _globals->_sceneItems.push_back(&_hotspot7); + _globals->_soundHandler.play(185); +} + +void Scene4250::signal() { + switch (_sceneMode) { + case 4252: + _globals->setFlag(17); + _globals->_sceneManager.changeScene(4301); + break; + case 4253: + if (_globals->_stripNum == 4301) { + _sceneMode = 4261; + ADD_MOVER_NULL(_hotspot1, 241, 169); + setAction(&_sequenceManager, this, 4261, &_globals->_player, &_hotspot6, NULL); + } else { + _globals->_player.enableControl(); + } + break; + case 4254: + case 4256: + case 4257: + case 4258: + case 4260: + case 4264: + case 4265: + case 4266: + case 4267: + case 4268: + case 4269: + case 4270: + _globals->_player.enableControl(); + break; + case 4259: + _globals->_soundHandler.play(360); + _globals->_sceneManager.changeScene(9900); + break; + case 4261: + RING_INVENTORY._keyDevice._sceneNumber = 1; + _globals->_player.enableControl(); + break; + case 4255: + case 4262: + case 4263: + default: + break; + } +} + +void Scene4250::dispatch() { + if (_globals->_player.getRegionIndex() == 8) + _globals->_player.changeZoom(90 - (_globals->_player._position.y - 153)); + if (_globals->_player.getRegionIndex() == 12) + _globals->_player.changeZoom(70); + if (_globals->_player.getRegionIndex() == 15) { + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(-1); + } + + if (_hotspot1.getRegionIndex() == 8) + _hotspot1.changeZoom(90 - (_hotspot1._position.y - 153)); + if (_hotspot1.getRegionIndex() == 12) + _hotspot1.changeZoom(70); + if (_hotspot1.getRegionIndex() == 15) { + _hotspot1.changeZoom(-1); + _hotspot1.fixPriority(-1); + } + + if (_hotspot4.getRegionIndex() == 8) + _hotspot4.changeZoom(90 - (_hotspot4._position.y - 153)); + if (_hotspot4.getRegionIndex() == 12) + _hotspot4.changeZoom(70); + if (_hotspot4.getRegionIndex() == 15) { + _hotspot4.changeZoom(-1); + _hotspot4.fixPriority(-1); + } + + Scene::dispatch(); + + if (!_action) { + if (!_globals->getFlag(55) && (_globals->_player.getRegionIndex() == 12)) { + setAction(&_action4); + } + + if (_globals->_sceneObjects->contains(&_hotspot6) && (_globals->_player.getRegionIndex() == 12)) + setAction(&_action4); + } +} + +/*-------------------------------------------------------------------------- + * Scene 4300 - Village - Slaver Ship + * + *--------------------------------------------------------------------------*/ + +void Scene4300::Action1::signal() { + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->setFlag(56); + _globals->_scenePalette.addRotation(240, 254, -1); + scene->_hotspot7.animate(ANIM_MODE_6, this); + _globals->_soundHandler.play(164); + break; + case 1: + _globals->_soundHandler.play(340); + scene->_soundHandler1.play(341); + scene->_hotspot1.remove(); + setDelay(3); + break; + case 2: + scene->_soundHandler1.play(341); + scene->_hotspot2.remove(); + setDelay(6); + break; + case 3: + scene->_soundHandler1.play(341); + scene->_hotspot3.remove(); + setDelay(6); + break; + case 4: + scene->_soundHandler1.play(341); + scene->_hotspot4.remove(); + setDelay(12); + break; + case 5: + scene->_soundHandler1.play(341); + scene->_hotspot5.remove(); + setDelay(12); + break; + case 6: + scene->_soundHandler1.play(341); + scene->_hotspot6.remove(); + setDelay(60); + break; + case 7: + scene->_hotspot10.fixPriority(250); + scene->_hotspot10.animate(ANIM_MODE_5, this); + break; + case 8: + scene->_hotspot13.show(); + scene->_stripManager.start(8015, this, scene); + break; + case 9: + _globals->_soundHandler.play(350); + _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + _globals->_events.setCursor(CURSOR_USE); + _globals->_player.enableControl(); + + remove(); + break; + } +} + +void Scene4300::Action2::signal() { + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_stripManager.start(8016, this, scene); + break; + case 2: + _globals->_player.enableControl(); + remove(); + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +void Scene4300::Hotspot8::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, 15); + break; + case CURSOR_USE: + SceneItem::display2(4300, 18); + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 14); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 19); + break; + case OBJECT_KEY_DEVICE: + RING_INVENTORY._keyDevice._sceneNumber = 4300; + _globals->_scenePalette.addRotation(240, 254, -1); + animate(ANIM_MODE_5, NULL); + + _globals->setFlag(99); + _globals->_sceneItems.push_back(this); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4300::Hotspot9::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || + (RING_INVENTORY._concentrator._sceneNumber == 1)) + SceneItem::display2(4300, 7); + else + SceneItem::display2(4300, 1); + break; + case CURSOR_USE: + if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || + (RING_INVENTORY._concentrator._sceneNumber == 1)) + SceneItem::display2(4300, 7); + else + SceneItem::display2(4300, 3); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 24); + break; + case OBJECT_SCANNER: + if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || + (RING_INVENTORY._concentrator._sceneNumber != 1)) + SceneItem::display2(4300, 22); + else + SceneItem::display2(4300, 23); + break; + default: + NamedHotspot::doAction(action); + break; + } +} + +void Scene4300::Hotspot10::doAction(int action) { + // Alien + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, 2); + break; + case CURSOR_TALK: + _globals->_player.disableControl(); + scene->setAction(&scene->_action2); + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 20); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 21); + break; + case CURSOR_USE: + case OBJECT_HELMET: + _globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301; + _globals->_events.setCursor(CURSOR_NONE); + _globals->_sceneManager.changeScene(4250); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4300::Hotspot15::signal() { + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + scene->_soundHandler2.play(345); + + _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1; + if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || + (RING_INVENTORY._concentrator._sceneNumber == 1)) { + setStrip(1); + setFrame(1); + animate(ANIM_MODE_NONE, NULL); + } else { + animate(ANIM_MODE_5, this); + } +} + +void Scene4300::Hotspot16::doAction(int action) { + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, 8); + break; + case CURSOR_USE: + if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) && + (RING_INVENTORY._concentrator._sceneNumber != 4300)) { + SceneItem::display2(4300, 16); + } else { + scene->_sceneMode = 4302; + scene->setAction(&scene->_sequenceManager, scene, 4302, this, NULL); + } + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 27); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 24); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene4300::Hotspot17::doAction(int action) { + Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, (RING_INVENTORY._stasisBox2._sceneNumber == 4300) ? 17 : 11); + break; + case CURSOR_USE: + if (RING_INVENTORY._stasisBox2._sceneNumber != 4300) + SceneItem::display2(4300, 13); + else { + _globals->_scenePalette.clearListeners(); + remove(); + + SceneItem::display2(4300, 12); + RING_INVENTORY._concentrator._sceneNumber = 1; + } + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 25); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 26); + break; + case OBJECT_STASIS_BOX2: + scene->_soundHandler1.play(352); + _globals->_events.setCursor(CURSOR_USE); + scene->_sceneMode = 4303; + + scene->setAction(&scene->_sequenceManager, scene, 4303, this, NULL); + break; + } +} + +void Scene4300::Hotspot19::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, 9); + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 28); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 24); + break; + case CURSOR_USE: + if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) && + (RING_INVENTORY._concentrator._sceneNumber != 4300)) + SceneItem::display2(4300, 10); + else + SceneItem::display2(4300, 29); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene4300::Scene4300() : + _hotspot18(0, CURSOR_LOOK, 4300, 0, LIST_END) { +} + +void Scene4300::postInit(SceneObjectList *OwnerList) { + loadScene(4300); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerFLText); + + _hotspot11.setup(76, 97, 102, 127, 4300, 5, 6); + + _hotspot7.postInit(); + _hotspot7.setPosition(Common::Point(90, 128)); + _hotspot7.setVisage(4303); + _hotspot7.fixPriority(250); + _globals->_sceneItems.push_back(&_hotspot7); + + _hotspot9.setup(120, 49, 174, 91, 4300, -1, -1); + + _hotspot15.postInit(); + _hotspot15.setVisage(4300); + _hotspot15.setPosition(Common::Point(149, 79)); + _hotspot15.signal(); + + if (!_globals->getFlag(99)) { + _hotspot8.postInit(); + _hotspot8.setVisage(4300); + _hotspot8.setStrip(3); + _hotspot8.setPosition(Common::Point(196, 47)); + _globals->_sceneItems.push_back(&_hotspot8); + } + + if (RING_INVENTORY._concentrator._sceneNumber == 4300) { + _hotspot17.postInit(); + _hotspot17.setVisage(4300); + _hotspot17.setStrip(6); + _hotspot17.fixPriority(1); + _hotspot17.setPosition(Common::Point(200, 69)); + + if (RING_INVENTORY._stasisBox2._sceneNumber == 4300) + _hotspot17.setFrame(_hotspot17.getFrameCount()); + + _globals->_sceneItems.push_back(&_hotspot17); + } + + if (!_globals->getFlag(98)) { + _hotspot10.postInit(); + _hotspot10.setVisage(4302); + _hotspot10.setPosition(Common::Point(244, 179)); + _hotspot10.fixPriority(100); + _globals->_sceneItems.push_back(&_hotspot10); + + _hotspot12.postInit(); + _hotspot12.setVisage(4302); + _hotspot12.setStrip2(3); + _hotspot12.setPosition(Common::Point(231, 185)); + _hotspot12.fixPriority(251); + _hotspot12.hide(); + + _hotspot13.postInit(); + _hotspot13.hide(); + _hotspot13.setVisage(4302); + _hotspot13.setStrip2(2); + _hotspot13.setPosition(Common::Point(256, 168)); + _hotspot13.fixPriority(251); + _hotspot13._numFrames = 1; + _hotspot13.animate(ANIM_MODE_8, 0, NULL); + } + + if (RING_INVENTORY._items._sceneNumber == 4300) { + _hotspot16.postInit(); + _hotspot16.setVisage(4300); + _hotspot16.setPosition(Common::Point(169, 141)); + _hotspot16.fixPriority(1); + _hotspot16.setStrip(4); + _globals->_sceneItems.push_back(&_hotspot16); + } + + if (_globals->_sceneManager._previousScene == 4301) { + _globals->_player.disableControl(); + _hotspot7.setFrame(_hotspot7.getFrameCount()); + + _hotspot1.postInit(); + _hotspot1.setVisage(4301); + _hotspot1.fixPriority(145); + _hotspot1.setPosition(Common::Point(160, 64)); + + _hotspot2.postInit(); + _hotspot2.setVisage(4301); + _hotspot2.setStrip2(2); + _hotspot2.fixPriority(140); + _hotspot2.setPosition(Common::Point(166, 90)); + + _hotspot3.postInit(); + _hotspot3.setVisage(4301); + _hotspot3.setStrip2(3); + _hotspot3.fixPriority(135); + _hotspot3.setPosition(Common::Point(173, 114)); + + _hotspot4.postInit(); + _hotspot4.setVisage(4301); + _hotspot4.setStrip2(4); + _hotspot4.fixPriority(130); + _hotspot4.setPosition(Common::Point(187, 141)); + + _hotspot5.postInit(); + _hotspot5.setVisage(4301); + _hotspot5.setStrip2(5); + _hotspot5.fixPriority(125); + _hotspot5.setPosition(Common::Point(201, 164)); + + _hotspot6.postInit(); + _hotspot6.setVisage(4301); + _hotspot6.setStrip2(6); + _hotspot6.fixPriority(120); + _hotspot6.setPosition(Common::Point(219, 186)); + + setAction(&_action1); + } else { + _globals->_player.disableControl(); + _sceneMode = 4304; + setAction(&_sequenceManager, this, 4304, NULL); + } + + _hotspot10.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot19._sceneRegionId = 0; + _globals->_sceneItems.push_back(&_hotspot19); + _globals->_sceneItems.push_back(&_hotspot18); +} + +void Scene4300::stripCallback(int v) { + switch (v) { + case 1: + _hotspot12.show(); + _hotspot12.animate(ANIM_MODE_7, 0, NULL); + break; + case 2: + _hotspot12.hide(); + break; + } +} + +void Scene4300::remove() { + _globals->_scenePalette.clearListeners(); + Scene::remove(); +} + +void Scene4300::signal() { + switch (_sceneMode) { + case 4302: + RING_INVENTORY._items._sceneNumber = 1; + _hotspot16.remove(); + _globals->_player.enableControl(); + break; + case 4303: + RING_INVENTORY._stasisBox2._sceneNumber = 4300; + _hotspot15.setStrip(1); + _hotspot15.setFrame(1); + _hotspot15.animate(ANIM_MODE_NONE, NULL); + break; + case 4304: + _hotspot14.postInit(); + _hotspot14.setVisage(4300); + _hotspot14.setStrip(7); + _hotspot14.setPosition(Common::Point(60, 199)); + + _gfxButton.setText(EXIT_MSG); + _gfxButton._bounds.center(60, 193); + _gfxButton.draw(); + _gfxButton._bounds.expandPanes(); + + _globals->_player.enableControl(); + _globals->_scenePalette.addRotation(240, 254, -1); + break; + } +} + +void Scene4300::dispatch() { + if (_action) + _action->dispatch(); +} + +void Scene4300::process(Event &event) { + Scene::process(event); + if (_gfxButton.process(event)) + _globals->_sceneManager.changeScene(4250); +} + +/*-------------------------------------------------------------------------- + * Scene 4301 - Village - Slaver Ship Keypad + * + *--------------------------------------------------------------------------*/ + +void Scene4301::Action1::synchronize(Serializer &s) { + Action::synchronize(s); + s.syncAsSint16LE(_field34E); + for (int idx = 0; idx < 6; ++idx) + s.syncAsSint16LE(_indexList[idx]); +} + +void Scene4301::Action1::remove() { + Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + _globals->_player.enableControl(); + + for (_state = 0; _state < 6; ++_state) + _buttonList[_state].remove(); + + scene->_hotspot3.remove(); + scene->_hotspot2.remove(); + + scene->_hotspot1.animate(ANIM_MODE_6, NULL); + Action::remove(); +} + +void Scene4301::Action1::signal() { + Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_soundHandler.play(164); + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 1: + _globals->_soundHandler.play(335); + _globals->_events.setCursor(CURSOR_USE); + + scene->_hotspot2.postInit(); + scene->_hotspot2.setVisage(4303); + scene->_hotspot2.setStrip(2); + scene->_hotspot2.setFrame(1); + scene->_hotspot2.setPosition(Common::Point(30, 15)); + scene->_hotspot2.fixPriority(255); + + scene->_hotspot3.postInit(); + scene->_hotspot3.setVisage(4303); + scene->_hotspot3.setStrip(2); + scene->_hotspot3.setFrame(2); + scene->_hotspot3.setPosition(Common::Point(48, 29)); + scene->_hotspot3.fixPriority(255); + scene->_hotspot3.hide(); + + _field34E = 0; + _state = 0; + _actionIndex = 2; + break; + case 10: + // Puzzle: Wrong code + _globals->_events.setCursor(CURSOR_NONE); + scene->_soundHandler.play(337); + if (scene->_hotspot3._flags & OBJFLAG_HIDE) + scene->_hotspot3.show(); + else + scene->_hotspot3.hide(); + setDelay(20); + + if (_state <= 8) + _actionIndex = 10; + ++_state; + break; + case 11: + for (_state = 0; _state < 6; ++_state) + _buttonList[_state].remove(); + + scene->_soundHandler.play(338); + scene->_hotspot3.hide(); + + _actionIndex = 2; + _state = 0; + _globals->_events.setCursor(CURSOR_USE); + break; + case 20: + // Puzzle: Correct code + _globals->_player.disableControl(); + scene->_soundHandler.play(339); + scene->_hotspot3._frame = 3; + if (scene->_hotspot3._flags & OBJFLAG_HIDE) + scene->_hotspot3.show(); + else + scene->_hotspot3.hide(); + + if (_state <= 8) + _actionIndex = 20; + ++_state; + + setDelay(20); + break; + case 21: + scene->_field68E = true; + remove(); + break; + } +} + +void Scene4301::Action1::process(Event &event) { + // Puzzle + Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + Rect buttonsRect; + + Action::process(event); + if (event.handled || (_actionIndex != 2)) + return; + + buttonsRect = Rect(14, 35, 112, 100); + buttonsRect.translate(30, 15); + + if ((event.eventType == EVENT_BUTTON_DOWN) && buttonsRect.contains(event.mousePos)) { + event.handled = true; + scene->_soundHandler.play(336); + + int buttonIndex = ((event.mousePos.y - buttonsRect.top) / 33) * 3 + + ((event.mousePos.x - buttonsRect.left) / 33); + + _buttonList[_state].postInit(); + _buttonList[_state].setVisage(4303); + _buttonList[_state].setStrip(buttonIndex + 3); + _buttonList[_state].setFrame(1); + _buttonList[_state].setPosition(Common::Point((_state % 3) * 25 + 55, (_state / 3) * 25 + 121)); + _buttonList[_state].fixPriority(255); + _buttonList[_state]._numFrames = 25; + _buttonList[_state].animate(ANIM_MODE_5, NULL); + + _indexList[_state++] = buttonIndex; + + if (_state == 6) { + // Six buttons pressed + if ((_indexList[0] == 2) && (_indexList[1] == 3) && (_indexList[2] == 0) && + (_indexList[3] == 4) && (_indexList[4] == 1) && (_indexList[5] == 5)) { + // Entered the correct full combination + _state = 0; + _actionIndex = 20; + } else { + // Incorrect combination entered + _state = 0; + _actionIndex = 10; + } + + signal(); + } + } + + if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { + event.handled = true; + remove(); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4301::Hotspot4::doAction(int action) { + // Hatch near door + Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + + if (action == CURSOR_USE) { + _globals->_player.disableControl(); + scene->setAction(&scene->_action1); + } else { + NamedHotspot::doAction(action); + } +} + +void Scene4301::Hotspot5::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(4300, 0); + break; + case CURSOR_USE: + SceneItem::display2(4300, 30); + break; + case OBJECT_SCANNER: + SceneItem::display2(4300, 31); + break; + case OBJECT_STUNNER: + SceneItem::display2(4300, 32); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene4301::postInit(SceneObjectList *OwnerList) { + _globals->setFlag(50); + loadScene(4301); + Scene::postInit(); + setZoomPercents(0, 100, 200, 100); + + _field68E = false; + RING_INVENTORY._stasisBox2._sceneNumber = 1; + _hotspot4.setup(97, 76, 127, 102, 4300, 5, 6); + + _hotspot1.postInit(); + _hotspot1.setPosition(Common::Point(90, 128)); + _hotspot1.setVisage(4303); + _hotspot1._strip = 1; + _hotspot1._frame = 1; + _hotspot1.fixPriority(250); + + _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _globals->_sceneItems.push_back(&_hotspot5); + + _globals->_player.enableControl(); +} + +void Scene4301::dispatch() { + if (_action) { + _action->dispatch(); + } else if (_field68E) { + _field68E = 0; + _globals->clearFlag(50); + _globals->_sceneManager._fadeMode = FADEMODE_NONE; + _globals->_sceneManager.setNewScene(4300); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h new file mode 100644 index 0000000000..d28e809678 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes5.h @@ -0,0 +1,693 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES5_H +#define TSAGE_RINGWORLD_SCENES5_H + +#include "common/scummsys.h" +#include "tsage/core.h" +#include "tsage/converse.h" +#include "tsage/ringworld/ringworld_logic.h" + +namespace tSage { + +class Scene4000 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + class Action9 : public Action { + public: + virtual void signal(); + }; + class Action10 : public Action { + public: + virtual void signal(); + }; + class Action11 : public Action { + public: + virtual void signal(); + }; + class Action12 : public Action { + public: + virtual void signal(); + }; + class Action13 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Miranda : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + private: + int _ctr; + public: + virtual void synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsUint16LE(_ctr); + } + virtual void doAction(int action); + }; + class GuardRock : public SceneObject { + public: + virtual void doAction(int action); + }; + class Ladder : public SceneObject { + public: + virtual void doAction(int action); + }; + class TheTech : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot13 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot17 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot18 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot23 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + ASound _soundHandler1, _soundHandler2; + SpeakerQR _speakerQR; + SpeakerML _speakerML; + SpeakerMR _speakerMR; + SpeakerSR _speakerSR; + SpeakerCHFL _speakerCHFL; + SpeakerPL _speakerPL; + SpeakerPText _speakerPText; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SpeakerCHFR _speakerCHFR; + SpeakerQL _speakerQL; + SpeakerCHFText _speakerCHFText; + SceneObject _smoke1, _hotspot2, _lander, _olo, _hotspot5, _rope; + Miranda _miranda; + Hotspot8 _hotspot8; + GuardRock _guardRock; + Ladder _ladder; + DisplayHotspot _forceField; + TheTech _theTech; + Hotspot13 _hotspot13; + Hotspot _hotspot14, _hotspot15, _hotspot16; + Hotspot17 _hotspot17; + Hotspot18 _hotspot18; + DisplayHotspot _hotspot19, _hotspot20, _hotspot21, _hotspot22; + Hotspot23 _hotspot23; + DisplayHotspot _hotspot24, _hotspot25, _hotspot26; + SceneObject _smoke2; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + Action10 _action10; + Action11 _action11; + Action12 _action12; + Action13 _action13; + + Scene4000(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4010 : public Scene { +public: + SequenceManager _sequenceManager; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SceneObject _hotspot1, _hotspot2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene4025 : public Scene { + /* Custom classes */ + class Peg; + + class Hole : public SceneObject { + public: + Peg *_pegPtr; + int _armStrip; + Common::Point _newPosition; + + virtual void synchronize(Serializer &s); + virtual void doAction(int action); + }; + class Peg : public SceneObject { + public: + int _field88; + int _armStrip; + + Peg() : SceneObject() { _field88 = 0; _armStrip = 3; } + virtual void synchronize(Serializer &s); + virtual void doAction(int action); + }; + + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + GfxButton _gfxButton; + SceneObject _armHotspot; + Hole _hole1, _hole2, _hole3, _hole4, _hole5; + Peg _peg1, _peg2, _peg3, _peg4, _peg5; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Peg *_pegPtr, *_pegPtr2; + Hole *_holePtr; + + Scene4025(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene4045 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class OlloStand : public SceneObject { + public: + virtual void doAction(int action); + }; + class Miranda : public SceneObject { + public: + virtual void doAction(int action); + }; + class Necklace : public SceneObject { + public: + virtual void doAction(int action); + }; + +public: + SequenceManager _sequenceManager; + SpeakerQR _speakerQR; + SpeakerML _speakerML; + SpeakerPR _speakerPR; + SpeakerPText _speakerPText; + SpeakerQText _speakerQText; + SpeakerQL _speakerQL; + OlloStand _olloStand; + Miranda _miranda; + DisplayHotspot _flame; + SceneObject _hotspot4, _olloFace; + Necklace _necklace; + DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14; + Action1 _action1; + Action2 _action2; + Action3 _action3; + + Scene4045(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void stripCallback(int v); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4050 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot15 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot17 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SpeakerPText _speakerPText; + SpeakerQText _speakerQText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5; + DisplayHotspot _hotspot6, _hotspot7, _hotspot8, _hotspot9, _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13; + SceneObject _hotspot14; + Hotspot15 _hotspot15; + SceneObject _hotspot16; + Hotspot17 _hotspot17; + + Scene4050(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4100 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Miranda : public SceneObject { + public: + virtual void doAction(int action); + }; + class Ladder : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot14 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + SpeakerMText _speakerMText; + SpeakerML _speakerML; + SpeakerQText _speakerQText; + SpeakerQR _speakerQR; + SpeakerCHFText _speakerCHFText; + SpeakerCDRText _speakerCDRText; + SpeakerCDR _speakerCDR; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + DisplayHotspot _hotspot3, _hotspot4; + Miranda _miranda; + Ladder _ladder; + DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13; + Hotspot14 _hotspot14; + + Scene4100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4150 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class HotspotGroup1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class HotspotGroup3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class HotspotGroup6 : public SceneObject { + public: + virtual void doAction(int action); + }; + + class Hotspot3 : public SceneObject { + public: + virtual void doAction(int action); + }; + +public: + SequenceManager _sequenceManager; + ASound _soundHandler; + SpeakerQText _speakerQText; + SpeakerQR _speakerQR; + SpeakerCDL _speakerCDL; + Action1 _action1; + Action2 _action2; + Action3 _action3; + DisplayHotspot _hotspot1, _hotspot2; + Hotspot3 _hotspot3; + SceneObject _hotspot4; + HotspotGroup1 _hotspot5, _hotspot6; + DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10, _hotspot11, _hotspot12; + HotspotGroup3 _hotspot13, _hotspot14, _hotspot15, _hotspot16; + DisplayHotspot _hotspot17, _hotspot18, _hotspot19, _hotspot20, _hotspot21; + DisplayHotspot _hotspot22, _hotspot23, _hotspot24; + HotspotGroup6 _hotspot25, _hotspot26; + + Scene4150(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4250 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot6 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + +public: + SequenceManager _sequenceManager; + ASound _soundHandler; + SpeakerSR _speakerSR; + SpeakerSL _speakerSL; + SpeakerSText _speakerSText; + SpeakerGameText _speakerGameText; + SpeakerQL _speakerQL; + SpeakerQR _speakerQR; + SpeakerQText _speakerQText; + SpeakerPText _speakerPText; + SpeakerMText _speakerMText; + SpeakerFLText _speakerFLText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + SceneObject _hotspot3; + Hotspot4 _hotspot4; + SceneObject _hotspot5; + Hotspot6 _hotspot6; + DisplayHotspot _hotspot7; + Hotspot8 _hotspot8; + + Scene4250(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene4300 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot9 : public NamedHotspot { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot15 : public SceneObject { + public: + virtual void signal(); + }; + class Hotspot16 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot17 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot19 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler1, _soundHandler2; + SequenceManager _sequenceManager; + GfxButton _gfxButton; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + SpeakerMText _speakerMText; + SpeakerFLText _speakerFLText; + + SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4; + SceneObject _hotspot5, _hotspot6, _hotspot7; + Hotspot8 _hotspot8; + Hotspot9 _hotspot9; + Hotspot10 _hotspot10; + NamedHotspot _hotspot11; + SceneObject _hotspot12, _hotspot13, _hotspot14; + Hotspot15 _hotspot15; + Hotspot16 _hotspot16; + Hotspot17 _hotspot17; + DisplayHotspot _hotspot18; + Hotspot19 _hotspot19; + Action1 _action1; + Action2 _action2; + + Scene4300(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void stripCallback(int v); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); + virtual void process(Event &event); +}; + +class Scene4301 : public Scene { + /* Actions */ + class Action1 : public ActionExt { + public: + SceneObject _buttonList[6]; + int _field34E; + int _indexList[6]; + + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + }; + + /* Hotspots */ + class Hotspot4 : public NamedHotspot { + public: + virtual void doAction(int action); + }; + class Hotspot5 : public NamedHotspot { + public: + virtual void doAction(int action); + }; + +public: + Common::List _list1; + SequenceManager _sequenceManager; + ASound _soundHandler; + Action1 _action1; + SceneObject _hotspot1, _hotspot2, _hotspot3; + Hotspot4 _hotspot4; + Hotspot5 _hotspot5; + bool _field68E; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void dispatch(); + virtual void synchronize(Serializer &s) { + Scene::synchronize(s); + s.syncAsSint16LE(_field68E); + } +}; + + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp new file mode 100644 index 0000000000..6b335fe7c3 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes6.cpp @@ -0,0 +1,2200 @@ +/* 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. + * + */ + +#include "tsage/ringworld/ringworld_scenes6.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +/*-------------------------------------------------------------------------- + * Scene 5000 - Caverns - Entrance + * + *--------------------------------------------------------------------------*/ + +void Scene5000::Action1::signal() { + // Ship landing + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_soundHandler.play(190); + scene->_soundHandler.holdAt(true); + ADD_MOVER(scene->_hotspot1, 283, 12); + break; + case 2: + break; + case 3: + scene->_hotspot1._moveDiff.y = 1; + scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x, + scene->_hotspot1._position.y + 15)); + scene->_hotspot4.show(); + setDelay(15); + break; + case 4: + scene->_soundHandler.release(); + ADD_MOVER(scene->_hotspot1, 233, 80); + break; + case 5: + scene->_hotspot3.animate(ANIM_MODE_8, 0, NULL); + scene->_hotspot3.show(); + ADD_MOVER(scene->_hotspot1, 233, 90); + break; + case 6: + scene->_hotspot3.remove(); + scene->_hotspot2.setPosition(Common::Point(233, 76)); + scene->_hotspot2.show(); + scene->_hotspot2.animate(ANIM_MODE_5, this); + + scene->_hotspot4.remove(); + break; + case 7: + setDelay(60); + scene->_hotspot2.remove(); + break; + case 8: + scene->_hotspot5.show(); + scene->_hotspot5.animate(ANIM_MODE_5, this); + break; + case 9: + scene->setAction(&scene->_action2); + break; + } +} + +void Scene5000::Action1::dispatch() { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Action::dispatch(); + + if (_actionIndex == 3) { + if (scene->_hotspot1._percent % 2 == 0) { + ++scene->_hotspot1._position.y; + if (scene->_hotspot1._position.x > 233) + --scene->_hotspot1._position.x; + } + + scene->_hotspot1.changeZoom(++scene->_hotspot1._percent); + scene->_hotspot1._flags |= OBJFLAG_PANES; + + if (scene->_hotspot1._percent >= 100) + signal(); + } + + if ((_actionIndex == 5) || (_actionIndex == 6)) { + scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x, + scene->_hotspot1._position.y + 15)); + } +} + +void Scene5000::Action2::signal() { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.setPosition(Common::Point(217, 76)); + setDelay(10); + break; + case 1: + _globals->_player.setStrip2(3); + _globals->_player.animate(ANIM_MODE_1, NULL); + ADD_MOVER(_globals->_player, 214, 89); + break; + case 2: + if (!_globals->getFlag(59)) + setAction(&scene->_action3, this); + _globals->_player.fixPriority(15); + ADD_MOVER(_globals->_player, 208, 100); + break; + case 3: + ADD_MOVER(_globals->_player, 213, 98); + break; + case 4: + _globals->_player.fixPriority(20); + ADD_MOVER(_globals->_player, 215, 115); + break; + case 5: + _globals->_player.changeZoom(47); + ADD_MOVER(_globals->_player, 220, 125); + break; + case 6: + ADD_MOVER(_globals->_player, 229, 115); + break; + case 7: + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(35); + ADD_MOVER(_globals->_player, 201, 166); + break; + case 8: + _globals->_player.updateZoom(); + ADD_MOVER(_globals->_player, 205, 146); + break; + case 9: + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(50); + ADD_MOVER(_globals->_player, 220, 182); + break; + case 10: + _globals->_player.updateZoom(); + ADD_MOVER(_globals->_player, 208, 163); + break; + case 11: + _globals->_player.changeZoom(-1); + _globals->_player.setStrip2(-1); + _globals->_player.fixPriority(-1); + ADD_MOVER(_globals->_player, 208, 175); + break; + case 12: + _globals->_player.setStrip(8); + _globals->_player.setFrame(1); + setDelay(10); + break; + case 13: + if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) + setDelay(10); + break; + case 14: + setDelay(30); + break; + case 15: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene5000::Action3::signal() { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_hotspot7.postInit(); + scene->_hotspot7.setVisage(2809); + scene->_hotspot7.setObjectWrapper(new SceneObjectWrapper()); + scene->_hotspot7.setPosition(Common::Point(217, 76)); + scene->_hotspot7.changeZoom(10); + scene->_hotspot7.setStrip2(3); + scene->_hotspot7.fixPriority(200); + scene->_hotspot7._moveDiff.y = 2; + scene->_hotspot7.animate(ANIM_MODE_1, NULL); + ADD_MOVER(scene->_hotspot7, 214, 89); + + _globals->_sceneItems.push_front(&scene->_hotspot7); + break; + case 2: + scene->_hotspot7.changeZoom(-1); + scene->_hotspot7.fixPriority(14); + ADD_MOVER(scene->_hotspot7, 208, 100); + break; + case 3: + ADD_MOVER(scene->_hotspot7, 213, 98); + break; + case 4: + scene->_hotspot7.fixPriority(19); + ADD_MOVER(scene->_hotspot7, 215, 115); + break; + case 5: + scene->_hotspot7.changeZoom(46); + ADD_MOVER(scene->_hotspot7, 220, 125); + break; + case 6: + ADD_MOVER(scene->_hotspot7, 229, 115); + break; + case 7: + scene->_hotspot7.changeZoom(-1); + scene->_hotspot7.fixPriority(34); + ADD_MOVER(scene->_hotspot7, 201, 166); + break; + case 8: + scene->_hotspot7.updateZoom(); + ADD_MOVER(scene->_hotspot7, 205, 146); + break; + case 9: + scene->_hotspot7.changeZoom(-1); + scene->_hotspot7.fixPriority(49); + ADD_MOVER(scene->_hotspot7, 210, 182); + break; + case 10: + scene->_hotspot7.updateZoom(); + ADD_MOVER(scene->_hotspot7, 208, 163); + break; + case 11: + scene->_hotspot7.changeZoom(-1); + scene->_hotspot7.setStrip2(-1); + scene->_hotspot7.fixPriority(-1); + ADD_MOVER(scene->_hotspot7, 175, 166); + break; + case 12: + ADD_MOVER(scene->_hotspot7, 126, 146); + break; + case 13: + scene->_hotspot7.setStrip(2); + remove(); + break; + } +} + +void Scene5000::Action4::signal() { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + _globals->_player.fixPriority(50); + _globals->_player.setStrip2(4); + ADD_MOVER(_globals->_player, 210, 182); + break; + case 2: + ADD_MOVER(_globals->_player, 205, 146); + break; + case 3: + _globals->_player.fixPriority(35); + ADD_MOVER(_globals->_player, 201, 166); + break; + case 4: + ADD_MOVER(_globals->_player, 229, 115); + break; + case 5: + _globals->_player.fixPriority(20); + _globals->_player.changeZoom(47); + ADD_MOVER(_globals->_player, 220, 125); + break; + case 6: + ADD_MOVER(_globals->_player, 215, 115); + break; + case 7: + _globals->_player.changeZoom(-1); + ADD_MOVER(_globals->_player, 213, 98); + break; + case 8: + _globals->_player.fixPriority(15); + ADD_MOVER(_globals->_player, 208, 100); + break; + case 9: + ADD_MOVER(_globals->_player, 214, 89); + break; + case 10: + ADD_MOVER(_globals->_player, 217, 76); + break; + case 11: + _globals->_player.hide(); + setDelay(60); + break; + case 12: + if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) + _globals->_sceneManager.changeScene(2320); + remove(); + break; + } +} + +void Scene5000::Action5::signal() { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_MOVER(_globals->_player, 91, 155); + break; + case 1: + _globals->_player.setVisage(2670); + _globals->_player._strip = 4; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + SceneItem::display2(5000, _globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + _globals->_player.setVisage(0); + _globals->_player._strip = 8; + _globals->_player.animate(ANIM_MODE_1, NULL); + + _globals->_player.enableControl(); + remove(); + } +} + +void Scene5000::Action6::signal() { + // Discussion between the hero and Seeker, then the hero goes back to the lander + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + _globals->_events.setCursor(CURSOR_WALK); + scene->_stripManager.start(2150, this); + break; + case 2: + _globals->_events.setCursor(CURSOR_NONE); + scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL); + break; + case 3: + ADD_PLAYER_MOVER(208, 163); + break; + case 4: + _globals->_player.fixPriority(50); + _globals->_player.setStrip2(4); + ADD_MOVER(_globals->_player, 210, 182); + break; + case 5: + _globals->_sceneManager.changeScene(2100); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene5000::Hotspot7::doAction(int action) { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5000, 12); + break; + case CURSOR_TALK: + scene->setAction(&scene->_action6); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5000::Hotspot8::doAction(int action) { + // Cave + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5000, 10); + break; + case OBJECT_STUNNER: + SceneItem::display2(5000, 14); + break; + case OBJECT_SCANNER: + scene->setAction(&scene->_action5); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5000::HotspotGroup1::doAction(int action) { + Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + + if (_globals->_sceneObjects->contains(&scene->_hotspot7)) + scene->setAction(&scene->_action6); + else + SceneItem::display2(5000, 11); +} +/*--------------------------------------------------------------------------*/ + +Scene5000::Scene5000() : + _hotspot1(0, CURSOR_LOOK, 5000, 3, LIST_END), + _hotspot12(0, CURSOR_LOOK, 5000, 6, CURSOR_USE, 5000, 7, OBJECT_STUNNER, 5000, 14, + OBJECT_SCANNER, 5000, 16, LIST_END), + _hotspot13(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0, + OBJECT_SCANNER, 5000, 16, LIST_END), + _hotspot14(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0, + OBJECT_SCANNER, 5000, 16, LIST_END), + _hotspot15(0, CURSOR_LOOK, 5000, 2, OBJECT_STUNNER, 5000, 15, LIST_END), + _hotspot16(0, CURSOR_LOOK, 5000, 4, CURSOR_USE, 5000, 5, LIST_END), + _hotspot17(0, CURSOR_LOOK, 5000, 1, LIST_END), + _hotspot18(0, CURSOR_LOOK, 5000, 0, LIST_END) { +} + + +void Scene5000::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + loadScene(5000); + + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerQText); + + _globals->_player.postInit(); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player._moveDiff = Common::Point(4, 2); + _globals->_player.changeZoom(-1); + _globals->_player.disableControl(); + + _hotspot1.postInit(); + _hotspot1.setVisage(5001); + _hotspot1.setFrame2(1); + _hotspot1._moveDiff = Common::Point(5, 5); + _hotspot1.fixPriority(10); + _hotspot1.changeZoom(10); + + _hotspot4.postInit(); + _hotspot4.setVisage(5001); + _hotspot4.setStrip2(2); + _hotspot4._moveDiff = Common::Point(5, 1); + _hotspot4.fixPriority(10); + _hotspot4.changeZoom(100); + _hotspot4.animate(ANIM_MODE_8, 0, NULL); + _hotspot4.hide(); + + _hotspot2.postInit(); + _hotspot2.setVisage(5001); + _hotspot2.setStrip2(3); + _hotspot2._numFrames = 5; + _hotspot2.hide(); + + _hotspot3.postInit(); + _hotspot3.setVisage(5001); + _hotspot3.setStrip2(5); + _hotspot3._numFrames = 5; + _hotspot3.setPosition(Common::Point(233, 76)); + _hotspot3.hide(); + + _hotspot5.postInit(); + _hotspot5.setVisage(5001); + _hotspot5.setStrip2(4); + _hotspot5._numFrames = 5; + _hotspot5.fixPriority(15); + _hotspot5.setPosition(Common::Point(218, 76)); + _hotspot5.hide(); + + _hotspot9.postInit(); + _hotspot9.setVisage(5002); + _hotspot9.fixPriority(80); + _hotspot9.setPosition(Common::Point(71, 174)); + + _hotspot10.postInit(); + _hotspot10.setVisage(5002); + _hotspot10.setStrip2(2); + _hotspot10.setPosition(Common::Point(87, 120)); + + _hotspot11.postInit(); + _hotspot11.setVisage(5002); + _hotspot11.setStrip2(2); + _hotspot11.setFrame(3); + _hotspot10.setPosition(Common::Point(93, 118)); + + setZoomPercents(95, 10, 145, 100); + + _hotspot8.setBounds(Rect(0, 73, 87, 144)); + _hotspot18.setBounds(Rect(54, 0, 319, 85)); + _hotspot17.setBounds(Rect(184, 0, 199, 79)); + _hotspot13.setBounds(Rect(0, 164, 135, 200)); + _hotspot14.setBounds(Rect(0, 0, 105, 140)); + _hotspot15.setBounds(Rect(266, 70, 291, 85)); + _hotspot16.setBounds(Rect(0, 86, 319, 200)); + _hotspot12.setBounds(Rect(230, 143, 244, 150)); + + _globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13, + &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL); + + switch (_globals->_sceneManager._previousScene) { + case 1000: + case 2100: + case 2320: + if (_globals->getFlag(59)) { + _hotspot1.setPosition(Common::Point(233, 90)); + _hotspot1.changeZoom(100); + _hotspot1.show(); + + _hotspot5.setFrame(1); + _hotspot5.animate(ANIM_MODE_5, NULL); + _hotspot5.setPosition(Common::Point(218, 76)); + _hotspot5.show(); + + _globals->_player.setPosition(Common::Point(217, -10)); + _globals->_player.disableControl(); + + setAction(&_action2); + } else { + _globals->_player.setPosition(Common::Point(217, -10)); + _hotspot1.setPosition(Common::Point(320, -10)); + _globals->_player.disableControl(); + + setAction(&_action1); + } + break; + default: + _globals->_player.disableControl(); + _globals->_player.setPosition(Common::Point(0, 146)); + + _hotspot1.changeZoom(100); + _hotspot1.setPosition(Common::Point(233, 90)); + _hotspot1.show(); + + _hotspot5.setFrame(_hotspot5.getFrameCount()); + _hotspot5.show(); + + _sceneMode = 5004; + setAction(&_sequenceManager, this, 5004, &_globals->_player, NULL); + break; + } + + _globals->_soundHandler.play(190); +} + +void Scene5000::signal() { + switch (_sceneMode) { + case 5002: + case 5003: + case 5004: + _globals->_player.enableControl(); + break; + case 5005: + _globals->_sceneManager.changeScene(5100); + break; + } +} + +void Scene5000::dispatch() { + Scene::dispatch(); + + if (!_action) { + if (!_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 10)) { + _globals->_player.disableControl(); + _sceneMode = 5005; + setAction(&_sequenceManager, this, 5005, &_globals->_player, NULL); + } + + if (_globals->_player.getRegionIndex() == 8) { + _globals->_player.disableControl(); + + if (_globals->_sceneObjects->contains(&_hotspot7)) { + _sceneMode = 5003; + _globals->_player.addMover(NULL); + setAction(&_sequenceManager, this, 5003, &_globals->_player, NULL); + } else { + setAction(&_action4); + } + } + + if (_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 15)) { + _sceneMode = 5002; + _globals->_player.disableControl(); + _globals->_player.addMover(NULL); + setAction(&_sequenceManager, this, 5002, &_globals->_player, NULL); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 5100 - Caverns + * + *--------------------------------------------------------------------------*/ + +void Scene5100::Action1::signal() { + // Quinn enters the cave for the first time + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + ADD_MOVER(_globals->_player, 1111, 165); + break; + case 2: + _globals->_player.setStrip(6); + _globals->_player.setFrame(1); + setDelay(60); + break; + case 3: + if (_globals->getFlag(10)) { + _globals->_player.enableControl(); + remove(); + } else { + _globals->setFlag(10); + scene->_stripManager.start(5102, this); + } + break; + case 4: + scene->_soundHandler.play(206); + + scene->_hotspot5.postInit(); + scene->_hotspot5.setVisage(5362); + scene->_hotspot5.setPosition(Common::Point(1160, 34)); + scene->_hotspot5.setStrip2(2); + scene->_hotspot5.animate(ANIM_MODE_1, NULL); + scene->_hotspot5.fixPriority(10); + + _globals->_sceneItems.push_front(&scene->_hotspot5); + ADD_MOVER(scene->_hotspot5, 999, 14); + break; + case 5: + scene->_hotspot5.setStrip2(4); + scene->_hotspot5._frame = 1; + scene->_hotspot5.animate(ANIM_MODE_5, this); + break; + case 6: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene5100::Action2::signal() { + // Quinn and Seeker exit the cave + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(5); + break; + case 1: + if (scene->_hotspot8._visage == 2806) + setDelay(1); + else + scene->_hotspot8.animate(ANIM_MODE_5, this); + break; + case 2: + if (scene->_hotspot8._visage != 2806) { + scene->_hotspot8.setVisage(2806); + scene->_hotspot8.setPosition(Common::Point(548, 193)); + scene->_hotspot8.animate(ANIM_MODE_1, NULL); + scene->_hotspot8._angle = 325; + scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper()); + scene->_hotspot8.setStrip(8); + } + + scene->_stripManager.start(5129, this); + break; + case 3: + if (_globals->_player._position.x >= 966) { + ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); + } else { + ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185); + } + + if (_globals->_player._position.x >= 966) { + setDelay(1); + } else { + ADD_PLAYER_MOVER(966, 190); + } + break; + case 4: + ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); + ADD_PLAYER_MOVER(1215, 155); + break; + case 5: + _globals->_sceneManager.changeScene(2100); + break; + } +} + +void Scene5100::Action3::signal() { + // Quinns shots flesheater + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->setFlag(62); + _globals->_player.disableControl(); + _globals->_player.addMover(NULL); + + scene->_hotspot2.addMover(NULL); + scene->_hotspot3.addMover(NULL); + _globals->_player.setVisage(2672); + + if (static_cast(_owner)->_position.x >= _globals->_player._position.x) + _globals->_player._strip = 4; + else + _globals->_player._strip = 3; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 1: + _globals->_player.setVisage(2674); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 2: + scene->_soundHandler.play(28); + if (static_cast(_owner)->_position.x < _globals->_player._position.x) { + scene->_hotspot2.setVisage(5130); + scene->_hotspot2._strip = 1; + scene->_hotspot2._frame = 1; + scene->_hotspot2.animate(ANIM_MODE_5, this); + scene->_hotspot2.setAction(NULL); + + scene->_hotspot3.setStrip2(1); + ADD_PLAYER_MOVER_NULL(scene->_hotspot3, 1200, 100); + } else { + scene->_hotspot3.setVisage(5130); + scene->_hotspot3._strip = 1; + scene->_hotspot3._frame = 1; + scene->_hotspot3.animate(ANIM_MODE_5, this); + scene->_hotspot3.setAction(NULL); + + scene->_hotspot2.setStrip2(2); + ADD_PLAYER_MOVER_NULL(scene->_hotspot2, 10, 140); + + } + + _globals->_player.setVisage(2672); + _globals->_player._frame = _globals->_player.getFrameCount(); + _globals->_player.animate(ANIM_MODE_6, this); + break; + case 3: + break; + case 4: + SceneItem::display2(5100, 38); + _globals->_player.enableControl(); + + _globals->_player.setVisage(0); + _globals->_player._strip = 8; + _globals->_player.animate(ANIM_MODE_1, NULL); + remove(); + break; + } +} + +void Scene5100::Action4::signal() { + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + _globals->_player.disableControl(); + scene->_soundHandler.play(208); + SceneItem::display2(5100, 15); + + ObjectMover3 *mover = new ObjectMover3(); + scene->_hotspot2.addMover(mover, &_globals->_player, 20, this); + break; + } + case 1: + scene->_hotspot1.postInit(); + scene->_hotspot1.setVisage(5120); + scene->_hotspot1.setPosition(Common::Point(795, 161)); + scene->_hotspot1._strip = 4; + scene->_hotspot1.animate(ANIM_MODE_5, this); + break; + case 2: + setDelay(15); + break; + case 3: + _globals->_sceneManager.changeScene(5200); + break; + } +} + +void Scene5100::Action5::signal() { + // Quinns forgot the statis box in the throne room, and goes back + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(60); + break; + case 1: + scene->_stripManager.start(5128, this); + break; + case 2: + setDelay(15); + break; + case 3: + scene->_sceneMode = 5106; + scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene5100::HotspotGroup1::doAction(int action) { + // Flesh Eaters + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, _globals->getFlag(62) ? 41 : 26); + break; + case CURSOR_USE: + SceneItem::display2(5100, 11); + break; + case OBJECT_SCANNER: + SceneItem::display2(5100, 17); + break; + case OBJECT_STUNNER: + if (_globals->getFlag(62)) + SceneItem::display2(5100, 42); + else + setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot4::doAction(int action) { + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, 31); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 5110; + scene->setAction(&scene->_sequenceManager, scene, 5110, &_globals->_player, this, &scene->_hotspot7, NULL); + break; + case CURSOR_TALK: + SceneItem::display2(5100, 34); + break; + case OBJECT_STUNNER: + SceneItem::display2(5100, 36); + break; + case OBJECT_SCANNER: + SceneItem::display2(5100, 37); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::HotspotGroup2::doAction(int action) { + // Bat + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, _globals->getFlag(108) ? 47 : 23); + break; + case CURSOR_USE: + SceneItem::display2(5100, 29); + break; + case CURSOR_TALK: + if (_position.x >= 600) + SceneItem::display2(5100, 28); + else { + _globals->_player.disableControl(); + scene->_sceneMode = 5114; + scene->setAction(&scene->_sequenceManager, scene, 5114, NULL); + } + break; + case OBJECT_SCANNER: + SceneItem::display2(5100, 43); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot9::doAction(int action) { + // Rope + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, 32); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 5117; + scene->setAction(&scene->_sequenceManager, scene, 5117, &_globals->_player, NULL); + break; + case OBJECT_STUNNER: + SceneItem::display2(5100, 35); + break; + case OBJECT_SCANNER: + SceneItem::display2(5100, 44); + break; + case OBJECT_BONE: + _globals->_player.disableControl(); + scene->_sceneMode = 5116; + scene->setAction(&scene->_sequenceManager, scene, 5116, &_globals->_player, this, &scene->_hotspot10, + &scene->_hotspot4, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot17::doAction(int action) { + // Rock blocking pit entrance + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, 18); + break; + case CURSOR_USE: + if (_globals->getFlag(67)) + SceneItem::display2(5100, 19); + else { + _globals->_player.disableControl(); + scene->_sceneMode = 5101; + scene->setAction(&scene->_sequenceManager, scene, 5101, &_globals->_player, this, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot18::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->_sceneManager._previousScene != 5000) { + SceneItem::display2(5100, 3); + } else { + switch (_index1) { + case 0: + SceneItem::display2(5100, 0); + ++_index1; + break; + case 1: + SceneItem::display2(5100, 1); + ++_index1; + break; + default: + SceneItem::display2(5100, 2); + break; + } + } + break; + case CURSOR_USE: + switch (_index2) { + case 0: + SceneItem::display2(5100, 8); + ++_index2; + break; + case 1: + SceneItem::display2(5100, 9); + ++_index2; + break; + default: + SceneItem::display2(5100, 10); + break; + } + break; + + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot19::doAction(int action) { + // Pillar + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, _globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + scene->_sceneMode = 5106; + + if (_globals->getFlag(66)) + scene->setAction(&scene->_sequenceManager, scene, 5113, &_globals->_player, NULL); + else { + _globals->setFlag(66); + scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5100::Hotspot20::doAction(int action) { + Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5100, 21); + break; + case CURSOR_USE: + _globals->_player.disableControl(); + + if (_globals->getFlag(67)) { + scene->_sceneMode = 5112; + scene->setAction(&scene->_sequenceManager, scene, 5112, &_globals->_player, NULL); + } else { + scene->_sceneMode = 5101; + scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot17, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene5100::Scene5100() : + _hotspot16(0, CURSOR_LOOK, 5100, 48, LIST_END), + _hotspot21(0, CURSOR_LOOK, 5100, 4, CURSOR_USE, 5100, 5, LIST_END) { +} + +void Scene5100::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(50, 10, 200, 100); + _sceneMode = 0; + + _stripManager.addSpeaker(&_speakerMText); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + _stripManager.addSpeaker(&_speakerBatText); + _speakerQText._npc = &_globals->_player; + _speakerMText._npc = &_globals->_player; + _speakerSText._npc = &_hotspot8; + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.disableControl(); + + if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { + _hotspot14.postInit(); + _hotspot14.setVisage(5101); + _hotspot14.setPosition(Common::Point(498, 147)); + _hotspot14.fixPriority(200); + _hotspot14._moveDiff.y = 10; + } + + _hotspot17.postInit(); + _hotspot17.setVisage(5101); + _hotspot17._strip = 2; + _hotspot17.fixPriority(200); + + if (_globals->getFlag(67)) + _hotspot17.setPosition(Common::Point(554, 192)); + else + _hotspot17.setPosition(Common::Point(539, 179)); + + _hotspot19.setBounds(Rect(488, 115, 508, 148)); + _hotspot21.setBounds(Rect(1150, 85, 1173, 112)); + _hotspot20.setBounds(Rect(517, 193, 562, 200)); + _globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL); + + if (_globals->getFlag(67)) { + _globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL); + } else { + _globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL); + } + + if (!_globals->getFlag(105)) { + _hotspot4.postInit(); + _hotspot4.setVisage(5363); + _hotspot4.setPosition(Common::Point(1025, 65)); + _hotspot4.setStrip(4); + _hotspot4.animate(ANIM_MODE_7, 0, NULL);; + _globals->_sceneItems.push_back(&_hotspot4); + + _hotspot9.postInit(); + _hotspot9.setVisage(5363); + _hotspot9.setPosition(Common::Point(966, 120)); + _globals->_sceneItems.push_back(&_hotspot9); + + _hotspot10.postInit(); + _hotspot10.setVisage(5363); + _hotspot10.setPosition(Common::Point(999, 68)); + _hotspot10.setStrip(2); + + _hotspot6.postInit(); + _hotspot6.setVisage(5362); + _hotspot6.setPosition(Common::Point(1017, 34)); + _hotspot6._strip = 4; + _hotspot6._frame = _hotspot6.getFrameCount(); + _globals->_sceneItems.push_back(&_hotspot6); + } + + _hotspot16._sceneRegionId = 15; + _globals->_sceneItems.push_back(&_hotspot16); + + if (!_globals->getFlag(62)) { + _hotspot2.postInit(); + _hotspot2.setVisage(5110); + _hotspot2.animate(ANIM_MODE_1, NULL); + _hotspot2._moveDiff.x = 4; + _globals->_sceneItems.push_back(&_hotspot2); + + _hotspot3.postInit(); + _hotspot3.setVisage(5110); + _hotspot3.animate(ANIM_MODE_1, NULL); + _hotspot3._moveDiff.x = 4; + _globals->_sceneItems.push_back(&_hotspot3); + + if (_globals->getFlag(61)) { + _hotspot2.setPosition(Common::Point(483, 189)); + _hotspot3.setPosition(Common::Point(811, 182)); + } else { + _hotspot2.setPosition(Common::Point(610, 170)); + _hotspot3.setPosition(Common::Point(600, 180)); + } + } + + if (_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) && + _globals->getFlag(107) && _globals->getFlag(67)) { + _hotspot8.postInit(); + _hotspot8.setVisage(2806); + _hotspot8.setPosition(Common::Point(557, 178)); + _hotspot8.animate(ANIM_MODE_1, NULL); + _hotspot8.setObjectWrapper(new SceneObjectWrapper()); + + _globals->clearFlag(59); + } + + switch (_globals->_sceneManager._previousScene) { + case 5000: + default: + _globals->_player.setPosition(Common::Point(1184, 160)); + setAction(&_action1); + break; + case 5200: + if (_globals->_stripNum == 5200) { + _globals->_player.setVisage(5101); + _globals->_player.fixPriority(200); + _globals->_player.setStrip(5); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(513, 199)); + + _sceneMode = 5108; + setAction(&_sequenceManager, this, 5108, &_globals->_player, NULL); + } else { + _globals->_player.setPosition(Common::Point(20, 175)); + + _hotspot13.postInit(); + _hotspot13.setVisage(5110); + _hotspot13.setPosition(Common::Point(578, 192)); + _hotspot13._strip = 2; + + _hotspot11.postInit(); + _hotspot11.setVisage(5110); + _hotspot11.setPosition(Common::Point(5, 162)); + _hotspot11.setStrip2(1); + _hotspot11._moveDiff = Common::Point(4, 2); + _hotspot11.animate(ANIM_MODE_1, NULL); + + ObjectMover2 *mover = new ObjectMover2(); + _hotspot11.addMover(mover, 15, 20, &_globals->_player); + + _hotspot12.postInit(); + _hotspot12.setVisage(5110); + _hotspot12.setPosition(Common::Point(15, 164)); + _hotspot12.setStrip2(1); + _hotspot12._moveDiff = Common::Point(4, 2); + _hotspot12.animate(ANIM_MODE_1, NULL); + + ObjectMover2 *mover2 = new ObjectMover2(); + _hotspot12.addMover(mover2, 25, 50, &_globals->_player); + + _hotspot17.setPosition(Common::Point(554, 182)); + _globals->_player.disableControl(); + + _sceneMode = 5105; + setAction(&_sequenceManager, this, 5105, &_globals->_player, NULL); + } + break; + case 5300: + switch (_globals->_stripNum) { + case 5300: + _sceneMode = 5111; + + _globals->_player.setVisage(5101); + _globals->_player.setStrip(6); + _globals->_player.fixPriority(170); + _globals->_player.setPosition(Common::Point(1168, 110)); + + setAction(&_sequenceManager, this, 5111, &_globals->_player, NULL); + _hotspot8.setPosition(Common::Point(1107, 178)); + break; + case 5302: + _globals->_player.setPosition(Common::Point(512, 190)); + + if (_globals->_sceneObjects->contains(&_hotspot8)) + setAction(&_action2); + else + _globals->_player.enableControl(); + break; + case 5303: + _hotspot8.setVisage(5102); + _hotspot8.setPosition(Common::Point(533, 172)); + _globals->_player.setPosition(Common::Point(512, 190)); + setAction(&_action2); + break; + } + + if (_globals->getFlag(108)) { + _hotspot6.postInit(); + _hotspot6.setVisage(5362); + _hotspot6.setPosition(Common::Point(542, 19)); + _hotspot6.setStrip(6); + _hotspot6.setFrame(1); + _globals->_sceneItems.push_back(&_hotspot6); + } else if (RING_INVENTORY._vial._sceneNumber != 5100) { + _hotspot6.postInit(); + _hotspot6.setVisage(5362); + _hotspot6.setPosition(Common::Point(1152, 70)); + _hotspot6.fixPriority(170); + _hotspot6.setStrip(6); + _hotspot6.setFrame(1); + _globals->_sceneItems.push_back(&_hotspot6); + } + break; + } + + _hotspot18.setBounds(Rect(0, 0, 1280, 200)); + _globals->_sceneItems.push_back(&_hotspot18); + + _hotspot15.postInit(); + _hotspot15.setVisage(5140); + _hotspot15.setStrip(3); + _hotspot15.setPosition(Common::Point(977, 173)); + _hotspot15.fixPriority(1); + + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + loadScene(5100); + _globals->_soundHandler.play(205); +} + +void Scene5100::signal() { + switch (_sceneMode) { + case 5101: + case 5112: + _globals->setFlag(67); + _globals->_sceneManager.changeScene(5300); + break; + case 5102: + case 5114: + _globals->_player.enableControl(); + break; + case 5103: + if (_globals->getFlag(61)) { + SceneItem::display2(5100, 46); + _globals->_sceneManager.changeScene(5300); + } else { + SceneItem::display2(5100, 45); + _globals->_sceneManager.changeScene(5200); + } + break; + case 5105: + _globals->_sceneManager.changeScene(5300); + break; + case 5106: + _globals->_stripNum = 5111; + _globals->_sceneManager.changeScene(5200); + break; + case 5108: + if (!_globals->getFlag(60)) + _globals->_player.enableControl(); + else if (RING_INVENTORY._stasisBox._sceneNumber == 1) + setAction(&_action2); + else + setAction(&_action5); + break; + case 5110: + SceneItem::display2(5100, 30); + _globals->_player._angle = 325; + _globals->_player.enableControl(); + break; + case 5111: + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setVisage(0); + _globals->_player.setStrip(6); + _globals->_player.fixPriority(-1); + _globals->_player.animate(ANIM_MODE_1, NULL); + + if ((RING_INVENTORY._vial._sceneNumber != 5100) && !_globals->getFlag(108)) { + _globals->setFlag(108); + _sceneMode = 5130; + _globals->_player.disableControl(); + + _speakerBatText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 20, 30)); + setAction(&_sequenceManager, this, 5130, &_globals->_player, &_hotspot6, NULL); + } else if (_globals->_sceneObjects->contains(&_hotspot8)) { + setAction(&_action2); + } else { + _globals->_player.enableControl(); + } + break; + case 5116: + _globals->setFlag(105); + RING_INVENTORY._bone._sceneNumber = 0; + + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setVisage(0); + _globals->_player.setStrip(6); + _globals->_player.fixPriority(-1); + _globals->_player.animate(ANIM_MODE_1, NULL); + // No break on purpose + case 5117: + _globals->_player.enableControl(); + break; + case 5130: + _hotspot6.setVisage(5362); + _hotspot6.setPosition(Common::Point(542, 25)); + _hotspot6.setStrip(6); + _hotspot6.setFrame(1); + _globals->_player.enableControl(); + break; + case 5150: + _globals->clearFlag(60); + _globals->_sceneManager.changeScene(5300); + break; + } +} + +void Scene5100::dispatch() { + // Flesheater trap + if (_hotspot15._bounds.contains(_globals->_player._position) && !_globals->_player._visage) { + _globals->_player.disableControl(); + _globals->_player.addMover(NULL); + + _soundHandler.play(207); + _sceneMode = 5103; + setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103, + &_globals->_player, &_hotspot15, NULL); + } + + if (_globals->getFlag(61) && !_globals->getFlag(62) && + ((_globals->_player._position.x - _hotspot2._position.x) < 160) && + (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { + setAction(NULL); + _sceneMode = 5150; + _soundHandler.play(208); + + if (RING_INVENTORY._vial._sceneNumber == 5100) { + _globals->_player.addMover(NULL); + _globals->_player.disableControl(); + SceneItem::display2(5100, 39); + } + + _hotspot2.setStrip2(1); + _hotspot3.setStrip2(2); + + ObjectMover3 *mover1 = new ObjectMover3(); + _hotspot2.addMover(mover1, &_globals->_player, 20, this); + ObjectMover3 *mover2 = new ObjectMover3(); + _hotspot3.addMover(mover2, &_globals->_player, 20, this); + } + + if (!_action) { + if (((_globals->_player._position.x - _hotspot2._position.x) < 130) && !_globals->getFlag(61)) { + _globals->_player._canWalk = false; + _globals->_player.addMover(NULL); + + Common::Point pt(20, 25); + PlayerMover2 *mover = new PlayerMover2(); + _hotspot3.addMover(mover, &pt, &_globals->_player); + setAction(&_action4); + } + + if ((_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= _globals->_player._position.x) + _globals->_sceneManager.changeScene(5000); + + if (_globals->_player.getRegionIndex() == 8) { + _sceneMode = 5114; + setAction(&_sequenceManager, this, 5115, &_globals->_player, NULL); + } + } + + Scene::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 5200 - Caverns - Throne Room + * + *--------------------------------------------------------------------------*/ + +void Scene5200::Action1::signal() { + Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(59) + 120); + break; + case 1: + scene->_hotspot3.animate(ANIM_MODE_8, 1, this); + _actionIndex = 0; + break; + } +} + +void Scene5200::Action2::signal() { + // Quinn obtains the stasis box from the flesheater throne room + Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + ADD_PLAYER_MOVER(92, 52); + break; + case 1: + _globals->_player.setVisage(5202); + _globals->_player._strip = 4; + _globals->_player._frame = 1; + _globals->_player.animate(ANIM_MODE_4, 3, 1, this); + break; + case 2: + scene->_soundHandler.stop(); + scene->_hotspot14.remove(); + + RING_INVENTORY._stasisBox._sceneNumber = 1; + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 3: + _globals->_player.setVisage(0); + _globals->_player._strip = 3; + _globals->_player.animate(ANIM_MODE_1, NULL); + + scene->_hotspot8.animate(ANIM_MODE_2, NULL); + ADD_MOVER(scene->_hotspot8, 141, 77); + break; + case 4: + scene->_soundHandler.play(303); + + scene->_hotspot8._strip = 2; + scene->_hotspot8._frame = 1; + scene->_hotspot8.animate(ANIM_MODE_5, this); + break; + case 5: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene5200::Action3::signal() { + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(5); + break; + case 1: + ADD_PLAYER_MOVER(285, 62); + break; + case 2: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene5200::Action4::signal() { + Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(120); + break; + case 1: + _globals->_soundHandler.play(209); + scene->_stripManager.start(5202, this, scene); + break; + case 2: + scene->_hotspot6.animate(ANIM_MODE_5, this); + break; + case 3: + setDelay(10); + break; + case 4: + scene->_stripManager.start(5204, this, scene); + break; + case 5: + setDelay(60); + break; + case 6: + _globals->_sceneManager.changeScene(5100); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene5200::Hotspot9::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (!_state) { + ++_state; + SceneItem::display2(5200, 5); + } else { + SceneItem::display2(5200, 6); + } + break; + case CURSOR_USE: + SceneItem::display2(5200, 14); + break; + default: + SceneItem::doAction(action); + break; + } +} + +void Scene5200::Hotspot10::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (!_state) { + ++_state; + SceneItem::display2(5200, 7); + } else { + SceneItem::display2(5200, 8); + } + break; + default: + SceneObject::doAction(action); + break; + } +} + +void Scene5200::Hotspot14::doAction(int action) { + Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5200, 4); + break; + case CURSOR_USE: + scene->setAction(&scene->_action2); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene5200::Scene5200() : + _hotspot11(0, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END), + _hotspot12(10, CURSOR_LOOK, 5200, 9, LIST_END), + _hotspot13(8, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END) { +} + + +void Scene5200::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(0, 150, 199, 150); + _fieldA = 5600; + _fieldE = 5100; + + _hotspot9._state = 0; + _hotspot10._state = 0; + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerGameText); + _stripManager.addSpeaker(&_speakerFLText); + _stripManager.addSpeaker(&_speakerFLL); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.setCallback(this); + + _speakerFLText._textPos.x = 160; + _speakerQText._textPos.x = 20; + + if (RING_INVENTORY._stasisBox._sceneNumber == 5200) { + _soundHandler.play(216); + _soundHandler.holdAt(true); + + _hotspot14.postInit(); + _hotspot14.setVisage(5202); + _hotspot14._strip = 3; + _hotspot14.setPosition(Common::Point(105, 52)); + _hotspot14.fixPriority(90); + + _hotspot8.postInit(); + _hotspot8.setVisage(5202); + _hotspot8._strip = 1; + _hotspot8.setPosition(Common::Point(96, 53)); + _hotspot8.fixPriority(90); + _globals->_sceneItems.push_back(&_hotspot14); + } + + if (_globals->_stripNum == 5111) { + // Happens when the player enters the throne room via the secret passage, + // after talking with the bat. No NPCs are around and the player can + // obtain the stasis box. + _globals->_soundHandler.play(205); + _globals->_player.disableControl(); + + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.changeZoom(75); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip(1); + _globals->_player.setFrame(3); + _globals->_player.setPosition(Common::Point(307, 62)); + + setAction(&_action3); + } else { + // Happens when the player is captured by the flesh eaters the first time. + _globals->_player.postInit(); + _globals->_player.setVisage(2640); + _globals->_player._strip = 1; + _globals->_player._frame = 4; + _globals->_player.setPosition(Common::Point(105, 199)); + + _hotspot5.postInit(); + _hotspot5.setVisage(5210); + _hotspot5._frame = 2; + _hotspot5.setPosition(Common::Point(189, 167)); + + _hotspot6.postInit(); + _hotspot6.setVisage(5210); + _hotspot6._frame = 1; + _hotspot6._strip = 2; + _hotspot6.setPosition(Common::Point(159, 137)); + + _hotspot7.postInit(); + _hotspot7.setVisage(5210); + _hotspot7._frame = 1; + _hotspot7._strip = 4; + _hotspot7.fixPriority(168); + _hotspot7.setPosition(Common::Point(186, 106)); + + _hotspot1.postInit(); + _hotspot1.setVisage(5212); + _hotspot1._frame = 1; + _hotspot1.setPosition(Common::Point(62, 132)); + + _hotspot2.postInit(); + _hotspot2.setVisage(5212); + _hotspot2._strip = 3; + _hotspot2.setPosition(Common::Point(148, 141)); + _hotspot2.fixPriority(90); + + _hotspot3.postInit(); + _hotspot3.setVisage(5212); + _hotspot3._strip = 2; + _hotspot3.setPosition(Common::Point(62, 109)); + _hotspot3.fixPriority(138); + _hotspot3.setAction(&_action1); + + _hotspot4.postInit(); + _hotspot4.setVisage(5212); + _hotspot4._strip = 4; + _hotspot4.setPosition(Common::Point(146, 110)); + _hotspot4.fixPriority(90); + + _globals->_player.disableControl(); + _globals->setFlag(61); + + setAction(&_action4); + } + + _hotspot11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot9._sceneRegionId = 11; + _hotspot10._sceneRegionId = 9; + _hotspot12._sceneRegionId = 10; + _hotspot13._sceneRegionId = 8; + + _globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL); + _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + loadScene(5200); +} + +void Scene5200::stripCallback(int v) { + switch (v) { + case 1: + _hotspot7.animate(ANIM_MODE_2, NULL); + break; + case 2: + _hotspot7.animate(ANIM_MODE_NONE, NULL); + break; + } +} + +void Scene5200::dispatch() { + Scene::dispatch(); + + if (!_action && (_globals->_player.getRegionIndex() == 12)) { + _globals->_stripNum = 5200; + _globals->_sceneManager.changeScene(5100); + } +} + +/*-------------------------------------------------------------------------- + * Scene 5300 - Caverns - Pit + * + *--------------------------------------------------------------------------*/ + +void Scene5300::Action1::signal() { + // Seeker waking up + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + scene->_hotspot2._numFrames = 4; + scene->_hotspot2.animate(ANIM_MODE_8, 1, NULL); + setDelay(120); + break; + case 2: + scene->_hotspot2.animate(ANIM_MODE_NONE, NULL); + + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setStrip2(-1); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + ADD_MOVER(_globals->_player, 85, 170); + break; + case 3: + scene->_hotspot2.fixPriority(-1); + _globals->_player.checkAngle(&scene->_hotspot2); + setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL); + break; + case 4: + scene->_stripManager.start(5316, this); + break; + case 5: + if (!_globals->getFlag(106) || !_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { + _globals->_player.enableControl(); + remove(); + } else { + _globals->setFlag(60); + scene->_hotspot2._numFrames = 10; + + if (_globals->getFlag(67)) { + scene->_sceneMode = 5310; + scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL); + } else { + scene->_sceneMode = 5347; + scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); + } + } + break; + } +} + +void Scene5300::Action2::signal() { + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(60); + break; + case 1: + _globals->setFlag(60); + scene->_stripManager.start(5328, this); + break; + case 2: + if (RING_INVENTORY._stasisBox._sceneNumber == 1) { + _globals->_stripNum = 5303; + setDelay(5); + } else { + _globals->_stripNum = 5302; + scene->_stripManager.start(5329, this); + } + break; + case 3: + _globals->_sceneManager.changeScene(5100); + remove(); + break; + } +} + +void Scene5300::Action3::signal() { + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(30); + break; + case 1: + scene->_stripManager.start(_globals->_stripNum, this); + break; + case 2: + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene5300::Hotspot1::doAction(int action) { + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5300, 24); + break; + case CURSOR_TALK: + _globals->_stripNum = 5312; + scene->setAction(&scene->_action3); + break; + default: + SceneHotspot::doAction(action); + break; + } +} +void Scene5300::Hotspot2::doAction(int action) { + // Seeker + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5300, 23); + break; + case CURSOR_USE: + if (!_globals->getFlag(106)) { + _globals->_player.disableControl(); + scene->_sceneMode = 5302; + scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); + } else { + SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20); + } + break; + case CURSOR_TALK: + if (!_globals->getFlag(106)) { + _globals->_player.disableControl(); + scene->_sceneMode = 5302; + scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); + } else if (!_globals->getFlag(107)) { + SceneItem::display2(5300, 11); + } else { + _globals->_player.disableControl(); + + if (RING_INVENTORY._stasisBox._sceneNumber != 1) { + scene->_sceneMode = 5316; + scene->setAction(&scene->_sequenceManager, scene, 5316, NULL); + } else { + _globals->setFlag(60); + if (_globals->getFlag(67)) { + scene->_sceneMode = 5315; + scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL); + } else { + scene->_sceneMode = 5347; + scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); + } + } + } + break; + case OBJECT_SCANNER: + SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9); + break; + case OBJECT_MEDKIT: + if (_globals->getFlag(106)) + SceneItem::display2(5300, 7); + else { + _globals->setFlag(106); + _globals->_player.disableControl(); + + scene->_sceneMode = 5303; + scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL); + } + break; + case OBJECT_VIAL: + if (_globals->getFlag(107)) { + SceneItem::display2(5300, 8); + } else { + RING_INVENTORY._vial._sceneNumber = 5300; + _globals->setFlag(107); + _globals->_player.disableControl(); + scene->_sceneMode = 5304; + + scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5300::Hotspot5::doAction(int action) { + // Sharp bone + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5300, 27); + break; + case CURSOR_USE: + RING_INVENTORY._bone._sceneNumber = 1; + _globals->_player.disableControl(); + + scene->_sceneMode = 5309; + scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5300::Hotspot6::doAction(int action) { + // Left Hole + Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1)) + SceneItem::display2(5300, 4); + else + SceneItem::display2(5300, 26); + break; + case CURSOR_USE: + if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) { + _globals->_player.disableControl(); + scene->_sceneMode = 5301; + scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL); + } else { + _globals->_player.disableControl(); + scene->_sceneMode = 5307; + RING_INVENTORY._vial._sceneNumber = 1; + + scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player, + &scene->_hotspot4, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5300::Hotspot7::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(63)) + SceneItem::display2(5300, 2); + else { + _globals->setFlag(63); + SceneItem::display2(5300, 0); + SceneItem::display2(5300, 1); + } + break; + case CURSOR_USE: + if (_globals->getFlag(64)) + SceneItem::display2(5300, 15); + else { + _globals->setFlag(64); + SceneItem::display2(5300, 14); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene5300::Hotspot8::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5); + break; + case CURSOR_USE: + SceneItem::display2(5300, 18); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene5300::Scene5300() : + _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) { +} + +void Scene5300::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + loadScene(5300); + setZoomPercents(0, 100, 199, 100); + + _stripManager.addSpeaker(&_speakerQR); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerBatR); + _stripManager.addSpeaker(&_speakerSR); + _stripManager.addSpeaker(&_speakerSL); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerBatText); + _stripManager.addSpeaker(&_speakerSText); + _stripManager.addSpeaker(&_speakerGameText); + + if (_globals->getFlag(106) && _globals->getFlag(107)) { + _hotspot2.postInit(); + _hotspot2.setVisage(2806); + _hotspot2.setObjectWrapper(new SceneObjectWrapper()); + _hotspot2.setPosition(Common::Point(63, 170)); + _hotspot2.animate(ANIM_MODE_1, NULL); + } else { + _hotspot2.postInit(); + _hotspot2.setVisage(5310); + _hotspot2.setPosition(Common::Point(63, 170)); + _hotspot2.animate(ANIM_MODE_1, NULL); + _hotspot2.fixPriority(98); + } + + _hotspot1.postInit(); + _hotspot1.setVisage(5362); + _hotspot1.setStrip2(3); + _hotspot1.setFrame2(5); + _hotspot1.setPosition(Common::Point(76, 48)); + + _hotspot4.postInit(); + _hotspot4.setVisage(5316); + _hotspot4.setStrip(2); + _hotspot4.setPosition(Common::Point(89, 65)); + _hotspot4.animate(ANIM_MODE_2, NULL); + _hotspot4.hide(); + + if (_globals->getFlag(67)) { + _globals->_player.postInit(); + _globals->_player.setVisage(5316); + _globals->_player.setPosition(Common::Point(191, 27)); + _globals->_player.disableControl(); + + if (_globals->getFlag(107) && _globals->getFlag(106)) { + _hotspot2.setVisage(2806); + _hotspot2.postInit(); + _hotspot2.setObjectWrapper(new SceneObjectWrapper()); + _hotspot2.animate(ANIM_MODE_1, NULL); + + setAction(&_action2); + } else { + _globals->_player.setVisage(5315); + _globals->_player.setPosition(Common::Point(204, 86)); + _globals->_player.animate(ANIM_MODE_2, NULL); + _globals->_player.setStrip2(1); + _globals->_player._moveDiff.y = 12; + + _sceneMode = 5308; + setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL); + } + } else { + _hotspot3.postInit(); + _hotspot3.setVisage(5301); + _hotspot3.setPosition(Common::Point(172, 32)); + _hotspot3.fixPriority(1); + _hotspot3.animate(ANIM_MODE_NONE, NULL); + + _globals->_player.postInit(); + _globals->_player.setVisage(5315); + _globals->_player.setPosition(Common::Point(204, 86)); + _globals->_player.animate(ANIM_MODE_2, NULL); + _globals->_player.setStrip2(1); + _globals->_player._moveDiff.y = 12; + _globals->_player.disableControl(); + + _sceneMode = 5306; + setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL); + } + + _field1B0A = 1; + if (RING_INVENTORY._bone._sceneNumber == 5300) { + _hotspot5.postInit(); + _hotspot5.setVisage(5301); + _hotspot5.setStrip(2); + _hotspot5.setPosition(Common::Point(190, 147)); + _globals->_sceneItems.push_back(&_hotspot5); + } + + _hotspot6.setBounds(Rect(74, 51, 114, 69)); + _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _hotspot8._sceneRegionId = 8; + + _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); + _globals->_soundHandler.play(212); +} + +void Scene5300::signal() { + switch (_sceneMode) { + case 5301: + _globals->_stripNum = 5300; + _globals->_sceneManager.changeScene(5100); + break; + case 5307: + _soundHandler.fadeOut(NULL); + // No break on purpose + case 5302: + case 5308: + case 5316: + case 5347: + _globals->_player.setStrip2(-1); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.enableControl(); + break; + case 5303: + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.enableControl(); + + if (_globals->getFlag(107)) + setAction(&_action1); + else + SceneItem::display2(5300, 28); + break; + case 5304: + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.enableControl(); + + if (_globals->getFlag(106)) + setAction(&_action1); + else + SceneItem::display2(5300, 28); + break; + case 5306: + _globals->clearFlag(67); + _globals->_player.setStrip2(-1); + + if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300)) + _stripManager.start(5303, this); + else + _stripManager.start(5302, this); + _sceneMode = 5302; + break; + case 5309: + _hotspot5.remove(); + _globals->_player.enableControl(); + break; + case 5310: + _hotspot2.fixPriority(41); + _sceneMode = 5315; + + setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL); + break; + case 5315: + _globals->_stripNum = 5302; + _globals->_sceneManager.changeScene(5100); + break; + } +} + + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h new file mode 100644 index 0000000000..db6efd0e18 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes6.h @@ -0,0 +1,330 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES6_H +#define TSAGE_RINGWORLD_SCENES6_H + +#include "common/scummsys.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +class Scene5000 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class HotspotGroup1 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + ASound _soundHandler; + SpeakerSText _speakerSText; + SpeakerQText _speakerQText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + DisplayHotspot _hotspot1; + SceneObject _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6; + Hotspot7 _hotspot7; + Hotspot8 _hotspot8; + HotspotGroup1 _hotspot9, _hotspot10, _hotspot11; + DisplayHotspot _hotspot12, _hotspot13, _hotspot14, _hotspot15; + DisplayHotspot _hotspot16, _hotspot17, _hotspot18; + + Scene5000(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene5100 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class HotspotGroup1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class HotspotGroup2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot4 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot9 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot17 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot18 : public SceneHotspot { + public: + int _index1; + int _index2; + + virtual void doAction(int action); + }; + class Hotspot19 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot20 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + SequenceManager _sequenceManager; + ASound _soundHandler; + SpeakerMText _speakerMText; + SpeakerQText _speakerQText; + SpeakerSText _speakerSText; + SpeakerBatText _speakerBatText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + HotspotGroup1 _hotspot1, _hotspot2, _hotspot3; + Hotspot4 _hotspot4; + HotspotGroup2 _hotspot5, _hotspot6, _hotspot7; + SceneObject _hotspot8; + Hotspot9 _hotspot9; + SceneObject _hotspot10, _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15; + DisplayHotspot _hotspot16; + Hotspot17 _hotspot17; + Hotspot18 _hotspot18; + Hotspot19 _hotspot19; + Hotspot20 _hotspot20; + DisplayHotspot _hotspot21; + + Scene5100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene5200 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot9 : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class Hotspot10 : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class Hotspot14 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + SpeakerFLL _speakerFLL; + SpeakerFLText _speakerFLText; + SpeakerQL _speakerQL; + SpeakerQText _speakerQText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + + SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6, _hotspot7; + SceneObject _hotspot8; + Hotspot9 _hotspot9; + Hotspot10 _hotspot10; + DisplayHotspot _hotspot11, _hotspot12, _hotspot13; + Hotspot14 _hotspot14; + + Scene5200(); + virtual void stripCallback(int v); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void dispatch(); +}; + +class Scene5300 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + + /* Hotspots */ + class Hotspot1 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot2 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot5 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot6 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot7 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Hotspot8 : public SceneObject { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + SpeakerQR _speakerQR; + SpeakerQL _speakerQL; + SpeakerQText _speakerQText; + SpeakerBatR _speakerBatR; + SpeakerBatText _speakerBatText; + SpeakerSR _speakerSR; + SpeakerSL _speakerSL; + SpeakerSText _speakerSText; + SpeakerGameText _speakerGameText; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Hotspot1 _hotspot1; + Hotspot2 _hotspot2; + DisplayHotspot _hotspot3; + SceneObject _hotspot4; + Hotspot5 _hotspot5; + Hotspot6 _hotspot6; + Hotspot7 _hotspot7; + Hotspot8 _hotspot8; + int _field1B0A; + + Scene5300(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void synchronize(Serializer &s) { + Scene::synchronize(s); + s.syncAsSint16LE(_field1B0A); + } +}; + + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp new file mode 100644 index 0000000000..5b01bb2c58 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes8.cpp @@ -0,0 +1,2545 @@ +/* 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. + * + */ + +#include "graphics/cursorman.h" +#include "tsage/ringworld/ringworld_scenes8.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace tSage { + +void NamedHotspotMult::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_useLineNum); + s.syncAsSint16LE(_lookLineNum); +} + +void SceneObject7700::synchronize(Serializer &s) { + SceneObject::synchronize(s); + if (s.getVersion() >= 3) { + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_defltLineNum); + } +} + +/*-------------------------------------------------------------------------- + * Scene 7000 - Landing near beach + * + *--------------------------------------------------------------------------*/ + +void Scene7000::Action1::signal() { + // Quinn walks from the lander to the seaside (action6) then discuss with Skeenar + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + setAction(&scene->_action6, this); + break; + case 2: + scene->_soundHandler.play(252); + scene->_object8.remove(); + scene->_object1.postInit(); + scene->_object1.setVisage(7003); + scene->_object1.animate(ANIM_MODE_5, this); + scene->_object1.setPosition(Common::Point(151, 182)); + scene->_object1.fixPriority(205); + _globals->_sceneItems.push_front(&scene->_object1); + break; + case 3: + scene->_object1._numFrames = 4; + scene->_object1.setStrip(2); + scene->_object1.animate(ANIM_MODE_8, 0, NULL); + scene->_stripManager.start(7005, this); + break; + case 4: + scene->_object1.animate(ANIM_MODE_2, NULL); + setDelay(3); + break; + case 5: + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action2::signal() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + _globals->_player.addMover(NULL); + _globals->_player.setVisage(7006); + _globals->_player.setStrip(1); + _globals->_player.setFrame(1); + _globals->_player.setPosition(Common::Point(_globals->_player._position.x, _globals->_player._position.y + 13)); + _globals->_player.changeZoom(68); + _globals->_player.animate(ANIM_MODE_5, this); + scene->_object1.remove(); + break; + case 2: + _globals->_sceneManager.changeScene(7100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action3::dispatch() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + Action::dispatch(); + if (_actionIndex == 4) + scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15)); +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action3::signal() { + // Lander is landing + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + scene->setZoomPercents(10, 10, 62, 100); + scene->_object4.postInit(); + scene->_object4.setVisage(5001); + scene->_object4.setStrip2(2); + scene->_object4.animate(ANIM_MODE_8, 0, NULL); + scene->_object4.setPosition(Common::Point(10, 18)); + scene->_object4.fixPriority(10); + scene->_object4.changeZoom(100); + scene->_object4.hide(); + break; + case 1: { + NpcMover *mover = new NpcMover(); + Common::Point pt(107, 65); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 2: + scene->_object3._moveDiff.y = 1; + scene->_object3.fixPriority(10); + scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15)); + scene->_object4.show(); + setDelay(30); + break; + case 3: { + NpcMover *mover = new NpcMover(); + Common::Point pt(107, 92); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 4: + scene->_object4.remove(); + _globals->_sceneManager.changeScene(2100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action4::signal() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 1: + scene->_object1.hide(); + setDelay(300); + break; + case 2: + _globals->_soundHandler.play(252); + scene->_object1.show(); + scene->_object1.setStrip(3); + scene->_object1.setFrame(1); + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_object1.setStrip(4); + scene->_object1.animate(ANIM_MODE_8, 0, NULL); + _globals->setFlag(81); + _globals->_player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action5::signal() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + NpcMover *playerMover = new NpcMover(); + Common::Point pt(88, 121); + _globals->_player.addMover(playerMover, &pt, this); + break; + } + case 1: + _globals->_player.checkAngle(&scene->_object1); + _globals->_soundHandler.play(252); + scene->_object1.setStrip(2); + scene->_stripManager.start(7015, this); + break; + case 2: + scene->_object1.setStrip(1); + scene->_object1.setFrame(4); + scene->_object1.animate(ANIM_MODE_6, this); + break; + case 3: { + scene->_object1.remove(); + NpcMover *mover = new NpcMover(); + Common::Point pt(31, 94); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 4: { + NpcMover *mover = new NpcMover(); + Common::Point pt(11, 94); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 5: { + _globals->_player.fixPriority(10); + NpcMover *mover = new NpcMover(); + Common::Point pt(11, 89); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: { + NpcMover *mover = new NpcMover(); + Common::Point pt(41, 89); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 7: + _globals->clearFlag(36); + _globals->clearFlag(37); + _globals->clearFlag(72); + _globals->clearFlag(13); + _globals->_sceneManager.changeScene(2100); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action6::signal() { + // Quinn walks from the lander to the seaside + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: { + NpcMover *mover = new NpcMover(); + Common::Point pt(12, 91); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: { + NpcMover *mover = new NpcMover(); + Common::Point pt(8, 91); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: { + NpcMover *mover = new NpcMover(); + Common::Point pt(31, 96); + _globals->_player.addMover(mover, &pt, this); + _globals->_player.fixPriority(-1); + break; + } + case 4: { + NpcMover *mover = new NpcMover(); + Common::Point pt(83, 117); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 5: { + NpcMover *mover = new NpcMover(); + Common::Point pt(95, 121); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: + _globals->_player.setStrip(3); + _globals->_player.setFrame(1); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Action7::signal() { + switch (_actionIndex++) { + case 0: + _globals->_player.disableControl(); + setDelay(3); + break; + case 1: + setDelay(3); + break; + case 2: { + NpcMover *mover = new NpcMover(); + Common::Point pt(31, 94); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: { + NpcMover *mover = new NpcMover(); + Common::Point pt(11, 94); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 4: { + _globals->_player.fixPriority(10); + NpcMover *mover = new NpcMover(); + Common::Point pt(11, 89); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 5: { + NpcMover *mover = new NpcMover(); + Common::Point pt(41, 89); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 6: + if (_globals->getFlag(13)) + _globals->_sceneManager.changeScene(2280); + else + _globals->_sceneManager.changeScene(2320); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Hotspot1::doAction(int action) { + if (action == CURSOR_LOOK) + SceneItem::display2(7000, 2); + else + SceneHotspot::doAction(action); +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::Object1::doAction(int action) { + // Skeenar + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_TRANSLATOR: + _globals->_player.disableControl(); + RING_INVENTORY._translator._sceneNumber = 7000; + + if ((RING_INVENTORY._waldos._sceneNumber != 7000) && (RING_INVENTORY._jar._sceneNumber != 7000)) { + scene->_sceneMode = 7004; + scene->setAction(&scene->_sequenceManager, scene, 7004, &_globals->_player, this, NULL); + } else if (RING_INVENTORY._waldos._sceneNumber != 7000) { + scene->_sceneMode = 7011; + scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); + } else if (RING_INVENTORY._jar._sceneNumber != 7000) { + scene->_sceneMode = 7012; + scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); + } else { + scene->_sceneMode = 7015; + scene->setAction(&scene->_sequenceManager, scene, 7017, &_globals->_player, NULL); + } + break; + case OBJECT_WALDOS: + _globals->_player.disableControl(); + RING_INVENTORY._waldos._sceneNumber = 7000; + if (RING_INVENTORY._translator._sceneNumber == 7000) { + if (RING_INVENTORY._jar._sceneNumber == 7000) { + scene->_sceneMode = 7015; + scene->setAction(&scene->_sequenceManager, scene, 7015, &_globals->_player, NULL); + } else { + scene->_sceneMode = 7006; + scene->setAction(&scene->_sequenceManager, scene, 7006, &_globals->_player, NULL); + } + } else { + scene->_sceneMode = 7009; + scene->setAction(&scene->_sequenceManager, scene, 7009, &_globals->_player, NULL); + } + break; + case OBJECT_JAR: + _globals->_player.disableControl(); + RING_INVENTORY._jar._sceneNumber = 7000; + + if (RING_INVENTORY._translator._sceneNumber == 7000) { + if (RING_INVENTORY._waldos._sceneNumber != 7000) { + scene->_sceneMode = 7007; + scene->setAction(&scene->_sequenceManager, scene, 7007, &_globals->_player, &scene->_object1, NULL); + } else { + scene->_sceneMode = 7015; + scene->setAction(&scene->_sequenceManager, scene, 7016, &_globals->_player, NULL); + } + } else { + scene->_sceneMode = 7008; + scene->setAction(&scene->_sequenceManager, scene, 7008, &_globals->_player, NULL); + } + break; + case CURSOR_LOOK: + if (_globals->getFlag(81)) + SceneItem::display2(7000, 1); + else + SceneItem::display2(7000, 0); + break; + case CURSOR_USE: + if (_globals->getFlag(81)) { + RING_INVENTORY._stasisBox2._sceneNumber = 1; + _globals->_player.disableControl(); + scene->setAction(&scene->_action5); + } else { + SceneItem::display2(7000, 5); + } + break; + case CURSOR_TALK: + if (_globals->getFlag(81)) { + RING_INVENTORY._stasisBox2._sceneNumber = 1; + _globals->_player.disableControl(); + scene->setAction(&scene->_action5); + } else if (_globals->getFlag(52)) { + scene->_sceneMode = 7005; + scene->setAction(&scene->_sequenceManager, scene, 7013, NULL); + } else if (_globals->getFlag(13)) { + scene->_sceneMode = 7002; + scene->setAction(&scene->_sequenceManager, scene, 7014, NULL); + } else { + scene->_sceneMode = 7002; + scene->setAction(&scene->_sequenceManager, scene, 7002, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::dispatch() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + + if (!_action) { + if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 8) { + if (!_globals->getFlag(13)) { + _globals->_player.disableControl(); + _globals->_player.addMover(NULL); + SceneItem::display2(7000, 3); + _sceneMode = 7001; + setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); + } else if (!_globals->getFlag(52)) { + setAction(&_action2); + } else { + _globals->_player.disableControl(); + _sceneMode = 7003; + setAction(&scene->_sequenceManager, this, 7003, &_globals->_player, NULL); + } + } + if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 9) + scene->setAction(&scene->_action7); + } + Scene::dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::postInit(SceneObjectList *OwnerList) { + loadScene(7000); + Scene::postInit(); + setZoomPercents(93, 25, 119, 55); + _stripManager.addSpeaker(&_speakerSKText); + _stripManager.addSpeaker(&_speakerSKL); + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerQL); + _stripManager.addSpeaker(&_speakerQR); + + _speakerSKText._npc = &_object1; + _speakerQText._npc = &_globals->_player; + + _object5.postInit(); + _object5.setVisage(7001); + _object5.setStrip2(1); + _object5.animate(ANIM_MODE_2, NULL); + _object5.setPosition(Common::Point(49, 147)); + _object5.fixPriority(1); + + _object6.postInit(); + _object6.setVisage(7001); + _object6.setStrip2(2); + _object6.animate(ANIM_MODE_2, NULL); + _object6.setPosition(Common::Point(160, 139)); + _object6.fixPriority(1); + + _object7.postInit(); + _object7.setVisage(7001); + _object7.setStrip2(3); + _object7.animate(ANIM_MODE_2, NULL); + _object7.setPosition(Common::Point(272, 129)); + _object7.fixPriority(1); + + _object8.postInit(); + _object8.setVisage(7001); + _object8.setStrip2(4); + _object8.animate(ANIM_MODE_2, NULL); + _object8.setPosition(Common::Point(176, 175)); + _object8.fixPriority(1); + + if (_globals->getFlag(72)) { + _object3.postInit(); + _object3.setVisage(5001); + _object3.setStrip2(1); + _object3.setPosition(Common::Point(107, 92)); + _object3.changeZoom(100); + _object3.fixPriority(10); + + _object1.postInit(); + _object1.setVisage(7003); + if (_globals->getFlag(81)) + _object1.setStrip(4); + else + _object1.setStrip(2); + _object1.setPosition(Common::Point(87, 129)); + _object1._numFrames = 4; + _object1.changeZoom(45); + _object1.animate(ANIM_MODE_8, 0, NULL); + _globals->_sceneItems.push_back(&_object1); + } + _soundHandler.play(251); + if (_globals->_sceneManager._previousScene == 2100) { + if (_globals->getFlag(72)) { + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + SceneObjectWrapper *wrapper = new SceneObjectWrapper(); + _globals->_player.setObjectWrapper(wrapper); + _globals->_player.setPosition(Common::Point(57, 94)); + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(10); + if (_globals->getFlag(81)) { + setAction(&_action4); + } else { + _object1.setPosition(Common::Point(151, 182)); + _object1.changeZoom(100); + setAction(&_action1); + } + } else { + _globals->_soundHandler.play(250); + _globals->setFlag(72); + + _object3.postInit(); + _object3.setVisage(5001); + _object3.setStrip2(1); + _object3.animate(ANIM_MODE_1, NULL); + _object3.setPosition(Common::Point(307, 0)); + _object3.changeZoom(-1); + setAction(&_action3); + } + } else if (_globals->_sceneManager._previousScene == 2280) { + _globals->_player.postInit(); + _globals->_player.setVisage(2170); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setPosition(Common::Point(57, 94)); + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(10); + _globals->_player.disableControl(); + _sceneMode = 7001; + setAction(&_action6, this); + if (!_globals->getFlag(81)) { + _object1.setPosition(Common::Point(151, 182)); + _object1.changeZoom(100); + } + _object8.remove(); + _object9.remove(); + } else if (_globals->_sceneManager._previousScene == 2320) { + _globals->_player.postInit(); + _globals->_player.setVisage(0); + _globals->_player.animate(ANIM_MODE_1, NULL); + SceneObjectWrapper *wrapper = new SceneObjectWrapper(); + _globals->_player.setObjectWrapper(wrapper); + _globals->_player.setPosition(Common::Point(57, 94)); + _globals->_player.changeZoom(-1); + _globals->_player.fixPriority(10); + _sceneMode = 7001; + setAction(&_action6, this); + } else { + _globals->setFlag(72); + + _object3.postInit(); + _object3.setVisage(5001); + _object3.setStrip2(1); + _object3.setPosition(Common::Point(307, 0)); + _soundHandler.play(151); + _soundHandler.holdAt(true); + _globals->_soundHandler.play(250); + setAction(&_action3); + } + + _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + _globals->_sceneItems.push_back(&_hotspot1); +} + +/*--------------------------------------------------------------------------*/ + +void Scene7000::signal() { + Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + switch (_sceneMode) { + case 7001: + case 7002: + case 7004: + case 7005: + case 7006: + case 7007: + case 7008: + case 7009: + _globals->_player.enableControl(); + break; + case 7003: + _sceneMode = 7001; + setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); + break; + case 7011: + _sceneMode = 7005; + setAction(&scene->_sequenceManager, this, 7005, &_globals->_player, NULL); + break; + case 7012: + _sceneMode = 7005; + setAction(&scene->_sequenceManager, this, 7012, &_globals->_player, NULL); + break; + case 7015: + setAction(&_action4); + break; + } +} + + +/*-------------------------------------------------------------------------- + * Scene 7100 - Underwater: swimming + * + *--------------------------------------------------------------------------*/ + +void Scene7100::Action3::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: { + Common::Point pt(433, 308); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, this); + break; + } + case 2: + scene->_object4.remove(); + remove(); + break; + } +} + +void Scene7100::Action4::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(1) + 1); + break; + case 1: { + scene->_object5.setStrip(3); + Common::Point pt(85, 52); + NpcMover *mover = new NpcMover(); + scene->_object5.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object5.setStrip(4); + Common::Point pt(20, 52); + NpcMover *mover = new NpcMover(); + scene->_object5.addMover(mover, &pt, this); + break; + } + case 3: + _actionIndex = 0; + setDelay(1); + break; + } +} + +void Scene7100::Action5::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: { + Common::Point pt(59, 151); + NpcMover *mover = new NpcMover(); + scene->_object9.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object9.setStrip2(1); + Common::Point pt(127, 144); + NpcMover *mover = new NpcMover(); + scene->_object9.addMover(mover, &pt, this); + break; + } + case 3: { + scene->_object9.setStrip2(2); + scene->_object9.fixPriority(180); + Common::Point pt(8, 181); + NpcMover *mover = new NpcMover(); + scene->_object9.addMover(mover, &pt, this); + break; + } + case 4: { + scene->_object9.remove(); + remove(); + } + } +} + +void Scene7100::Action6::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + scene->_object10.fixPriority(8); + scene->_object10.setPosition(Common::Point(155, 187)); + + scene->_object11.fixPriority(8); + scene->_object11.setPosition(Common::Point(155, 190)); + + scene->_object12.fixPriority(8); + scene->_object12.setPosition(Common::Point(151, 193)); + break; + case 1: { + Common::Point pt1(167, 187); + NpcMover *mover1 = new NpcMover(); + scene->_object10.addMover(mover1, &pt1, this); + + Common::Point pt2(165, 185); + NpcMover *mover2 = new NpcMover(); + scene->_object11.addMover(mover2, &pt2, NULL); + + Common::Point pt3(163, 183); + NpcMover *mover3 = new NpcMover(); + scene->_object12.addMover(mover3, &pt3, NULL); + break; + } + case 2: { + scene->_object10.setStrip2(6); + Common::Point pt1(91, 187); + NpcMover *mover1 = new NpcMover(); + scene->_object10.addMover(mover1, &pt1, this); + + scene->_object11.setStrip2(6); + scene->_object11.fixPriority(50); + Common::Point pt2(89, 185); + NpcMover *mover2 = new NpcMover(); + scene->_object11.addMover(mover2, &pt2, NULL); + + scene->_object12.setStrip2(6); + scene->_object12.fixPriority(50); + Common::Point pt3(87, 183); + NpcMover *mover3 = new NpcMover(); + scene->_object12.addMover(mover3, &pt3, NULL); + break; + } + case 3: + _actionIndex = 0; + setDelay(1); + break; + } +} + +void Scene7100::Action7::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: { + scene->_object13.setStrip2(8); + Common::Point pt(324, 87); + NpcMover *mover = new NpcMover(); + scene->_object13.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object13.setStrip2(2); + Common::Point pt(524, 104); + NpcMover *mover = new NpcMover(); + scene->_object13.addMover(mover, &pt, NULL); + break; + } + case 3: + _actionIndex = 0; + setDelay(1); + break; + } +} + +void Scene7100::Action8::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: { + scene->_object17.setStrip2(4); + scene->_object18.setStrip2(4); + scene->_object19.setStrip2(4); + + Common::Point pt1(482, 153); + NpcMover *mover1 = new NpcMover(); + scene->_object17.addMover(mover1, &pt1, this); + + Common::Point pt2(480, 146); + NpcMover *mover2 = new NpcMover(); + scene->_object18.addMover(mover2, &pt2, NULL); + + Common::Point pt3(470, 153); + NpcMover *mover3 = new NpcMover(); + scene->_object19.addMover(mover3, &pt3, NULL); + break; + } + case 2: { + scene->_object17.setStrip2(3); + scene->_object18.setStrip2(3); + scene->_object19.setStrip2(3); + + Common::Point pt1(506, 186); + NpcMover *mover1 = new NpcMover(); + scene->_object17.addMover(mover1, &pt1, this); + + Common::Point pt2(502, 179); + NpcMover *mover2 = new NpcMover(); + scene->_object18.addMover(mover2, &pt2, NULL); + + Common::Point pt3(495, 184); + NpcMover *mover3 = new NpcMover(); + scene->_object19.addMover(mover3, &pt3, NULL); + break; + } + case 3: { + scene->_object17.setStrip2(4); + scene->_object18.setStrip2(4); + scene->_object19.setStrip2(4); + + Common::Point pt1(386, 167); + NpcMover *mover1 = new NpcMover(); + scene->_object17.addMover(mover1, &pt1, this); + + Common::Point pt2(379, 161); + NpcMover *mover2 = new NpcMover(); + scene->_object18.addMover(mover2, &pt2, NULL); + + Common::Point pt3(373, 167); + NpcMover *mover3 = new NpcMover(); + scene->_object19.addMover(mover3, &pt3, NULL); + break; + } + case 4: { + scene->_object17.setStrip2(3); + scene->_object18.setStrip2(3); + scene->_object19.setStrip2(3); + + Common::Point pt1(479, 193); + NpcMover *mover1 = new NpcMover(); + scene->_object17.addMover(mover1, &pt1, this); + + Common::Point pt2(473, 187); + NpcMover *mover2 = new NpcMover(); + scene->_object18.addMover(mover2, &pt2, NULL); + + Common::Point pt3(466, 192); + NpcMover *mover3 = new NpcMover(); + scene->_object19.addMover(mover3, &pt3, NULL); + break; + } + case 5: { + Common::Point pt1(552, 183); + NpcMover *mover1 = new NpcMover(); + scene->_object17.addMover(mover1, &pt1, this); + + Common::Point pt2(552, 178); + NpcMover *mover2 = new NpcMover(); + scene->_object18.addMover(mover2, &pt2, NULL); + + Common::Point pt3(541, 183); + NpcMover *mover3 = new NpcMover(); + scene->_object19.addMover(mover3, &pt3, NULL); + + _actionIndex = 0; + break; + } + } +} + +void Scene7100::Action9::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: { + scene->_object24.setStrip2(1); + Common::Point pt(64, 159); + NpcMover *mover = new NpcMover(); + scene->_object24.addMover(mover, &pt, this); + break; + } + case 2: { + scene->_object24.setStrip2(2); + scene->_object24.fixPriority(160); + Common::Point pt(34, 159); + NpcMover *mover = new NpcMover(); + scene->_object24.addMover(mover, &pt, this); + break; + } + case 3: { + scene->_object24.setStrip2(1); + Common::Point pt(64, 159); + NpcMover *mover = new NpcMover(); + scene->_object24.addMover(mover, &pt, this); + break; + } + case 4: { + scene->_object24.setStrip2(2); + scene->_object24.fixPriority(180); + Common::Point pt(-12, 182); + NpcMover *mover = new NpcMover(); + scene->_object24.addMover(mover, &pt, this); + break; + } + case 5: { + _actionIndex = 0; + setDelay(1); + break; + } + } +} + +void Scene7100::Action10::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1000); + break; + case 1: { + Common::Point pt(610, -60); + NpcMover *mover = new NpcMover(); + scene->_object25.addMover(mover, &pt, this); + break; + } + case 2: + scene->_object25.remove(); + remove(); + break; + } +} + +void Scene7100::Action11::signal() { + Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: { + Common::Point pt(154, 175); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + ObjectMover2 *mover2 = new ObjectMover2(); + scene->_object1.addMover(mover2, 25, 35, &_globals->_player); + break; + } + case 2: { + Common::Point pt(700, 155); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 3: + _globals->_sceneManager.changeScene(7200); + remove(); + break; + } +} + +void Scene7100::postInit(SceneObjectList *OwnerList) { + loadScene(7100); + Scene::postInit(); + setZoomPercents(60, 85, 200, 100); + + _object2.postInit(); + _object2.setVisage(7161); + _object2.animate(ANIM_MODE_2, NULL); + _object2.setPosition(Common::Point(10, 140)); + _object2._numFrames = 1; + _object2.fixPriority(180); + _object2.setAction(&_action1, NULL); + + _object3.postInit(); + _object3.setVisage(7161); + _object3.animate(ANIM_MODE_2, NULL); + _object3.setPosition(Common::Point(34, 115)); + _object3._numFrames = 1; + _object3.fixPriority(180); + _object3.setAction(&_action2, NULL); + + _object4.postInit(); + _object4.setVisage(7164); + _object4.animate(ANIM_MODE_2, NULL); + _object4.setPosition(Common::Point(-10, 159)); + _object4._numFrames = 2; + _object4.fixPriority(250); + _object4.setAction(&_action3, NULL); + + _object5.postInit(); + _object5.setVisage(7162); + _object5.setStrip(3); + _object5.animate(ANIM_MODE_2, NULL); + _object5.setPosition(Common::Point(20, 52)); + _object5.setAction(&_action4, NULL); + + _object9.postInit(); + _object9.setVisage(7160); + _object5.setStrip(2); + _object9.animate(ANIM_MODE_2, NULL); + _object9.setPosition(Common::Point(110, 168)); + _object9._numFrames = 2; + _object9.fixPriority(16); + _object9.setAction(&_action5, NULL); + + _object13.postInit(); + _object13.setVisage(7161); + _object13.setStrip(8); + _object13.animate(ANIM_MODE_2, NULL); + _object13.setPosition(Common::Point(524, 104)); + _object13._numFrames = 5; + _object13.fixPriority(250); + _object13.setAction(&_action7, NULL); + + _object17.postInit(); + _object17.setVisage(7160); + _object17.setStrip(3); + _object17.animate(ANIM_MODE_2, NULL); + _object17.setPosition(Common::Point(552, 183)); + _object17._numFrames = 4; + _object17._moveDiff.x = 12; + _object17._moveDiff.y = 12; + _object17.setAction(&_action8, NULL); + + _object18.postInit(); + _object18.setVisage(7160); + _object18.setStrip(3); + _object18.animate(ANIM_MODE_2, NULL); + _object18.setPosition(Common::Point(552, 178)); + _object18._numFrames = 4; + _object18._moveDiff.x = 12; + _object18._moveDiff.y = 12; + + _object19.postInit(); + _object19.setVisage(7160); + _object19.setStrip(3); + _object19.animate(ANIM_MODE_2, NULL); + _object19.setPosition(Common::Point(541, 183)); + _object19._numFrames = 4; + _object19._moveDiff.x = 12; + _object19._moveDiff.y = 12; + + _object24.postInit(); + _object24.setVisage(7162); + _object24.setStrip(1); + _object24.animate(ANIM_MODE_2, NULL); + _object24.setPosition(Common::Point(-12, 182)); + _object24._numFrames = 4; + _object24.fixPriority(180); + _object24.setAction(&_action9, NULL); + + _object25.postInit(); + _object25.setVisage(7163); + _object25.animate(ANIM_MODE_2, NULL); + _object25.setPosition(Common::Point(551, 145)); + _object25._numFrames = 5; + _object25.fixPriority(160); + _object25.setAction(&_action10, NULL); + + // Swimmer 1 + _globals->_player.postInit(); + _globals->_player.setVisage(7101); + _globals->_player.animate(ANIM_MODE_2, NULL); + _globals->_player._moveDiff.x = 4; + _globals->_player._moveDiff.y = 2; + _globals->_player.setPosition(Common::Point(135, 135)); + _globals->_player.fixPriority(200); + _globals->_player.disableControl(); + + // Swimmer 2 + _object1.postInit(); + _object1.setVisage(7110); + _object1.animate(ANIM_MODE_1, NULL); + _object1._moveDiff.x = 4; + _object1._moveDiff.y = 2; + _object1.setPosition(Common::Point(100, 100)); + + setAction(&_action11); + _soundHandler1.play(270); + _soundHandler2.play(275); + _globals->_soundHandler.play(270); +} +/*-------------------------------------------------------------------------- + * Scene 7200 - Underwater: Entering the cave + * + *--------------------------------------------------------------------------*/ + +void Scene7200::Action1::signal() { + Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(15); + break; + case 1: { + PlayerMover *mover1 = new PlayerMover(); + Common::Point pt1(165, 147); + scene->_swimmer.addMover(mover1, &pt1, this); + Common::Point pt2(207, 138); + PlayerMover *mover2 = new PlayerMover(); + _globals->_player.addMover(mover2, &pt2, this); + break; + } + case 2: + break; + case 3: + _globals->_sceneManager.changeScene(7300); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7200::Action2::signal() { + Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: { + scene->_object2.fixPriority(25); + scene->_object3.fixPriority(25); + scene->_object4.fixPriority(25); + scene->_object2.setStrip(1); + scene->_object3.setStrip(1); + scene->_object4.setStrip(1); + NpcMover *mover1 = new NpcMover(); + Common::Point pt1(54, 90); + scene->_object2.addMover(mover1, &pt1, this); + NpcMover *mover2 = new NpcMover(); + Common::Point pt2(56, 85); + scene->_object3.addMover(mover2, &pt2, NULL); + NpcMover *mover3 = new NpcMover(); + Common::Point pt3(54, 80); + scene->_object4.addMover(mover3, &pt3, NULL); + break; + } + case 2: { + scene->_object2.fixPriority(160); + scene->_object3.fixPriority(160); + scene->_object4.fixPriority(160); + scene->_object2.setStrip(2); + scene->_object3.setStrip(2); + scene->_object4.setStrip(2); + NpcMover *mover1 = new NpcMover(); + Common::Point pt1(10, 89); + scene->_object2.addMover(mover1, &pt1, this); + NpcMover *mover2 = new NpcMover(); + Common::Point pt2(12, 84); + scene->_object3.addMover(mover2, &pt2, NULL); + NpcMover *mover3 = new NpcMover(); + Common::Point pt3(10, 79); + scene->_object4.addMover(mover3, &pt3, NULL); + break; + } + case 3: + _actionIndex = 0; + setDelay(1); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7200::postInit(SceneObjectList *OwnerList) { + loadScene(7200); + Scene::postInit(); + _object2.postInit(); + _object2.setVisage(7160); + _object2.animate(ANIM_MODE_2, NULL); + _object2.setZoom(10); + _object2.setPosition(Common::Point(53, 88)); + _object2.setAction(&_action2); + + _object3.postInit(); + _object3.setVisage(7160); + _object3.animate(ANIM_MODE_2, NULL); + _object3.setZoom(10); + _object3.setPosition(Common::Point(55, 83)); + + _object4.postInit(); + _object4.setVisage(7160); + _object4.animate(ANIM_MODE_2, NULL); + _object4.setZoom(10); + _object4.setPosition(Common::Point(57, 78)); + + _object5.postInit(); + _object5.setVisage(7201); + _object5.setPosition(Common::Point(300, 172)); + _object5.setPriority(172); + _object5.animate(ANIM_MODE_2, NULL); + _object5._numFrames = 3; + + _object6.postInit(); + _object6.setVisage(7201); + _object6.setStrip2(3); + _object6.setPosition(Common::Point(144, 97)); + _object6.setPriority(199); + _object6.animate(ANIM_MODE_2, NULL); + _object6._numFrames = 3; + + _object7.postInit(); + _object7.setVisage(7201); + _object7.setStrip2(4); + _object7.setPosition(Common::Point(115, 123)); + _object7.setPriority(199); + _object7.animate(ANIM_MODE_2, NULL); + _object7._numFrames = 3; + + _object8.postInit(); + _object8.setVisage(7201); + _object8.setStrip2(6); + _object8.setPosition(Common::Point(140, 173)); + _object8.setPriority(199); + _object8.animate(ANIM_MODE_2, NULL); + _object8._numFrames = 3; + + _object9.postInit(); + _object9.setVisage(7201); + _object9.setStrip2(7); + _object9.setPosition(Common::Point(215, 196)); + _object9.setPriority(199); + _object9.animate(ANIM_MODE_2, NULL); + _object9._numFrames = 3; + + // Orange swimmer + _globals->_player.postInit(); + _globals->_player.setVisage(7110); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setZoom(50); + _globals->_player.setPosition(Common::Point(-18, 16)); + _globals->_player.disableControl(); + + _swimmer.postInit(); + _swimmer.setVisage(7101); + _swimmer.animate(ANIM_MODE_1, NULL); + _swimmer.setObjectWrapper(new SceneObjectWrapper()); + _swimmer.setZoom(50); + _swimmer.setPosition(Common::Point(-8, 16)); + + setAction(&_action1); + _soundHandler.play(271); +} + +/*-------------------------------------------------------------------------- + * Scene 7300 - Underwater: Lord Poria + * + *--------------------------------------------------------------------------*/ + +void Scene7300::Action1::signal() { + Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + case 1: + case 3: + setDelay(30); + break; + case 2: + scene->_stripManager.start(7300, this); + break; + case 4: { + NpcMover *mover = new NpcMover(); + Common::Point pt(102, 122); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 5: + _globals->_player.setStrip(2); + _globals->_player.setFrame(1); + _globals->_player.animate(ANIM_MODE_5, this); + break; + case 6: + _globals->_player.setStrip(3); + _globals->_player._numFrames = 5; + _globals->_player.animate(ANIM_MODE_2, this); + if (RING_INVENTORY._translator._sceneNumber == 1) + scene->_stripManager.start(7310, this); + else + scene->_stripManager.start(7305, this); + break; + case 7: + setDelay(3); + _globals->_soundHandler.fadeOut(NULL); + break; + case 8: + _globals->_sceneManager.changeScene(2280); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7300::Action2::signal() { + Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + NpcMover *mover1 = new NpcMover(); + Common::Point pt(_globals->_randomSource.getRandomNumber(3) + 203, _globals->_randomSource.getRandomNumber(3) + 96); + scene->_object3.addMover(mover1, &pt, this); + _actionIndex = 0; + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7300::Action3::signal() { + Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + NpcMover *mover1 = new NpcMover(); + Common::Point pt(_globals->_randomSource.getRandomNumber(5) + 76, _globals->_randomSource.getRandomNumber(5) + 78); + scene->_object1.addMover(mover1, &pt, this); + _actionIndex = 0; + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7300::Action4::signal() { + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + _actionIndex = 0; + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7300::dispatch() { + Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + scene->_object4.setPosition(Common::Point(scene->_object3._position.x + 15, scene->_object3._position.y + 61)); + scene->_object2.setPosition(Common::Point(scene->_object1._position.x + 1, scene->_object1._position.y - 31)); + + Scene::dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene7300::postInit(SceneObjectList *OwnerList) { + loadScene(7300); + + Scene::postInit(); + setZoomPercents(60, 85, 200, 100); + + _globals->setFlag(52); + _globals->setFlag(24); + _globals->setFlag(109); + + _stripManager.addSpeaker(&_speakerPOR); + _stripManager.addSpeaker(&_speakerPOText); + _stripManager.addSpeaker(&_speakerSKText); + _stripManager.addSpeaker(&_speakerQU); + + _speakerSKText.setTextPos(Common::Point(100, 20)); + _speakerPOText.setTextPos(Common::Point(100, 160)); + + _object4.postInit(); + _object4.setVisage(7311); + _object4.setStrip(1); + _object4.setFrame(1); + _object4.setPosition(Common::Point(218, 157)); + + _object3.postInit(); + _object3.setVisage(7311); + _object3.setStrip(2); + _object3.setFrame(1); + _object3.setPosition(Common::Point(203, 96)); + _object3._numFrames = 2; + _object3._moveDiff = Common::Point(1, 1); + _object3.animate(ANIM_MODE_8, 0, NULL); + _object3._moveRate = 2; + _object3.setAction(&_action2); + + _globals->_player.postInit(); + _globals->_player.setVisage(7305); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setPosition(Common::Point(-100, 100)); + _globals->_player.disableControl(); + + _object1.postInit(); + _object1.setVisage(7312); + _object1.animate(ANIM_MODE_1, NULL); + _object1._moveDiff = Common::Point(1, 1); + _object1.setPosition(Common::Point(76, 78)); + _object1._moveRate = 1; + _object1.setAction(&_action3); + + _object2.postInit(); + _object2.setVisage(7312); + _object2.setStrip(2); + _object2.animate(ANIM_MODE_2, NULL); + _object2.setPosition(Common::Point(77, 47)); + _object2.fixPriority(190); + + _object5.postInit(); + _object5.setVisage(7300); + _object5.setPosition(Common::Point(106, 45)); + _object5.animate(ANIM_MODE_2, NULL); + _object5._numFrames = 5; + + _object6.postInit(); + _object6.setVisage(7300); + _object6.setStrip2(2); + _object6.setPosition(Common::Point(283, 193)); + _object6.animate(ANIM_MODE_2, NULL); + _object6._numFrames = 3; + + _object7.postInit(); + _object7.setVisage(7300); + _object7.setStrip(4); + _object7.setPosition(Common::Point(295, 77)); + _object7.animate(ANIM_MODE_2, NULL); + _object7._numFrames = 3; + + _object8.postInit(); + _object8.setVisage(7300); + _object8.setStrip(5); + _object8.setPosition(Common::Point(1, 147)); + _object8.animate(ANIM_MODE_2, NULL); + _object8._numFrames = 2; + + setAction(&_action1); + _globals->_soundHandler.play(272); +} + +/*-------------------------------------------------------------------------- + * Scene 7600 - Floating Buildings: Outside + * + *--------------------------------------------------------------------------*/ + +void Scene7600::Action1::signal() { + switch (_actionIndex++) { + case 0: + setDelay(120); + break; + case 1: { + PlayerMover *mover = new PlayerMover(); + Common::Point pt(389, 57); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_sceneManager.changeScene(7700); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7600::Action2::signal() { + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: { + NpcMover *mover = new NpcMover(); + Common::Point pt(-30, 195); + _globals->_player.addMover(mover, &pt, this); + break; + } + case 2: + _globals->_sceneManager.changeScene(2320); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene7600::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + setZoomPercents(100, 0, 200, 100); + + _object2.postInit(); + _object2.setVisage(7601); + _object2.setStrip(1); + _object2.animate(ANIM_MODE_2, NULL); + _object2.setPosition(Common::Point(48, 135)); + _object2.fixPriority(1); + + _object3.postInit(); + _object3.setVisage(7601); + _object3.setStrip(2); + _object3.animate(ANIM_MODE_2, NULL); + _object3.setPosition(Common::Point(158, 136)); + _object3.fixPriority(1); + + _object4.postInit(); + _object4.setVisage(7601); + _object4.setStrip(3); + _object4.animate(ANIM_MODE_2, NULL); + _object4.setPosition(Common::Point(293, 141)); + _object4.fixPriority(1); + + _object5.postInit(); + _object5.setVisage(7601); + _object5.setStrip(4); + _object5.animate(ANIM_MODE_2, NULL); + _object5.setPosition(Common::Point(405, 143)); + _object5.fixPriority(1); + + _object6.postInit(); + _object6.setVisage(7601); + _object6.setStrip(5); + _object6.animate(ANIM_MODE_2, NULL); + _object6.setPosition(Common::Point(379, 191)); + _object6.fixPriority(1); + + _globals->_player.postInit(); + _globals->_player.setVisage(2333); + _globals->_player.animate(ANIM_MODE_1, NULL); + _globals->_player.setObjectWrapper(new SceneObjectWrapper()); + _globals->_player.setStrip(1); + _globals->_player._moveDiff = Common::Point(16, 16); + _globals->_player.changeZoom(-1); + _globals->_player.disableControl(); + + if (_globals->_sceneManager._previousScene == 7700) { + _globals->_player.setPosition(Common::Point(389, 57)); + setAction(&_action2); + } else { + _globals->_player.setPosition(Common::Point(-50, 195)); + setAction(&_action1); + } + _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + loadScene(7600); + _soundHandler2.play(255); + _soundHandler1.play(251); +} + +/*-------------------------------------------------------------------------- + * Scene 7700 - Floating Buildings: In the lab + * + *--------------------------------------------------------------------------*/ + +void Scene7700::Action1::signal() { + SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler; + switch (_actionIndex++) { + case 0: { + PlayerMover *mover1 = new PlayerMover(); + Common::Point pt = Common::Point(fmtObj->_position.x, fmtObj->_position.y + 30); + _globals->_player.addMover(mover1, &pt, this); + break; + } + case 1: + _globals->_player.checkAngle(fmtObj); + if (fmtObj->_state == 0) + fmtObj->animate(ANIM_MODE_5, this); + else + fmtObj->animate(ANIM_MODE_6, this); + break; + case 2: + remove(); + break; + } +} + +void Scene7700::Action2::signal() { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + switch (_actionIndex++) { + case 0: + case 2: + setDelay(_globals->_randomSource.getRandomNumber(60) + 60); + break; + case 1: + scene->_prof.animate(ANIM_MODE_7, 0, NULL); + setDelay(20); + break; + case 3: + scene->_prof.animate(ANIM_MODE_6, this); + _actionIndex = 0; + break; + } +} + +void Scene7700::Action3::signal() { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + switch (_actionIndex++) { + case 0: + scene->_object15.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_sceneItem10.remove(); + scene->_object15.remove(); + scene->_sceneHotspot8.remove(); + scene->_sceneHotspot9.remove(); + scene->_object19.remove(); + setDelay(60); + // No break on purpose! + case 2: + scene->_soundHandler.play(260); + scene->_object8.setVisage(7703); + scene->_object8.setPosition(Common::Point(177, 97)); + scene->_object8.setStrip2(3); + scene->_object8.animate(ANIM_MODE_5, this); + scene->_object8._numFrames = 3; + break; + case 3: + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene7700::Action4::signal() { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + switch (_actionIndex++) { + case 2: + scene->_object13.remove(); + // No break on purpose! + case 0: + setDelay(3); + break; + case 1: + CursorMan.showMouse(false); + scene->_object13.postInit(); + scene->_object13.setVisage(7700); + scene->_object13.setStrip2(7); + scene->_object13.setPosition(Common::Point(151, 33)); + scene->_object13.animate(ANIM_MODE_5, this); + break; + case 3: + CursorMan.showMouse(true); + SceneItem::display2(7700, 11); + _globals->_player.enableControl(); + remove(); + break; + } +} + +void Scene7700::Action5::signal() { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + switch (_actionIndex++) { + case 0: + setDelay(_globals->_randomSource.getRandomNumber(240)); + break; + case 1: { + scene->_cloud.setFrame(_globals->_randomSource.getRandomNumber(1) + 1); + scene->_cloud.setPosition(Common::Point(133, 145 + _globals->_randomSource.getRandomNumber(54))); + + Common::Point pt(360, scene->_cloud._position.y); + NpcMover *mover = new NpcMover(); + scene->_cloud.addMover(mover, &pt, this); + _actionIndex = 0; + break; + } + } +} + +void Scene7700::Action6::signal() { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: { + Common::Point pt(2, 66); + NpcMover *mover = new NpcMover(); + scene->_easterEgg1.addMover(mover, &pt, this); + break; + } + case 2: + scene->_easterEgg1.setStrip(2); + scene->_easterEgg1.setPosition(Common::Point(43, 65)); + + scene->_easterEgg2.postInit(); + scene->_easterEgg2.setVisage(7708); + scene->_easterEgg2.setStrip(3); + scene->_easterEgg2.setPosition(Common::Point(116, 54)); + scene->_easterEgg2.animate(ANIM_MODE_2, NULL); + + setDelay(120); + break; + case 3: + scene->_easterEgg1.remove(); + scene->_easterEgg2.remove(); + remove(); + break; + } +} + +void Scene7700::SceneHotspot1::doAction(int action) { + if (action == CURSOR_LOOK) + SceneItem::display2(7700, 4); + else + SceneHotspot::doAction(action); +} + +void Scene7700::SceneHotspot2::doAction(int action) { + if (action == CURSOR_LOOK) + SceneItem::display2(7700, 6); + else + SceneHotspot::doAction(action); +} + +void Scene7700::SceneHotspot3::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_KEY: + SceneItem::display2(7702, 3); + RING_INVENTORY._key._sceneNumber = 7700; + break; + case CURSOR_LOOK: + if (RING_INVENTORY._key._sceneNumber == 7700) + scene->setAction(&scene->_action4, NULL); + else + SceneItem::display2(7700, 53); + break; + case CURSOR_USE: + if (!_globals->getFlag(78)) { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } else if (RING_INVENTORY._key._sceneNumber == 7700) { + _globals->_player.disableControl(); + scene->_sceneMode = 7705; + scene->setAction(&scene->_sequenceManager, scene, 7705, &_globals->_player, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneHotspot4::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 12); + break; + case CURSOR_USE: + if (!_globals->getFlag(78)) { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } else { + SceneItem::display2(7700, 12); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneHotspot5::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 28); + break; + case CURSOR_USE: + if (_globals->getFlag(78)) { + if (RING_INVENTORY._paper._sceneNumber == 7700) { + _globals->_player.disableControl(); + scene->_sceneMode = 7708; + scene->setAction(&scene->_sequenceManager, scene, 7708, &_globals->_player, NULL); + } + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneHotspot6::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 43); + break; + case CURSOR_USE: + SceneItem::display2(7700, 56); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneItem7::doAction(int action) { + if (action == CURSOR_LOOK) + SceneItem::display2(7700, 51); +} + +void Scene7700::SceneHotspot8::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 48); + break; + case CURSOR_USE: + scene->_sceneMode = 7709; + scene->_soundHandler.play(259); + scene->_object15.setFrame(scene->_object15.getFrameCount()); + scene->_object15.animate(ANIM_MODE_6, scene); + if ((scene->_field977 == 2) && (scene->_field97B == 0)) { + scene->_field979++; + } else { + scene->_field97B = 0; + scene->_field979 = 0; + scene->_field977 = 0; + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneHotspot9::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 48); + break; + case CURSOR_USE: + scene->_sceneMode = 7709; + scene->_soundHandler.play(259); + scene->_object15.setFrame(1); + scene->_object15.animate(ANIM_MODE_5, scene); + if (scene->_field977 > 2) { + scene->_field97B = 0; + scene->_field979 = 0; + scene->_field977 = 0; + } + + if (scene->_field979 != 0) { + if (scene->_field979 != 4) { + scene->_field97B = 0; + scene->_field979 = 0; + scene->_field977 = 0; + } else { + scene->_field97B++; + if (scene->_field97B == 3) { + _globals->_player.disableControl(); + scene->setAction(&scene->_action3); + } + } + } else { + scene->_field977++; + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::SceneItem10::doAction(int action) { +} + +void Scene7700::Object1::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(7700, _lookLineNum); + } else if (action == CURSOR_USE) { + if (_globals->getFlag(78)) { + _globals->_player.disableControl(); + scene->setAction(&scene->_action1, this); + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene7700::SceneHotspot11::doAction(int action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, _lookLineNum); + break; + case CURSOR_USE: + SceneItem::display2(7701, _useLineNum); + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::Object1::signal() { + if (_state == 0) { + _state = 1; + SceneItem::display2(7701, _defltLineNum); + } else { + _state = 0; + } + _globals->_player.enableControl(); +} + +void Scene7700::Object3::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(7700, 34); + } else if (action == CURSOR_USE) { + if (_globals->getFlag(78)) { + if (scene->_object3._frame == 1) { + _globals->_player.disableControl(); + scene->_sceneMode = 7707; + scene->setAction(&scene->_sequenceManager, scene, 7707, &_globals->_player, this, NULL); + } else { + SceneItem::display2(7700, 60); + } + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene7700::Object7::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_globals->getFlag(78)) + SceneItem::display2(7700, 45); + else + SceneItem::display2(7700, 44); + break; + case CURSOR_USE: + if (_globals->getFlag(78)) { + SceneItem::display2(7701, 41); + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7714, NULL); + } + break; + case CURSOR_TALK: + if (_globals->getFlag(78)) { + SceneItem::display2(7702, 1); + } else { + _globals->_player.disableControl(); + if (_state == 0) { + _state = 1; + scene->_sceneMode = 7703; + scene->setAction(&scene->_sequenceManager, scene, 7703, NULL); + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7712, NULL); + } + } + break; + case OBJECT_STUNNER: + if (!_globals->getFlag(78)) { + _globals->_soundHandler.stop(); + _globals->setFlag(78); + setAction(NULL); + _globals->_player.disableControl(); + scene->_sceneMode = 7704; + scene->setAction(&scene->_sequenceManager, scene, 7704, &_globals->_player, this, NULL); + } + break; + default: + SceneHotspot::doAction(action); + break; + } +} + +void Scene7700::Object8::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { + if (_strip == 3) { + scene->_object9.postInit(); + scene->_object9.setVisage(7701); + scene->_object9.setStrip2(3); + scene->_object9.setPosition(Common::Point(91, 166)); + scene->_object9.fixPriority(200); + + scene->_object14.postInit(); + scene->_object14.setVisage(7701); + scene->_object14.setStrip(2); + scene->_object14.fixPriority(250); + scene->_object14.setPosition(Common::Point(139, 151)); + + scene->_gfxButton.setText(EXIT_MSG); + scene->_gfxButton._bounds.center(140, 189); + scene->_gfxButton.draw(); + + _globals->_sceneItems.push_front(&scene->_sceneItem10); + _globals->_sceneItems.push_front(&scene->_object9); + _globals->_player._canWalk = false; + } else if (_globals->getFlag(78)) { + scene->_object15.postInit(); + scene->_object15.setVisage(7701); + scene->_object15.setPosition(Common::Point(140, 165)); + scene->_object15.fixPriority(200); + + scene->_gfxButton.setText(EXIT_MSG); + scene->_gfxButton._bounds.center(140, 186); + scene->_gfxButton.draw(); + scene->_gfxButton._bounds.expandPanes(); + + scene->_object19.postInit(); + scene->_object19.setVisage(7700); + scene->_object19.setStrip(6); + scene->_object19.setPosition(Common::Point(140, 192)); + + _globals->_sceneItems.push_front(&scene->_sceneItem10); + _globals->_sceneItems.push_front(&scene->_sceneHotspot8); + _globals->_sceneItems.push_front(&scene->_sceneHotspot9); + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player._canWalk = false; + } else { + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene7700::Object9::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(7700, 49); + break; + case CURSOR_USE: + SceneItem::display2(7701, 42); + break; + case CURSOR_TALK: + SceneItem::display2(7702, 4); + break; + case OBJECT_KEY: + if (_frame == 1) { + if (!_globals->getFlag(80)) { + scene->_object10.postInit(); + scene->_object10.setVisage(7701); + scene->_object10.setStrip(4); + scene->_object10.setPosition(Common::Point(159, 136)); + _globals->_sceneItems.push_front(&scene->_object10); + scene->_object10.fixPriority(240); + } + + scene->_soundHandler.play(262); + scene->_object14.animate(ANIM_MODE_5, NULL); + } + _globals->_events.setCursor(CURSOR_WALK); + break; + default: + SceneHotspot::doAction(action); + } +} + +void Scene7700::Object10::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(7700, 50); + } else if (action == CURSOR_USE) { + _globals->_player._canWalk = true; + RING_INVENTORY._translator._sceneNumber = 1; + _globals->setFlag(80); + scene->_sceneItem10.remove(); + scene->_gfxButton._bounds.expandPanes(); + scene->_object14.remove(); + scene->_object9.remove(); + remove(); + } else { + SceneHotspot::doAction(action); + } +} + +void Scene7700::Object11::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + switch (action) { + case OBJECT_SCANNER: + if (_frame != 1) + SceneItem::display2(7701, 44); + else + SceneItem::doAction(action); + break; + case CURSOR_LOOK: + if (_frame != 1) + SceneItem::display2(7700, 9); + else + SceneItem::display2(7700, 52); + break; + case CURSOR_USE: + if (_frame != 1) { + SceneItem::display2(7701, 8); + } else { + _globals->setFlag(49); + _globals->_player.disableControl(); + scene->_sceneMode = 7706; + scene->setAction(&scene->_sequenceManager, scene, 7706, &_globals->_player, this, NULL); + } + break; + case OBJECT_EMPTY_JAR: + RING_INVENTORY._emptyJar._sceneNumber = 0; + RING_INVENTORY._jar._sceneNumber = 1; + _globals->_player.disableControl(); + scene->_sceneMode = 7710; + scene->setAction(&scene->_sequenceManager, scene, 7710, &_globals->_player, NULL); + break; + default: + SceneHotspot::doAction(action); + } +} + +void Scene7700::Object12::doAction(int action) { + Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + + if (action == CURSOR_LOOK) { + SceneItem::display2(7700, 15); + } else if (action == CURSOR_USE) { + if (_globals->getFlag(78)) { + scene->_sceneMode = 7713; + scene->setAction(&scene->_sequenceManager, scene, 7713, &_globals->_player, NULL); + } else { + scene->_sceneMode = 7712; + scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); + } + } else { + SceneHotspot::doAction(action); + } +} + +void Scene7700::signal() { + switch (_sceneMode) { + case 7701: + _globals->_player.fixPriority(-1); + _globals->_player.setStrip2(-1); + if (_globals->getFlag(78)) { + _globals->_player.enableControl(); + } else { + _sceneMode = 7711; + setAction(&_sequenceManager, this, 7711, NULL); + } + break; + case 7702: + _globals->_soundHandler.fadeOut(NULL); + _globals->_sceneManager.changeScene(7600); + break; + case 7703: + case 7706: + case 7707: + case 7711: + case 7712: + _globals->_player.enableControl(); + break; + case 7704: + _globals->_soundHandler.play(256); + _prof.setStrip2(4); + _prof.setFrame2(1); + _prof.setPosition(Common::Point(159, 87)); + _globals->_player.enableControl(); + break; + case 7705: + RING_INVENTORY._key._sceneNumber = 1; + _globals->_player.enableControl(); + break; + case 7708: + RING_INVENTORY._paper._sceneNumber = 1; + _globals->_player.enableControl(); + break; + case 7709: + _globals->_events.setCursor(CURSOR_USE); + break; + case 7710: + _globals->_player.enableControl(); + SceneItem::display2(7700, 62); + break; + case 7713: + _emptyJar.remove(); + RING_INVENTORY._emptyJar._sceneNumber = 1; + break; + default: + break; + } +} + +void Scene7700::process(Event &event) { + Scene::process(event); + + if (contains(_globals->_sceneItems, &_sceneItem10)) { + if (_gfxButton.process(event)) { + _sceneItem10.remove(); + _object15.remove(); + _object9.remove(); + if (_globals->_sceneObjects->contains(&_object10)) + _object10.remove(); + if (_globals->_sceneObjects->contains(&_object14)) + _object14.remove(); + _object19.remove(); + _gfxButton._bounds.expandPanes(); + _globals->_player._canWalk = true; + } + } + if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_p)) { + event.handled = true; + if (!_globals->_sceneObjects->contains(&_easterEgg1)) { + _easterEgg1.postInit(); + _easterEgg1.setVisage(7708); + _easterEgg1.setPosition(Common::Point(163, 50)); + _easterEgg1.fixPriority(1); + _easterEgg1.animate(ANIM_MODE_2, NULL); + _easterEgg1.setAction(&_action6); + } + } +} + +void Scene7700::dispatch() { + if ((_globals->_sceneRegions.indexOf(_globals->_player._position) == 6) || (_globals->_player._position.x < 10)) + _globals->_player.changeZoom(100 - ((_globals->_player._position.y - 68) / 2)); + else + _globals->_player.changeZoom(-1); + + if ((_action == 0) && (_globals->_sceneRegions.indexOf(_globals->_player._position) == 30)) { + _globals->_player.disableControl(); + _sceneMode = 7702; + setAction(&_sequenceManager, this, 7702, &_globals->_player, NULL); + } + Scene::dispatch(); +} + +void Scene7700::postInit(SceneObjectList *OwnerList) { + loadScene(7700); + Scene::postInit(); + setZoomPercents(100, 80, 200, 100); + _globals->setFlag(53); + _field97B = 0; + _field979 = 0; + _field977 = 0; + + _stripManager.addSpeaker(&_speakerEText); + _stripManager.addSpeaker(&_speakerQText); + _speakerQText._npc = &_globals->_player; + _speakerEText._npc = &_prof; + + _globals->_player.postInit(); + _globals->_player.setVisage(4201); + _globals->_player.animate(ANIM_MODE_1, NULL); + SceneObjectWrapper *wrapper = new SceneObjectWrapper(); + _globals->_player.setObjectWrapper(wrapper); + _globals->_player.setPosition(Common::Point(-19, 68)); + _globals->_player.setStrip2(7); + _globals->_player.fixPriority(95); + _globals->_player.changeZoom(80); + _globals->_player._moveDiff.x = 6; + _globals->_player._moveDiff.y = 3; + _globals->_player.disableControl(); + + _prof.postInit(); + _prof.setVisage(7706); + + if (_globals->getFlag(78)) { + _prof.setStrip2(4); + _prof.fixPriority(80); + _prof.setPosition(Common::Point(159, 87)); + } else { + _prof.setPosition(Common::Point(203, 87)); + _prof.setStrip2(2); + _prof._numFrames = 6; + _prof.setAction(&_action2); + } + + _cloud.postInit(); + _cloud.setVisage(7700); + _cloud.setStrip2(5); + _cloud.fixPriority(1); + _cloud.setPosition(Common::Point(133, 160)); + _cloud._moveDiff.x = 1; + _cloud._moveRate = 7; + _cloud.setAction(&_action5); + + _object1.postInit(); + _object1.setVisage(7700); + _object1.setPosition(Common::Point(184, 61)); + _object1._lookLineNum = 18; + _object1._defltLineNum = 16; + + _object2.postInit(); + _object2.setVisage(7700); + _object2.setPosition(Common::Point(184, 70)); + _object2.fixPriority(60); + _object2._lookLineNum = 19; + _object2._defltLineNum = 17; + + _object3.postInit(); + _object3.setVisage(7703); + _object3.setPosition(Common::Point(288, 36)); + _object3.setStrip(2); + + _object4.postInit(); + _object4.setVisage(7700); + _object4.setPosition(Common::Point(268, 59)); + _object4.setStrip(2); + _object4._lookLineNum = 37; + _object4._defltLineNum = 35; + + _object5.postInit(); + _object5.setVisage(7700); + _object5.setPosition(Common::Point(268, 67)); + _object5.fixPriority(58); + _object5.setStrip2(3); + _object5._lookLineNum = 38; + _object5._defltLineNum = 36; + + _object6.postInit(); + _object6.setVisage(7700); + _object6.setPosition(Common::Point(268, 75)); + _object6.fixPriority(57); + _object6.setStrip2(4); + _object6._lookLineNum = 40; + _object6._defltLineNum = 43; + + _object8.postInit(); + _object8.setVisage(7703); + _object8.setPosition(Common::Point(203, 91)); + _object8.setStrip2(4); + _object8.fixPriority(86); + + _sceneHotspot8.setBounds(82, 141, 161, 92); + _sceneHotspot9.setBounds(82, 187, 161, 141); + + _cork.postInit(); + _cork.setVisage(7703); + _cork.setPosition(Common::Point(32, 128)); + + if (_globals->getFlag(49)) + _cork.setFrame(_cork.getFrameCount()); + + if (RING_INVENTORY._emptyJar._sceneNumber == 7700) { + _emptyJar.postInit(); + _emptyJar.setVisage(7700); + _emptyJar.setStrip(8); + _emptyJar.setPosition(Common::Point(189, 48)); + _globals->_sceneItems.addItems(&_emptyJar, NULL); + } + _sceneHotspot1._sceneRegionId = 28; + _sceneHotspot2._sceneRegionId = 6; + _sceneHotspot3._sceneRegionId = 10; + _sceneHotspot4._sceneRegionId = 11; + _sceneHotspot5._sceneRegionId = 9; + _sceneHotspot6._sceneRegionId = 7; + + _sceneItem7.setBounds(0, 320, 200, 0); + _sceneItem10.setBounds(0, 320, 200, 0); + + _sceneHotspot11._sceneRegionId = 57; + _sceneHotspot11._useLineNum = 0; + _sceneHotspot11._lookLineNum = 0; + _sceneHotspot12._sceneRegionId = 2; + _sceneHotspot12._useLineNum = 2; + _sceneHotspot12._lookLineNum = 2; + _sceneHotspot13._sceneRegionId = 12; + _sceneHotspot13._useLineNum = 3; + _sceneHotspot13._lookLineNum = 3; + _sceneHotspot14._sceneRegionId = 18; + _sceneHotspot14._useLineNum = 4; + _sceneHotspot14._lookLineNum = 5; + _sceneHotspot15.setBounds(0, 55, 50, 8); + _sceneHotspot15._useLineNum = 6; + _sceneHotspot15._lookLineNum = 7; + _sceneHotspot16.setBounds(0, 130, 34, 103); + _sceneHotspot16._useLineNum = 7; + _sceneHotspot16._lookLineNum = 8; + _sceneHotspot17.setBounds(41, 180, 46, 170); + _sceneHotspot17._useLineNum = 11; + _sceneHotspot17._lookLineNum = 13; + _sceneHotspot18.setBounds(38, 187, 46, 180); + _sceneHotspot18._useLineNum = 12; + _sceneHotspot18._lookLineNum = 14; + _sceneHotspot19._sceneRegionId = 3; + _sceneHotspot19._useLineNum = 14; + _sceneHotspot19._lookLineNum = 16; + _sceneHotspot20._sceneRegionId = 14; + _sceneHotspot20._useLineNum = 15; + _sceneHotspot20._lookLineNum = 17; + _sceneHotspot21.setBounds(9, 215, 26, 210); + _sceneHotspot21._useLineNum = 18; + _sceneHotspot21._lookLineNum = 20; + _sceneHotspot22.setBounds(10, 221, 26, 215); + _sceneHotspot22._useLineNum = 19; + _sceneHotspot22._lookLineNum = 21; + _sceneHotspot23.setBounds(6, 230, 26, 225); + _sceneHotspot23._useLineNum = 20; + _sceneHotspot23._lookLineNum = 22; + _sceneHotspot24._sceneRegionId = 13; + _sceneHotspot24._useLineNum = 21; + _sceneHotspot24._lookLineNum = 23; + _sceneHotspot25._sceneRegionId = 21; + _sceneHotspot25._useLineNum = 22; + _sceneHotspot25._lookLineNum = 24; + _sceneHotspot26._sceneRegionId = 19; + _sceneHotspot26._useLineNum = 23; + _sceneHotspot26._lookLineNum = 25; + _sceneHotspot27._sceneRegionId = 27; + _sceneHotspot27._useLineNum = 24; + _sceneHotspot27._lookLineNum = 26; + _sceneHotspot28._sceneRegionId = 15; + _sceneHotspot28._useLineNum = 25; + _sceneHotspot28._lookLineNum = 27; + _sceneHotspot29._sceneRegionId = 26; + _sceneHotspot29._useLineNum = 27; + _sceneHotspot29._lookLineNum = 29; + _sceneHotspot30.setBounds(0, 317, 34, 310); + _sceneHotspot30._useLineNum = 28; + _sceneHotspot30._lookLineNum = 30; + _sceneHotspot31._sceneRegionId = 17; + _sceneHotspot31._useLineNum = 29; + _sceneHotspot31._lookLineNum = 31; + _sceneHotspot32._sceneRegionId = 25; + _sceneHotspot32._useLineNum = 30; + _sceneHotspot32._lookLineNum = 32; + _sceneHotspot33._sceneRegionId = 5; + _sceneHotspot33._useLineNum = 31; + _sceneHotspot33._lookLineNum = 33; + _sceneHotspot34.setBounds(42, 292, 48, 281); + _sceneHotspot34._useLineNum = 32; + _sceneHotspot34._lookLineNum = 35; + _sceneHotspot35._sceneRegionId = 24; + _sceneHotspot35._useLineNum = 38; + _sceneHotspot35._lookLineNum = 41; + _sceneHotspot36._sceneRegionId = 1; + _sceneHotspot36._useLineNum = 39; + _sceneHotspot36._lookLineNum = 42; + + _globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL); + _globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL); + _globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL); + _globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL); + _globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL); + _globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL); + _globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL); + + _sceneMode = 7701; + setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL); + _soundHandler.play(256); +} + +Scene7700::Scene7700() { + _object1._state = 0; + _object2._state = 0; + _object4._state = 0; + _object5._state = 0; + _object6._state = 0; + _prof._state = 0; +} + +void Scene7700::synchronize(Serializer &s) { + Scene::synchronize(s); + if (s.getVersion() >= 3) { + s.syncAsSint16LE(_field977); + s.syncAsSint16LE(_field979); + s.syncAsSint16LE(_field97B); + } +} + +} // End of namespace tSage diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h new file mode 100644 index 0000000000..e4f82fc164 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_scenes8.h @@ -0,0 +1,490 @@ +/* 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. + * + */ + +#ifndef TSAGE_RINGWORLD_SCENES8_H +#define TSAGE_RINGWORLD_SCENES8_H + +#include "common/scummsys.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace tSage { + +class NamedHotspotMult : public SceneHotspot { +public: + int _useLineNum, _lookLineNum; + NamedHotspotMult() : SceneHotspot() {} + + virtual Common::String getClassName() { return "NamedHotspotMult"; } + virtual void synchronize(Serializer &s); +}; + +class SceneObject7700 : public SceneObjectExt { +public: + int _lookLineNum, _defltLineNum; + + virtual void synchronize(Serializer &s); + virtual Common::String getClassName() { return "SceneObject7700"; } +}; + +class Scene7000 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void dispatch(); + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Object1 : public SceneObject { + public: + virtual void doAction(int action); + }; + + /* Items */ + class Hotspot1 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + SpeakerSKText _speakerSKText; + SpeakerSKL _speakerSKL; + SpeakerQL _speakerQL; + SpeakerQR _speakerQR; + SpeakerQText _speakerQText; + Object1 _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneObject _object7; + SceneObject _object8; + SceneObject _object9; + SceneObject _object10; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Hotspot1 _hotspot1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene7100 : public Scene { + /* Actions */ + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + class Action7 : public Action { + public: + virtual void signal(); + }; + class Action8 : public Action { + public: + virtual void signal(); + }; + class Action9 : public Action { + public: + virtual void signal(); + }; + class Action10 : public Action { + public: + virtual void signal(); + }; + class Action11 : public Action { + public: + virtual void signal(); + }; + +public: + ASound _soundHandler1; + ASound _soundHandler2; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneObject _object7; + SceneObject _object8; + SceneObject _object9; + SceneObject _object10; + SceneObject _object11; + SceneObject _object12; + SceneObject _object13; + SceneObject _object14; + SceneObject _object15; + SceneObject _object16; + SceneObject _object17; + SceneObject _object18; + SceneObject _object19; + SceneObject _object20; + SceneObject _object21; + SceneObject _object22; + SceneObject _object23; + SceneObject _object24; + SceneObject _object25; + Action _action1; + Action _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + Action10 _action10; + Action11 _action11; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene7200 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + +public: + Action1 _action1; + Action2 _action2; + SceneObject _swimmer; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneObject _object7; + SceneObject _object8; + SceneObject _object9; + ASound _soundHandler; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene7300 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + +public: + SpeakerPOR _speakerPOR; + SpeakerPOText _speakerPOText; + SpeakerSKText _speakerSKText; + SpeakerQU _speakerQU; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + SceneObject _object7; + SceneObject _object8; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void dispatch(); +}; + +class Scene7600 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + +public: + Action1 _action1; + Action2 _action2; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SceneObject _object4; + SceneObject _object5; + SceneObject _object6; + ASound _soundHandler1; + ASound _soundHandler2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene7700 : public Scene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + class Action5 : public Action { + public: + virtual void signal(); + }; + class Action6 : public Action { + public: + virtual void signal(); + }; + + class Object1 : public SceneObject7700 { + public: + virtual void signal(); + virtual void doAction(int action); + }; + class Object3 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object7 : public SceneObjectExt { + public: + virtual void doAction(int action); + }; + class Object8 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object9 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object10 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object11 : public SceneObject { + public: + virtual void doAction(int action); + }; + class Object12 : public SceneObject { + public: + virtual void doAction(int action); + }; + + /* Items */ + class SceneHotspot1 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot2 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot3 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot4 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot5 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot6 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneItem7 : public SceneItem { + public: + virtual void doAction(int action); + }; + class SceneHotspot8 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneHotspot9 : public SceneHotspot { + public: + virtual void doAction(int action); + }; + class SceneItem10 : public SceneItem { + public: + virtual void doAction(int action); + }; + class SceneHotspot11 : public NamedHotspotMult { + public: + virtual void doAction(int action); + }; +public: + ASound _soundHandler; + SequenceManager _sequenceManager; + GfxButton _gfxButton; + SpeakerEText _speakerEText; + SpeakerQText _speakerQText; + Object1 _object1; + Object1 _object2; + Object3 _object3; + Object1 _object4; + Object1 _object5; + Object1 _object6; + Object7 _prof; + Object8 _object8; + Object9 _object9; + Object10 _object10; + Object11 _cork; + Object12 _emptyJar; + SceneObject _object13; + SceneObject _object14; + SceneObject _object15; + SceneObject _cloud; + SceneObject _easterEgg1; + SceneObject _easterEgg2; + SceneObject _object19; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + SceneHotspot1 _sceneHotspot1; + SceneHotspot2 _sceneHotspot2; + SceneHotspot3 _sceneHotspot3; + SceneHotspot4 _sceneHotspot4; + SceneHotspot5 _sceneHotspot5; + SceneHotspot6 _sceneHotspot6; + SceneItem7 _sceneItem7; + SceneHotspot8 _sceneHotspot8; + SceneHotspot9 _sceneHotspot9; + SceneItem10 _sceneItem10; + SceneHotspot11 _sceneHotspot11; + SceneHotspot11 _sceneHotspot12; + SceneHotspot11 _sceneHotspot13; + SceneHotspot11 _sceneHotspot14; + SceneHotspot11 _sceneHotspot15; + SceneHotspot11 _sceneHotspot16; + SceneHotspot11 _sceneHotspot17; + SceneHotspot11 _sceneHotspot18; + SceneHotspot11 _sceneHotspot19; + SceneHotspot11 _sceneHotspot20; + SceneHotspot11 _sceneHotspot21; + SceneHotspot11 _sceneHotspot22; + SceneHotspot11 _sceneHotspot23; + SceneHotspot11 _sceneHotspot24; + SceneHotspot11 _sceneHotspot25; + SceneHotspot11 _sceneHotspot26; + SceneHotspot11 _sceneHotspot27; + SceneHotspot11 _sceneHotspot28; + SceneHotspot11 _sceneHotspot29; + SceneHotspot11 _sceneHotspot30; + SceneHotspot11 _sceneHotspot31; + SceneHotspot11 _sceneHotspot32; + SceneHotspot11 _sceneHotspot33; + SceneHotspot11 _sceneHotspot34; + SceneHotspot11 _sceneHotspot35; + SceneHotspot11 _sceneHotspot36; + int _field977, _field979, _field97B; + + Scene7700(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +} // End of namespace tSage + +#endif diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp deleted file mode 100644 index b24fec98f9..0000000000 --- a/engines/tsage/ringworld_demo.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* 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. - * - */ - -#include "tsage/ringworld_demo.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -void RingworldDemoGame::start() { - // Start the demo's single scene - _globals->_sceneManager.changeScene(1); - - _globals->_events.setCursor(CURSOR_NONE); -} - -Scene *RingworldDemoGame::createScene(int sceneNumber) { - // The demo only has a single scene, so ignore the scene number and always return it - return new RingworldDemoScene(); -} - -void RingworldDemoGame::quitGame() { - if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0) - _vm->quitGame(); -} - -void RingworldDemoGame::pauseGame() { - _globals->_events.setCursor(CURSOR_ARROW); - MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING); - dlg->draw(); - - GfxButton *selectedButton = dlg->execute(&dlg->_btn2); - bool exitFlag = selectedButton != &dlg->_btn2; - - delete dlg; - _globals->_events.hideCursor(); - - if (exitFlag) - _vm->quitGame(); -} - -void RingworldDemoGame::processEvent(Event &event) { - if (event.eventType == EVENT_KEYPRESS) { - switch (event.kbd.keycode) { - case Common::KEYCODE_F1: - // F1 - Help - MessageDialog::show(DEMO_HELP_MSG, OK_BTN_STRING); - break; - - case Common::KEYCODE_F2: { - // F2 - Sound Options - ConfigDialog *dlg = new ConfigDialog(); - dlg->runModal(); - delete dlg; - _globals->_soundManager.syncSounds(); - _globals->_events.setCursorFromFlag(); - break; - } - - case Common::KEYCODE_F3: - // F3 - Quit - quitGame(); - event.handled = false; - break; - - default: - break; - } - } else if (event.eventType == EVENT_BUTTON_DOWN) { - pauseGame(); - event.handled = true; - } -} - -/*-------------------------------------------------------------------------- - * Ringworld Demo scene - * - *--------------------------------------------------------------------------*/ - -void RingworldDemoScene::postInit(SceneObjectList *OwnerList) { - signal(); -} - -void RingworldDemoScene::signal() { - _soundHandler.play(4); - _actor1.postInit(); - _actor2.postInit(); - _actor3.postInit(); - _actor4.postInit(); - _actor5.postInit(); - _actor6.postInit(); - - setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL); -} - -void RingworldDemoScene::process(Event &event) { - -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_demo.h b/engines/tsage/ringworld_demo.h deleted file mode 100644 index 3e7431e107..0000000000 --- a/engines/tsage/ringworld_demo.h +++ /dev/null @@ -1,59 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_DEMO_H -#define TSAGE_RINGWORLD_DEMO_H - -#include "common/scummsys.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" -#include "tsage/sound.h" - -namespace tSage { - -class RingworldDemoGame: public Game { -private: - void pauseGame(); -public: - virtual void start(); - virtual Scene *createScene(int sceneNumber); - virtual void quitGame(); - virtual void processEvent(Event &event); -}; - -class RingworldDemoScene: public Scene { -public: - SequenceManager _sequenceManager; - SceneObject _actor1, _actor2, _actor3; - SceneObject _actor4, _actor5, _actor6; - ASound _soundHandler; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void process(Event &event); - virtual void signal(); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp deleted file mode 100644 index 070d8afd25..0000000000 --- a/engines/tsage/ringworld_logic.cpp +++ /dev/null @@ -1,1490 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "common/translation.h" -#include "gui/saveload.h" -#include "tsage/ringworld_logic.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" -#include "tsage/ringworld_demo.h" -#include "tsage/ringworld_scenes1.h" -#include "tsage/ringworld_scenes2.h" -#include "tsage/ringworld_scenes3.h" -#include "tsage/ringworld_scenes4.h" -#include "tsage/ringworld_scenes5.h" -#include "tsage/ringworld_scenes6.h" -#include "tsage/ringworld_scenes8.h" -#include "tsage/ringworld_scenes10.h" - -namespace tSage { - -Scene *RingworldGame::createScene(int sceneNumber) { - switch (sceneNumber) { - /* Scene group 1 */ - // Kziniti Palace (Introduction) - case 10: return new Scene10(); - // Outer Space (Introduction) - case 15: return new Scene15(); - // Cut-scenes for Ch'mee house in distance - case 20: return new Scene20(); - // Outside Ch'mee residence - case 30: return new Scene30(); - // Chmeee Home - case 40: return new Scene40(); - // By Flycycles - case 50: return new Scene50(); - // Flycycle controls - case 60: return new Scene60(); - // Shipyard Entrance - case 90: return new Scene90(); - // Ship Close-up - case 95: return new Scene95(); - // Sunflower navigation sequence - case 6100: return new Scene6100(); - - /* Scene group 2 */ - // Title screen - case 1000: return new Scene1000(); - // Fleeing planet cutscene - case 1001: return new Scene1001(); - // Unused - case 1250: return new Scene1250(); - // Ringworld Wall - case 1400: return new Scene1400(); - // Ringworld Space-port - case 1500: return new Scene1500(); - - /* Scene group 3 - Part #1 */ - // Cockpit cutscenes - case 2000: return new Scene2000(); - // Starcraft - Cockpit - case 2100: return new Scene2100(); - // Encyclopedia - case 2120: return new Scene2120(); - // Starcraft - Level 2 - case 2150: return new Scene2150(); - // Starcraft - AutoDoc - case 2200: return new Scene2200(); - // Stasis Field Map - case 2222: return new Scene2222(); - // Starcraft - Quinn's Room - case 2230: return new Scene2230(); - - /* Scene group 3 - Part #2 */ - // Starcraft - Storage Room - case 2280: return new Scene2280(); - // Starcraft - Hanger Bay - case 2300: return new Scene2300(); - // Starcraft - Copy Protection Screen - case 2310: return new Scene2310(); - // Starcraft - Lander Bay - case 2320: return new Scene2320(); - // Scene 2400 - Descending in Lander - case 2400: return new Scene2400(); - - /* Scene group 4 */ - // Ringworld Scan - case 3500: return new Scene3500(); - // Remote Viewer - case 3700: return new Scene3700(); - - /* Scene group 5 */ - // Village - case 4000: return new Scene4000(); - // Village - Outside Lander - case 4010: return new Scene4010(); - // Village - Puzzle Board - case 4025: return new Scene4025(); - // Village - Temple Antechamber - case 4045: return new Scene4045(); - // Village - Temple - case 4050: return new Scene4050(); - // Village - Hut - case 4100: return new Scene4100(); - // Village - Bedroom - case 4150: return new Scene4150(); - // Village - Near Slaver Ship - case 4250: return new Scene4250(); - // Village - Slaver Ship - case 4300: return new Scene4300(); - // Village - Slaver Ship Keypad - case 4301: return new Scene4301(); - - /* Scene group 6 */ - // Caverns - Entrance - case 5000: return new Scene5000(); - // Caverns - case 5100: return new Scene5100(); - // Caverns - Throne-room - case 5200: return new Scene5200(); - // Caverns - Pit - case 5300: return new Scene5300(); - - /* Scene group 8 */ - // Landing near beach - case 7000: return new Scene7000(); - // Underwater: swimming - case 7100: return new Scene7100(); - // Underwater: Entering the cave - case 7200: return new Scene7200(); - // Underwater: Lord Poria - case 7300: return new Scene7300(); - // Floating Buildings: Outside - case 7600: return new Scene7600(); - // Floating Buildings: In the lab - case 7700: return new Scene7700(); - - /* Scene group 10 */ - // Near beach: Slave washing clothes - case 9100: return new Scene9100(); - // Castle: Outside the bulwarks - case 9150: return new Scene9150(); - // Castle: Near the fountain - case 9200: return new Scene9200(); - // Castle: In front of a large guarded door - case 9300: return new Scene9300(); - // Castle: In a hallway - case 9350: return new Scene9350(); - // Castle: In a hallway - case 9360: return new Scene9360(); - // Castle: Black-Smith room - case 9400: return new Scene9400(); - // Castle: Dining room - case 9450: return new Scene9450(); - // Castle: Bedroom - case 9500: return new Scene9500(); - // Castle: Balcony - case 9700: return new Scene9700(); - // Castle: In the garden - case 9750: return new Scene9750(); - // Castle: Dressing room - case 9850: return new Scene9850(); - // Ending - case 9900: return new Scene9900(); - // Space travel - case 9999: return new Scene9999(); - - default: - error("Unknown scene number - %d", sceneNumber); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -DisplayHotspot::DisplayHotspot(int regionId, ...) { - _sceneRegionId = regionId; - - // Load up the actions - va_list va; - va_start(va, regionId); - - int param = va_arg(va, int); - while (param != LIST_END) { - _actions.push_back(param); - param = va_arg(va, int); - } - - va_end(va); -} - -bool DisplayHotspot::performAction(int action) { - for (uint i = 0; i < _actions.size(); i += 3) { - if (_actions[i] == action) { - display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - } - } - - return false; -} - -/*--------------------------------------------------------------------------*/ - -DisplayObject::DisplayObject(int firstAction, ...) { - // Load up the actions - va_list va; - va_start(va, firstAction); - - int param = firstAction; - while (param != LIST_END) { - _actions.push_back(param); - param = va_arg(va, int); - } - - va_end(va); -} - -bool DisplayObject::performAction(int action) { - for (uint i = 0; i < _actions.size(); i += 3) { - if (_actions[i] == action) { - display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - } - } - - return false; -} - -/*--------------------------------------------------------------------------*/ - -SceneArea::SceneArea() { - _savedArea = NULL; - _pt.x = _pt.y = 0; -} - -SceneArea::~SceneArea() { - delete _savedArea; -} - -void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { - _resNum = resNum; - _rlbNum = rlbNum; - _subNum = subNum; - _actionId = actionId; - - _surface = surfaceFromRes(resNum, rlbNum, subNum); -} - -void SceneArea::draw2() { - _surface.draw(Common::Point(_bounds.left, _bounds.top)); -} - -void SceneArea::display() { - _bounds.left = _pt.x - (_surface.getBounds().width() / 2); - _bounds.top = _pt.y + 1 - _surface.getBounds().height(); - _bounds.setWidth(_surface.getBounds().width()); - _bounds.setHeight(_surface.getBounds().height()); - - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds); - draw2(); -} - -void SceneArea::restore() { - assert(_savedArea); - _savedArea->draw(Common::Point(_bounds.left, _bounds.top)); - delete _savedArea; - _savedArea = NULL; -} - -void SceneArea::draw(bool flag) { - _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum); - _surface.draw(Common::Point(_bounds.left, _bounds.top)); -} - -void SceneArea::wait() { - // Wait until a mouse or keypress - Event event; - while (!_vm->shouldQuit() && !_globals->_events.getEvent(event)) { - g_system->updateScreen(); - g_system->delayMillis(10); - } - - SynchronizedList::iterator ii; - for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) { - SceneItem *sceneItem = *ii; - if (sceneItem->contains(event.mousePos)) { - sceneItem->doAction(_actionId); - break; - } - } - - _globals->_events.setCursor(CURSOR_ARROW); -} - -void SceneArea::synchronize(Serializer &s) { - if (s.getVersion() >= 2) - SavedObject::synchronize(s); - - s.syncAsSint16LE(_pt.x); - s.syncAsSint16LE(_pt.y); - s.syncAsSint32LE(_resNum); - s.syncAsSint32LE(_rlbNum); - s.syncAsSint32LE(_subNum); - s.syncAsSint32LE(_actionId); - _bounds.synchronize(s); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerGText::SpeakerGText() { - _speakerName = "GTEXT"; - _textWidth = 160; - _textPos = Common::Point(130, 10); - _color1 = 42; - _hideObjects = false; -} - -void SpeakerGText::setText(const Common::String &msg) { - // Set the animation properties - _sceneObject.postInit(); - _sceneObject.setVisage(9405); - _sceneObject.setStrip2(3); - _sceneObject.fixPriority(255); - _sceneObject.changeZoom(100); - _sceneObject._frame = 1; - _sceneObject.setPosition(Common::Point(183, 71)); - _sceneObject.animate(ANIM_MODE_7, 0, NULL); - - // Set the text - Rect textRect; - _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth); - textRect.center(_sceneObject._position.x, _sceneObject._position.y); - _textPos.x = textRect.left; - Speaker::setText(msg); -} - -void SpeakerGText::removeText() { - _sceneObject.remove(); - Speaker::removeText(); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerPOR::SpeakerPOR() { - _speakerName = "POR"; - _newSceneNumber = 7221; - _textPos = Common::Point(10, 30); - _color1 = 41; -} - -void SpeakerPOR::SpeakerAction1::signal(){ - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(60) + 60); - break; - case 1: - static_cast(_owner)->animate(ANIM_MODE_5, this, NULL); - break; - case 2: - setDelay(_globals->_randomSource.getRandomNumber(10)); - _actionIndex = 0; - break; - default: - break; - } -} - -void SpeakerPOR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(7223); - _object1.setStrip2(2); - _object1.setPosition(Common::Point(191, 166)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(7223); - _object2.setPosition(Common::Point(159, 86)); - _object2.setAction(&_speakerAction, NULL); - - _object3.postInit(&_objectList); - _object3.setVisage(7223); - _object3.setStrip(3); - _object3.setPosition(Common::Point(119, 107)); - _object3.fixPriority(199); - _object3.setAction(&_action2); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerOR::SpeakerOR() { - _speakerName = "OR"; - _newSceneNumber = 9430; - _textPos = Common::Point(8, 36); - _color1 = 42; - _textWidth = 136; -} - -void SpeakerOR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(9431); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(202, 147)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(9431); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.setZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(199, 85)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerOText::SpeakerOText() : SpeakerGText() { - _speakerName = "OTEXT"; - _textWidth = 240; - _textPos = Common::Point(130, 10); - _color1 = 42; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerQText::SpeakerQText() : ScreenSpeaker() { - _speakerName = "QTEXT"; - _textPos = Common::Point(160, 40); - _color1 = 35; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSText::SpeakerSText() : ScreenSpeaker() { - _speakerName = "STEXT"; - _color1 = 13; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerPOText::SpeakerPOText() : ScreenSpeaker() { - _speakerName = "POTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 41; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerMText::SpeakerMText() { - _speakerName = "MTEXT"; - _color1 = 22; - _textWidth = 230; - _textMode = ALIGN_CENTER; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCText::SpeakerCText() { - _speakerName = "CTEXT"; - _color1 = 4; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerEText::SpeakerEText() { - _speakerName = "ETEXT"; - _textPos = Common::Point(20, 20); - _color1 = 22; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerGR::SpeakerGR() : AnimatedSpeaker() { - _speakerName = "GR"; - _newSceneNumber = 9220; - _textWidth = 136; - _textPos = Common::Point(168, 36); - _color1 = 14; -} - -void SpeakerGR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(9221); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(101, 70)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerHText::SpeakerHText() { - _speakerName = "HTEXT"; - _textPos = Common::Point(160, 40); - _color1 = 52; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSKText::SpeakerSKText() : ScreenSpeaker() { - _speakerName = "SKTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 9; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerPText::SpeakerPText() { - _speakerName = "PTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 5; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCHFText::SpeakerCHFText() { - _speakerName = "CHFTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 56; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCDRText::SpeakerCDRText() { - _speakerName = "CDRTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 52; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerFLText::SpeakerFLText() { - _speakerName = "FLTEXT"; - _textPos = Common::Point(10, 40); - _color1 = 17; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerBatText::SpeakerBatText() { - _speakerName = "BATTEXT"; - _textWidth = 240; - _textMode = ALIGN_CENTER; - _color1 = 3; - _hideObjects = false; -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSKL::SpeakerSKL() : AnimatedSpeaker() { - _speakerName = "SKL"; - _newSceneNumber = 7011; - _textPos = Common::Point(10, 30); - _color1 = 9; -} - -void SpeakerSKL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(7013); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(203, 120)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(7013); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(197, 80)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerQL::SpeakerQL() : AnimatedSpeaker() { - _speakerName = "QL"; - _newSceneNumber = 2610; - _textPos = Common::Point(160, 30); - _color1 = 35; - _textMode = ALIGN_CENTER; -} - -void SpeakerQL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2612); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(128, 146)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2612); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(122, 84)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSR::SpeakerSR() { - _speakerName = "SR"; - _newSceneNumber = 2811; - _textPos = Common::Point(10, 30); - _color1 = 13; - _textMode = ALIGN_CENTER; -} - -void SpeakerSR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2813); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(224, 198)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2813); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(203, 96)); - _object2.setAction(&_speakerAction, NULL); - - _object3.postInit(&_objectList); - _object3.setVisage(2813); - _object3.setStrip(3); - _object3.setPosition(Common::Point(204, 91)); - _object3.fixPriority(199); - _object3._numFrames = 3; - _object3.animate(ANIM_MODE_7, 0, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSL::SpeakerSL() { - _speakerName = "SL"; - _newSceneNumber = 2810; - _textPos = Common::Point(140, 30); - _textWidth = 160; - _color1 = 13; - _textMode = ALIGN_CENTER; -} - -void SpeakerSL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2812); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(95, 198)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2812); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(116, 96)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerQR::SpeakerQR() { - _speakerName = "QR"; - _newSceneNumber = 2611; - _textPos = Common::Point(10, 30); - _color1 = 35; - _textMode = ALIGN_CENTER; -} - -void SpeakerQR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2613); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(191, 146)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2613); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(197, 84)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerQU::SpeakerQU() { - _speakerName = "QU"; - _newSceneNumber = 7020; - _textPos = Common::Point(160, 30); - _color1 = 35; - _textMode = ALIGN_CENTER; -} - -void SpeakerQU::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(7021); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(116, 120)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(7021); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(111, 84)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCR::SpeakerCR() { - _speakerName = "CR"; - _newSceneNumber = 9010; - _textPos = Common::Point(20, 40); - _color1 = 4; -} - -void SpeakerCR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(9011); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.setPosition(Common::Point(219, 168)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(9011); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.setPosition(Common::Point(232, 81)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerMR::SpeakerMR() { - _speakerName = "MR"; - _newSceneNumber = 2711; - _textPos = Common::Point(10, 40); - _color1 = 22; -} - -void SpeakerMR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2713); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(220, 143)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2713); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(215, 99)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerSAL::SpeakerSAL() { - _speakerName = "SAL"; - _newSceneNumber = 2851; - _textPos = Common::Point(10, 30); - _color1 = 13; - _textMode = ALIGN_CENTER; -} - -void SpeakerSAL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2853); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(185, 200)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2853); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(170, 92)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerML::SpeakerML() { - _speakerName = "ML"; - _newSceneNumber = 2710; - _textPos = Common::Point(160, 40); - _color1 = 22; -} - -void SpeakerML::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(2712); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(99, 143)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(2712); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(105, 99)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCHFL::SpeakerCHFL() { - _speakerName = "CHFL"; - _newSceneNumber = 4111; - _textPos = Common::Point(10, 40); - _color1 = 56; -} - -void SpeakerCHFL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4113); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(205, 116)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4113); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(202, 71)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCHFR::SpeakerCHFR() { - _speakerName = "CHFR"; - _newSceneNumber = 4110; - _textPos = Common::Point(160, 40); - _color1 = 56; -} - -void SpeakerCHFR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4112); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(103, 116)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4112); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(106, 71)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerPL::SpeakerPL() { - _speakerName = "PL"; - _newSceneNumber = 4060; - _textPos = Common::Point(160, 40); - _color1 = 5; -} - -void SpeakerPL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4062); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(107, 117)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4062); - _object2.setStrip2(1); - _object2.fixPriority(200); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(105, 62)); - _object2.setAction(&_speakerAction, NULL); - - _object3.postInit(&_objectList); - _object3.setVisage(4062); - _object3.setStrip2(3); - _object3.fixPriority(255); - _object3.changeZoom(100); - _object3._frame = 1; - _object3.setPosition(Common::Point(105, 59)); - _object3.setAction(&_speakerAction2, NULL); - - Speaker::setText(msg); -} - -void SpeakerPL::removeText() { - _object3.remove(); - AnimatedSpeaker::removeText(); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerPR::SpeakerPR() { - _speakerName = "PR"; - _newSceneNumber = 4061; - _textPos = Common::Point(10, 40); - _color1 = 5; -} - -void SpeakerPR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4063); - _object1.setStrip2(1); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(212, 117)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4063); - _object2.setStrip2(2); - _object2.fixPriority(200); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(214, 62)); - _object2.setAction(&_speakerAction, NULL); - - _object3.postInit(&_objectList); - _object3.setVisage(4063); - _object3.setStrip2(3); - _object3.fixPriority(255); - _object3.changeZoom(100); - _object3._frame = 1; - _object3.setPosition(Common::Point(214, 59)); - _object3.setAction(&_speakerAction2, NULL); - - Speaker::setText(msg); -} - -void SpeakerPR::removeText() { - _object3.remove(); - AnimatedSpeaker::removeText(); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCDR::SpeakerCDR() { - _speakerName = "CDR"; - _newSceneNumber = 4161; - _textPos = Common::Point(10, 40); - _color1 = 52; -} - -void SpeakerCDR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4163); - _object1.setStrip2(1); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(208, 97)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4163); - _object2.setStrip2(2); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(200, 57)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerCDL::SpeakerCDL() { - _speakerName = "CDL"; - _newSceneNumber = 4160; - _textPos = Common::Point(160, 40); - _color1 = 52; -} - -void SpeakerCDL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(4162); - _object1.setStrip2(1); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(112, 97)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(4162); - _object2.setStrip2(2); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(115, 57)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerFLL::SpeakerFLL() { - _speakerName = "FLL"; - _newSceneNumber = 5221; - _textPos = Common::Point(10, 40); - _color1 = 17; -} - -void SpeakerFLL::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(5223); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(216, 129)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(5223); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(210, 67)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -SpeakerBatR::SpeakerBatR() { - _speakerName = "BATR"; - _newSceneNumber = 5360; - _textPos = Common::Point(140, 40); - _color1 = 3; -} - -void SpeakerBatR::setText(const Common::String &msg) { - _object1.postInit(&_objectList); - _object1.setVisage(5361); - _object1.setStrip2(2); - _object1.fixPriority(255); - _object1.changeZoom(100); - _object1._frame = 1; - _object1.setPosition(Common::Point(137, 122)); - _object1.animate(ANIM_MODE_7, 0, NULL); - - _object2.postInit(&_objectList); - _object2.setVisage(5361); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object2.changeZoom(100); - _object2._frame = 1; - _object2.setPosition(Common::Point(137, 104)); - _object2.setAction(&_speakerAction, NULL); - - Speaker::setText(msg); -} - -/*--------------------------------------------------------------------------*/ - -RingworldInvObjectList::RingworldInvObjectList() : - _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."), - _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."), - _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."), - _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."), - _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."), - _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."), - _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."), - _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."), - _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."), - _key(7700, 1, 11, OBJECT_KEY, "A key."), - _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."), - _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."), - _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."), - _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."), - _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."), - _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."), - _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."), - _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."), - _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."), - _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."), - _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."), - _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."), - _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."), - _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."), - _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."), - _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."), - _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."), - _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."), - _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."), - _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."), - _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."), - _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."), - _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") { - - // Add the items to the list - _itemList.push_back(&_stunner); - _itemList.push_back(&_scanner); - _itemList.push_back(&_stasisBox); - _itemList.push_back(&_infoDisk); - _itemList.push_back(&_stasisNegator); - _itemList.push_back(&_keyDevice); - _itemList.push_back(&_medkit); - _itemList.push_back(&_ladder); - _itemList.push_back(&_rope); - _itemList.push_back(&_key); - _itemList.push_back(&_translator); - _itemList.push_back(&_ale); - _itemList.push_back(&_paper); - _itemList.push_back(&_waldos); - _itemList.push_back(&_stasisBox2); - _itemList.push_back(&_ring); - _itemList.push_back(&_cloak); - _itemList.push_back(&_tunic); - _itemList.push_back(&_candle); - _itemList.push_back(&_straw); - _itemList.push_back(&_scimitar); - _itemList.push_back(&_sword); - _itemList.push_back(&_helmet); - _itemList.push_back(&_items); - _itemList.push_back(&_concentrator); - _itemList.push_back(&_nullifier); - _itemList.push_back(&_peg); - _itemList.push_back(&_vial); - _itemList.push_back(&_jacket); - _itemList.push_back(&_tunic2); - _itemList.push_back(&_bone); - _itemList.push_back(&_jar); - _itemList.push_back(&_emptyJar); - - _selectedItem = NULL; -} - -/*--------------------------------------------------------------------------*/ - -void RingworldGame::restartGame() { - if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1) - _globals->_game->restart(); -} - -void RingworldGame::saveGame() { - if (!_vm->canSaveGameStateCurrently()) - MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING); - else { - // Show the save dialog - handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName); - } -} - -void RingworldGame::restoreGame() { - if (!_vm->canLoadGameStateCurrently()) - MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING); - else { - // Show the load dialog - handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); - } -} - -void RingworldGame::quitGame() { - if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) - _vm->quitGame(); -} - -void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) { - const EnginePlugin *plugin = 0; - EngineMan.findGame(_vm->getGameId(), &plugin); - GUI::SaveLoadChooser *dialog; - if (saveFlag) - dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); - else - dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); - - dialog->setSaveMode(saveFlag); - - saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); - saveName = dialog->getResultString(); - - delete dialog; -} - -void RingworldGame::start() { - // Set some default flags - _globals->setFlag(12); - _globals->setFlag(34); - - // Set the screen to scroll in response to the player moving off-screen - _globals->_scrollFollower = &_globals->_player; - - // Set the object's that will be in the player's inventory by default - RING_INVENTORY._stunner._sceneNumber = 1; - RING_INVENTORY._scanner._sceneNumber = 1; - RING_INVENTORY._ring._sceneNumber = 1; - - int slot = -1; - - if (ConfMan.hasKey("save_slot")) { - slot = ConfMan.getInt("save_slot"); - Common::String file = _vm->generateSaveName(slot); - Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file); - if (in) - delete in; - else - slot = -1; - } - - if (slot >= 0) - _globals->_sceneHandler._loadGameSlot = slot; - else - // Switch to the title screen - _globals->_sceneManager.setNewScene(1000); - - _globals->_events.showCursor(); -} - -void RingworldGame::restart() { - _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.stop(); - - // Reset the flags - _globals->reset(); - _globals->setFlag(34); - - // Clear save/load slots - _globals->_sceneHandler._saveGameSlot = -1; - _globals->_sceneHandler._loadGameSlot = -1; - - _globals->_stripNum = 0; - _globals->_events.setCursor(CURSOR_WALK); - - // Reset item properties - RING_INVENTORY._stunner._sceneNumber = 1; - RING_INVENTORY._scanner._sceneNumber = 1; - RING_INVENTORY._stasisBox._sceneNumber = 5200; - RING_INVENTORY._infoDisk._sceneNumber = 40; - RING_INVENTORY._stasisNegator._sceneNumber = 0; - RING_INVENTORY._keyDevice._sceneNumber = 0; - RING_INVENTORY._medkit._sceneNumber = 2280; - RING_INVENTORY._ladder._sceneNumber = 4100; - RING_INVENTORY._rope._sceneNumber = 4150; - RING_INVENTORY._key._sceneNumber = 7700; - RING_INVENTORY._translator._sceneNumber = 2150; - RING_INVENTORY._paper._sceneNumber = 7700; - RING_INVENTORY._waldos._sceneNumber = 0; - RING_INVENTORY._ring._sceneNumber = 1; - RING_INVENTORY._stasisBox2._sceneNumber = 8100; - RING_INVENTORY._cloak._sceneNumber = 9850; - RING_INVENTORY._tunic._sceneNumber = 9450; - RING_INVENTORY._candle._sceneNumber = 9500; - RING_INVENTORY._straw._sceneNumber = 9400; - RING_INVENTORY._scimitar._sceneNumber = 9850; - RING_INVENTORY._sword._sceneNumber = 9850; - RING_INVENTORY._helmet._sceneNumber = 9500; - RING_INVENTORY._items._sceneNumber = 4300; - RING_INVENTORY._concentrator._sceneNumber = 4300; - RING_INVENTORY._nullifier._sceneNumber = 4300; - RING_INVENTORY._peg._sceneNumber = 4045; - RING_INVENTORY._vial._sceneNumber = 5100; - RING_INVENTORY._jacket._sceneNumber = 9850; - RING_INVENTORY._tunic2._sceneNumber = 9850; - RING_INVENTORY._bone._sceneNumber = 5300; - RING_INVENTORY._jar._sceneNumber = 7700; - RING_INVENTORY._emptyJar._sceneNumber = 7700; - RING_INVENTORY._selectedItem = NULL; - - // Change to the first game scene - _globals->_sceneManager.changeScene(30); -} - -void RingworldGame::endGame(int resNum, int lineNum) { - _globals->_events.setCursor(CURSOR_WALK); - Common::String msg = _resourceManager->getMessage(resNum, lineNum); - bool savesExist = _saver->savegamesExist(); - - if (!savesExist) { - // No savegames exist, so prompt the user to restart or quit - if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) - _vm->quitGame(); - else - restart(); - } else { - // Savegames exist, so prompt for Restore/Restart - bool breakFlag; - do { - if (_vm->shouldQuit()) { - breakFlag = true; - } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { - restart(); - breakFlag = true; - } else { - handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); - breakFlag = _globals->_sceneHandler._loadGameSlot >= 0; - } - } while (!breakFlag); - } - - _globals->_events.setCursorFromFlag(); -} - -void RingworldGame::processEvent(Event &event) { - if (event.eventType == EVENT_KEYPRESS) { - switch (event.kbd.keycode) { - case Common::KEYCODE_F1: - // F1 - Help - MessageDialog::show(HELP_MSG, OK_BTN_STRING); - break; - - case Common::KEYCODE_F2: { - // F2 - Sound Options - ConfigDialog *dlg = new ConfigDialog(); - dlg->runModal(); - delete dlg; - _globals->_soundManager.syncSounds(); - _globals->_events.setCursorFromFlag(); - break; - } - - case Common::KEYCODE_F3: - // F3 - Quit - quitGame(); - event.handled = false; - break; - - case Common::KEYCODE_F4: - // F4 - Restart - restartGame(); - _globals->_events.setCursorFromFlag(); - break; - - case Common::KEYCODE_F7: - // F7 - Restore - restoreGame(); - _globals->_events.setCursorFromFlag(); - break; - - case Common::KEYCODE_F10: - // F10 - Pause - GfxDialog::setPalette(); - MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); - _globals->_events.setCursorFromFlag(); - break; - - default: - break; - } - } -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld_logic.h deleted file mode 100644 index 19b0f10b42..0000000000 --- a/engines/tsage/ringworld_logic.h +++ /dev/null @@ -1,461 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_LOGIC_H -#define TSAGE_RINGWORLD_LOGIC_H - -#include "common/scummsys.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - _globals->_player.addMover(mover, &pt, this); } -#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - OBJ.addMover(mover, &pt, NULL); } -#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - OBJ.addMover(mover, &pt, this); } - -#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ - OBJ.addMover(mover, &pt, this); } -#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ - OBJ.addMover(mover, &pt, NULL); } - - -class SceneFactory { -public: - static Scene *createScene(int sceneNumber); -}; - -class DisplayHotspot : public SceneObject { -private: - Common::Array _actions; - bool performAction(int action); -public: - DisplayHotspot(int regionId, ...); - - virtual void doAction(int action) { - if (!performAction(action)) - SceneHotspot::doAction(action); - } -}; - -class DisplayObject : public SceneObject { -private: - Common::Array _actions; - bool performAction(int action); -public: - DisplayObject(int firstAction, ...); - - virtual void doAction(int action) { - if (!performAction(action)) - SceneHotspot::doAction(action); - } -}; - -class SceneArea : public SavedObject { -public: - GfxSurface _surface; - GfxSurface *_savedArea; - Common::Point _pt; - int _resNum; - int _rlbNum; - int _subNum; - int _actionId; - Rect _bounds; -public: - SceneArea(); - ~SceneArea(); - - void setup(int resNum, int rlbNum, int subNum, int actionId); - void draw2(); - void display(); - void restore(); - - virtual void synchronize(Serializer &s); - virtual void draw(bool flag); - virtual void wait(); -}; - -/*--------------------------------------------------------------------------*/ -// Ringworld specific game speakers - -class SpeakerGText : public Speaker { -public: - SceneObject _sceneObject; -public: - SpeakerGText(); - - virtual Common::String getClassName() { return "SpeakerGText"; } - virtual void setText(const Common::String &msg); - virtual void removeText(); -}; - -class SpeakerPOR : public AnimatedSpeaker { - class SpeakerAction1 : public SpeakerAction { - public: - virtual void signal(); - }; - -public: - SceneObject _object3; - SpeakerAction1 _action2; -public: - SpeakerPOR(); - virtual Common::String getClassName() { return "SpeakerPOR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerOR : public AnimatedSpeaker { -public: - SpeakerOR(); - virtual Common::String getClassName() { return "SpeakerOR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerOText : public SpeakerGText { -public: - SpeakerOText(); - - virtual Common::String getClassName() { return "SpeakerOText"; } -}; - -class SpeakerPOText : public ScreenSpeaker { -public: - SpeakerPOText(); - - virtual Common::String getClassName() { return "SpeakerPOText"; } -}; - -class SpeakerSText : public ScreenSpeaker { -public: - SpeakerSText(); - - virtual Common::String getClassName() { return "SpeakerSText"; } -}; - -class SpeakerQText : public ScreenSpeaker { -public: - SpeakerQText(); - - virtual Common::String getClassName() { return "SpeakerQText"; } -}; - -class SpeakerMText : public ScreenSpeaker { -public: - SpeakerMText(); - - virtual Common::String getClassName() { return "SpeakerMText"; } -}; - -class SpeakerCText : public ScreenSpeaker { -public: - SpeakerCText(); - - virtual Common::String getClassName() { return "SpeakerCText"; } -}; - -class SpeakerEText : public ScreenSpeaker { -public: - SpeakerEText(); - - virtual Common::String getClassName() { return "SpeakerEText"; } -}; - -class SpeakerGR : public AnimatedSpeaker { -public: - SpeakerGR(); - - virtual Common::String getClassName() { return "SpeakerGR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerHText : public ScreenSpeaker { -public: - SpeakerHText(); - - virtual Common::String getClassName() { return "SpeakerHText"; } -}; - -class SpeakerPText : public ScreenSpeaker { -public: - SpeakerPText(); - - virtual Common::String getClassName() { return "SpeakerPText"; } -}; - -class SpeakerCHFText : public ScreenSpeaker { -public: - SpeakerCHFText(); - - virtual Common::String getClassName() { return "SpeakerCHFText"; } -}; - -class SpeakerSKText : public ScreenSpeaker { -public: - SpeakerSKText(); - - virtual Common::String getClassName() { return "SpeakerSKText"; } -}; - -class SpeakerCDRText : public ScreenSpeaker { -public: - SpeakerCDRText(); - - virtual Common::String getClassName() { return "SpeakerCDRText"; } -}; - -class SpeakerFLText : public ScreenSpeaker { -public: - SpeakerFLText(); - - virtual Common::String getClassName() { return "SpeakerFLText"; } -}; - -class SpeakerBatText : public ScreenSpeaker { -public: - SpeakerBatText(); - - virtual Common::String getClassName() { return "SpeakerFLText"; } -}; - -class SpeakerQR : public AnimatedSpeaker { -public: - SpeakerQR(); - - virtual Common::String getClassName() { return "SpeakerQR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerQU : public AnimatedSpeaker { -public: - SpeakerQU(); - - virtual Common::String getClassName() { return "SpeakerQU"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerSKL : public AnimatedSpeaker { -public: - SpeakerSKL(); - - virtual Common::String getClassName() { return "SpeakerQL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerQL : public AnimatedSpeaker { -public: - SpeakerQL(); - - virtual Common::String getClassName() { return "SpeakerQL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerSR : public AnimatedSpeaker { -public: - SceneObject _object3; -public: - SpeakerSR(); - - virtual Common::String getClassName() { return "SpeakerSR"; } - void setText(const Common::String &msg); -}; - -class SpeakerSL : public AnimatedSpeaker { -public: - SpeakerSL(); - - virtual Common::String getClassName() { return "SpeakerSL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerCR : public AnimatedSpeaker { -public: - SpeakerCR(); - - virtual Common::String getClassName() { return "SpeakerCR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerMR : public AnimatedSpeaker { -public: - SpeakerMR(); - - virtual Common::String getClassName() { return "SpeakerMR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerSAL : public AnimatedSpeaker { -public: - SpeakerSAL(); - - virtual Common::String getClassName() { return "SpeakerSAL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerML : public AnimatedSpeaker { -public: - SpeakerML(); - - virtual Common::String getClassName() { return "SpeakerML"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerCHFL : public AnimatedSpeaker { -public: - SpeakerCHFL(); - - virtual Common::String getClassName() { return "SpeakerCHFL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerCHFR : public AnimatedSpeaker { -public: - SpeakerCHFR(); - - virtual Common::String getClassName() { return "SpeakerCHFR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerPL : public AnimatedSpeaker { -public: - SceneObject _object3; - SpeakerAction _speakerAction2; - - SpeakerPL(); - - virtual Common::String getClassName() { return "SpeakerPL"; } - virtual void setText(const Common::String &msg); - virtual void removeText(); -}; - -class SpeakerPR : public AnimatedSpeaker { -public: - SceneObject _object3; - SpeakerAction _speakerAction2; - - SpeakerPR(); - - virtual Common::String getClassName() { return "SpeakerPR"; } - virtual void setText(const Common::String &msg); - virtual void removeText(); -}; - -class SpeakerCDR : public AnimatedSpeaker { -public: - SpeakerCDR(); - - virtual Common::String getClassName() { return "SpeakerCDR"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerCDL : public AnimatedSpeaker { -public: - SpeakerCDL(); - - virtual Common::String getClassName() { return "SpeakerCDL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerFLL : public AnimatedSpeaker { -public: - SpeakerFLL(); - - virtual Common::String getClassName() { return "SpeakerFLL"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerBatR : public AnimatedSpeaker { -public: - SpeakerBatR(); - - virtual Common::String getClassName() { return "SpeakerBatR"; } - virtual void setText(const Common::String &msg); -}; - -/*--------------------------------------------------------------------------*/ - -class RingworldInvObjectList : public InvObjectList { -public: - InvObject _stunner; - InvObject _scanner; - InvObject _stasisBox; - InvObject _infoDisk; - InvObject _stasisNegator; - InvObject _keyDevice; - InvObject _medkit; - InvObject _ladder; - InvObject _rope; - InvObject _key; - InvObject _translator; - InvObject _ale; - InvObject _paper; - InvObject _waldos; - InvObject _stasisBox2; - InvObject _ring; - InvObject _cloak; - InvObject _tunic; - InvObject _candle; - InvObject _straw; - InvObject _scimitar; - InvObject _sword; - InvObject _helmet; - InvObject _items; - InvObject _concentrator; - InvObject _nullifier; - InvObject _peg; - InvObject _vial; - InvObject _jacket; - InvObject _tunic2; - InvObject _bone; - InvObject _jar; - InvObject _emptyJar; -public: - RingworldInvObjectList(); - - virtual Common::String getClassName() { return "RingworldInvObjectList"; } -}; - -#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory)) - -class RingworldGame: public Game { -protected: - virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName); -public: - virtual void start(); - virtual void restart(); - virtual void restartGame(); - virtual void saveGame(); - virtual void restoreGame(); - virtual void quitGame(); - virtual void endGame(int resNum, int lineNum); - - virtual Scene *createScene(int sceneNumber); - virtual void processEvent(Event &event); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp deleted file mode 100644 index f97cfa4ae6..0000000000 --- a/engines/tsage/ringworld_scenes1.cpp +++ /dev/null @@ -1,3345 +0,0 @@ -/* 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. - * - */ - -#include "tsage/ringworld_scenes1.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 10 - Kziniti Palace (Introduction) - * - *--------------------------------------------------------------------------*/ - -void Scene10::Action1::signal() { - Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: - _globals->_scenePalette.addRotation(240, 254, -1); - scene->_stripManager.start(10, this); - break; - case 2: - scene->_speakerSText.setTextPos(Common::Point(20, 20)); - scene->_speakerSText._color1 = 10; - scene->_speakerSText._textWidth = 160; - scene->_stripManager.start(11, this, scene); - break; - case 3: - scene->_object2.hide(); - scene->_object3.hide(); - scene->_object3.setAction(NULL); - scene->_object4.animate(ANIM_MODE_5, this); - break; - case 4: - case 9: - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 5: - scene->_object2.setStrip(3); - scene->_object2.setFrame(1); - scene->_object2.setPosition(Common::Point(240, 51)); - scene->_object2.show(); - - scene->_object3.setStrip(6); - scene->_object3.setFrame(1); - scene->_object3.setPosition(Common::Point(200, 76)); - scene->_object3._numFrames = 20; - scene->_object3.show(); - - scene->_stripManager.start(12, this, scene); - break; - case 6: - scene->_object2.hide(); - scene->_object3.hide(); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 7: - scene->_object3.show(); - scene->_object3.setStrip2(5); - scene->_object3._numFrames = 10; - scene->_object3.setPosition(Common::Point(180, 87)); - scene->_object3.setAction(&scene->_action2); - - scene->_object2.setStrip(4); - scene->_object2.setFrame(1); - scene->_object2.setPosition(Common::Point(204, 59)); - scene->_object2.show(); - - scene->_stripManager.start(13, this, scene); - break; - case 8: - scene->_object2.hide(); - scene->_object3.hide(); - scene->_object4.animate(ANIM_MODE_6, this); - break; - case 10: - _globals->_soundHandler.fadeOut(this); - break; - case 11: - _globals->_scenePalette.clearListeners(); - _globals->_sceneManager.changeScene(15); - break; - } -} - -void Scene10::Action2::signal() { - Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(179)); - break; - case 1: - scene->_object3.setFrame(1); - scene->_object3.animate(ANIM_MODE_5, this); - _actionIndex = 0; - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene10::postInit(SceneObjectList *OwnerList) { - loadScene(10); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerQText); - _speakerSText._speakerName = "STEXT"; - _speakerQText._speakerName = "QTEXT"; - _speakerSText._hideObjects = false; - _speakerQText._hideObjects = false; - _speakerQText.setTextPos(Common::Point(140, 120)); - _speakerQText._color1 = 4; - _speakerQText._textWidth = 160; - _speakerSText.setTextPos(Common::Point(20, 20)); - _speakerSText._color1 = 7; - _speakerSText._textWidth = 320; - - _stripManager.setCallback(this); - - _object1.postInit(); - _object1.setVisage(10); - _object1.setPosition(Common::Point(232, 90)); - _object1.fixPriority(1); - - _object2.postInit(); - _object2.setVisage(10); - _object2.setStrip(4); - _object2.setFrame(1); - _object2.setPosition(Common::Point(204, 59)); - _object2.fixPriority(198); - - _object3.postInit(); - _object3.setVisage(10); - _object3.setStrip2(5); - _object3.setPosition(Common::Point(180, 87)); - _object3.fixPriority(196); - _object3.setAction(&_action2); - - _object4.postInit(); - _object4.setVisage(10); - _object4.setStrip(2); - _object4.setPosition(Common::Point(0, 209)); - _object4.animate(ANIM_MODE_1, NULL); - - _object5.postInit(); - _object5.setVisage(11); - _object5.setPosition(Common::Point(107, 146)); - _object5.animate(ANIM_MODE_2, NULL); - _object5._numFrames = 5; - - _object6.postInit(); - _object6.setVisage(11); - _object6.setStrip(2); - _object6.setPosition(Common::Point(287, 149)); - _object6.animate(ANIM_MODE_2, NULL); - _object6._numFrames = 5; - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - - setAction(&_action1); - _globals->_soundHandler.play(5); -} - -void Scene10::stripCallback(int v) { - switch (v) { - case 1: - _object2.animate(ANIM_MODE_7, -1, NULL); - break; - case 2: - _object2.animate(ANIM_MODE_NONE); - break; - case 3: - _object2.animate(ANIM_MODE_7, -1, NULL); - _object3.animate(ANIM_MODE_5, NULL); - break; - default: - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 15 - Outer Space (Introduction) - * - *--------------------------------------------------------------------------*/ - -void Scene15::Action1::signal() { - Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - SceneItem::display(15, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7, - SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(300); - break; - case 2: { - SceneItem::display(15, 1, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7, - SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END); - scene->_object1.postInit(); - scene->_object1.setVisage(15); - scene->_object1.setPosition(Common::Point(160, -10)); - scene->_object1.animate(ANIM_MODE_2, NULL); - Common::Point pt(160, 100); - NpcMover *mover = new NpcMover(); - scene->_object1.addMover(mover, &pt, this); - scene->_soundHandler.play(7); - break; - } - case 3: - SceneItem::display(0, 0); - _globals->_sceneManager.changeScene(20); - break; - } -} - -void Scene15::Action1::dispatch() { - Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; - - if (scene->_object1._position.y < 100) - scene->_object1.changeZoom(100 - scene->_object1._position.y); - Action::dispatch(); -} - -/*--------------------------------------------------------------------------*/ - -void Scene15::postInit(SceneObjectList *OwnerList) { - loadScene(15); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - _globals->_soundHandler.play(6); - setAction(&_action1); -} - -/*-------------------------------------------------------------------------- - * Scene 20 - Cut-scenes where House Chmeee is in the distance - * - *--------------------------------------------------------------------------*/ - -void Scene20::Action1::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(120); - break; - case 1: - scene->_stripManager.start(20, this); - break; - case 2: - _globals->_soundHandler.fadeOut(this); - break; - case 3: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(30); // First game scene - break; - default: - break; - } -} - -void Scene20::Action2::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; - NpcMover *npcMover; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - SceneItem::display(20, 1, SET_WIDTH, 200, SET_Y, 20, SET_X, 160, SET_KEEP_ONSCREEN, true, - SET_EXT_BGCOLOR, 4, LIST_END); - setDelay(120); - break; - case 2: { - NpcMover *mover = new NpcMover(); - Common::Point pt(455, 77); - _globals->_player.addMover(mover, &pt, this); - ObjectMover2 *mover2 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player); - ObjectMover2 *mover3 = new ObjectMover2(); - scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player); - break; - } - case 3: { - npcMover = new NpcMover(); - Common::Point pt(557, 100); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 4: { - npcMover = new NpcMover(); - Common::Point pt(602, 90); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 5: { - npcMover = new NpcMover(); - Common::Point pt(618, 90); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 6: { - npcMover = new NpcMover(); - Common::Point pt(615, 81); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 7: { - npcMover = new NpcMover(); - Common::Point pt(588, 79); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 8: - scene->_sound.release(); - _globals->_soundHandler.fadeOut(this); - break; - case 9: - SceneItem::display(0, 0, LIST_END); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(40); - break; - default: - break; - } -} - -void Scene20::Action3::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; - NpcMover *npcMover; - - switch (_actionIndex++) { - case 0: - setDelay(120); - break; - case 1: { - npcMover = new NpcMover(); - Common::Point pt(615, 81); - _globals->_player.addMover(npcMover, &pt, this); - ObjectMover2 *mover1 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player); - ObjectMover2 *mover2 = new ObjectMover2(); - scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player); - break; - } - case 2: { - npcMover = new NpcMover(); - Common::Point pt(618, 90); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 3: { - _globals->_player._moveDiff = Common::Point(10, 10); - scene->_SceneObjectExt._moveDiff = Common::Point(10, 10); - scene->_sceneObject3._moveDiff = Common::Point(10, 10); - npcMover = new NpcMover(); - Common::Point pt(445, 132); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 4: { - npcMover = new NpcMover(); - Common::Point pt(151, 137); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 5: { - npcMover = new NpcMover(); - Common::Point pt(-15, 137); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 6: - scene->_sound.play(60, this, 127); - _globals->_soundHandler.release(); - break; - case 7: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(90); - break; - default: - break; - } -} - -void Scene20::Action4::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; - NpcMover *npcMover; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: { - npcMover = new NpcMover(); - Common::Point pt(486, 134); - _globals->_player.addMover(npcMover, &pt, this); - ObjectMover2 *mover1 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player); - break; - } - case 2: { - _globals->_player._moveDiff = Common::Point(12, 12); - scene->_SceneObjectExt._moveDiff = Common::Point(12, 12); - NpcMover *mover1 = new NpcMover(); - Common::Point pt(486, 134); - scene->_sceneObject3.addMover(mover1, &pt, this); - NpcMover *mover2 = new NpcMover(); - pt = Common::Point(-15, 134); - _globals->_player.addMover(mover2, &pt, NULL); - NpcMover *mover3 = new NpcMover(); - pt = Common::Point(-15, 134); - scene->_SceneObjectExt.addMover(mover3, &pt, NULL); - break; - } - case 3: { - scene->_sceneObject3._moveDiff = Common::Point(20, 20); - npcMover = new NpcMover(); - Common::Point pt(320, 134); - scene->_sceneObject3.addMover(npcMover, &pt, this); - break; - } - case 4: { - scene->_sound.play(28); - scene->_sceneObject4.postInit(); - scene->_sceneObject4.setVisage(21); - scene->_sceneObject4.setStrip(3); - scene->_sceneObject4.setPosition(Common::Point(scene->_sceneObject3._position.x - 36, - scene->_sceneObject3._position.y - 1)); - scene->_sceneObject4._moveDiff.x = 48; - - ObjectMover3 *mover = new ObjectMover3(); - scene->_sceneObject4.addMover(mover, &scene->_SceneObjectExt, 4, this); - break; - } - case 5: { - scene->_sound.play(42); - scene->_sceneObject4.remove(); - scene->_SceneObjectExt.setVisage(21); - scene->_SceneObjectExt.setStrip(1); - scene->_SceneObjectExt.setFrame(1); - scene->_SceneObjectExt.animate(ANIM_MODE_5, NULL); - - scene->_SceneObjectExt._moveDiff.x = 4; - NpcMover *mover1 = new NpcMover(); - Common::Point pt(scene->_SceneObjectExt._position.x - 12, scene->_SceneObjectExt._position.y + 5); - scene->_SceneObjectExt.addMover(mover1, &pt, NULL); - - scene->_sceneObject5.postInit(); - scene->_sceneObject5.setVisage(21); - scene->_sceneObject5.setStrip(3); - scene->_sceneObject5.setPosition(Common::Point(scene->_sceneObject3._position.x - 36, - scene->_sceneObject3._position.y - 1)); - scene->_sceneObject5._moveDiff.x = 48; - - ObjectMover3 *mover = new ObjectMover3(); - scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this); - break; - } - case 6: { - scene->_sound.play(42); - scene->_SceneObjectExt.setStrip(2); - scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL); - - scene->_sceneObject5.remove(); - _globals->_player.setVisage(21); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - _globals->_player._moveDiff.x = 4; - - npcMover = new NpcMover(); - Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5); - _globals->_player.addMover(npcMover, &pt, this); - break; - } - case 7: - _globals->_player.setStrip(2); - _globals->_player.animate(ANIM_MODE_2, NULL); - scene->_sound.play(77, this, 127); - break; - case 8: - _globals->_game->endGame(20, 0); - break; - default: - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene20::Scene20() { -} - -void Scene20::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerGameText); - _speakerQText._npc = &_globals->_player; - - if (_globals->_sceneManager._previousScene == 30) { - // Cut scene: Assassins are coming - _globals->_player.postInit(); - _globals->_player.setVisage(20); - _globals->_player.setPosition(Common::Point(405, 69)); - _globals->_player._moveDiff = Common::Point(10, 10); - _globals->_player.animate(ANIM_MODE_1, NULL); - - _SceneObjectExt.postInit(); - _SceneObjectExt.setVisage(20); - _SceneObjectExt.setPosition(Common::Point(400, 69)); - _SceneObjectExt.animate(ANIM_MODE_1, NULL); - - _sceneObject3.postInit(); - _sceneObject3.setVisage(20); - _sceneObject3.setPosition(Common::Point(395, 69)); - _sceneObject3.animate(ANIM_MODE_1, NULL); - - _SceneObjectExt._moveDiff = Common::Point(10, 10); - _sceneObject3._moveDiff = Common::Point(10, 10); - _globals->_soundHandler.play(20); - _sound.play(21); - _sound.holdAt(true); - setAction(&_action2); - - _sceneBounds = Rect(320, 0, 640, 200); - } else if (_globals->_sceneManager._previousScene == 60) { - // Evasion - _sound.play(30); - _globals->_player.postInit(); - _globals->_player.setVisage(20); - _globals->_player.setPosition(Common::Point(588, 79)); - _globals->_player._moveDiff = Common::Point(5, 5); - _globals->_player.fixPriority(50); - _globals->_player.animate(ANIM_MODE_1, NULL); - - _SceneObjectExt.postInit(); - _SceneObjectExt.setVisage(20); - _SceneObjectExt.setPosition(Common::Point(583, 79)); - _SceneObjectExt.animate(ANIM_MODE_1, NULL); - - _sceneObject3.postInit(); - _sceneObject3.setVisage(20); - _sceneObject3.setStrip2(2); - _sceneObject3.setPosition(Common::Point(595, 79)); - _sceneObject3.animate(ANIM_MODE_1, NULL); - - if ((_globals->getFlag(120) && _globals->getFlag(116)) || - (_globals->getFlag(117) && _globals->getFlag(119))) { - // Successful evasion - setAction(&_action3); - } else if (_globals->getFlag(104)) { - _sceneMode = 21; - setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL); - } else { - // Failed evasion - _sceneObject3._moveDiff = Common::Point(8, 8); - setAction(&_action4); - } - _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - } else { - // Intro: Quinn looking at the monaster - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setStrip2(1); - _globals->_player.setFrame2(4); - _globals->_player.fixPriority(200); - _globals->_player.setPosition(Common::Point(425, 233)); - - setAction(&_action1); - _speakerQText.setTextPos(Common::Point(350, 20)); - _speakerQText._textWidth = 260; - _speakerGameText.setTextPos(Common::Point(350, 20)); - _speakerGameText._textWidth = 260; - - _globals->_soundHandler.play(8); - _sceneBounds = Rect(320, 0, 640, 200); - } - - _globals->_player.disableControl(); - loadScene(20); -} - -void Scene20::signal() { - if (_sceneMode == 21) - _globals->_sceneManager.changeScene(90); -} - -/*-------------------------------------------------------------------------- - * Scene 30 - First game scene (Outside Ch'mee house) - * - *--------------------------------------------------------------------------*/ - -void Scene30::BeamObject::doAction(int action) { - if (action == OBJECT_SCANNER) - display2(30, 14); - else if (action == CURSOR_LOOK) - display2(30, 2); - else if (action == CURSOR_USE) { - Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene; - parent->setAction(&parent->_beamAction); - } else - SceneObject::doAction(action); -} - -void Scene30::DoorObject::doAction(int action) { - if (action == OBJECT_SCANNER) - display2(30, 13); - else if (action == CURSOR_LOOK) - display2(30, 1); - else if (action == CURSOR_USE) - display2(30, 7); - else - SceneObject::doAction(action); -} - -void Scene30::BeamAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - // Disable control and move player to the doorway beam - _globals->_player.disableControl(); - NpcMover *mover = new NpcMover(); - Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); - break; - } - - case 1: - // Perform the animation of player raising hand - _globals->_player.setVisage(31); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - - case 2: - // Hide the beam and lower the player's hand - scene->_sound.play(10, NULL, 127); - _globals->_player.animate(ANIM_MODE_6, this); - scene->_beam.remove(); - break; - - case 3: { - // Bring the Kzin to the doorway - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(7); - scene->_kzin.postInit(); - scene->_kzin.setVisage(2801); - scene->_kzin.animate(ANIM_MODE_1, NULL); - scene->_kzin.setObjectWrapper(new SceneObjectWrapper()); - scene->_kzin.setPosition(Common::Point(334, 1)); - NpcMover *mover = new NpcMover(); - Common::Point pt(158, 170); - scene->_kzin.addMover(mover, &pt, this); - _globals->_sceneItems.push_front(&scene->_kzin); - break; - } - - case 4: - // Open the door - scene->_sound.play(11, NULL, 127); - scene->_door.animate(ANIM_MODE_5, this); - break; - - case 5: - // Run the Kzin's talk sequence - scene->_sound.play(13, NULL, 127); - _globals->_soundHandler.play(12, NULL, 127); - scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this); - break; - - case 6: - // Slight delay - setDelay(3); - break; - - case 7: - // Re-activate player control - scene->_sceneMode = 31; - scene->_kzin.setAction(&scene->_kzinAction); - _globals->_player.enableControl(); - - // End this action - remove(); - break; - - default: - break; - } -} - -void Scene30::KzinAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1200); - break; - case 1: - _globals->_soundHandler.fadeOut(NULL); - _globals->_player.disableControl(); - setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL); - break; - case 2: - _globals->_player.enableControl(); - remove(); - break; - default: - break; - } -} - -void Scene30::RingAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - scene->_kzin.setAction(NULL); - NpcMover *mover = new NpcMover(); - Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); - break; - } - - case 1: - _globals->_player.checkAngle(&scene->_kzin); - scene->_stripManager.start(32, this); - break; - - case 2: { - _globals->_player.animate(ANIM_MODE_1, NULL); - NpcMover *mover = new NpcMover(); - Common::Point pt(143, 177); - _globals->_player.addMover(mover, &pt, this); - break; - } - - case 3: - scene->_sound.play(11, NULL, 127); - scene->_door.animate(ANIM_MODE_6, this); - break; - - case 4: { - scene->_sound.play(13, NULL, 127); - NpcMover *kzinMover = new NpcMover(); - Common::Point pt(354, 5); - scene->_kzin.addMover(kzinMover, &pt, this); - NpcMover *playerMover = new NpcMover(); - pt = Common::Point(335, 36); - _globals->_player.addMover(playerMover, &pt, this); - break; - } - - case 5: - break; - - case 6: - _globals->_sceneManager.changeScene(20); - break; - - default: - break; - } -} - -void Scene30::TalkAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - scene->_kzin.setAction(NULL); - NpcMover *mover = new NpcMover(); - Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_player.checkAngle(&scene->_kzin); - scene->_stripManager.start(34, this); - break; - case 2: - setDelay(5); - break; - case 3: - scene->_kzin.setAction(&scene->_kzinAction); - _globals->_player.enableControl(); - remove(); - break; - default: - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene30::KzinObject::doAction(int action) { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - display2(30, 12); - break; - case OBJECT_SCANNER: - display2(30, 11); - break; - case OBJECT_RING: - RING_INVENTORY._ring._sceneNumber = 30; - scene->setAction(&scene->_ringAction); - break; - case CURSOR_LOOK: - display2(30, 6); - break; - case CURSOR_USE: - display2(30, 10); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->setAction(&scene->_talkAction); - break; - default: - SceneObject::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene30::Scene30() : - _groundHotspot(9, OBJECT_SCANNER, 50, 17, CURSOR_LOOK, 30, 3, CURSOR_USE, 30, 8, LIST_END), - _wallsHotspot(8, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 30, 0, CURSOR_USE, 30, 7, LIST_END), - _courtyardHotspot(0, CURSOR_LOOK, 30, 4, LIST_END), - _treeHotspot(10, OBJECT_SCANNER, 40, 39, CURSOR_LOOK, 30, 5, CURSOR_USE, 30, 9, LIST_END) { -} - -void Scene30::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - // Add the speaker classes to the strip manager - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerQText); - _speakerSText._npc = &_kzin; - _speakerQText._npc = &_globals->_player; - - - // Setup player - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(7); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(114, 198)); - _globals->_player.changeZoom(75); - _globals->_player.enableControl(); - - // Set up beam object - _beam.postInit(); - _beam.setVisage(31); - _beam.setStrip(2); - _beam.setPosition(Common::Point(124, 178)); - _beam.fixPriority(188); - - // Set up door object - _door.postInit(); - _door.setVisage(30); - _door.setPosition(Common::Point(150, 183)); - - // Final processing and add of scene items - _courtyardHotspot.setBounds(Rect(0, 0, 320, 200)); - - // Add the objects and hotspots to the scene - _globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot, - &_courtyardHotspot, NULL); - - // Load the scene data - loadScene(30); - _sceneMode = 0; -} - -void Scene30::signal() { - if (_sceneMode == 31) { - // Re-activate beam if the Kzin goes back inside - _beam.postInit(); - _beam.setVisage(31); - _beam.setStrip(2); - _beam.setPosition(Common::Point(124, 178)); - _beam.fixPriority(188); - _globals->_sceneItems.push_front(&_beam); - _globals->_player.enableControl(); - } else if (_sceneMode == 32) { - _globals->_player.disableControl(); - _sceneMode = 31; - setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 40 - Chmeee Home - * - *--------------------------------------------------------------------------*/ - -void Scene40::Action1::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(120); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(40, this); - break; - case 2: - scene->_doorway.postInit(); - scene->_doorway.setVisage(46); - scene->_doorway.setPosition(Common::Point(305, 61)); - scene->_doorway.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(25); - break; - case 3: - scene->_doorway.hide(); - scene->_dyingKzin.setPosition(Common::Point(296, 62)); - _globals->_player.animate(ANIM_MODE_5, NULL); - scene->_object1.setVisage(43); - scene->_object1.setStrip(3); - scene->_object1.animate(ANIM_MODE_5, NULL); - scene->_object2.hide(); - scene->_object3.hide(); - scene->_stripManager.start(45, this); - break; - case 4: - scene->_object2.remove(); - scene->_object3.remove(); - scene->_assassin.setVisage(42); - scene->_assassin.setStrip(2); - scene->_assassin.setFrame(1); - scene->_assassin.setPosition(Common::Point(13, 171)); - scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(25); - break; - case 5: - scene->_doorway.show(); - scene->_doorway.setVisage(42); - scene->_doorway.setStrip(3); - scene->_doorway.setFrame(1); - scene->_doorway.setPosition(Common::Point(41, 144)); - scene->_assassin.animate(ANIM_MODE_6, NULL); - setDelay(6); - break; - case 6: - scene->_doorway.setPosition(Common::Point(178, 101)); - setDelay(6); - break; - case 7: - scene->_doorway.setPosition(Common::Point(271, 69)); - setDelay(6); - break; - case 8: - scene->_doorway.remove(); - scene->_dyingKzin.animate(ANIM_MODE_5, this); - break; - case 9: { - scene->_dyingKzin.setStrip(1); - //Workaround: The original uses setFrame(1) but it's completely wrong. - scene->_dyingKzin.setFrame(2); - scene->_dyingKzin._moveDiff.y = 15; - scene->_dyingKzin.animate(ANIM_MODE_5, NULL); - Common::Point pt(223, 186); - NpcMover *mover = new NpcMover(); - scene->_dyingKzin.addMover(mover, &pt, this); - break; - } - case 10: { - scene->_soundHandler.play(27); - Common::Point pt(223, 184); - NpcMover *mover = new NpcMover(); - scene->_dyingKzin.addMover(mover, &pt, this); - break; - } - case 11: { - Common::Point pt(223, 186); - NpcMover *mover = new NpcMover(); - scene->_dyingKzin.addMover(mover, &pt, this); - break; - } - case 12: { - _globals->_soundHandler.play(26); - _globals->_player._uiEnabled = true; - scene->_assassin.setVisage(42); - scene->_assassin.setPosition(Common::Point(4, 191)); - scene->_assassin.setStrip(1); - scene->_assassin.animate(ANIM_MODE_1, NULL); - Common::Point pt(230, 187); - NpcMover *mover = new NpcMover(); - scene->_assassin.addMover(mover, &pt, this); - break; - } - case 13: - setDelay(180); - break; - case 14: - scene->_assassin.setVisage(45); - scene->_assassin.setStrip(1); - scene->_assassin.setFrame(1); - scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(28); - break; - case 15: - _globals->_player.disableControl(); - scene->_object1.setVisage(40); - scene->_object1.setStrip(4); - scene->_object1.setFrame(1); - scene->_object1.animate(ANIM_MODE_5, NULL); - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 16: - _globals->_soundHandler.play(77, this); - break; - case 17: - _globals->_game->endGame(40, 20); - remove(); - break; - } -} - -void Scene40::Action2::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - if (scene->_assassin._position.x < 229) - _actionIndex = 0; - setDelay(1); - break; - case 1: - scene->_assassin.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: { - scene->_soundHandler.play(28); - scene->_doorway.postInit(); - scene->_doorway.setVisage(16); - scene->_doorway.setStrip2(6); - scene->_doorway.fixPriority(200); - scene->_doorway.setPosition(Common::Point(159, 191)); - scene->_doorway._moveDiff = Common::Point(40, 40); - scene->_doorway._moveRate = 60; - scene->_doorway.animate(ANIM_MODE_5, NULL); - - Common::Point pt(271, 165); - NpcMover *mover = new NpcMover(); - scene->_doorway.addMover(mover, &pt, this); - break; - } - case 3: - scene->_doorway.remove(); - scene->_assassin.setVisage(44); - scene->_assassin._frame = 1; - scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(29); - RING_INVENTORY._infoDisk._sceneNumber = 40; - break; - case 4: - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 5: { - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); - Common::Point pt(230, 195); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: { - _globals->_player.setStrip(7); - scene->_object1.setVisage(2806); - scene->_object1.animate(ANIM_MODE_1, NULL); - SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - scene->_object1.setObjectWrapper(wrapper); - Common::Point pt(200, 190); - NpcMover *mover = new NpcMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 7: - scene->_stripManager.start(44, this); - break; - case 8: { - Common::Point pt(170, 260); - NpcMover *mover = new NpcMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 9: - scene->_dyingKzin.setAction(&scene->_action7); - scene->_object1.remove(); - _globals->_stripNum = 88; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.enableControl(); - scene->_assassin.setAction(&scene->_action8); - break; - } -} - -void Scene40::Action3::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.setAction(NULL); - _globals->_stripNum = 99; - _globals->_player.disableControl(); - Common::Point pt(240, 195); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_player.setVisage(5010); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_4, 5, 1, this); - break; - case 2: - scene->_assassin.setStrip(2); - scene->_assassin.setFrame(1); - RING_INVENTORY._infoDisk._sceneNumber = 1; - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(7); - _globals->_stripNum = 88; - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene40::Action4::signal() { - switch (_actionIndex++) { - case 0: { - Common::Point pt(178, 190); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_stripNum = 88; - _globals->_player.enableControl(); - break; - } -} - -void Scene40::Action5::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 120); - break; - case 1: - scene->_object2.animate(ANIM_MODE_8, 1, this); - _actionIndex = 0; - } -} - -void Scene40::Action6::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_object1.postInit(); - scene->_object1.setVisage(16); - scene->_object1.setStrip2(6); - scene->_object1._moveDiff = Common::Point(40, 40); - scene->_object1.setPosition(Common::Point(313, 53)); - scene->_object1._moveRate = 60; - - Common::Point pt(141, 194); - NpcMover *mover = new NpcMover(); - scene->_object1.addMover(mover, &pt, NULL); - scene->_object1.animate(ANIM_MODE_5, NULL); - - scene->_doorway.postInit(); - scene->_doorway.setVisage(46); - scene->_doorway.setPosition(Common::Point(305, 61)); - scene->_doorway.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(25); - break; - } - case 1: - scene->_soundHandler.play(28); - scene->_doorway.setPosition(Common::Point(148, 74)); - scene->_doorway.setFrame(1); - scene->_doorway.setStrip(2); - scene->_doorway.animate(ANIM_MODE_5, this); - break; - case 2: - remove(); - break; - } -} - -void Scene40::Action7::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(499) + 500); - break; - case 1: - scene->_object7.postInit(); - scene->_object7.setVisage(46); - - if (_globals->_randomSource.getRandomNumber(32767) >= 16384) { - scene->_object7.setStrip(3); - scene->_object7.setPosition(Common::Point(15, 185)); - } else { - scene->_object7.setPosition(Common::Point(305, 61)); - scene->_object7.setFrame(15); - } - scene->_object7.animate(ANIM_MODE_5, this); - scene->_soundHandler.play(25); - break; - case 2: - scene->_object7.remove(); - _actionIndex = 0; - setDelay(60); - break; - } -} - -void Scene40::Action8::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(300); - break; - case 1: - _globals->_player.disableControl(); - - if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) { - _actionIndex = 1; - setDelay(30); - } else { - scene->_doorway.postInit(); - scene->_doorway.setVisage(16); - scene->_doorway.setStrip2(6); - scene->_doorway.fixPriority(200); - scene->_doorway._moveRate = 60; - - if (_globals->_player._position.x >= 145) { - scene->_doorway.fixPriority(-1); - scene->_doorway.setPosition(Common::Point(6, 157)); - } else { - scene->_doorway.setPosition(Common::Point(313, 53)); - } - - scene->_doorway._moveDiff = Common::Point(40, 40); - Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18); - NpcMover *mover = new NpcMover(); - scene->_doorway.addMover(mover, &pt, this); - scene->_doorway.animate(ANIM_MODE_5, NULL); - } - break; - case 2: - scene->_doorway.remove(); - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_soundHandler.play(77, this); - break; - case 4: - _globals->_game->endGame(40, 45); - remove(); - break; - } -} - -void Scene40::Action8::dispatch() { - if (_action) - _action->dispatch(); - - if (_delayFrames) { - uint32 frameNumber = _globals->_events.getFrameNumber(); - if ((_startFrame + 60) < frameNumber) { - --_delayFrames; - _startFrame = frameNumber; - - if (_delayFrames <= 0) { - _delayFrames = 0; - signal(); - } - } - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene40::DyingKzin::doAction(int action) { - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(40, 44); - break; - case OBJECT_SCANNER: - SceneItem::display2(40, 43); - break; - case CURSOR_LOOK: - SceneItem::display2(40, 12); - break; - case CURSOR_USE: - SceneItem::display2(40, 18); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene40::Assassin::doAction(int action) { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - if (scene->_assassin._visage == 44) - SceneItem::display2(40, 21); - else { - _globals->_player.disableControl(); - Common::Point pt(230, 187); - NpcMover *mover = new NpcMover(); - addMover(mover, &pt, NULL); - scene->setAction(&scene->_action2); - } - break; - case OBJECT_SCANNER: - SceneItem::display2(40, (scene->_assassin._visage == 44) ? 22 : 23); - break; - case CURSOR_LOOK: - if (scene->_assassin._visage != 44) - SceneItem::display2(40, 13); - else - SceneItem::display2(40, (RING_INVENTORY._infoDisk._sceneNumber == 1) ? 19 : 14); - break; - case CURSOR_USE: - if (scene->_assassin._visage != 44) - SceneItem::display2(40, 15); - else if (RING_INVENTORY._infoDisk._sceneNumber == 1) - SceneItem::display2(40, 19); - else { - _globals->_player.disableControl(); - setAction(&scene->_action3); - } - break; - case CURSOR_TALK: - SceneItem::display2(40, 38); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene40::Item2::doAction(int action) { - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(40, 35); - _globals->_events.setCursor(CURSOR_WALK); - break; - case OBJECT_SCANNER: - SceneItem::display2(40, 34); - break; - case CURSOR_LOOK: - SceneItem::display2(40, 8); - break; - case CURSOR_USE: - SceneItem::display2(40, 36); - break; - case CURSOR_TALK: - SceneItem::display2(40, 37); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene40::Item6::doAction(int action) { - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(40, 25); - _globals->_events.setCursor(CURSOR_WALK); - break; - case OBJECT_SCANNER: - SceneItem::display2(40, 42); - break; - case CURSOR_LOOK: - SceneItem::display2(40, 6); - break; - case CURSOR_USE: - SceneItem::display2(40, 36); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene40::Scene40() : - _item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END), - _item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END), - _item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END), - _item5(0, CURSOR_LOOK, 40, 11, LIST_END), - _item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END), - _item8(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) { -} - -void Scene40::postInit(SceneObjectList *OwnerList) { - loadScene(40); - Scene::postInit(); - - setZoomPercents(0, 100, 200, 100); - _globals->_stripNum = 99; - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - - _speakerGameText._color1 = 9; - _speakerGameText.setTextPos(Common::Point(160, 30)); - _speakerQText._npc = &_globals->_player; - _speakerSText._npc = &_object1; - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(130, 220)); - _globals->_player.disableControl(); - - if (_globals->_sceneManager._previousScene == 20) { - _globals->_soundHandler.play(24); - _globals->_player.setVisage(43); - - _object1.postInit(); - _object1.setVisage(41); - _object1.setPosition(Common::Point(105, 220)); - _object2.postInit(); - _object2.setVisage(41); - _object2.setStrip(6); - _object2.fixPriority(200); - _object2.setPosition(Common::Point(94, 189)); - _object2.setAction(&_action5); - - _object3.postInit(); - _object3.setVisage(41); - _object3.setStrip(5); - _object3.fixPriority(205); - _object3.setPosition(Common::Point(110, 186)); - _object3._numFrames = 2; - _object3.animate(ANIM_MODE_8, NULL, NULL); - - _assassin.postInit(); - _assassin.setPosition(Common::Point(-40, 191)); - _globals->_sceneItems.push_back(&_assassin); - - _dyingKzin.postInit(); - _dyingKzin.setVisage(40); - _dyingKzin.setStrip(6); - _dyingKzin.setPosition(Common::Point(-90, 65)); - _dyingKzin.fixPriority(170); - - setAction(&_action1); - } else { - _doorway.postInit(); - _doorway.setVisage(46); - _doorway.setPosition(Common::Point(148, 74)); - _doorway.setStrip(2); - _doorway.setFrame(_doorway.getFrameCount()); - - _dyingKzin.postInit(); - _dyingKzin.setVisage(40); - _dyingKzin.setPosition(Common::Point(205, 183)); - _dyingKzin.fixPriority(170); - _dyingKzin._frame = 9; - _dyingKzin.setAction(&_action7); - - _assassin.postInit(); - _assassin.setVisage(44); - _assassin.setPosition(Common::Point(230, 187)); - _assassin.setAction(&_action8); - - if (RING_INVENTORY._infoDisk._sceneNumber == 40) { - _assassin.setStrip(1); - _assassin.setFrame(_assassin.getFrameCount()); - } else { - _assassin.setStrip(2); - } - - _globals->_sceneItems.push_back(&_assassin); - _globals->_player.setPosition(Common::Point(170, 220)); - - setAction(&_action4); - } - - _item5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _item6._sceneRegionId = 3; - _item2._sceneRegionId = 7; - - _globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4, - &_item6, &_item7, &_item5, NULL); -} - -void Scene40::signal() { - if (_sceneMode == 41) - _globals->_sceneManager.changeScene(50); -} - -void Scene40::dispatch() { - if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) { - _globals->_player.disableControl(); - _globals->_stripNum = 0; - _globals->_player.setAction(NULL); - _sceneMode = 41; - setAction(&_sequenceManager, this, 41, &_globals->_player, NULL); - - if (_globals->_sceneManager._previousScene == 20) { - _dyingKzin.setAction(&_action6); - } - } - - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 50 - By Flycycles - * - *--------------------------------------------------------------------------*/ - -void Scene50::Action1::signal() { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(63, this); - break; - case 2: - if (scene->_stripManager._field2E8 != 107) { - _globals->_player.enableControl(); - remove(); - } else { - Common::Point pt(282, 139); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - } - break; - case 3: - _globals->_stripNum = -1; - _globals->_sceneManager.changeScene(60); - break; - } -} - -void Scene50::Action2::signal() { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - scene->_stripManager.start(66, this); - break; - case 1: { - Common::Point pt(141, 142); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_sceneManager.changeScene(40); - remove(); - break; - } -} - -void Scene50::Action3::signal() { - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(136, 185); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_sceneManager.changeScene(60); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene50::Object1::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(50, 20); - break; - case OBJECT_SCANNER: - SceneItem::display2(50, 19); - break; - case CURSOR_LOOK: - SceneItem::display2(50, 4); - break; - case CURSOR_USE: - SceneItem::display2(50, 21); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->_sceneMode = 52; - scene->setAction(&scene->_sequenceManager, scene, 52, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene50::Object2::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(50, 11); - break; - case OBJECT_SCANNER: - SceneItem::display2(50, 10); - break; - case CURSOR_LOOK: - SceneItem::display2(50, 1); - break; - case OBJECT_INFODISK: - case CURSOR_USE: - _globals->_stripNum = 50; - scene->setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene50::Object3::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(50, 11); - break; - case OBJECT_SCANNER: - SceneItem::display2(50, 10); - break; - case CURSOR_LOOK: - SceneItem::display2(50, 1); - break; - case OBJECT_INFODISK: - case CURSOR_USE: - SceneItem::display2(50, 8); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->_sceneMode = 52; - scene->setAction(&scene->_sequenceManager, scene, 52, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene50::Object4::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(50, 11); - break; - case OBJECT_SCANNER: - SceneItem::display2(50, 10); - break; - case CURSOR_LOOK: - SceneItem::display2(50, 1); - break; - case OBJECT_INFODISK: - case CURSOR_USE: - _globals->_player.disableControl(); - _globals->_stripNum = 0; - scene->_sceneMode = 51; - scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene50::Scene50() : - _item0(0, CURSOR_LOOK, 50, 3, LIST_END), - _item1(0, OBJECT_SCANNER, 50, 15, CURSOR_USE, 50, 16, CURSOR_LOOK, 50, 3, LIST_END), - _item2(0, CURSOR_LOOK, 50, 7, LIST_END), - _item3(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 50, 3, LIST_END), - _item4(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END), - _item5(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) { - - _doorwayRect = Rect(80, 108, 160, 112); -} - -void Scene50::postInit(SceneObjectList *OwnerList) { - loadScene(50); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._canWalk = false; - _globals->_player.changeZoom(75); - _globals->_player._moveDiff.y = 3; - - if (_globals->_sceneManager._previousScene == 40) { - _globals->_player.setPosition(Common::Point(128, 123)); - } else if (_globals->_stripNum == 50) { - _globals->_player.setPosition(Common::Point(136, 185)); - } else { - _globals->_player.setPosition(Common::Point(270, 143)); - } - - _object2.postInit(); - _object2.setVisage(2331); - _object2.setStrip(6); - _object2.setPosition(Common::Point(136, 192)); - _object2.fixPriority(200); - - _object3.postInit(); - _object3.setVisage(2337); - _object3.setStrip(6); - _object3.setPosition(Common::Point(260, 180)); - _object3.fixPriority(200); - - _object4.postInit(); - _object4.setVisage(2331); - _object4.setStrip(6); - _object4.setPosition(Common::Point(295, 144)); - _object4.fixPriority(178); - - _globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL); - - if (!_globals->getFlag(101)) { - _globals->_player.disableControl(); - _globals->setFlag(101); - setAction(&_action1); - } else { - _globals->_player.enableControl(); - - if (_globals->_sceneManager._previousScene == 40) { - _globals->_player.disableControl(); - _sceneMode = 54; - setAction(&_sequenceManager, this, 54, &_globals->_player, NULL); - } - } - - _item0.setBounds(Rect(200, 0, 320, 200)); - _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL); -} - -void Scene50::signal() { - switch (_sceneMode) { - case 51: - _globals->_sceneManager.changeScene(60); - break; - case 55: - _globals->_sceneManager.changeScene(40); - break; - case 52: - case 54: - _globals->_player.enableControl(); - break; - } -} - -void Scene50::dispatch() { - Scene::dispatch(); - - if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) { - // Player in house doorway, start player moving to within - _globals->_player.disableControl(); - _sceneMode = 55; - Common::Point pt(89, 111); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - } -} - -/*-------------------------------------------------------------------------- - * Scene 60 - Flycycle controls - * - *--------------------------------------------------------------------------*/ - -void Scene60::Action1::signal() { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - scene->_floppyDrive.postInit(); - scene->_floppyDrive.setVisage(60); - scene->_floppyDrive.setStrip(7); - scene->_floppyDrive.setPosition(Common::Point(136, 65)); - scene->_floppyDrive.animate(ANIM_MODE_5, this); - - scene->_soundHandler1.play(35); - break; - case 2: - scene->_redLights.postInit(); - scene->_redLights.setVisage(60); - scene->_redLights.setPosition(Common::Point(199, 186)); - scene->_redLights.animate(ANIM_MODE_8, 0, NULL); - scene->_redLights._numFrames = 5; - - scene->_controlButton.animate(ANIM_MODE_2, NULL); - - if (!_globals->getFlag(83)) { - scene->_message.postInit(); - scene->_message.setVisage(60); - scene->_message.setStrip2(3); - scene->_message.setFrame(2); - scene->_message.setPosition(Common::Point(148, 85)); - scene->_message.animate(ANIM_MODE_2, NULL); - scene->_message._numFrames = 5; - - _globals->_sceneItems.push_front(&scene->_message); - scene->_soundHandler2.play(38); - } - - _globals->_events.setCursor(CURSOR_USE); - break; - case 3: - scene->_soundHandler2.play(37); - scene->loadScene(65); - scene->_message.remove(); - - if (_globals->_sceneObjects->contains(&scene->_redLights)) - scene->_redLights.remove(); - - scene->_controlButton.remove(); - scene->_slaveButton.remove(); - scene->_masterButton.remove(); - scene->_item1.remove(); - scene->_item2.remove(); - - scene->_nextButton.postInit(); - scene->_nextButton.setVisage(65); - scene->_nextButton.setPosition(Common::Point(118, 197)); - - scene->_prevButton.postInit(); - scene->_prevButton.setVisage(65); - scene->_prevButton.setStrip(2); - scene->_prevButton.setPosition(Common::Point(160, 197)); - - scene->_exitButton.postInit(); - scene->_exitButton.setVisage(65); - scene->_exitButton.setStrip(3); - scene->_exitButton.setPosition(Common::Point(202, 197)); - - scene->_rose.postInit(); - scene->_rose.setVisage(65); - scene->_rose.setStrip(4); - scene->_rose.setFrame(1); - scene->_rose.setPosition(Common::Point(145, 165)); - - _globals->_sceneItems.push_front(&scene->_nextButton); - _globals->_sceneItems.push_front(&scene->_prevButton); - _globals->_sceneItems.push_front(&scene->_exitButton); - setDelay(10); - - _globals->_events.setCursor(CURSOR_USE); - break; - case 4: - _globals->setFlag(90); - // Deliberate fall-through - case 5: - case 6: - case 7: - SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75, - SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0, - SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); - _globals->_events.setCursor(CURSOR_USE); - break; - case 9: - _globals->_player._uiEnabled = false; - RING_INVENTORY._infoDisk._sceneNumber = 1; - - if (_globals->_sceneObjects->contains(&scene->_message)) - scene->_message.remove(); - - scene->_controlButton.animate(ANIM_MODE_NONE); - scene->_controlButton.setFrame(1); - scene->_redLights.remove(); - - scene->_floppyDrive.postInit(); - scene->_floppyDrive.setVisage(60); - scene->_floppyDrive.setStrip(7); - scene->_floppyDrive.setPosition(Common::Point(136, 65)); - scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount()); - scene->_floppyDrive.animate(ANIM_MODE_6, this); - - scene->_soundHandler1.play(35); - scene->_soundHandler3.stop(); - - scene->_masterButton.setFrame(1); - scene->_masterButton._state = 0; - - _globals->clearFlag(103); - _globals->clearFlag(!_globals->_stripNum ? 116 : 119); - break; - case 10: - setDelay(60); - break; - case 11: - _globals->_player._uiEnabled = true; - scene->_floppyDrive.remove(); - remove(); - break; - case 8: - default: - break; - } -} - -void Scene60::Action2::signal() { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - case 2: - setDelay(3); - break; - case 1: - scene->_stripManager.start(66, this); - break; - case 3: - _globals->_sceneManager.changeScene(50); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene60::PrevObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 16); - } else if (action == CURSOR_USE) { - animate(ANIM_MODE_8, 1, NULL); - - if (scene->_action1.getActionIndex() > 5) { - scene->_soundHandler3.play(36); - scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2); - scene->_action1.setDelay(1); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::NextObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 17); - } else if (action == CURSOR_USE) { - animate(ANIM_MODE_8, 1, NULL); - - if (scene->_action1.getActionIndex() < 8) { - scene->_soundHandler3.play(36); - scene->_action1.setDelay(1); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::ExitObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 18); - } else if (action == CURSOR_USE) { - scene->_soundHandler3.play(36); - animate(ANIM_MODE_8, 1, NULL); - scene->_nextButton.remove(); - scene->_prevButton.remove(); - scene->_exitButton.remove(); - scene->_rose.remove(); - - SceneItem::display(0, 0); - scene->loadScene(60); - - scene->_controlButton.postInit(); - scene->_controlButton.setVisage(60); - scene->_controlButton.setStrip(5); - scene->_controlButton.setPosition(Common::Point(233, 143)); - scene->_controlButton.animate(ANIM_MODE_2, NULL); - - scene->_slaveButton.postInit(); - scene->_slaveButton.setVisage(60); - scene->_slaveButton.setStrip(8); - scene->_slaveButton.setPosition(Common::Point(143, 125)); - - scene->_masterButton.postInit(); - scene->_masterButton.setVisage(60); - scene->_masterButton.setStrip(8); - scene->_masterButton.setPosition(Common::Point(143, 105)); - - _globals->_sceneItems.push_front(&scene->_masterButton); - _globals->_sceneItems.push_front(&scene->_slaveButton); - - scene->_redLights.postInit(); - scene->_redLights.setVisage(60); - scene->_redLights.setPosition(Common::Point(199, 186)); - scene->_redLights.animate(ANIM_MODE_8, 0, NULL); - scene->_redLights._numFrames = 5; - scene->_redLights.setAction(&scene->_sequenceManager, scene, 61, NULL); - - if (scene->_slaveButton._state) - scene->_slaveButton.setFrame(2); - if (scene->_masterButton._state) - scene->_masterButton.setFrame(2); - - _globals->_sceneItems.push_front(&scene->_item1); - _globals->_sceneItems.push_front(&scene->_controlButton); - _globals->_sceneItems.push_front(&scene->_slaveButton); - _globals->_sceneItems.push_front(&scene->_masterButton); - _globals->_sceneItems.push_back(&scene->_item2); - - _globals->gfxManager()._font.setFontNumber(2); - _globals->_sceneText._fontNumber = 2; - - scene->_action1.setActionIndex(2); - scene->_action1.setDelay(1); - scene->_sceneMode = 9999; - scene->signal(); - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::MessageObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 9); - } else if (action == CURSOR_USE) { - scene->_action1.setDelay(1); - _globals->setFlag(83); - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::ControlObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 11); - } else if (action == CURSOR_USE) { - if (_animateMode == ANIM_MODE_NONE) - SceneItem::display2(60, 14); - else if (!scene->_slaveButton._state) { - _globals->_soundHandler.play(40); - _globals->_soundHandler.holdAt(true); - _globals->_sceneManager.changeScene(20); - } else { - scene->_sceneMode = 15; - setAction(&scene->_sequenceManager, scene, 62, NULL); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::SlaveObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 8); - } else if (action == CURSOR_USE) { - if (scene->_masterButton._state) - scene->_sceneMode = 19; - else if (_state) { - scene->_soundHandler3.stop(); - animate(ANIM_MODE_6, NULL); - _globals->clearFlag(102); - _globals->clearFlag(!_globals->_stripNum ? 117 : 120); - _state = 0; - scene->_sceneMode = 9998; - } else { - scene->_soundHandler3.play(39); - _globals->setFlag(102); - _globals->setFlag(!_globals->_stripNum ? 117 : 120); - animate(ANIM_MODE_5, NULL); - _state = 1; - scene->_sceneMode = 9998; - } - - setAction(&scene->_sequenceManager, scene, 62, NULL); - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::MasterObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 7); - } else if (action == CURSOR_USE) { - if (!scene->_controlButton._animateMode) - scene->_sceneMode = 14; - else if (scene->_slaveButton._state) - scene->_sceneMode = 20; - else if (_state) { - scene->_soundHandler3.stop(); - animate(ANIM_MODE_6, NULL); - _state = 0; - _globals->clearFlag(103); - _globals->clearFlag(!_globals->_stripNum ? 116 : 119); - scene->_sceneMode = 9998; - } else { - scene->_soundHandler3.play(39); - animate(ANIM_MODE_5, NULL); - _state = 1; - _globals->setFlag(103); - _globals->setFlag(!_globals->_stripNum ? 116 : 119); - scene->_sceneMode = 9998; - } - - setAction(&scene->_sequenceManager, scene, 62, NULL); - } else { - SceneHotspot::doAction(action); - } -} - -void Scene60::FloppyDrive::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(60, 13); - } else if (action == CURSOR_USE) { - _globals->setFlag(!_globals->_stripNum ? 118 : 121); - scene->setAction(&scene->_action1); - } else { - SceneHotspot::doAction(action); - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene60::Item1::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_INFODISK: - RING_INVENTORY._infoDisk._sceneNumber = 60; - _globals->setFlag(!_globals->_stripNum ? 118 : 121); - scene->_sceneMode = 0; - scene->setAction(&scene->_action1); - break; - case CURSOR_LOOK: - SceneItem::display2(60, 10); - break; - case CURSOR_USE: - if (RING_INVENTORY._infoDisk._sceneNumber == 60) { - if (_globals->getFlag(118) && !_globals->_stripNum) { - _globals->clearFlag(118); - scene->setAction(&scene->_action1); - scene->_action1.setActionIndex(9); - scene->_action1.setDelay(1); - } - if (_globals->getFlag(121) && !_globals->_stripNum) { - _globals->clearFlag(121); - scene->setAction(&scene->_action1); - scene->_action1.setActionIndex(9); - scene->_action1.setDelay(1); - } - } else if (RING_INVENTORY._infoDisk._sceneNumber == 1) { - scene->_sceneMode = 0; - setAction(&scene->_sequenceManager, scene, 62, NULL); - } else { - scene->setAction(&scene->_action2); - } - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene60::Item::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(60, _messageNum); - break; - case CURSOR_USE: - scene->_sceneMode = _sceneMode; - setAction(&scene->_sequenceManager, this, 62, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene60::Scene60() : - _item2(0, 12, 12), - _item3(8, 22, 23), - _item4(9, 24, 25), - _item5(10, 26, 27), - _item6(11, 28, 29) { -} - -void Scene60::postInit(SceneObjectList *OwnerList) { - loadScene(60); - Scene::postInit(); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - - _slaveButton.postInit(); - _slaveButton.setVisage(60); - _slaveButton.setStrip(8); - _slaveButton.setPosition(Common::Point(143, 125)); - _slaveButton._state = 0; - - _masterButton.postInit(); - _masterButton.setVisage(60); - _masterButton.setStrip(8); - _masterButton.setPosition(Common::Point(143, 105)); - _masterButton._state = 0; - - _globals->_sceneItems.push_back(&_masterButton); - _globals->_sceneItems.push_back(&_slaveButton); - - _controlButton.postInit(); - _controlButton.setVisage(60); - _controlButton.setStrip(5); - _controlButton.setPosition(Common::Point(233, 143)); - _globals->_sceneItems.push_back(&_controlButton); - - if (_globals->_stripNum == -1) { - _globals->_stripNum = 0; - } else { - _globals->_player.disableControl(); - _sceneMode = 9999; - setAction(&_sequenceManager, this, 61, NULL); - } - - _item1.setBounds(Rect(130, 55, 174, 70)); - _item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - - if (_globals->_stripNum == 0) { - if (_globals->getFlag(117)) { - _slaveButton._state = 1; - _slaveButton.setFrame(2); - } - - if (_globals->getFlag(116)) { - _masterButton._state = 1; - _masterButton.setFrame(2); - } - - if (_globals->getFlag(118)) { - _controlButton.animate(ANIM_MODE_2, NULL); - - _redLights.postInit(); - _redLights.setVisage(60); - _redLights.setPosition(Common::Point(199, 186)); - _redLights.animate(ANIM_MODE_8, 0, NULL); - - _soundHandler1.play(35); - - if (!_globals->getFlag(83)) { - _message.postInit(); - _message.setVisage(60); - _message.setStrip2(3); - _message.setFrame(2); - _message.setPosition(Common::Point(148, 85)); - _message.animate(ANIM_MODE_2, NULL); - _message._numFrames = 5; - _globals->_sceneItems.push_front(&_message); - - _soundHandler2.play(38); - } - } - } else { - if (_globals->getFlag(120)) { - _slaveButton._state = 1; - _slaveButton.setFrame(2); - } - - if (_globals->getFlag(119)) { - _masterButton._state = 1; - _masterButton.setFrame(2); - } - - if (_globals->getFlag(121)) { - _controlButton.animate(ANIM_MODE_2, NULL); - - _redLights.postInit(); - _redLights.setVisage(60); - _redLights.setPosition(Common::Point(199, 186)); - _redLights.animate(ANIM_MODE_8, 0, NULL); - _redLights._numFrames = 5; - - _soundHandler1.play(35); - - if (!_globals->getFlag(83)) { - _message.postInit(); - _message.setVisage(60); - _message.setStrip2(3); - _message.setFrame(2); - _message.setPosition(Common::Point(148, 85)); - _message.animate(ANIM_MODE_2, NULL); - _message._numFrames = 5; - _globals->_sceneItems.push_front(&_message); - - _soundHandler2.play(38); - } - } - } - - _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6, - &_item1, &_item2, NULL); -} - -void Scene60::signal() { - if (_sceneMode != 0) { - if (_sceneMode == 9998) { - _globals->_events.setCursor(CURSOR_USE); - } else if (_sceneMode == 9999) { - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - - _gfxButton.setText(EXIT_MSG); - _gfxButton._bounds.center(160, 193); - _gfxButton.draw(); - _gfxButton._bounds.expandPanes(); - } else { - SceneItem::display2(60, _sceneMode); - _globals->_events.setCursor(CURSOR_USE); - } - } -} - -void Scene60::process(Event &event) { - Scene::process(event); - - if (_screenNumber == 60) { - if (_gfxButton.process(event)) - _globals->_sceneManager.changeScene(50); - } -} - -/*-------------------------------------------------------------------------- - * Scene 90 - Shipyard Entrance - * - *--------------------------------------------------------------------------*/ - -void Scene90::Action1::signal() { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - _globals->_scenePalette.addRotation(64, 72, -1); - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(90, this); - break; - case 2: - setDelay(2); - break; - case 3: { - Common::Point pt(278, 191); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 4: - scene->_object2.setStrip(3); - setDelay(2); - break; - case 5: - scene->_soundHandler2.play(58); - - if (scene->_stripManager._field2E8 == 220) - scene->_stripManager.start(91, this, scene); - else { - scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene); - _actionIndex = 7; - } - break; - case 6: - scene->_object2.animate(ANIM_MODE_NONE); - _globals->_player._uiEnabled = true; - break; - case 7: - scene->_object2.animate(ANIM_MODE_NONE); - _globals->_soundHandler.play(56); - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 8: { - Common::Point pt(215, 127); - PlayerMover *mover = new PlayerMover(); - scene->_object5.addMover(mover, &pt, this); - break; - } - case 9: { - Common::Point pt1(215, 127); - PlayerMover *mover1 = new PlayerMover(); - scene->_object1.addMover(mover1, &pt1, this); - Common::Point pt2(86, 62); - PlayerMover *mover2 = new PlayerMover(); - scene->_object5.addMover(mover2, &pt2, this); - break; - } - case 10: { - PlayerMover2 *mover = new PlayerMover2(); - scene->_object1.addMover(mover, 10, 15, &scene->_object5); - - if (!_globals->getFlag(104)) { - mover = new PlayerMover2(); - scene->_object4.addMover(mover, 10, 15, &scene->_object1); - } - setDelay(60); - break; - } - case 11: - _globals->_soundHandler.play(57); - _globals->_soundHandler.play(68); - scene->_object3.animate(ANIM_MODE_6, NULL); - - SceneItem::display(90, _globals->getFlag(104) ? 15 : 14, - SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END); - break; - case 12: - SceneItem::display(0, 0); - _globals->_scenePalette.clearListeners(); - _globals->_sceneManager.changeScene(95); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene90::Object1::doAction(int action) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(90, 7); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 97; - setAction(&scene->_sequenceManager, scene, 97, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene90::Object2::doAction(int action) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_object6.postInit(); - scene->_object6.setVisage(90); - scene->_object6.setStrip(6); - scene->_object6.setPosition(Common::Point(184, 210)); - scene->_object6.hide(); - - scene->_sceneMode = 91; - scene->_soundHandler1.play(59); - scene->_soundHandler1.holdAt(true); - scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL); - break; - case CURSOR_LOOK: - SceneItem::display2(90, 8); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - setAction(&scene->_sequenceManager, scene, 96, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene90::Scene90() : - _item1(0, CURSOR_LOOK, 90, 9, LIST_END), - _item2(0, CURSOR_LOOK, 90, 10, LIST_END), - _item3(0, CURSOR_LOOK, 90, 11, LIST_END), - _object3(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END), - _object4(CURSOR_LOOK, 90, 17, LIST_END), - _object5(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) { -} - -void Scene90::stripCallback(int v) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; - - if (v == 1) - scene->_object2.animate(ANIM_MODE_7, NULL); - else if (v == 2) - scene->_object2.animate(ANIM_MODE_NONE); -} - -void Scene90::postInit(SceneObjectList *OwnerList) { - loadScene(90); - Scene::postInit(); - - setZoomPercents(70, 10, 180, 100); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerSR); - - _speakerMText._npc = &_object2; - _speakerQText._textWidth = 160; - _speakerQText._npc = &_object5; - _speakerSText._npc = &_object1; - - _object5.postInit(); - _object5.setVisage(2333); - _object5.setObjectWrapper(new SceneObjectWrapper()); - _object5._strip = 7; - _object5._moveDiff = Common::Point(22, 22); - _object5.setPosition(Common::Point(151, 177)); - _object5.changeZoom(-1); - _globals->_sceneItems.push_back(&_object5); - - _object1.postInit(); - _object1.setVisage(2337); - _object1.setObjectWrapper(new SceneObjectWrapper()); - _object1._strip = 4; - _object1._moveDiff = Common::Point(20, 20); - _object1.setPosition(Common::Point(212, 183)); - _object1.changeZoom(-1); - _globals->_sceneItems.push_back(&_object1); - - if (!_globals->getFlag(104)) { - _object4.postInit(); - _object4.setVisage(2331); - _object4.setObjectWrapper(new SceneObjectWrapper()); - _object4._strip = 4; - _object4._moveDiff = Common::Point(20, 20); - _object4.setPosition(Common::Point(251, 207)); - _object4.changeZoom(-1); - _globals->_sceneItems.push_back(&_object4); - } - - _object2.postInit(); - _object2.setVisage(90); - _object2.animate(ANIM_MODE_1, NULL); - _object2.setPosition(Common::Point(315, 185)); - _object2._strip = 2; - _globals->_sceneItems.push_back(&_object2); - - _object3.postInit(); - _object3.setVisage(90); - _object3.animate(ANIM_MODE_1, NULL); - _object3.setPosition(Common::Point(196, 181)); - _object3.fixPriority(175); - _globals->_sceneItems.push_back(&_object3); - - _globals->_player.disableControl(); - _globals->_soundHandler.play(55); - _soundHandler1.play(52); - _soundHandler1.holdAt(true); - - setAction(&_action1); - - _item3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _item1.setBounds(Rect(271, 65, 271, 186)); - _item2.setBounds(Rect(0, 17, 124, 77)); - - _globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL); -} - -void Scene90::signal() { - switch (_sceneMode) { - case 91: - _sceneMode = 92; - _globals->_soundHandler.play(77, this); - break; - case 92: - _globals->_scenePalette.clearListeners(); - _globals->_game->endGame(90, 6); - break; - case 96: - _globals->_player.enableControl(); - break; - case 97: - _stripManager._field2E8 = 0; - _action1.setActionIndex(5); - _action1.setDelay(1); - break; - default: - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 95 - Ship Close-up - * - *--------------------------------------------------------------------------*/ - -void Scene95::Action1::signal() { - Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _state = 6; - setDelay(60); - break; - case 1: - if (_state) { - SceneItem::display(95, _state % 2, SET_FONT, 2, - SET_EXT_BGCOLOR, -1, SET_EXT_BGCOLOR, 20, - SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, SET_TEXT_MODE, 1, LIST_END); - --_state; - _actionIndex = 1; - } - setDelay(60); - break; - case 2: { - scene->_soundHandler.play(66); - scene->_object3._numFrames = 5; - scene->_object3.animate(ANIM_MODE_5, NULL); - SceneItem::display(0, 0); - - Common::Point pt1(5, 198); - NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); - - Common::Point pt2(9, 190); - NpcMover *mover2 = new NpcMover(); - scene->_object1.addMover(mover2, &pt2, NULL); - break; - } - case 3: { - scene->_soundHandler.play(21); - - Common::Point pt1(235, 72); - PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, NULL); - - Common::Point pt2(235, 72); - PlayerMover *mover2 = new PlayerMover(); - scene->_object1.addMover(mover2, &pt2, NULL); - - SceneItem::display(95, 2, SET_Y, 45, SET_FONT, 2, - SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 13, SET_WIDTH, 200, - SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(240); - break; - } - case 4: - scene->_object3.remove(); - - SceneItem::display(95, 3, SET_Y, 45, SET_FONT, 2, - SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, - SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(240); - break; - case 5: - SceneItem::display(95, 4, SET_Y, 45, SET_FONT, 2, - SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, - SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(240); - break; - case 6: - setDelay(20); - break; - case 7: { - SceneItem::display(0, 0); - _globals->_player.setVisage(92); - _globals->_player.setPosition(Common::Point(-25, 200)); - scene->_object1.setVisage(91); - scene->_object1.setPosition(Common::Point(-22, 220)); - - scene->_soundHandler.play(21); - - Common::Point pt1(5, 198); - NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); - - Common::Point pt2(9, 190); - NpcMover *mover2 = new NpcMover(); - scene->_object1.addMover(mover2, &pt2, NULL); - break; - } - case 8: { - Common::Point pt1(108, 112); - PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); - - Common::Point pt2(108, 112); - PlayerMover *mover2 = new PlayerMover(); - scene->_object1.addMover(mover2, &pt2, NULL); - break; - } - case 9: - _globals->_sceneManager.changeScene(2300); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene95::Scene95() { -} - -void Scene95::postInit(SceneObjectList *OwnerList) { - loadScene(95); - Scene::postInit(); - setZoomPercents(100, 10, 200, 100); - - _globals->_player.postInit(); - _globals->_player.setVisage(2337); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._strip = 4; - _globals->_player._moveDiff = Common::Point(30, 30); - _globals->_player.setPosition(Common::Point(-35, 200)); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); - - _object1.postInit(); - _object1.setVisage(2333); - _object1.setPosition(Common::Point(-22, 220)); - _object1.animate(ANIM_MODE_1, NULL); - _object1.setObjectWrapper(new SceneObjectWrapper()); - _object1._moveDiff = Common::Point(30, 30); - _object1.changeZoom(-1); - - _object3.postInit(); - _object3.setVisage(96); - _object3.setPosition(Common::Point(29, 198)); - - _soundHandler.play(67); - setAction(&_action1); -} - -/*-------------------------------------------------------------------------- - * Scene 6100 - Sunflower navigation sequence - * - *--------------------------------------------------------------------------*/ - -void Scene6100::Action1::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->showMessage(SCENE6100_CAREFUL, 13, this); - break; - case 1: - scene->showMessage(SCENE6100_TOUGHER, 35, this); - break; - case 2: - scene->showMessage(NULL, 0, NULL); - remove(); - break; - } -} - -void Scene6100::Action2::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->showMessage(SCENE6100_ONE_MORE_HIT, 13, this); - break; - case 1: - scene->showMessage(SCENE6100_DOING_BEST, 35, this); - break; - case 2: - scene->showMessage(NULL, 0, NULL); - remove(); - break; - } -} - -void Scene6100::Action3::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_speed = 0; - setDelay(60); - break; - case 1: - _globals->_scenePalette.clearListeners(); - scene->_fadePercent = 100; - _globals->_scenePalette.refresh(); - scene->loadScene(9997); - scene->_object1.hide(); - scene->_object2.hide(); - scene->_object3.hide(); - scene->_sunflower1.hide(); - scene->_sunflower2.hide(); - scene->_sunflower3.hide(); - scene->_rocks.hide(); - scene->_sceneText.hide(); - - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(8120, this); - break; - case 2: - scene->showMessage(SCENE6100_REPAIR, 7, this); - break; - case 3: - scene->showMessage(NULL, 0, NULL); - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(8130, this); - break; - case 4: - _globals->setFlag(76); - _globals->_sceneManager.changeScene( - (scene->_stripManager._field2E8 == 135) ? 6100 : 2320); - remove(); - break; - } -} - -void Scene6100::Action4::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->showMessage(SCENE6100_ROCKY_AREA, 13, this); - break; - case 1: - scene->showMessage(SCENE6100_REPLY, 35, this); - break; - case 2: - scene->showMessage(NULL, 0, NULL); - remove(); - break; - } -} - -void Scene6100::Action5::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - FloatSet zeroSet; - const double MULTIPLY_FACTOR = 0.01744; // 2 * pi / 360 - - if (scene->_turnAmount) { - scene->_angle = (scene->_turnAmount + scene->_angle) % 360; - - for (int objIndex = 1; objIndex <= 3; ++objIndex) { - SceneObject *obj = &scene->_object1; - if (objIndex == 2) obj = &scene->_object2; - if (objIndex == 3) obj = &scene->_object3; - - obj->_position.x += scene->_turnAmount * 2; - if (obj->_position.x >= 320) - obj->_position.x -= 480; - if (obj->_position.x < -160) - obj->_position.x += 480; - } - } - - scene->_object1._flags |= OBJFLAG_PANES; - scene->_object2._flags |= OBJFLAG_PANES; - scene->_object3._flags |= OBJFLAG_PANES; - - double distance = scene->_speed; - double angle = (double)scene->_angle * MULTIPLY_FACTOR; - scene->_probe._floats._float1 += sin(angle) * distance; - scene->_probe._floats._float2 += cos(angle) * distance; - - for (int idx = 0; idx < 4; ++idx) { - FloatSet tempSet = scene->_objList[idx]->_floats; - tempSet.add(-scene->_probe._floats._float1, -scene->_probe._floats._float2, - -scene->_probe._floats._float3); - - tempSet.proc1(scene->_angle * MULTIPLY_FACTOR); - - double sqrtVal = tempSet.sqrt(zeroSet); - if (sqrtVal != 0.0) { - scene->_objList[idx]->_position.y = static_cast(13800.0 / sqrtVal + 62.0); - } - - scene->_objList[idx]->_position.x = static_cast( - 160.0 - (330.0 / (tempSet._float2 + 330.0) * tempSet._float1)); - scene->_objList[idx]->dispatch(); - - if (tempSet._float2 < 0) { - scene->_objList[idx]->_position.y = 300; - - if (idx != 3) { - scene->_objList[idx]->_floats._float1 = - _globals->_randomSource.getRandomNumber(199); - scene->_objList[idx]->_floats._float2 = - _globals->_randomSource.getRandomNumber(999) + 750.0; - - scene->_objList[idx]->_floats.proc1( - -(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR); - scene->_objList[idx]->_floats.add(scene->_probe._floats._float1, - scene->_probe._floats._float2, scene->_probe._floats._float3); - } - } - - if (idx == 3) { - scene->_rocksCheck = (ABS((int)tempSet._float1) < 100) && (tempSet._float2 > 0); - } - - scene->_objList[idx]->_flags |= OBJFLAG_PANES; - - if ((idx != 3) && (scene->_fadePercent == 100) && - (tempSet.sqrt(zeroSet) < 150.0)) { - switch (scene->_hitCount++) { - case 0: - scene->_soundHandler.play(233); - scene->showMessage(NULL, 0, NULL); - - if (!_globals->getFlag(76)) - scene->_probe.setAction(&scene->_action1); - break; - case 1: - scene->_soundHandler.play(233); - scene->showMessage(NULL, 0, NULL); - - if (!_globals->getFlag(76)) - scene->_probe.setAction(&scene->_action2); - break; - case 2: - scene->_soundHandler.play(234); - scene->showMessage(NULL, 0, NULL); - - if (!_globals->getFlag(76)) - scene->_probe.setAction(NULL); - scene->setAction(&scene->_action3); - break; - } - - _globals->_scenePalette.clearListeners(); - scene->_fadePercent = 0; - } - } -} - -void Scene6100::GetBoxAction::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_turnAmount = 0; - Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y + 10); - ProbeMover *mover = new ProbeMover(); - scene->_probe.addMover(mover, &pt, NULL); - scene->_probe.show(); - break; - } - case 1: { - scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this); - _globals->_scenePalette.clearListeners(); - - Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10); - NpcMover *mover = new NpcMover(); - scene->_probe.addMover(mover, &pt, NULL); - break; - } - case 2: - scene->_probe._percent = 4; - scene->showMessage(SCENE6100_SURPRISE, 13, this); - break; - case 3: - scene->showMessage(SCENE6100_SWEAT, 35, this); - break; - case 4: - scene->showMessage(SCENE6100_VERY_WELL, 13, this); - break; - case 5: - scene->showMessage(NULL, 0, NULL); - _globals->_sceneManager.changeScene(2320); - remove(); - } -} - -void Scene6100::GetBoxAction::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) { - if (scene->_getBoxAction._actionIndex == 1) { - scene->_speed = 0; - scene->_getBoxAction.signal(); - } - - if (scene->_probe._percent > 4) - // Handle the probe disappearing into the rocks - scene->_probe._percent = scene->_probe._percent * 7 / 8; - scene->_probe._flags |= OBJFLAG_PANES; - } - - Action::dispatch(); -} - -void Scene6100::Action7::signal() { - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - setDelay(90); - break; - case 2: - _globals->_sceneManager.changeScene(2100); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene6100::Object::synchronize(Serializer &s) { - SceneObject::synchronize(s); - - // Save the double fields of the FloatSet - s.syncAsDouble(_floats._float1); - s.syncAsDouble(_floats._float2); - s.syncAsDouble(_floats._float3); - s.syncAsDouble(_floats._float4); -} - -/*--------------------------------------------------------------------------*/ - -void Scene6100::ProbeMover::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; - - if (!dontMove()) { - if (scene->_speed > 0) { - scene->_action5.dispatch(); - scene->_speed = (scene->_speed * 4) / 5; - } - } - - NpcMover::dispatch(); -} - -/*--------------------------------------------------------------------------*/ - -void Scene6100::Item1::doAction(int action) { - SceneItem::display2(4000, 0); -} - -/*--------------------------------------------------------------------------*/ - -Scene6100::Scene6100(): Scene() { - _objList[0] = &_sunflower1; - _objList[1] = &_sunflower2; - _objList[2] = &_sunflower3; - _objList[3] = &_rocks; - - _speed = 30; - _fadePercent = 100; - _rocksCheck = false; - _hitCount = 0; - _turnAmount = 0; - _angle = 0; - _msgActive = false; - - _globals->_sceneHandler._delayTicks = 8; - - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_WALK); -} - -void Scene6100::synchronize(Serializer &s) { - Scene::synchronize(s); - - s.syncAsSint16LE(_speed); - s.syncAsSint16LE(_fadePercent); - s.syncAsByte(_rocksCheck); - s.syncAsByte(_msgActive); - s.syncAsSint16LE(_hitCount); - s.syncAsSint16LE(_turnAmount); - s.syncAsSint16LE(_angle); -} - -void Scene6100::postInit(SceneObjectList *OwnerList) { - loadScene(6100); - Scene::postInit(); - setZoomPercents(62, 2, 200, 425); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerSL); - - _object1.postInit(); - _object1.setVisage(6100); - _object1._frame = 1; - _object1._strip = 4; - _object1.setPosition(Common::Point(0, 60)); - _object1.fixPriority(1); - - _object2.postInit(); - _object2.setVisage(6100); - _object2._frame = 1; - _object2._strip = 4; - _object2.setPosition(Common::Point(160, 60)); - _object2.fixPriority(1); - - _object3.postInit(); - _object3.setVisage(6100); - _object3._frame = 1; - _object3._strip = 4; - _object3.setPosition(Common::Point(320, 60)); - _object3.fixPriority(1); - - _rocks.postInit(); - _rocks.setVisage(6100); - _rocks._frame = 1; - _rocks._strip = 3; - _rocks.setPosition(Common::Point(320, 0)); - _rocks.fixPriority(2); - _rocks.changeZoom(-1); - _rocks._floats._float1 = 320.0; - _rocks._floats._float2 = 25000.0; - _rocks._floats._float3 = 0.0; - - _probe.postInit(); - _probe._moveDiff = Common::Point(15, 15); - _probe.setVisage(6100); - _probe._frame = 1; - _probe._strip = 5; - _probe.setPosition(Common::Point(160, 260)); - _probe.fixPriority(3); - _probe._floats._float1 = 320.0; - _probe._floats._float2 = 0.0; - _probe._floats._float3 = 0.0; - _probe.hide(); - - int baseVal = 2000; - for (int idx = 0; idx < 3; ++idx) { - _objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999); - _objList[idx]->_floats._float2 = baseVal; - _objList[idx]->_floats._float3 = 0.0; - baseVal += _globals->_randomSource.getRandomNumber(499); - - _objList[idx]->postInit(); - _objList[idx]->setVisage(6100); - _objList[idx]->_frame = 1; - _objList[idx]->_strip = 2; - - _objList[idx]->setPosition(Common::Point( - _globals->_randomSource.getRandomNumber(319), 60)); - _objList[idx]->fixPriority(1); - _objList[idx]->changeZoom(-1); - } - - setAction(&_action5); - _globals->_scenePalette.addRotation(96, 143, -1); - - if (!_globals->getFlag(76)) - _probe.setAction(&_action4); - - _globals->_soundHandler.play(231); -} - -void Scene6100::remove() { - _globals->_player.disableControl(); - _globals->_scenePalette.clearListeners(); - Scene::remove(); -} - -void Scene6100::process(Event &event) { - Scene::process(event); - - if (event.eventType == EVENT_KEYPRESS) { - // Handle incremental turning speeds with arrow keys - if ((event.kbd.keycode == Common::KEYCODE_LEFT) || (event.kbd.keycode == Common::KEYCODE_KP4)) { - _turnAmount = MIN(_turnAmount + 1, 8); - } else if ((event.kbd.keycode == Common::KEYCODE_RIGHT) || (event.kbd.keycode == Common::KEYCODE_KP6)) { - _turnAmount = MAX(_turnAmount - 1, -8); - } - } - - if (_probe._action) - _probe._action->process(event); -} - -void Scene6100::dispatch() { - Scene::dispatch(); - - if (_probe._action) - _probe._action->dispatch(); - - // Handle mouse controlling the turning - int changeAmount = (_globals->_events._mousePos.x - 160) / -20; - _turnAmount += (changeAmount - _turnAmount) / 2; - - if (_fadePercent < 100) { - _fadePercent += 10; - if (_fadePercent >= 100) { - _globals->_scenePalette.addRotation(96, 143, -1); - _fadePercent = 100; - } - - byte adjustData[] = {0xff, 0xff, 0xff, 0}; - _globals->_scenePalette.fade(adjustData, false, _fadePercent); - } - - if (_action != &_action3) { - // Display the distance remaining to the target - int distance = (int)_probe._floats.sqrt(_rocks._floats); - Common::String s = Common::String::format("%06d", distance); - - _sceneText.setPosition(Common::Point(24, 160)); - _sceneText._fontNumber = 0; - _sceneText._color1 = 35; - _sceneText.setup(s); - } - - if (_rocksCheck && (_action == &_action5)) { - // Check whether the probe is close enough to the rocks - double distance = _probe._floats.sqrt(_rocks._floats); - - if ((distance >= 300.0) && (distance <= 500.0)) - setAction(&_getBoxAction); - } -} - -void Scene6100::showMessage(const Common::String &msg, int color, Action *action) { - if (_msgActive) { - _msgActive = false; - _speaker1.removeText(); - } - - if (!msg.empty()) { - _msgActive = true; - _speaker1._textPos.x = 20; - _speaker1._textWidth = 280; - _speaker1._color1 = color; - _speaker1._action = action; - _speaker1.setText(msg); - } -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld_scenes1.h deleted file mode 100644 index 0f9bf61117..0000000000 --- a/engines/tsage/ringworld_scenes1.h +++ /dev/null @@ -1,538 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES1_H -#define TSAGE_RINGWORLD_SCENES1_H - -#include "common/scummsys.h" -#include "tsage/ringworld_logic.h" -#include "tsage/converse.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" -#include "tsage/sound.h" - -namespace tSage { - -class Scene10 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; -public: - Speaker _speakerSText; - Speaker _speakerQText; - Action1 _action1; - Action2 _action2; - SceneObject _object1, _object2, _object3; - SceneObject _object4, _object5, _object6; - - virtual void stripCallback(int v); - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene15 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; -public: - Action1 _action1; - SceneObject _object1; - ASound _soundHandler; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene20 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; -public: - SequenceManager _sequenceManager; - SpeakerQText _speakerQText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5; - ASound _sound; -public: - Scene20(); - virtual ~Scene20() {} - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); -}; - -class Scene30 : public Scene { - /* Scene objects */ - // Doorway beam sensor - class BeamObject : public SceneObject { - public: - virtual void doAction(int action); - }; - // Doorway object - class DoorObject : public SceneObject { - public: - virtual void doAction(int action); - }; - // Kzin object - class KzinObject : public SceneObject { - public: - virtual void doAction(int action); - }; - - /* Actions */ - class BeamAction : public Action { - public: - virtual void signal(); - }; - class KzinAction : public Action { - public: - virtual void signal(); - }; - class RingAction : public Action { - public: - virtual void signal(); - }; - class TalkAction : public Action { - public: - virtual void signal(); - }; - -public: - ASound _sound; - DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot; - BeamObject _beam; - DoorObject _door; - KzinObject _kzin; - - BeamAction _beamAction; - KzinAction _kzinAction; - RingAction _ringAction; - TalkAction _talkAction; - SequenceManager _sequenceManager; - - SpeakerSR _speakerSR; - SpeakerQL _speakerQL; - SpeakerSText _speakerSText; - SpeakerQText _speakerQText; -public: - Scene30(); - virtual ~Scene30() {} - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); -}; - -class Scene40 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; - - /* Objects */ - class DyingKzin : public SceneObject { - public: - virtual void doAction(int action); - }; - class Assassin : public SceneObject { - public: - virtual void doAction(int action); - }; - - /* Items */ - class Item2 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class Item6 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class Item8 : public SceneHotspot { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SpeakerSL _speakerSL; - SpeakerQR _speakerQR; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - SpeakerGameText _speakerGameText; - ASound _soundHandler; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - SceneObject _object1, _object2, _object3; - DyingKzin _dyingKzin; - Assassin _assassin; - SceneObject _doorway, _object7, _object8; - DisplayHotspot _item1; - Item2 _item2; - DisplayHotspot _item3, _item4, _item5; - Item6 _item6; - DisplayHotspot _item7, _item8; - - Scene40(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene50 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - - /* Objects */ - class Object1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object4 : public SceneObject { - public: - virtual void doAction(int action); - }; - -public: - SequenceManager _sequenceManager; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Object1 _object1; - Object2 _object2; - Object3 _object3; - Object4 _object4; - Rect _doorwayRect; - SpeakerSText _speakerSText; - SpeakerQText _speakerQText; - DisplayHotspot _item0, _item1, _item2; - DisplayHotspot _item3, _item4, _item5; - - Scene50(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene60 : public Scene { - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class PrevObject : public SceneObject { - public: - virtual void doAction(int action); - }; - class NextObject : public SceneObject { - public: - virtual void doAction(int action); - }; - class ExitObject : public SceneObject { - public: - virtual void doAction(int action); - }; - class MessageObject : public SceneObject { - public: - virtual void doAction(int action); - }; - class ControlObject : public SceneObject { - public: - virtual void doAction(int action); - }; - class SlaveObject : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class MasterObject : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class FloppyDrive : public SceneObject { - public: - virtual void doAction(int action); - }; - class Item1 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class Item : public SceneHotspot { - public: - int _messageNum, _sceneMode; - - Item(int sceneRegionId, int messageNum, int sceneMode) { - _sceneRegionId = sceneRegionId; - _messageNum = messageNum; - _sceneMode = sceneMode; - } - virtual void doAction(int action); - }; - -public: - GfxButton _gfxButton; - SequenceManager _sequenceManager; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - Action1 _action1; - Action2 _action2; - SceneObject _rose; - PrevObject _prevButton; - NextObject _nextButton; - ExitObject _exitButton; - MessageObject _message; - ControlObject _controlButton; - SlaveObject _slaveButton; - MasterObject _masterButton; - FloppyDrive _floppyDrive; - SceneObject _redLights; - Item1 _item1; - Item _item2, _item3, _item4, _item5, _item6; - ASound _soundHandler1; - ASound _soundHandler2; - ASound _soundHandler3; - - Scene60(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); -}; - -class Scene90 : public Scene { - class Action1 : public Action { - public: - virtual void signal(); - }; - class Object1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object2 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SpeakerSText _speakerSText; - SpeakerQText _speakerQText; - SpeakerQL _speakerQL; - SpeakerSR _speakerSR; - SpeakerMText _speakerMText; - Action1 _action1; - Object1 _object1; - Object2 _object2; - DisplayObject _object3, _object4, _object5; - SceneObject _object6; - DisplayHotspot _item1, _item2, _item3; - ASound _soundHandler1, _soundHandler2; - - Scene90(); - - virtual void stripCallback(int v); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); -}; - -class Scene95 : public Scene { - class Action1 : public ActionExt { - public: - virtual void signal(); - }; - -public: - Action1 _action1; - SceneObject _object1, _object2, _object3; - ASound _soundHandler; - - Scene95(); - virtual void postInit(SceneObjectList *OwnerList); -}; - -class Scene6100 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void dispatch(); - }; - class GetBoxAction : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - - /* Objects */ - class Object : public SceneObject { - public: - FloatSet _floats; - - virtual void synchronize(Serializer &s); - }; - class ProbeMover : public NpcMover { - public: - virtual void dispatch(); - }; - - /* Items */ - class Item1 : public SceneItem { - public: - virtual void doAction(int action); - }; - -public: - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - GetBoxAction _getBoxAction; - Action7 _action7; - ASound _soundHandler; - Speaker _speaker1; - SpeakerQR _speakerQR; - SpeakerSL _speakerSL; - SceneObject _object1, _object2, _object3; - Object _rocks, _probe; - Object _sunflower1, _sunflower2, _sunflower3; - SceneText _sceneText; - SceneItem _item1; - - int _turnAmount, _angle, _speed, _fadePercent; - int _hitCount; - bool _rocksCheck; - Object *_objList[4]; - bool _msgActive; - - Scene6100(); - virtual void synchronize(Serializer &s); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - virtual void process(Event &event); - virtual void dispatch(); - void showMessage(const Common::String &msg, int color, Action *action); - -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp deleted file mode 100644 index 839fa0f008..0000000000 --- a/engines/tsage/ringworld_scenes10.cpp +++ /dev/null @@ -1,2089 +0,0 @@ -/* 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. - * - */ - -#include "graphics/cursorman.h" -#include "tsage/ringworld_scenes10.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -Scene2::Scene2() : Scene() { - _sceneState = 0; -} - -/*--------------------------------------------------------------------------*/ - -void Object9350::postInit(SceneObjectList *OwnerList) { - //SceneObject::postInit(&_globals->_sceneManager._altSceneObjects); - SceneObject::postInit(OwnerList); -} - -void Object9350::draw() { - reposition(); - Rect destRect = _bounds; - destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); - Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum); - GfxSurface frame = getFrame(); - _globals->gfxManager().copyFrom(frame, destRect, priorityRegion); -} - -/*-------------------------------------------------------------------------- - * Scene 9100 - Near beach: Slave washing clothes - * - *--------------------------------------------------------------------------*/ -void Scene9100::SceneHotspot1::doAction(int action) { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; - - if (action == CURSOR_TALK) { - if (_globals->getFlag(23)) { - _globals->_player.disableControl(); - scene->_sceneMode = 9104; - } else { - _globals->setFlag(23); - _globals->_player.disableControl(); - scene->_sceneMode = 9105; - } - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9100::dispatch() { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; - - if (!_action) { - if (_globals->_player._position.x < 25) { - _globals->_player.disableControl(); - if (!_globals->getFlag(23) || _globals->getFlag(11)) - _sceneMode = 9106; - else { - _sceneMode = 9108; - _globals->setFlag(11); - } - - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL); - } - } else { - Scene::dispatch(); - } -} - -void Scene9100::signal() { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; - - switch (scene->_sceneMode) { - case 9102: - case 9106: - case 9108: - _globals->_sceneManager.changeScene(9150); - break; - case 9105: - _sceneHotspot3.remove(); - // No break on purpose - case 9103: - case 9104: - case 9107: - case 9109: - default: - _globals->_player.enableControl(); - break; - } -} - -void Scene9100::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - _object1.postInit(); - _object1.setVisage(9100); - _object1._strip = 1; - _object1._numFrames = 6; - _object1.setPosition(Common::Point(279, 132)); - _object1.animate(ANIM_MODE_2, NULL); - _object1.fixPriority(10); - - _globals->_player.postInit(); - - _object2.postInit(); - _object2.hide(); - - _object3.postInit(); - _object3.hide(); - - _object4.postInit(); - _object4.hide(); - - _object5.postInit(); - _object5.hide(); - - if (!_globals->getFlag(23)) { - _object6.postInit(); - _object6.setVisage(9111); - _object6.setStrip(6); - _object6.setFrame(1); - _object6.setPosition(Common::Point(138, 166)); - _sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43); - } - _sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37); - _sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39); - _sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1); - _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46); - _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48); - - _globals->_soundHandler.play(251); - if (_globals->_sceneManager._previousScene == 9150) { - if (_globals->getFlag(20)) { - _globals->_player.disableControl(); - if (_globals->getFlag(11)) - _sceneMode = 9107; - else - _sceneMode = 9109; - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL); - } else { - _sceneMode = 9103; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); - _globals->setFlag(20); - } - } else { - _sceneMode = 9102; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 9150 - Castle: Outside the bulwarks - * - *--------------------------------------------------------------------------*/ -void Scene9150::Object3::signal() { - switch (_signalFlag++) { - case 0: - _timer = 10 + _globals->_randomSource.getRandomNumber(90); - break; - default: - animate(ANIM_MODE_5, this); - _signalFlag = 0; - break; - } -} - -void Scene9150::Object3::dispatch() { - SceneObject::dispatch(); - if ((_timer != 0) && (--_timer == 0)) - signal(); -} - -void Scene9150::signal() { - switch (_sceneMode) { - case 9151: - case 9157: - _globals->_sceneManager.changeScene(9100); - break; - case 9153: - _globals->_sceneManager.changeScene(9300); - break; - case 9152: - case 9155: - case 9156: - _globals->_player.enableControl(); - break; - case 9154: - default: - break; - } -} - -void Scene9150::dispatch() { - - if ((_sceneState != 0) && (_sceneBounds.left == 0)) { - _object3._timer = 0; - _sceneState = 0; - _object3.setAction(&_sequenceManager2, NULL, 9154, &_object3, NULL); - _sceneHotspot10.remove(); - } - - if (_action) { - _action->dispatch(); - } else { - if (_globals->_player._position.x >= 160) { - if (_globals->_player._position.x > 630) { - _globals->_player.disableControl(); - _sceneMode = 9157; - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); - } - } else { - _globals->_player.disableControl(); - if (_globals->getFlag(11)) { - _globals->_soundHandler.play(286); - _sceneMode = 9153; - } else { - _sceneMode = 9156; - } - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); - } - } -} - -void Scene9150::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); - - _object3.postInit(); - _sceneState = 1; - _object3.setVisage(9151); - _object3._strip = 1; - _object3._frame = 1; - _object3.setPosition(Common::Point(312, 95)); - _object3.signal(); - - _sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1); - _sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1); - _sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49); - _sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51); - _sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53); - _sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55); - _sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1); - _sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1); - _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1); - _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59); - - _globals->_soundHandler.play(285); - _globals->_player.disableControl(); - - if (_globals->getFlag(20)) { - // Walking alone - _globals->_scrollFollower = &_globals->_player; - if (_globals->getFlag(11)) - // Hero wearing peasan suit - _sceneMode = 9155; - else - // Hero wearing Purple suit - _sceneMode = 9152; - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); - } else { - // Walking with the tiger - _sceneMode = 9151; - _object2.postInit(); - _object2.hide(); - _object1.postInit(); - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 9200 - Castle: Near the fountain - * - *--------------------------------------------------------------------------*/ -void Scene9200::SceneHotspot1::doAction(int action) { - Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene; - - if (action == OBJECT_TUNIC) { - _globals->_player.disableControl(); - if (_globals->getFlag(93)) { - scene->_sceneState = 9214; - scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); - } else { - _globals->setFlag(93); - scene->_sceneState = 9213; - scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL); - } - } else if (action <= 100) { - _globals->_player.disableControl(); - scene->_sceneState = 9214; - scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9200::signal() { - switch (_sceneState++) { - case 9207: - _globals->_sceneManager.changeScene(9700); - break; - case 9208: - case 9211: - case 9212: - _globals->_sceneManager.changeScene(9500); - break; - case 9209: - _globals->_sceneManager.changeScene(9360); - break; - case 9210: - _hotspot1.remove(); - // No break on purpose - case 9201: - case 9202: - case 9203: - case 9204: - case 9205: - case 9206: - default: - _globals->_player.enableControl(); - break; - } -} - -void Scene9200::process(Event &event) { - Scene::process(event); -} - -void Scene9200::dispatch() { -// Rect rect9200 = Rect(320, 175, 250, 154); - Rect rect9200 = Rect(250, 154, 320, 175); - - if (_action) { - _action->dispatch(); - } else { - if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) { - _globals->_player.disableControl(); - _sceneState = 9209; - setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL); - } else { - if (rect9200.contains(_globals->_player._position)) { - if (_globals->getFlag(93)) { - if (_globals->getFlag(86)) { - _sceneState = 9215; - setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL); - } else { - _sceneState = 9208; - setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL); - } - } else { - _globals->_player.disableControl(); - _sceneState = 9204; - setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL); - } - } else { - if (_globals->_player._position.y < 140) { - _globals->_player.disableControl(); - _sceneState = 9207; - setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL); - } - } - } - } -} - -void Scene9200::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(130, 50, 200, 150); - - _globals->_player.postInit(); - _object3.postInit(); - _object3.hide(); - _object1.postInit(); - // Water animation - _object1.setVisage(9200); - _object1._strip = 3; - _object1.animate(ANIM_MODE_2, NULL); - _object1.setPosition(Common::Point(132, 114)); - _object1.fixPriority(140); - _soundHandler.play(297); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerGR); - _stripManager.addSpeaker(&_speakerGText); - - if (!_globals->getFlag(86)) { - _object2.postInit(); - _hotspot1.setup(96, 194, 160, 234, 9200, 29, 31); - } - _hotspot2.setup(164, 0, 200, 282, 9200, 0, 1); - _hotspot3.setup(140, 39, 165, 153, 9200, 2, 3); - _hotspot4.setup(92, 122, 139, 152, 9200, 4, 5); - _hotspot5.setup(33, 20, 142, 115, 9200, 6, 7); - _hotspot6.setup(104, 235, 153, 265, 9200, 8, 9); - _hotspot7.setup(107, 262, 153, 286, 9200, 10, 11); - _hotspot8.setup(69, 276, 164, 320, 9200, 12, 13); - - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - - switch (_globals->_sceneManager._previousScene) { - case 9500: - if (_globals->getFlag(85)) { - if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->setFlag(86); - _globals->_player.disableControl(); - _sceneState = 9210; - setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL); - } else { - _globals->_player.disableControl(); - _sceneState = 9212; - setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL); - } - } else { - if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->_player.disableControl(); - _sceneState = 9211; - setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL); - } else { - _globals->_player.disableControl(); - _sceneState = 9202; - setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL); - } - } - break; - case 9700: - if (_globals->getFlag(86)) { - _sceneState = 9206; - setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL); - } else { - _sceneState = 9203; - setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL); - } - break; - case 9360: - default: - if (_globals->getFlag(86)) { - _sceneState = 9205; - setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL); - } else { - _sceneState = 9201; - setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL); - } - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 9300 - Castle: In front of a large guarded door - * - *--------------------------------------------------------------------------*/ -void Scene9300::signal() { - switch (_sceneMode++) { - case 9301: - _globals->setFlag(84); - // No break on purpose - case 9303: - _globals->_soundHandler.play(295); - _globals->_sceneManager.changeScene(9350); - break; - case 9302: - _globals->_player.enableControl(); - break; - default: - break; - } -} - -void Scene9300::dispatch() { - if (_action) { - _action->dispatch(); - } else if (_globals->_player._position.y < 145) { - _globals->_player.disableControl(); - _sceneMode = 9303; - setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL); - } -} - -void Scene9300::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(130, 75, 230, 150); - - _sceneMode = 0; - _globals->_player.postInit(); - _globals->_player.changeZoom(-1); - _object1.postInit(); - _object2.postInit(); - _globals->_soundHandler.play(289); - - _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1); - _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3); - _hotspot3.setup(78, 142, 146, 216, 9300, 4, 5); - _hotspot4.setup(3, 43, 91, 74, 9300, 6, 7); - _hotspot5.setup(82, 19, 157, 65, 9300, 8, 9); - _hotspot6.setup(5, 218, 84, 274, 9300, 10, 11); - _hotspot7.setup(86, 233, 168, 293, 9300, 12, 13); - _hotspot8.setup(157, 0, 200, 230, 9300, 14, 15); - _hotspot9.setup(169, 227, 200, 320, 9300, 16, 17); - _hotspot10.setup(145, 97, 166, 225, 9300, 18, 19); - _hotspot11.setup(81, 75, 145, 145, 9300, 20, 21); - _hotspot12.setup(0, 0, 94, 35, 9300, 22, 23); - _hotspot13.setup(12, 268, 149, 320, 9300, 24, 25); - - if (_globals->_sceneManager._previousScene == 9350) { - _globals->_player.disableControl(); - _sceneMode = 9302; - setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL); - } else { - _globals->_player.disableControl(); - _sceneMode = 9301; - setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 9350 - Castle: In a hallway - * - *--------------------------------------------------------------------------*/ - -void Scene9350::signal() { - switch (_sceneState ++) { - case 0: - case 9352: - case 9353: - case 9354: - _globals->_player.enableControl(); - break; - case 9355: - _globals->_sceneManager.changeScene(9300); - break; - case 9356: - _globals->_sceneManager.changeScene(9360); - break; - case 9357: - case 9359: - _globals->_sceneManager.changeScene(9400); - break; - default: - break; - } -} - -void Scene9350::dispatch() { - if (_action == 0) { - if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { - _globals->_player.disableControl(); - _sceneState = 9356; - setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL); - } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { - _globals->_player.disableControl(); - _sceneState = 9357; - setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL); - } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { - _globals->_player.disableControl(); - _sceneState = 9355; - setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL); - } - } else { - Scene::dispatch(); - } -} - -void Scene9350::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(95, 80, 200, 100); - _globals->_player.postInit(); - - _object1.setup(9351, 1, 3, 139, 97, 0); - _sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1); - _sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1); - _sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1); - _sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1); - _sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1); - - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - - if (_globals->_sceneManager._previousScene == 9360) { - _globals->_player.disableControl(); - _sceneState = 9352; - setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL); - } else if (_globals->_sceneManager._previousScene == 9400) { - _globals->_player.disableControl(); - _sceneState = 9353; - setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL); - } else { - if (_globals->getFlag(84)) { - _globals->clearFlag(84); - _object2.postInit(); - _globals->_player.disableControl(); - _sceneState = 9359; - setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL); - } else { - _globals->_player.disableControl(); - _sceneState = 9354; - setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL); - } - } -} - -/*-------------------------------------------------------------------------- - * Scene 9360 - Castle: In a hallway - * - *--------------------------------------------------------------------------*/ - -void Scene9360::signal() { - switch (_sceneState ++) { - case 0: - case 9362: - case 9363: - case 9364: - _globals->_player.enableControl(); - break; - case 9365: - _globals->_sceneManager.changeScene(9350); - break; - case 9366: - _globals->_sceneManager.changeScene(9200); - break; - case 9367: - _globals->_sceneManager.changeScene(9450); - break; - default: - break; - } -} - -void Scene9360::dispatch() { - if (_action == 0) { - if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { - _globals->_player.disableControl(); - _sceneState = 9366; - setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL); - } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { - _globals->_player.disableControl(); - _sceneState = 9367; - setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL); - } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { - _globals->_player.disableControl(); - _sceneState = 9365; - setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL); - } - } else { - Scene::dispatch(); - } -} - -void Scene9360::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(95, 80, 200, 100); - _globals->_player.postInit(); - - _hotspot1.setup(37, 92, 93, 173, 9360, 0, 1); - _hotspot2.setup(42, 0, 100, 63, 9360, 2, -1); - _hotspot3.setup(36, 205, 82, 260, 9360, 3, -1); - _hotspot4.setup(103, 2, 200, 320, 9360, 4, -1); - _hotspot5.setup(0, 0, 37, 320, 9360, 4, -1); - _hotspot6.setup(35, 61, 103, 92, 9360, 4, -1); - _hotspot7.setup(33, 174, 93, 207, 9360, 4, -1); - _hotspot8.setup(28, 257, 149, 320, 9360, 4, -1); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - if (_globals->_sceneManager._previousScene == 9350) { - _globals->_player.disableControl(); - _sceneState = 9364; - setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL); - } else if (_globals->_sceneManager._previousScene == 9450) { - _globals->_player.disableControl(); - _sceneState = 9363; - setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL); - } else { - _globals->_player.disableControl(); - _sceneState = 9362; - setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL); - } - _object1.setup(9351, 1, 1, 131, 90, 0); -} - -/*-------------------------------------------------------------------------- - * Scene 9400 - Castle: Black-Smith room - * - *--------------------------------------------------------------------------*/ -Scene9400::Scene9400() { - _field1032 = 0; -} - -void Scene9400::SceneHotspot7::doAction(int action) { - Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; - - if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) { - scene->_sceneState = 1; - RING_INVENTORY._straw._sceneNumber = 1; - scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9400::SceneHotspot8::doAction(int action) { - Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; - - if (action == CURSOR_TALK) { - _globals->_player.disableControl(); - scene->_sceneState = 2; - scene->signal(); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9400::signal() { - switch (_sceneState ++) { - case 0: - _object1._numFrames = 6; - _stripManager.start(9400, this); - break; - case 1: - _object1._numFrames = 6; - _object1.animate(ANIM_MODE_2, NULL); - _globals->_player.enableControl(); - break; - case 2: - _object1.animate(ANIM_MODE_5, this); - break; - case 3: - _stripManager.start(9405, this); - break; - case 4: - _object1.animate(ANIM_MODE_2, this); - _globals->_player.enableControl(); - break; - case 9350: - _globals->_sceneManager.changeScene(9350); - break; - default: - break; - } -} - -void Scene9400::dispatch() { - if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){ - if (_field1032 == 0) { - _soundHandler.play(296); - _field1032 = 1; - } - } else { - _field1032 = 0; - } - if (_action == 0) { - if (_globals->_player._position.y < 120) { - _sceneState = 9350; - _globals->_player.disableControl(); - setAction(&_action1); - Common::Point pt(-45, 88); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - } - } else { - Scene::dispatch(); - } -} - -void Scene9400::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - _screenNumber = 9400; - setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); - _object1.postInit(); - _object3.postInit(); - _speakerQText._textPos.x = 20; - - _hotspot7.setup(157, 66, 180, 110, 9400, 21, 23); - _hotspot5.setup(130, 133, 152, 198, 9400, 22, -1); - _hotspot1.setup(33, 280, 69, 297, 9400, 1, 2); - _hotspot2.setup(73, 96, 87, 159, 9400, 3, 4); - _hotspot3.setup(89, 253, 111, 305, 9400, 5, 6); - _hotspot4.setup(46, 0, 116, 35, 9400, 7, 8); - _hotspot8.setup(58, 169, 122, 200, 9400, 9, 10); - _hotspot6.setup(0, 0, 199, 319, 9400, 16, 0); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerOR); - _stripManager.addSpeaker(&_speakerOText); - - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - - // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350) - _sceneState = 2; - if (!_globals->getFlag(89)) { - _globals->setFlag(89); - _sceneState = 0; - } - - setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL); -} - -void Scene9400::synchronize(Serializer &s) { - Scene::synchronize(s); - if (s.getVersion() >= 3) - s.syncAsSint16LE(_field1032); -} - -/*-------------------------------------------------------------------------- - * Scene 9450 - Castle: Dining room - * - *--------------------------------------------------------------------------*/ -void Scene9450::Object2::signal() { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; - - this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL); -} - -void Scene9450::Object3::dispatch() { - SceneObject::dispatch(); - _percent = (_percent * 20) / 30; -} - -void Scene9450::Hotspot1::doAction(int action) { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - if (scene->_object2._action) - scene->_object2._action->remove(); - scene->_sceneMode = 9459; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9450::Hotspot3::doAction(int action) { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_CLOAK: - case OBJECT_JACKET: - case OBJECT_TUNIC2: - scene->_sceneMode = 9460; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); - break; - case OBJECT_TUNIC: - SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - break; - case CURSOR_WALK: - // nothing - break; - case CURSOR_LOOK: - SceneItem::display(9450, 41, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - break; - case CURSOR_USE: - case CURSOR_TALK: - if (RING_INVENTORY._tunic._sceneNumber == 9450) { - if (scene->_object2._action) - scene->_object2._action->remove(); - scene->_sceneMode = 9459; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); - } else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) { - SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else { - scene->_sceneMode = 9460; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); - } - break; - default: - SceneItem::display(9450, 45, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - break; - } -} - -void Scene9450::signal() { - switch (_sceneMode++) { - case 1002: - case 1004: - // Drink - setAction(&_sequenceManager1, this, 9456, &_object2, &_object1, &_object3, NULL); - break; - case 1005: - // Bring me more wine - setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL); - break; - case 9451: - if (_globals->getFlag(87)) { - _globals->_player.enableControl(); - } else { - _sceneMode = 1001; - if (_object2._action) - _object2._action->remove(); - // Eat - setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL); - } - break; - case 1001: - case 1003: - // Eat - setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL); - break; - case 9453: - _globals->_sceneManager.changeScene(9360); - break; - case 9459: - RING_INVENTORY._tunic._sceneNumber = 1; - _object2.signal(); - _globals->_player.enableControl(); - _globals->_events.setCursor(CURSOR_WALK); - _hotspot1.remove(); - break; - case 1006: - _globals->setFlag(87); - // No break on purpose - default: - _globals->_player.enableControl(); - break; - } -} - -void Scene9450::dispatch() { - if (_action) { - _action->dispatch(); - } else { - if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) { - _globals->_player.disableControl(); - _sceneMode = 9452; - setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL); - } else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) { - _globals->_player.disableControl(); - _sceneMode = 9453; - setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL); - } - } -} - -void Scene9450::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(84, 75, 167, 150); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.postInit(); - - _object2.postInit(); - _object1.postInit(); - _object1.hide(); - - _globals->_player.disableControl(); - _sceneMode = 9451; - setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL); - - if (_globals->getFlag(87)) { - if (RING_INVENTORY._tunic._sceneNumber == 1) { - _object2.signal(); - } else { - _object2.setPosition(Common::Point(184, 144)); - _object2.setVisage(9451); - _object2.fixPriority(250); - _object2._strip = 5; - _object2._frame = 10; - } - } else { - _object3.postInit(); - _object3.hide(); - _object3.setAction(&_sequenceManager2, NULL, 9455, &_object2, &_object1, NULL); - } - - if (RING_INVENTORY._tunic._sceneNumber != 1) - _hotspot1.setup(123, 139, 138, 170, 9450, 37, -1); - - _hotspot2.setup(153, 102, 176, 141, 9450, 39, 40); - _hotspot3.setup(97, 198, 130, 229, 9450, 41, 42); - _hotspot15.setup(131, 190, 145, 212, 9450, 43, 44); - _hotspot4.setup(33, 144, 105, 192, 9450, 0, 1); - _hotspot5.setup(20, 236, 106, 287, 9450, 2, 3); - _hotspot6.setup(137, 119, 195, 320, 9450, 4, 5); - _hotspot7.setup(20, 59, 99, 111, 9450, 6, -1); - _hotspot8.setup(110, 0, 199, 117, 9450, 7, 8); - _hotspot9.setup(101, 104, 130, 174, 9450, 9, 10); - _hotspot10.setup(110, 246, 149, 319, 9450, 11, 12); - _hotspot11.setup(16, 34, 74, 62, 6450, 13, 14); - _hotspot12.setup(19, 108, 72, 134, 9450, 15, 16); - _hotspot13.setup(18, 215, 71, 237, 9450, 17, 18); - _hotspot14.setup(15, 288, 76, 314, 9450, 19, 20); - _hotspot16.setup(0, 0, 200, 320, 9450, 46, -1); -} - -/*-------------------------------------------------------------------------- - * Scene 9500 - Castle: Bedroom - * - *--------------------------------------------------------------------------*/ -void Scene9500::Hotspot1::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; - - if (action == OBJECT_SWORD) { - scene->_sceneMode = 9510; - _globals->setFlag(92); - RING_INVENTORY._sword._sceneNumber = 9500; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); - scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9500::Hotspot2::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - scene->_sceneMode = 9511; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9500::Hotspot3::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; - - if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){ - scene->_sceneMode = 9505; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9500::Hotspot4::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; - - if (action == OBJECT_CANDLE) { - _globals->_player.disableControl(); - if (RING_INVENTORY._straw._sceneNumber == 9500) { - scene->_sceneMode = 9506; - _globals->_sceneItems.remove(&scene->_hotspot5); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL); - RING_INVENTORY._candle._sceneNumber = 9850; - } else { - scene->_sceneMode = 9507; - scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL); - } - } else if (action == OBJECT_STRAW) { - scene->_sceneMode = 9512; - _globals->_player.disableControl(); - RING_INVENTORY._straw._sceneNumber = 9500; - scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9500::signal() { - switch (_sceneMode) { - case 9503: - _globals->_sceneManager.changeScene(9200); - _globals->_soundHandler.play(295); - break; - case 9504: - _globals->_sceneManager.changeScene(9850); - break; - case 9505: - _candle.setStrip(2); - RING_INVENTORY._candle._sceneNumber = 1; - _globals->_player.enableControl(); - break; - case 9506: - _globals->setFlag(85); - _globals->_player.enableControl(); - break; - case 9511: - RING_INVENTORY._helmet._sceneNumber = 1; - _globals->_player.enableControl(); - if (!_globals->getFlag(51)) { - _globals->setFlag(51); - _globals->_player.disableControl(); - _sceneMode = 9514; - setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL); - } - break; - case 0: - case 9514: - default: - _globals->_player.enableControl(); - break; - } -} - -void Scene9500::dispatch() { - if (_action) { - _action->dispatch(); - } else { - if (_globals->_player._position.y >= 199) { - _globals->_player.disableControl(); - _sceneMode = 9503; - setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL); - } else if (_globals->_player._position.y < 127) { - _globals->_player.disableControl(); - _sceneMode = 9504; - setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL); - } - } - -} - -void Scene9500::process(Event &event) { - Scene::process(event); -} - -void Scene9500::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(110, 75, 200, 150); - - _globals->_player.postInit(); - _globals->_soundHandler.play(305); - - _candle.postInit(); - _candle.setVisage(9500); - _candle.setStrip(1); - _candle.animate(ANIM_MODE_2); - _candle.setPosition(Common::Point(30, 105)); - if (RING_INVENTORY._candle._sceneNumber != 9500) - _candle.setStrip(2); - - _object3.postInit(); - _object3.hide(); - _object3.fixPriority(150); - _object3.setPosition(Common::Point(166, 133)); - if (RING_INVENTORY._straw._sceneNumber == 9500) { - _object3.show(); - _object3.setVisage(5); - _object3._strip = 2; - _object3._frame = 9; - _object3.setPosition(Common::Point(168, 128)); - if (_globals->getFlag(85)) { - _object3.setVisage(9500); - _object3.setStrip(4); - _object3.animate(ANIM_MODE_8, 0, NULL); - _object3.setPosition(Common::Point(166, 133)); - } - } - - _object2.postInit(); - _object2.hide(); - if (_globals->getFlag(92)) { - _object2.show(); - _object2.setVisage(9501); - _object2.setStrip(1); - _object2.setFrame(_object2.getFrameCount()); - _object2.setPosition(Common::Point(303, 130)); - _object2.fixPriority(132); - if (RING_INVENTORY._helmet._sceneNumber == 1) { - _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); - } else { - _object2.setStrip(2); - _object2.setFrame(1); - } - } else { - _hotspot1.setup(105, 295, 134, 313, 9500, 9, 10); - } - - _hotspot17.setup(101, 293, 135, 315, 9500, 9, 10); - _hotspot3.setup(84, 12, 107, 47, 9500, 15, 15); - _hotspot6.setup(93, 11, 167, 46, 9500, 0, 1); - _hotspot7.setup(100, 70, 125, 139, 9500, 2, 3); - - if (!_globals->getFlag(85)) { - _hotspot5.setup(111, 68, 155, 244, 9500, 17, -1); - _hotspot4.setup(57, 71, 120, 126, 9500, 16, -1); - } - - _hotspot8.setup(60, 24, 90, 53, 9500, 4, 5); - _hotspot9.setup(72, 143, 93, 163, 9500, 4, 5); - _hotspot10.setup(70, 205, 92, 228, 9500, 4, 5); - _hotspot11.setup(66, 291, 90, 317, 9500, 4, 5); - _hotspot12.setup(22, 58, 101, 145, 9500, 6, 7); - _hotspot13.setup(121, 57, 163, 249, 9500, 6, 7); - _hotspot14.setup(115, 133, 135, 252, 9500, 6, 7); - _hotspot15.setup(55, 240, 125, 254, 9500, 6, 7); - _hotspot16.setup(53, 251, 132, 288, 9500, 8, -1); - _hotspot19.setup(101, 207, 120, 225, 9500, 9, 10); - _hotspot18.setup(98, 144, 117, 162, 9500, 9, 10); - _hotspot20.setup(102, 27, 132, 50, 9500, 9, 10); - - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - - if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) { - _sceneMode = 0; - if (RING_INVENTORY._helmet._sceneNumber != 1) { - setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL); - } else { - RING_INVENTORY._helmet._sceneNumber = 9500; - _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); - setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL); - } - } else { - _sceneMode = 0; - setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 9700 - Castle: Balcony - * - *--------------------------------------------------------------------------*/ -void Scene9700::signal() { - switch (_sceneMode ++) { - case 9703: - _globals->setFlag(88); - // No break on purpose - case 9701: - case 9702: - _gfxButton1.setText(EXIT_MSG); - _gfxButton1._bounds.center(50, 190); - _gfxButton1.draw(); - _gfxButton1._bounds.expandPanes(); - _globals->_player.enableControl(); - _globals->_player._canWalk = false; - _globals->_events.setCursor(CURSOR_USE); - break; - case 9704: - _globals->_soundHandler.play(323); - _globals->_sceneManager.changeScene(9750); - break; - } -} - -void Scene9700::process(Event &event) { - Scene::process(event); - if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { - if (_gfxButton1.process(event)) { - _globals->_sceneManager.changeScene(9200); - } else if (_globals->_events._currentCursor == OBJECT_SCANNER) { - event.handled = true; - if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->_player.disableControl(); - _sceneMode = 9704; - setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL); - } else { - _globals->_player.disableControl(); - _sceneMode = 9703; - setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL); - } - } - } -} - -void Scene9700::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1); - _sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1); - _sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16); - _sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1); - _sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1); - _sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1); - - _object1.postInit(); - _object1.hide(); - _globals->_player.postInit(); - if (!_globals->getFlag(97)) { - _globals->_player.disableControl(); - _sceneMode = 9701; - setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL); - _globals->setFlag(97); - } else { - _globals->_player.disableControl(); - _sceneMode = 9702; - setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 9750 - Castle: In the garden - * - *--------------------------------------------------------------------------*/ -void Scene9750::signal() { - switch (_sceneMode ++) { - case 9751: - _globals->_soundHandler.fadeOut(this); - break; - case 9752: - _globals->_sceneManager.changeScene(2100); - default: - break; - } -} - -void Scene9750::dispatch() { - Scene::dispatch(); -} - -void Scene9750::postInit(SceneObjectList *OwnerList) { - loadScene(9750); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _globals->_player.postInit(); - _object1.postInit(); - _object1.hide(); - _object2.postInit(); - _object2.hide(); - _globals->_player.disableControl(); - _sceneMode = 9751; - setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL); -} - - -/*-------------------------------------------------------------------------- - * Scene 9850 - Castle: Dressing room - * - *--------------------------------------------------------------------------*/ -void Scene9850::Object6::doAction(int action) { - if ((_flags & OBJFLAG_HIDE) == 0) { - if (action == CURSOR_LOOK) { - SceneItem::display(9850, 27, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else if (action == CURSOR_USE) { - RING_INVENTORY._scimitar._sceneNumber = 1; - hide(); - } else { - SceneHotspot::doAction(action); - } - } -} -void Scene9850::Object7::doAction(int action) { - if ((_flags & OBJFLAG_HIDE) == 0) { - if (action == CURSOR_LOOK) { - SceneItem::display(9850, 28, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else if (action == CURSOR_USE) { - RING_INVENTORY._sword._sceneNumber = 1; - hide(); - } else { - SceneHotspot::doAction(action); - } - } -} - -// Hair covered tunic -void Scene9850::Hotspot12::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - if (RING_INVENTORY._tunic2._sceneNumber != 1) { - RING_INVENTORY._tunic2._sceneNumber = 1; - _globals->_player.disableControl(); - scene->_sceneMode = 9858; - scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL); - } else { - RING_INVENTORY._tunic2._sceneNumber = 9850; - _globals->_player.disableControl(); - scene->_sceneMode = 9861; - scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL); - } - } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) { - NamedHotspot::doAction(action); - } else { - SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } -} - -void Scene9850::Hotspot14::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - if (RING_INVENTORY._jacket._sceneNumber != 1) { - RING_INVENTORY._jacket._sceneNumber = 1; - _globals->_player.disableControl(); - scene->_sceneMode = 9857; - scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL); - } else { - RING_INVENTORY._jacket._sceneNumber = 9850; - _globals->_player.disableControl(); - scene->_sceneMode = 9860; - scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL); - } - } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) { - NamedHotspot::doAction(action); - } else { - SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } -} - -void Scene9850::Hotspot16::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - if (RING_INVENTORY._cloak._sceneNumber != 1) { - RING_INVENTORY._cloak._sceneNumber = 1; - _globals->_player.disableControl(); - scene->_sceneMode = 9862; - scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL); - } else { - RING_INVENTORY._cloak._sceneNumber = 9850; - _globals->_player.disableControl(); - scene->_sceneMode = 9859; - scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL); - } - } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) { - NamedHotspot::doAction(action); - } else { - SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } -} - -void Scene9850::Hotspot17::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == OBJECT_SCANNER) { - SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else { - if (action == CURSOR_USE) - scene->_soundHandler.play(306); - NamedHotspot::doAction(action); - } -} - -void Scene9850::Hotspot18::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == OBJECT_SCANNER) { - SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else { - if (action == CURSOR_USE) - scene->_soundHandler.play(306); - NamedHotspot::doAction(action); - } -} - -void Scene9850::Hotspot19::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == OBJECT_SCANNER) { - SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else { - if (action == CURSOR_USE) - scene->_soundHandler.play(313); - NamedHotspot::doAction(action); - } -} - -// Arrow on Statue -void Scene9850::Hotspot20::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - _globals->_player.disableControl(); - if (scene->_objSword._state == 0) { - if (RING_INVENTORY._scimitar._sceneNumber == 9850) - scene->_objScimitar.show(); - if (RING_INVENTORY._sword._sceneNumber == 9850) - scene->_objSword.show(); - scene->_sceneMode = 11; - setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); - } else { - scene->_sceneMode = 10; - setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); - } - scene->_objSword._state ^= 1; - } else { - NamedHotspot::doAction(action); - } -} - -void Scene9850::signal() { - switch (_sceneMode ++) { - case 10: - // Hidden closet closed - if (RING_INVENTORY._scimitar._sceneNumber == 9850) - _objScimitar.hide(); - if (RING_INVENTORY._sword._sceneNumber == 9850) - _objSword.hide(); - _globals->_sceneItems.remove(&_objScimitar); - _globals->_sceneItems.remove(&_objSword); - _globals->_sceneItems.addItems(&_hotspot19, NULL); - _globals->_player.enableControl(); - break; - case 11: - // Hidden closet opened - if (RING_INVENTORY._scimitar._sceneNumber == 9850) - _globals->_sceneItems.addItems(&_objScimitar, NULL); - if (RING_INVENTORY._sword._sceneNumber == 9850) - _globals->_sceneItems.addItems(&_objSword, NULL); - _globals->_sceneItems.remove(&_hotspot19); - _globals->_player.enableControl(); - break; - case 9500: - _globals->_sceneManager.changeScene(_sceneMode - 1); - break; - case 0: - default: - _globals->_player.enableControl(); - break; - } -} - -void Scene9850::process(Event &event) { - Scene::process(event); - if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) { - event.handled = true; - _globals->_player.disableControl(); - if (_objSword._state == 0) { - _sceneMode = 0; - setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL); - } else { - _sceneMode = 10; - setAction(&_sequenceManager, this, 9854, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL); - } - _objSword._state ^= 1; - } -} - -void Scene9850::dispatch() { - if (_action) { - _action->dispatch(); - } else if (_globals->_player._position.y >= 198) { - _globals->_player.disableControl(); - _sceneMode = 9500; - setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL); - } -} - -void Scene9850::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - _objSword._state = 0; - - _objDoor.postInit(); - _objDoor.setVisage(9850); - _objDoor.setStrip(1); - _objDoor.setFrame(1); - _objDoor.setPosition(Common::Point(28, 118)); - _objDoor.fixPriority(90); - - _objLever.postInit(); - _objLever.setVisage(9850); - _objLever.setStrip(4); - _objLever.setFrame(1); - _objLever.setPosition(Common::Point(256, 35)); - - _objCloak.postInit(); - _objCloak.setVisage(9850); - _objCloak.setStrip(5); - _objCloak.setFrame(1); - _objCloak.fixPriority(90); - _objCloak.setPosition(Common::Point(157, 81)); - if (RING_INVENTORY._cloak._sceneNumber != 9850) - _objCloak.hide(); - - _objJacket.postInit(); - _objJacket.setVisage(9850); - _objJacket.setStrip(5); - _objJacket.setFrame(2); - _objJacket.fixPriority(90); - _objJacket.setPosition(Common::Point(201, 84)); - if (RING_INVENTORY._jacket._sceneNumber != 9850) - _objJacket.hide(); - - _objTunic2.postInit(); - _objTunic2.setVisage(9850); - _objTunic2.setStrip(5); - _objTunic2.setFrame(3); - _objTunic2.fixPriority(90); - _objTunic2.setPosition(Common::Point(295, 90)); - if (RING_INVENTORY._tunic2._sceneNumber != 9850) - _objTunic2.hide(); - - if (RING_INVENTORY._scimitar._sceneNumber == 9850) { - _objScimitar.postInit(); - _objScimitar.setVisage(9850); - _objScimitar.setStrip(2); - _objScimitar.setFrame(1); - _objScimitar.setPosition(Common::Point(55, 83)); - _objScimitar.fixPriority(80); - _objScimitar.hide(); - } - - if (RING_INVENTORY._sword._sceneNumber == 9850) { - _objSword.postInit(); - _objSword.setVisage(9850); - _objSword.setStrip(3); - _objSword.setFrame(1); - _objSword.setPosition(Common::Point(56, 101)); - _objSword.fixPriority(80); - _objSword.hide(); - } - - _spotLever.setup(30, 251, 45, 270, 9850, 26, -1); - _hotspot1.setup(123, 0, 200, 320, 9850, 0, 1); - _hotspot2.setup(107, 87, 133, 308, 9850, 0, 1); - _hotspot3.setup(2, 28, 53, 80, 9850, 2, 3); - _hotspot4.setup(13, 0, 55, 27, 9850, 2, 3); - _hotspot5.setup(8, 74, 27, 91, 9850, 4, 5); - _hotspot17.setup(61, 0, 125, 28, 9850, 6, 7); - _hotspot18.setup(51, 95, 105, 145, 9850, 6, 7); - _hotspot19.setup(56, 28, 115, 97, 9850, 6, 8); - _hotspot6.setup(0, 223, 115, 257, 9850, 9, 10); - _hotspot7.setup(15, 254, 33, 268, 9850, 9, -1); - _hotspot8.setup(17, 218, 37, 233, 9850, 9, 10); - _hotspot9.setup(8, 113, 26, 221, 9850, 11, 12); - _hotspot10.setup(14, 94, 53, 112, 9850, 13, 14); - _hotspot11.setup(5, 269, 29, 303, 9850, 15, 16); - _hotspot12.setup(43, 278, 91, 317, 9850, 17, 18); - _hotspot13.setup(47, 263, 112, 282, 9850, 19, 20); - _hotspot14.setup(43, 188, 86, 224, 9850, 21, 22); - _hotspot15.setup(43, 162, 92, 191, 9850, 23, 24); - _hotspot16.setup(40, 146, 90, 169, 9850, 25, -1); - - _globals->_player.postInit(); - _globals->_player.disableControl(); - _sceneMode = 0; - setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL); -} - -/*-------------------------------------------------------------------------- - * Scene 9900 - Ending - * - *--------------------------------------------------------------------------*/ -void Scene9900::strAction1::signal() { - const byte mask1[3] = {0xff, 0xff, 0xff}; - const byte mask2[3] = {0, 0, 0}; - - Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_soundHandler.play(351); - _object9.postInit(); - _object9.setVisage(18); - _object9._frame = 1; - _object9._strip = 6; - _object9.fixPriority(250); - _object9.setPosition(Common::Point(171, 59)); - _object9.animate(ANIM_MODE_5, NULL); - _globals->_scenePalette.addRotation(67, 111, 1, 1, this); - scene->_object2.hide(); - break; - case 1: - _palette1.getPalette(); - _globals->_scenePalette.addFader(&mask1[0], 1, 10, this); - break; - case 2: - _object9.remove(); - _globals->_scenePalette.addFader(&mask2[0], 1, 5, this); - break; - case 3: - _globals->_soundHandler.play(377); - setDelay(120); - break; - case 4: - _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this); - break; - case 5: - remove(); - break; - default: - break; - } -} - -void Scene9900::strAction2::signal() { - switch (_actionIndex++) { - case 0: - _lineNum = 0; - _txtArray1Index = 0; - _txtArray1[0]._position.y = 200; - _txtArray1[1]._position.y = 300; - _txtArray2[0]._position.y = 400; - _txtArray2[1]._position.y = 500; - _var3 = 0; - // No break on purpose - case 1: { - Common::String msg = _resourceManager->getMessage(8030, _lineNum++); - if (msg.compareTo("LASTCREDIT")) { - if (_var3) { - // Not used? - // int x = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); - _txtArray1[_txtArray1Index]._moveDiff.y = 10; - - NpcMover *mover = new NpcMover(); - Common::Point pt(_txtArray1[_txtArray1Index]._position.x, -100); - _txtArray1[_txtArray1Index].addMover(mover, &pt, NULL); - - // Not used? - // int x = _txtArray2[_txtArray1Index].getFrame().getBounds().height(); - _txtArray2[_txtArray1Index]._moveDiff.y = 10; - _txtArray1Index = (_txtArray1Index + 1) % 2; - } - _var3 = 1; - _txtArray1[_txtArray1Index]._textMode = ALIGN_CENTER; - _txtArray1[_txtArray1Index]._width = 240; - _txtArray1[_txtArray1Index]._fontNumber = 2; - _txtArray1[_txtArray1Index]._color1 = 7; - _txtArray1[_txtArray1Index].setup(msg); - _txtArray1[_txtArray1Index]._moveRate = 20; - _txtArray1[_txtArray1Index]._moveDiff.y = 2; - _txtArray1[_txtArray1Index].fixPriority(255); - int frameWidth = _txtArray1[_txtArray1Index].getFrame().getBounds().width(); - int frameHeight = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); - _txtArray1[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200)); - - NpcMover *mover2 = new NpcMover(); - Common::Point pt2(_txtArray1[_txtArray1Index]._position.x, 100); - _txtArray1[_txtArray1Index].addMover(mover2, &pt2, this); - - _txtArray2[_txtArray1Index]._textMode = ALIGN_CENTER; - _txtArray2[_txtArray1Index]._width = 240; - _txtArray2[_txtArray1Index]._fontNumber = 2; - _txtArray2[_txtArray1Index]._color1 = 23; - - msg = _resourceManager->getMessage(8030, _lineNum++); - _txtArray2[_txtArray1Index].setup(msg); - _txtArray2[_txtArray1Index]._moveRate = 20; - _txtArray2[_txtArray1Index]._moveDiff.y = 2; - _txtArray2[_txtArray1Index].fixPriority(255); - frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width(); - _txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight)); - } else { - // WORKAROUND: Fix inventory becoming available at end of credits - _globals->_events.setCursor(CURSOR_WALK); - _actionIndex = 3; - signal(); - } - break; - } - case 2: - setDelay(60); - _actionIndex = 1; - break; - case 3: - setDelay(7200); - break; - case 4: - _txtArray1[0].remove(); - _txtArray1[1].remove(); - _txtArray2[0].remove(); - _txtArray2[1].remove(); - remove(); - break; - default: - break; - } -} -void Scene9900::strAction2::dispatch() { -// if (this->_txtArray1[0]._textSurface != 0) { - int frameHeight = _txtArray1[0].getFrame().getBounds().height(); - _txtArray2[0]._position.y = frameHeight + _txtArray1[0]._position.y; - _txtArray2[0]._flags |= OBJFLAG_PANES; -// } -// if (this->_txtArray1[1]._textSurface != 0) { - frameHeight = _txtArray1[1].getFrame().getBounds().height(); - _txtArray2[1]._position.y = frameHeight + _txtArray1[1]._position.y; - _txtArray2[1]._flags |= OBJFLAG_PANES; -// } - Action::dispatch(); -} - -void Scene9900::strAction2::synchronize(Serializer &s) { - Action::synchronize(s); - if (s.getVersion() >= 3) { - s.syncAsSint16LE(_lineNum); - s.syncAsSint16LE(_txtArray1Index); - s.syncAsSint16LE(_var3); - } -} - -void Scene9900::strAction3::signal() { - const byte mask3[3] = {0xff, 0, 0}; - const byte mask4[3] = {0, 0, 0}; - - switch (_actionIndex++) { - case 0: - _palette2.getPalette(); - _palette3.loadPalette(2003); - _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this); - break; - case 1: - _globals->_scenePalette.addFader(&mask3[0], 1, 10, this); - break; - case 2: - _globals->_scenePalette.addFader(&mask4[0], 1, 1, this); - break; - case 3: - _palette2.loadPalette(17); - _globals->_sceneManager._scene->loadScene(17); - _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this); - break; - case 4: - _globals->_game->endGame(9900, 61); - remove(); - default: - break; - } -} - -void Scene9900::signal() { - if ((_sceneMode != 9913) && (_sceneMode != 9905) && (_sceneMode != 9904) && (_sceneMode != 9912)) { - _object1.hide(); - _object2.hide(); - _object3.hide(); - _object4.hide(); - _object5.hide(); - _object6.hide(); - } - - _object1.animate(ANIM_MODE_NONE, NULL); - _object2.animate(ANIM_MODE_NONE, NULL); - _object3.animate(ANIM_MODE_NONE, NULL); - _object4.animate(ANIM_MODE_NONE, NULL); - _object5.animate(ANIM_MODE_NONE, NULL); - _object6.animate(ANIM_MODE_NONE, NULL); - - _object1.setObjectWrapper(NULL); - _object2.setObjectWrapper(NULL); - _object3.setObjectWrapper(NULL); - _object4.setObjectWrapper(NULL); - _object5.setObjectWrapper(NULL); - _object6.setObjectWrapper(NULL); - - _object1.addMover(NULL); - _object2.addMover(NULL); - _object3.addMover(NULL); - _object4.addMover(NULL); - _object5.addMover(NULL); - _object6.addMover(NULL); - - switch (_sceneMode){ - case 150: - _globals->_soundHandler.play(380); - _object8.postInit(); - _object8.setVisage(2002); - _object8.setStrip(1); - _object8.setFrame(1); - _object8.fixPriority(200); - _object8.setPosition(Common::Point(64, 199)); - _globals->_player.disableControl(); - _sceneMode = 9908; - setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 162: - warning("TBC: shutdown();"); - _globals->_game->quitGame(); - break; - case 9901: - _globals->_player.disableControl(); - _sceneMode = 9906; - setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - break; - case 9902: - _globals->_player.disableControl(); - _sceneMode = 9901; - setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9903: - _globals->_player.disableControl(); - _sceneMode = 9902; - setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9904: - _globals->_soundHandler.play(390); - _sceneMode = 9912; - setAction(&_strAction2, this); - break; - case 9905: - _sceneMode = 150; - setAction(&_strAction1, this); - break; - case 9906: - if (_object8._state == 0) { - _globals->_player.disableControl(); - _sceneMode = 9913; - setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - } else { - _globals->_player.disableControl(); - _sceneMode = 9905; - setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - } - break; - case 9907: - _globals->_player.disableControl(); - _sceneMode = 9903; - setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9908: - _object8.remove(); - _globals->_player.disableControl(); - _sceneMode = 9904; - setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9909: - _globals->_soundHandler.play(375); - _globals->_player.disableControl(); - _sceneMode = 9907; - setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9910: - _globals->_player.disableControl(); - _sceneMode = 9911; - setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9911: - _globals->_soundHandler.play(367); - _globals->_player.disableControl(); - _sceneMode = 9909; - setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - break; - case 9912: - _globals->_player.disableControl(); - _sceneMode = 9912; - setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - _sceneMode = 162; - _globals->_player.enableControl(); - _globals->_player._canWalk = false; - break; - case 9913: - _sceneMode = 200; - setAction(&_strAction3, this); - break; - default: - break; - } -} - -void Scene9900::process(Event &event) { - if (event.handled) - return; - Scene::process(event); - if (_sceneMode == 9906) { - if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) { - _object8._state = 1; - RING_INVENTORY._items._sceneNumber = 9900; - _globals->_events.setCursor(CURSOR_USE); - } - } -} - -void Scene9900::dispatch() { - if (_action) - _action->dispatch(); -} - -void Scene9900::postInit(SceneObjectList *OwnerList) { - _object1.postInit(); - _object1.hide(); - _object2.postInit(); - _object2.hide(); - _object3.postInit(); - _object3.hide(); - _object4.postInit(); - _object4.hide(); - _object5.postInit(); - _object5.hide(); - _object6.postInit(); - _object6.hide(); - - _object8._state = 0; - - RING_INVENTORY._concentrator._sceneNumber = 9900; - RING_INVENTORY._items._rlbNum = 3; - RING_INVENTORY._items._cursorNum = 6; - RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge."); - - _stripManager.addSpeaker(&_speakerMR); - _globals->_player.disableControl(); - _sceneMode = 9910; - setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); -} - -/*-------------------------------------------------------------------------- - * Scene 9999 - Space travel - * - *--------------------------------------------------------------------------*/ - -void Scene9999::Action1::signal() { - switch (_actionIndex++) { - case 0: - setDelay(600); - break; - case 1: - _globals->_sceneManager.changeScene(3500); - break; - default: - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene9999::Action2::signal() { - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - SceneItem::display(9999, 0, SET_Y, 10, SET_X, 30, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 23, SET_WIDTH, 260, SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(300); - break; - case 2: - _globals->_stripNum = 3600; - _globals->_sceneManager.changeScene(3600); - default: - break; - } -} - -void Scene9999::postInit(SceneObjectList *OwnerList) { - loadScene(9998); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _object1.postInit(); - _object1.setVisage(1303); - _object1.setStrip2(3); - _object1.setPosition(Common::Point(160, 152)); - - _globals->_player.postInit(); - _globals->_player.setVisage(1303); - _globals->_player.setStrip2(1); - _globals->_player.fixPriority(250); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setPosition(Common::Point(194, 98)); - _globals->_player._numFrames = 20; - _globals->_player.disableControl(); - - _object2.postInit(); - _object2.setVisage(1303); - _object2.setStrip2(2); - _object2.fixPriority(2); - _object2.setPosition(Common::Point(164, 149)); - - _object3.postInit(); - _object3.setVisage(1303); - _object3.setStrip2(2); - _object3.fixPriority(2); - _object3.setFrame(2); - _object3.setPosition(Common::Point(292, 149)); - _object3.setAction(&_action3); - - if (_globals->_sceneManager._previousScene == 3500) - setAction(&_action2); - else - setAction(&_action1); - - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - - if (_globals->_sceneManager._previousScene == 3500) - _globals->_stripNum = 2222; - else - _globals->_stripNum = 2121; - - _globals->_soundHandler.play(118); - -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld_scenes10.h deleted file mode 100644 index 33b16d0014..0000000000 --- a/engines/tsage/ringworld_scenes10.h +++ /dev/null @@ -1,532 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES10_H -#define TSAGE_RINGWORLD_SCENES10_H - -#include "common/scummsys.h" -#include "tsage/ringworld_logic.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -class SceneObject9150 : public SceneObject { -public: - int _timer, _signalFlag; - - virtual void synchronize(Serializer &s) { - SceneObject::synchronize(s); - s.syncAsSint16LE(_timer); - s.syncAsSint16LE(_signalFlag); - } - virtual Common::String getClassName() { return "SceneObject9150"; } -}; - -class Scene2 : public Scene { -public : - int _sceneState; - - Scene2(); - virtual void synchronize(Serializer &s) { - Scene::synchronize(s); - s.syncAsSint16LE(_sceneState); - } -}; - -class Object9350 : public SceneObject { -public: - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void draw(); -}; - -class Scene9100 : public Scene { - /* Items */ - class SceneHotspot1 : public NamedHotspot { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneHotspot1 _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - NamedHotspot _sceneHotspot6; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9150 : public Scene2 { - class Object3 : public SceneObject9150 { - public: - virtual void signal(); - virtual void dispatch(); - }; -public: - SequenceManager _sequenceManager1; - SequenceManager _sequenceManager2; - SceneObject _object1; - SceneObject _object2; - Object3 _object3; - NamedHotspot _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - NamedHotspot _sceneHotspot6; - NamedHotspot _sceneHotspot7; - NamedHotspot _sceneHotspot8; - NamedHotspot _sceneHotspot9; - NamedHotspot _sceneHotspot10; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9200 : public Scene2 { - class SceneHotspot1 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - Action _action1; - SpeakerGText _speakerGText; - SpeakerGR _speakerGR; - SpeakerQText _speakerQText; - ASound _soundHandler; - SceneHotspot1 _hotspot1; - NamedHotspot _hotspot2; - NamedHotspot _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); - virtual void process(Event &event); -}; - -class Scene9300 : public Scene { -public: - SequenceManager _sequenceManager; - SceneObject _object1; - SceneObject _object2; - NamedHotspot _hotspot1; - NamedHotspot _hotspot2; - NamedHotspot _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - NamedHotspot _hotspot9; - NamedHotspot _hotspot10; - NamedHotspot _hotspot11; - NamedHotspot _hotspot12; - NamedHotspot _hotspot13; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9350 : public Scene2 { -public: - SequenceManager _sequenceManager; - Object9350 _object1; - SceneObject _object2; - NamedHotspot _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9360 : public Scene2 { -public: - SequenceManager _sequenceManager; - Action _action1; - Object9350 _object1; - NamedHotspot _hotspot1; - NamedHotspot _hotspot2; - NamedHotspot _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9400 : public Scene2 { - class SceneHotspot7 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class SceneHotspot8 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; -public: - Scene9400(); - SequenceManager _sequenceManager; - Action _action1; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SpeakerOText _speakerOText; - SpeakerOR _speakerOR; - SpeakerQText _speakerQText; - NamedHotspot _hotspot1; - NamedHotspot _hotspot2; - NamedHotspot _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - ASound _soundHandler; - int _field1032; - SceneHotspot7 _hotspot7; - SceneHotspot8 _hotspot8; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); - virtual void synchronize(Serializer &s); -}; - -class Scene9450 : public Scene2 { - class Object2 : public SceneObject { - public: - virtual void signal(); - }; - - class Object3 : public SceneObject9150 { - public: - virtual void dispatch(); - }; - - class Hotspot1 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot3 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; -public: - SceneObject _object1; - SequenceManager _sequenceManager1; - SequenceManager _sequenceManager2; - Object2 _object2; - SequenceManager _sequenceManager3; - Object3 _object3; - Hotspot1 _hotspot1; - NamedHotspot _hotspot2; - Hotspot3 _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - NamedHotspot _hotspot9; - NamedHotspot _hotspot10; - NamedHotspot _hotspot11; - NamedHotspot _hotspot12; - NamedHotspot _hotspot13; - NamedHotspot _hotspot14; - NamedHotspot _hotspot15; - NamedHotspot _hotspot16; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9500 : public Scene2 { - class Hotspot1 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot2 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot3 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot4 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - -public: - SequenceManager _sequenceManager; - SceneObject _candle; - SceneObject _object2; - SceneObject _object3; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - Hotspot3 _hotspot3; - Hotspot4 _hotspot4; - Hotspot4 _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - NamedHotspot _hotspot9; - NamedHotspot _hotspot10; - NamedHotspot _hotspot11; - NamedHotspot _hotspot12; - NamedHotspot _hotspot13; - NamedHotspot _hotspot14; - NamedHotspot _hotspot15; - NamedHotspot _hotspot16; - NamedHotspot _hotspot17; - NamedHotspot _hotspot18; - NamedHotspot _hotspot19; - NamedHotspot _hotspot20; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); - virtual void process(Event &event); -}; - -class Scene9700 : public Scene2 { - SequenceManager _sequenceManager; - SceneObject _object1; - NamedHotspot _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - NamedHotspot _sceneHotspot6; - GfxButton _gfxButton1; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); -}; - -class Scene9750 : public Scene { -public: - SequenceManager _sequenceManager; - SceneObject _object1; - SceneObject _object2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene9850 : public Scene { - class Object6 : public SceneObject{ - public: - virtual void doAction(int action); - }; - - class Object7 : public SceneObjectExt{ - public: - virtual void doAction(int action); - }; - - class Hotspot12 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot14 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot16 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot17 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot18 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot19 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; - - class Hotspot20 : public NamedHotspot{ - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SceneObject _objDoor; - SceneObject _objCloak; - SceneObject _objJacket; - SceneObject _objTunic2; - SceneObject _objLever; - Object6 _objScimitar; - Object7 _objSword; - ASound _soundHandler; - NamedHotspot _hotspot1; - NamedHotspot _hotspot2; - NamedHotspot _hotspot3; - NamedHotspot _hotspot4; - NamedHotspot _hotspot5; - NamedHotspot _hotspot6; - NamedHotspot _hotspot7; - NamedHotspot _hotspot8; - NamedHotspot _hotspot9; - NamedHotspot _hotspot10; - NamedHotspot _hotspot11; - Hotspot12 _hotspot12; - NamedHotspot _hotspot13; - Hotspot14 _hotspot14; - NamedHotspot _hotspot15; - Hotspot16 _hotspot16; - Hotspot17 _hotspot17; - Hotspot18 _hotspot18; - Hotspot19 _hotspot19; - Hotspot20 _spotLever; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); -}; - -class Scene9900 : public Scene { - class strAction1 : public Action { - public: - SceneObject _object9; - ScenePalette _palette1; - - virtual void signal(); - }; - - class strAction2 : public Action { - public: - SceneText _txtArray1[2]; - SceneText _txtArray2[2]; - int _lineNum, _txtArray1Index, _var3; - - virtual void signal(); - virtual void dispatch(); - virtual void synchronize(Serializer &s); - }; - - class strAction3 : public Action { - public: - SceneObject _object10; - ScenePalette _palette2; - ScenePalette _palette3; - - virtual void signal(); - }; - -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneObject _object7; - SceneObjectExt _object8; - strAction1 _strAction1; - strAction2 _strAction2; - strAction3 _strAction3; - SpeakerMR _speakerMR; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); - virtual void process(Event &event); -}; - -class Scene9999 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - -public: - - Action1 _action1; - Action2 _action2; - Action _action3; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes2.cpp b/engines/tsage/ringworld_scenes2.cpp deleted file mode 100644 index 0154123c3d..0000000000 --- a/engines/tsage/ringworld_scenes2.cpp +++ /dev/null @@ -1,928 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "tsage/ringworld_scenes2.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 1000 - Title Screen - * - *--------------------------------------------------------------------------*/ - -void Scene1000::Action1::signal() { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(10); - break; - case 1: - scene->_object4.postInit(); - scene->_object4.setVisage(1001); - scene->_object4._frame = 1; - scene->_object4.setStrip2(5); - scene->_object4.changeZoom(100); - scene->_object4.animate(ANIM_MODE_2, NULL); - scene->_object4.setPosition(Common::Point(403, 163)); - setDelay(90); - break; - case 2: { - SceneItem::display(0, 0); - scene->_object4.remove(); - scene->_object1.changeZoom(-1); - NpcMover *mover = new NpcMover(); - Common::Point pt(180, 100); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_sceneManager.changeScene(1400); - break; - } - -} - -void Scene1000::Action2::signal() { - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(10); - break; - case 1: - SceneItem::display(1000, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, - SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(180); - break; - case 2: - SceneItem::display(0, 0); - _globals->_sceneManager.changeScene(2000); - break; - default: - break; - } -} - -void Scene1000::Action3::signal() { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_sceneManager._scene->loadBackground(0, 0); - setDelay(60); - break; - case 1: { - NpcMover *mover = new NpcMover(); - Common::Point pt(158, 31); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 2: - case 3: - setDelay(60); - break; - case 4: - _globals->_player.show(); - setDelay(240); - break; - case 5: { - _globals->_player.enableControl(); - - const char *SEEN_INTRO = "seen_intro"; - if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { - // First time being played, so show the introduction - ConfMan.setBool(SEEN_INTRO, true); - ConfMan.flushToDisk(); - - setDelay(1); - } else { - // Prompt user for whether to start play or watch introduction - _globals->_player.enableControl(); - - if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { - _actionIndex = 20; - _globals->_soundHandler.fadeOut(this); - } else { - setDelay(1); - } - } - - _globals->_player.disableControl(); - break; - } - case 6: { - scene->_object3.remove(); - _globals->_player.setStrip2(2); - NpcMover *mover = new NpcMover(); - Common::Point pt(480, 100); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 7: - _globals->_scenePalette.loadPalette(1002); - _globals->_scenePalette.refresh(); - _globals->_scenePalette.addRotation(80, 95, -1); - scene->_object3.postInit(); - scene->_object3.setVisage(1002); - scene->_object3.setStrip(1); - scene->_object3.setPosition(Common::Point(284, 122)); - scene->_object3.changeZoom(1); - - zoom(true); - setDelay(200); - break; - case 8: - zoom(false); - setDelay(10); - break; - case 9: - scene->_object3.setStrip(2); - scene->_object3.setPosition(Common::Point(285, 155)); - - zoom(true); - setDelay(400); - break; - case 10: - zoom(false); - setDelay(10); - break; - case 11: - scene->_object3.setStrip(3); - scene->_object3.setPosition(Common::Point(279, 172)); - - zoom(true); - setDelay(240); - break; - case 12: - zoom(false); - setDelay(10); - break; - case 13: - scene->_object3.setStrip(4); - scene->_object3.setPosition(Common::Point(270, 128)); - - zoom(true); - setDelay(300); - break; - case 14: - zoom(false); - setDelay(10); - break; - case 15: - scene->_object3.setStrip(1); - scene->_object3.setFrame(2); - scene->_object3.setPosition(Common::Point(283, 137)); - - zoom(true); - setDelay(300); - break; - case 16: - zoom(false); - setDelay(10); - break; - case 17: - scene->_object3.setStrip(5); - scene->_object3.setFrame(1); - scene->_object3.setPosition(Common::Point(292, 192)); - - zoom(true); - setDelay(300); - break; - case 18: - zoom(false); - _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.fadeOut(this); - break; - case 19: - _globals->_sceneManager.changeScene(10); - break; - case 20: - _globals->_sceneManager.changeScene(30); - break; - default: - break; - } -} - -void Scene1000::Action3::zoom(bool up) { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; - - if (up) { - while ((scene->_object3._percent < 100) && !_vm->shouldQuit()) { - scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100)); - _globals->_sceneObjects->draw(); - _globals->_events.delay(1); - } - } else { - while ((scene->_object3._percent > 0) && !_vm->shouldQuit()) { - scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0)); - _globals->_sceneObjects->draw(); - _globals->_events.delay(1); - } - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene1000::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - loadScene(1000); - - if (_globals->_sceneManager._previousScene == 2000) { - setZoomPercents(150, 10, 180, 100); - _object1.postInit(); - _object1.setVisage(1001); - _object1._strip = 7; - _object1.animate(ANIM_MODE_2, 0); - _object1._moveDiff = Common::Point(1, 1); - _object1.setPosition(Common::Point(120, 180)); - - setAction(&_action2); - - _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - _globals->_soundHandler.play(114); - } else if (_globals->_sceneManager._previousScene == 2222) { - setZoomPercents(150, 10, 180, 100); - _object1.postInit(); - _object1.setVisage(1001); - _object1._strip = 7; - _object1.animate(ANIM_MODE_2, 0); - _object1._moveDiff = Common::Point(2, 2); - _object1.setPosition(Common::Point(120, 180)); - - _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - - setAction(&_action1); - } else { - _globals->_soundHandler.play(4); - setZoomPercents(0, 10, 30, 100); - _object3.postInit(); - _object3.setVisage(1050); - _object3.changeZoom(-1); - _object3.setPosition(Common::Point(158, 0)); - - _globals->_player.postInit(); - _globals->_player.setVisage(1050); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(160, 191)); - _globals->_player._moveDiff.x = 12; - _globals->_player.hide(); - _globals->_player.disableControl(); - - _globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y); - - setAction(&_action3); - } -} - -/*-------------------------------------------------------------------------- - * Scene 1001 - Fleeing planet cutscene - * - *--------------------------------------------------------------------------*/ - -void Scene1001::Action1::signal() { - Scene1001 *scene = (Scene1001 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 2: { - Common::Point pt(108, 171); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 3: { - Common::Point pt(170, 159); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 4: { - scene->_object2.postInit(); - scene->_object2.setVisage(16); - scene->_object2.setStrip2(4); - scene->_object2.setPosition(Common::Point(61, 177)); - scene->_object2.animate(ANIM_MODE_5, this); - - Common::Point pt(320, 100); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 5: { - Common::Point pt(82, 166); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 6: { - Common::Point pt(64, 149); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 7: { - Common::Point pt(15, 136); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 8: { - Common::Point pt(-5, 120); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 9: { - scene->_object1.postInit(); - scene->_object1.setVisage(16); - scene->_object1.setStrip2(1); - scene->_object1.setFrame(1); - scene->_object1.setPosition(Common::Point(-75, 87)); - scene->_object1.animate(ANIM_MODE_2, NULL); - - Common::Point pt(0, 100); - NpcMover *mover = new NpcMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 10: { - Common::Point pt1(107, 115); - NpcMover *mover1 = new NpcMover(); - scene->_object1.addMover(mover1, &pt1, NULL); - - scene->_object3.setVisage(16); - scene->_object3.setStrip2(5); - scene->_object3.setFrame2(2); - scene->_object3.setPosition(Common::Point(220, 200)); - - Common::Point pt2(187, 181); - NpcMover *mover2 = new NpcMover(); - scene->_object3.addMover(mover2, &pt2, this); - break; - } - case 11: { - scene->_object2.setVisage(16); - scene->_object2.setStrip2(5); - scene->_object2.setFrame2(1); - scene->_object2.setPosition(Common::Point(211, 0)); - - Common::Point pt(189, 30); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 12: - scene->_stripManager.start(100, this); - break; - case 13: { - scene->_object4.postInit(); - scene->_object4.setVisage(16); - scene->_object4.setStrip2(2); - scene->_object4.setFrame(4); - scene->_object4.setPosition(Common::Point(360, 80)); - scene->_object4.animate(ANIM_MODE_2, NULL); - - Common::Point pt(303, 97); - NpcMover *mover = new NpcMover(); - scene->_object4.addMover(mover, &pt, this); - break; - } - case 14: - scene->_stripManager.start(110, this); - break; - case 15: - setDelay(10); - break; - case 16: { - scene->_soundHandler1.play(90); - - scene->_object6.postInit(); - scene->_object6.setVisage(16); - scene->_object6.setStrip2(6); - scene->_object6.setFrame2(2); - scene->_object6._moveDiff = Common::Point(20, 20); - scene->_object6.fixPriority(20); - scene->_object6.setPosition(Common::Point(scene->_object2._position.x - 6, scene->_object2._position.y + 7)); - scene->_object6.animate(ANIM_MODE_5, NULL); - - Common::Point pt(scene->_object6._position.x - 70, scene->_object6._position.y + 70); - NpcMover *mover = new NpcMover(); - scene->_object6.addMover(mover, &pt, this); - break; - } - case 17: { - scene->_soundHandler1.play(90); - scene->_object6.remove(); - - scene->_object7.postInit(); - scene->_object7.setVisage(16); - scene->_object7.setStrip2(6); - scene->_object7.setFrame2(1); - scene->_object7._moveDiff = Common::Point(20, 20); - scene->_object7.setPosition(Common::Point(scene->_object3._position.x - 28, scene->_object3._position.y - 11)); - scene->_object7.fixPriority(200); - scene->_object7.animate(ANIM_MODE_5, NULL); - - Common::Point pt(scene->_object7._position.x - 70, scene->_object7._position.y - 70); - NpcMover *mover = new NpcMover(); - scene->_object7.addMover(mover, &pt, this); - break; - } - case 18: - scene->_object7.remove(); - - scene->_object5.postInit(); - scene->_object5.setVisage(16); - scene->_object5.setPosition(Common::Point(306, 93)); - scene->_object5._strip = 3; - scene->_object5.fixPriority(200); - scene->_object5.animate(ANIM_MODE_2, NULL); - setDelay(30); - break; - case 19: { - _globals->_soundHandler.play(91); - byte adjustData[4] = {0xff, 0xff, 0xff, 0}; - _globals->_scenePalette.fade(adjustData, false, 0); - - scene->_object1._strip = 7; - scene->_object1._frame = 1; - scene->_object1.setPosition(Common::Point(314, 112)); - scene->_object1.addMover(NULL); - setDelay(2); - break; - } - case 20: - _globals->_scenePalette.loadPalette(16); - _globals->_scenePalette.refresh(); - setDelay(6); - break; - case 21: - scene->_object1._numFrames = 15; - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 22: - _globals->_soundHandler.play(92); - scene->_stripManager.start(111, this); - break; - case 23: - setDelay(60); - break; - case 24: - _globals->_sceneManager.changeScene(2000); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene1001::postInit(SceneObjectList *OwnerList) { - loadScene(16); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerCText); - _stripManager.addSpeaker(&_speakerCR); - _stripManager.addSpeaker(&_speakerSL); - _speakerQText._color1 = 11; - - _object3.postInit(); - _object3.setVisage(16); - _object3.setStrip2(4); - _object3.setPosition(Common::Point(61, 177)); - - _globals->_soundHandler.play(85); - setAction(&_action1); -} - - -/*-------------------------------------------------------------------------- - * Scene 1250 - - * - *--------------------------------------------------------------------------*/ - -void Scene1250::Action1::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(120) + 60); - break; - case 1: - scene->_object1.animate(ANIM_MODE_5, this); - _actionIndex = 0; - break; - } -} - -void Scene1250::Action2::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - switch (_globals->_randomSource.getRandomNumber(2)) { - case 0: - scene->_object2.setPosition(Common::Point(163, 75)); - break; - case 1: - scene->_object2.setPosition(Common::Point(109, 65)); - break; - case 2: - scene->_object2.setPosition(Common::Point(267, 20)); - break; - } - - setDelay(30); - break; - case 1: - scene->_object2.animate(ANIM_MODE_5, this); - _actionIndex = 0; - break; - } -} - -void Scene1250::Action3::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - scene->_stripManager.start(1251, this); - break; - case 2: - setDelay(6); - break; - case 3: - _globals->_sceneManager.changeScene(1000); - break; - } -} - -void Scene1250::Action4::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - scene->_stripManager.start(1250, this); - break; - case 2: - setDelay(6); - break; - case 3: - _globals->_sceneManager.changeScene(2000); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene1250::postInit(SceneObjectList *OwnerList) { - loadScene(1250); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQText); - _speakerQText._textPos = Common::Point(120, 120); - _speakerQText._textWidth = 180; - - _object1.postInit(); - _object1.setVisage(1250); - _object1.setPosition(Common::Point(126, 69)); - _object1.setStrip2(1); - _object1._frame = 1; - _object1.setAction(&_action1); - - _object2.postInit(); - _object2.setVisage(1250); - _object2.setPosition(Common::Point(126, 69)); - _object2.setStrip2(2); - _object2.fixPriority(255); - _object2._frame = 1; - _object2.setAction(&_action2); - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - - if ((_globals->_sceneManager._previousScene != 2000) || (_globals->_stripNum != 1250)) { - setAction(&_action4); - } else { - setAction(&_action3); - _globals->_soundHandler.play(114); - } -} - -/*-------------------------------------------------------------------------- - * Scene 1400 - Ringworld Wall - * - *--------------------------------------------------------------------------*/ - -void Scene1400::Action1::signal() { - Scene1400 *scene = (Scene1400 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: { - SceneItem::display(1400, 0, SET_X, 120, SET_Y, 610, SET_FONT, 2, SET_EXT_BGCOLOR, 23, SET_KEEP_ONSCREEN, -1, LIST_END); - - Common::Point pt(160, 700); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: { - _globals->_player.setStrip2(3); - _globals->_player.changeZoom(100); - - Common::Point pt(160, 100); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - - SceneItem::display(0, 0); - setDelay(360); - break; - } - case 3: - SceneItem::display(1400, 2, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, - SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); - setDelay(420); - break; - case 4: - SceneItem::display(0, 0); - setDelay(360); - break; - case 5: - SceneItem::display(1400, 3, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, - SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); - setDelay(360); - break; - case 6: - SceneItem::display(0, 0); - break; - case 7: { - _globals->_player._frame = 1; - _globals->_player.setStrip2(1); - _globals->_player._numFrames = 5; - _globals->_player.animate(ANIM_MODE_5, this); - - Common::Point pt(205, 70); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, NULL); - _globals->_sceneManager._fadeMode = FADEMODE_NONE; - - scene->loadScene(1402); - break; - } - case 8: - _globals->_player.setStrip2(2); - _globals->_player._numFrames = 10; - _globals->_player.animate(ANIM_MODE_2, NULL); - - SceneItem::display(1400, 4, SET_X, 30, SET_Y, _globals->_player._position.y + 10, SET_FONT, 2, - SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); - setDelay(300); - break; - case 9: { - SceneItem::display(0, 0); - Common::Point pt(450, 45); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 10: - _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_stripNum = 1500; - _globals->_soundHandler.stop(); - - _globals->_sceneManager.changeScene(1500); - break; - } -} - -void Scene1400::Action1::dispatch() { - Action::dispatch(); - - if ((_actionIndex > 3) && (_actionIndex < 9)) - _globals->_sceneText.setPosition(Common::Point(60, _globals->_sceneManager._scene->_sceneBounds.bottom - 80)); - - if ((_actionIndex <= 2) && (_globals->_player._percent > 22)) - _globals->_player.changeZoom(100 - (800 - _globals->_player._position.y)); - - if ((_actionIndex >= 9) && (_globals->_player._percent > 22)) - _globals->_player.changeZoom(100 - (_globals->_player._position.x - 205)); -} - -/*--------------------------------------------------------------------------*/ - -void Scene1400::postInit(SceneObjectList *OwnerList) { - if (_globals->_stripNum != 1400) { - loadScene(1401); - } else { - loadScene(1402); - } - Scene::postInit(); - - _globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180); - _globals->_player.postInit(); - _globals->_player.setVisage(1401); - _globals->_player.animate(ANIM_MODE_2, 0); - _globals->_player.setStrip2(4); - _globals->_player.fixPriority(4); - _globals->_player.disableControl(); - - _globals->_player._moveDiff = Common::Point(4, 2); - _globals->_player.setPosition(Common::Point(160, 800)); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100; - - setAction(&_action1); - _globals->_soundHandler.play(118); -} - -/*-------------------------------------------------------------------------- - * Scene 1500 - Ringworld Space-port - * - *--------------------------------------------------------------------------*/ - -void Scene1500::Action1::signal() { - Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_object1.postInit(); - scene->_object1.setVisage(1501); - scene->_object1._moveDiff = Common::Point(2, 1); - scene->_object1.setPosition(Common::Point(204, 85)); - scene->_object1.animate(ANIM_MODE_2, NULL); - scene->_object1._numFrames = 3; - scene->_object1.changeZoom(-1); - - Common::Point pt(238, 121); - PlayerMover *mover = new PlayerMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 1: { - Common::Point pt(312, 145); - PlayerMover *mover = new PlayerMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object1.setStrip(2); - scene->_object1.setFrame(1); - scene->_object1._moveDiff.y = 2; - scene->_object1._numFrames = 5; - - Common::Point pt(310, 150); - PlayerMover *mover = new PlayerMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 3: { - Common::Point pt(304, 165); - PlayerMover *mover = new PlayerMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 4: { - scene->_object1._numFrames = 3; - scene->_object1.setStrip2(3); - scene->_object1.animate(ANIM_MODE_2, this); - - Common::Point pt(94, 175); - PlayerMover *mover = new PlayerMover(); - scene->_object1.addMover(mover, &pt, this); - break; - } - case 5: - setDelay(30); - break; - case 6: - scene->_soundHandler.play(123); - scene->_object1.setStrip2(4); - scene->_object1.setFrame(1); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 7: - scene->_object1.setStrip2(5); - scene->_object1.animate(ANIM_MODE_2, NULL); - scene->_soundHandler.play(124, this); - break; - case 8: - _globals->_soundHandler.play(126, this); - break; - case 9: - _globals->_soundHandler.play(127); - _globals->_sceneManager.changeScene(2000); - break; - } -} - -void Scene1500::Action2::signal() { - Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: { - scene->_object2.postInit(); - scene->_object2.setVisage(1502); - scene->_object2.fixPriority(255); - scene->_object2.changeZoom(5); - scene->_object2._frame = 1; - scene->_object2._moveDiff = Common::Point(1, 1); - scene->_object2.setPosition(Common::Point(104, 184)); - scene->_object2.animate(ANIM_MODE_2, NULL); - - Common::Point pt(118, 147); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object2._moveDiff.x = 5; - scene->_object2.changeZoom(-1); - Common::Point pt(-55, 200); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 3: - scene->_soundHandler.release(); - _globals->_stripNum = 1505; - _globals->_sceneManager.changeScene(2400); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene1500::postInit(SceneObjectList *OwnerList) { - loadScene(1500); - Scene::postInit(); - - if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) { - _globals->_soundHandler.play(120); - setZoomPercents(105, 20, 145, 100); - - setAction(&_action1); - } else { - setZoomPercents(150, 5, 200, 100); - - _object1.postInit(); - _object1.setVisage(1501); - _object1.setStrip2(5); - _object1.setPosition(Common::Point(94, 175)); - _object1.animate(ANIM_MODE_2, NULL); - - setAction(&_action2); - } -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes2.h b/engines/tsage/ringworld_scenes2.h deleted file mode 100644 index 93a8f04fd4..0000000000 --- a/engines/tsage/ringworld_scenes2.h +++ /dev/null @@ -1,149 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES2_H -#define TSAGE_RINGWORLD_SCENES2_H - -#include "common/scummsys.h" -#include "tsage/ringworld_logic.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -class Scene1000 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - private: - void zoom(bool up); - public: - virtual void signal(); - }; - -public: - SceneObject _object1, _object2, _object3, _object4; - Action1 _action1; - Action2 _action2; - Action3 _action3; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene1001 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; -public: - SpeakerQText _speakerQText; - SpeakerSL _speakerSL; - SpeakerCText _speakerCText; - SpeakerCR _speakerCR; - Action1 _action1; - SceneObject _object1, _object2, _object3, _object4; - SceneObject _object5, _object6, _object7; - ASound _soundHandler1, _soundHandler2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene1250 : public Scene { -public: - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; -public: - SpeakerQText _speakerQText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - SceneObject _object1, _object2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene1400 : public Scene { -public: - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; -public: - Action1 _action1; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - -}; - -class Scene1500 : public Scene { -public: - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; -public: - ASound _soundHandler; - Action1 _action1; - Action2 _action2; - SceneObject _object1, _object2, _object3; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - - - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp deleted file mode 100644 index 209144766a..0000000000 --- a/engines/tsage/ringworld_scenes3.cpp +++ /dev/null @@ -1,6133 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "tsage/ringworld_scenes3.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 2000 - Cockpit cutscenes - * - *--------------------------------------------------------------------------*/ - -void Scene2000::Action1::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - error("Old stuff"); - break; - case 1: - scene->_stripManager.start(2075, this); - break; - case 2: - setDelay(4); - break; - case 3: - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(1250); - break; - } -} - -void Scene2000::Action2::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_object2.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - break; - case 1: - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - if (_globals->_randomSource.getRandomNumber(4) >= 2) - _actionIndex = 0; - break; - case 2: - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - _actionIndex = _globals->_randomSource.getRandomNumber(1); - break; - } -} - -void Scene2000::Action3::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_object6.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - break; - case 1: - scene->_object6.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - _actionIndex = 0; - break; - } -} - -void Scene2000::Action4::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_object4.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - break; - case 1: - scene->_object4.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - _actionIndex = 0; - break; - } -} - -void Scene2000::Action5::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_object3.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(125) + 300); - break; - case 1: - scene->_object3.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(125) + 300); - _actionIndex = 0; - break; - } -} - -void Scene2000::Action6::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(130); - break; - case 1: - scene->_soundHandler2.play(79); - scene->_stripManager.start(2000, this); - break; - case 2: - _globals->_soundHandler.play(81); - scene->_object6.postInit(); - scene->_object6.setVisage(2003); - scene->_object6.setAction(NULL); - scene->_object6.setStrip2(2); - scene->_object6.setPosition(Common::Point(184, 137)); - scene->_object6.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_stripManager.start(95, this); - break; - case 4: - scene->_object6.animate(ANIM_MODE_6, this); - break; - case 5: - _globals->_soundHandler.play(80); - scene->_object6.remove(); - _globals->_sceneManager.changeScene(1001); - break; - } -} - -void Scene2000::Action7::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - scene->_stripManager.start(2072, this); - break; - case 2: - setDelay(3); - break; - case 3: - _globals->_sceneManager.changeScene(2222); - break; - } -} - -void Scene2000::Action8::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - error("Old stuff"); - break; - case 1: - scene->_stripManager.start(2073, this); - break; - case 2: - setDelay(10); - break; - case 3: - _globals->_stripNum = 2005; - _globals->_sceneManager.changeScene(1000); - break; - } -} - -void Scene2000::Action9::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - error("Old stuff"); - break; - case 1: - scene->_stripManager.start(2074, this); - break; - case 2: - setDelay(3); - break; - case 3: - _globals->_stripNum = 2008; - _globals->_sceneManager.changeScene(9999); - break; - } -} - -void Scene2000::Action10::signal() { - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - error("Old stuff"); - break; - case 2: - SceneItem::display(2000, 17, SET_Y, 20, SET_X, 110, SET_FONT, 2, SET_BG_COLOR, -1, - SET_FG_COLOR, 17, SET_WIDTH, 200, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, 1, LIST_END); - break; - case 3: - SceneItem::display(0, 0); - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(9999); - break; - } -} - -void Scene2000::Action11::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - error("Old stuff"); - break; - case 1: - scene->_stripManager.start(2076, this); - break; - case 2: - scene->_stripManager.start(2077, this); - break; - case 3: - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(1400); - break; - } -} - -void Scene2000::Action12::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(2020, this); - break; - case 2: - _globals->_player.disableControl(); - setDelay(10); - break; - case 3: - _globals->_sceneManager.changeScene(2300); - break; - } -} - -void Scene2000::Action13::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - scene->_stripManager.start(2078, this); - break; - case 2: - SceneItem::display(0, 0); - _globals->_stripNum = 2751; - _globals->_sceneManager.changeScene(1500); - break; - } -} - -void Scene2000::Action14::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(30); - break; - case 1: - scene->_stripManager.start(2070, this); - break; - case 2: - setDelay(60); - break; - case 3: - _globals->_soundHandler.play(99); - scene->_object8.show(); - scene->_object8.animate(ANIM_MODE_5, this); - break; - case 4: - _globals->_soundHandler.play(12); - scene->_object8.setStrip(2); - scene->_object8.setFrame(1); - scene->_object9.show(); - scene->_object10.show(); - setDelay(60); - break; - case 5: - scene->_stripManager.start(2001, this, scene); - break; - case 6: - _globals->_soundHandler.fadeOut(NULL); - scene->_object8.setStrip(1); - scene->_object8.setFrame(scene->_object8.getFrameCount()); - scene->_object8.animate(ANIM_MODE_6, this); - - scene->_object9.remove(); - scene->_object10.remove(); - break; - case 7: - _globals->_soundHandler.play(111); - scene->_object8.remove(); - setDelay(5); - break; - case 8: - scene->_stripManager.start(2071, this); - break; - case 9: - _globals->_stripNum = 1250; - _globals->_sceneManager.changeScene(1000); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2000::postInit(SceneObjectList *OwnerList) { - loadScene(2000); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerMR); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - _stripManager.addSpeaker(&_speakerHText); - - _speakerQText._npc = &_object2; - _speakerSText._npc = &_object3; - _speakerMText._npc = &_object6; - _speakerHText._npc = &_object6; - _stripManager.setCallback(this); - - _object3.postInit(); - _object3.setVisage(2002); - _object3.setPosition(Common::Point(65, 199)); - - _object4.postInit(); - _object4.setVisage(2002); - _object4.setStrip(2); - _object4.setPosition(Common::Point(125, 199)); - _object4.setAction(&_action4); - - _object2.postInit(); - _object2.setVisage(2001); - _object2.setPosition(Common::Point(43, 115)); - _object2.setAction(&_action2); - - _globals->_player.disableControl(); - - _object6.postInit(); - _object6.setVisage(2003); - _object6.setPosition(Common::Point(267, 170)); - _object6.setAction(&_action3); - - _object8.postInit(); - _object8.setVisage(2005); - _object8.setPosition(Common::Point(169, 133)); - _object8.setPriority(133); - _object8.hide(); - - _object9.postInit(); - _object9.setVisage(2005); - _object9.setStrip2(3); - _object9.setFrame(4); - _object9.setPosition(Common::Point(136, 86)); - _object9.fixPriority(190); - _object9.hide(); - - _object10.postInit(); - _object10.setVisage(2005); - _object10.setStrip2(5); - _object10.setFrame(4); - _object10.setPosition(Common::Point(202, 86)); - _object10.fixPriority(195); - _object10.hide(); - - switch (_globals->_sceneManager._previousScene) { - case 1000: - setAction(&_action7); - break; - case 1001: - _object6.remove(); - setAction(&_action12); - break; - case 1500: - setAction(&_action13); - break; - case 2200: - _globals->_soundHandler.play(111); - setAction(&_action14); - break; - case 2222: - _globals->_soundHandler.play(115); - setAction(&_action8); - break; - case 3500: - setAction(&_action11); - break; - default: - _object6.remove(); - _globals->_soundHandler.play(80); - setAction(&_action6); - break; - } - - _soundHandler1.play(78); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2000::stripCallback(int v) { - switch (v) { - case 0: - _object9.setStrip(3); - _object9.animate(ANIM_MODE_7, NULL); - _object10.setStrip(6); - _object10.setFrame(1); - _object10.animate(ANIM_MODE_5, NULL); - break; - case 1: - _object10.setStrip(5); - _object10.animate(ANIM_MODE_7, NULL); - _object9.setStrip(4); - _object9.setFrame(1); - _object9.animate(ANIM_MODE_5, NULL); - break; - case 2: - _object9.animate(ANIM_MODE_NONE, NULL); - break; - case 3: - _object10.setStrip(6); - _object10.setFrame(1); - _object10.animate(ANIM_MODE_5, NULL); - _object9.setStrip(4); - _object9.setFrame(1); - _object9.animate(ANIM_MODE_5, NULL); - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 2100 - Starcraft Cockpit - * - *--------------------------------------------------------------------------*/ - -void Scene2100::Action1::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - if (!scene->_sitFl) - setDelay(1); - else { - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); - scene->_sitFl = 0; - } - break; - case 1: { - Common::Point pt(157, 62); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 3: { - Common::Point pt(157, 56); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 4: - _globals->_player._strip = 3; - setDelay(3); - break; - case 5: - _globals->_player.fixPriority(1); - scene->_area1.display(); - scene->_area2.display(); - scene->_area3.display(); - scene->_area4.display(); - - scene->_area1.draw(true); - _state = 0; - _globals->_events.setCursor(CURSOR_USE); - - while (!_state && !_vm->shouldQuit()) { - // Wait for an event - Event event; - if (!_globals->_events.getEvent(event)) { - g_system->updateScreen(); - g_system->delayMillis(10); - continue; - } - - if (scene->_area1._bounds.contains(event.mousePos)) { - scene->_area1.draw(true); - _state = scene->_area1._actionId; - } - if (scene->_area2._bounds.contains(event.mousePos)) { - scene->_area1.draw(false); - scene->_area2.draw(true); - _state = scene->_area2._actionId; - } - if (scene->_area3._bounds.contains(event.mousePos)) { - scene->_area1.draw(false); - scene->_area3.draw(true); - _state = scene->_area3._actionId; - } - } - - scene->_soundHandler.play(161); - scene->_area1.restore(); - scene->_area2.restore(); - scene->_area3.restore(); - scene->_area4.restore(); - - if (_state == 2100) { - setDelay(1); - } else { - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - } - break; - case 6: - if (_state == 2100) { - Common::Point pt(157, 65); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } else { - _globals->_sceneManager.changeScene(_state); - } - break; - case 7: - _globals->_player.fixPriority(-1); - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 8: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2100::Action2::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_object3._numFrames = 5; - setDelay(_globals->_randomSource.getRandomNumber(59)); - break; - case 1: - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 2: - setDelay(_globals->_randomSource.getRandomNumber(59)); - break; - case 3: - scene->_object3.animate(ANIM_MODE_6, this); - _actionIndex = 0; - break; - } -} - -void Scene2100::Action3::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - case 2: - setDelay(_globals->_randomSource.getRandomNumber(119)); - break; - case 1: - scene->_object2.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_object2.animate(ANIM_MODE_6, this); - _actionIndex = 0; - break; - } -} - -void Scene2100::Action4::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - if (!scene->_sitFl) - setDelay(1); - else - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); - break; - case 1: { - Common::Point pt(80, 66); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_player.setVisage(2109); - _globals->_player._frame = 1; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_sceneManager.changeScene(2120); - break; - } -} - -void Scene2100::Action5::signal() { - // Quinn enters the cokpit after Seeker decided to enter the cave alone - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); - break; - case 2: { - Common::Point pt(272, 127); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_player.checkAngle(&scene->_object3); - setDelay(30); - break; - case 4: - _globals->_sceneManager.changeScene(3700); - break; - } -} - -void Scene2100::Action6::signal() { - // Seeker stands up and walks to the elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_object2.setVisage(2806); - scene->_object2.setStrip(1); - scene->_object2.setStrip2(-1); - scene->_object2.changeZoom(-1); - scene->_object2.setPosition(Common::Point(155, 116)); - scene->_object2.setObjectWrapper(new SceneObjectWrapper()); - scene->_object2.setAction(NULL); - scene->_object2.animate(ANIM_MODE_1, NULL); - - Common::Point pt(130, 116); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 1: { - scene->_object2.fixPriority(-1); - Common::Point pt(153, 67); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 2: - remove(); - break; - } -} - -void Scene2100::Action7::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); - break; - case 2: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, NULL); - break; - case 3: - _globals->_sceneManager.changeScene(8100); - break; - } -} - -void Scene2100::Action8::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); - break; - case 2: { - Common::Point pt(200, 174); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_player.checkAngle(&scene->_object3); - scene->_stripManager.start((RING_INVENTORY._translator._sceneNumber == 1) ? 7720 : 7710, this); - break; - case 4: - if (RING_INVENTORY._translator._sceneNumber != 1) - _globals->_sceneManager.changeScene(7600); - else { - _globals->setFlag(24); - _globals->_player.enableControl(); - remove(); - } - break; - } -} - -void Scene2100::Action9::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - scene->_stripManager.start(6050, this); - break; - case 2: - scene->_soundHandler.play(99); - scene->_object4.show(); - scene->_object4.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_soundHandler.play(12); - scene->_object4.setStrip(2); - scene->_stripManager.start(6051, this, scene); - break; - case 4: - scene->_soundHandler.fadeOut(NULL); - scene->_object4.setStrip(1); - scene->_object4.setFrame(scene->_object4.getFrameCount()); - scene->_object4.animate(ANIM_MODE_6, this); - break; - case 5: - scene->_object4.hide(); - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(6010, this); - break; - case 6: - if (scene->_stripManager._field2E8 != 165) - setAction(&scene->_action10); - else - setAction(&scene->_action11); - break; - } -} - -void Scene2100::Action10::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); - break; - case 2: { - _globals->_player.disableControl(); - Common::Point pt(155, 64); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - scene->_object3.setVisage(2105); - scene->_object3.setStrip(2); - scene->_object3.setFrame(1); - scene->_object3._numFrames = 10; - scene->_object3.setAction(NULL); - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 4: { - scene->_object3.setVisage(2705); - scene->_object3.setStrip2(-1); - scene->_object3.changeZoom(-1); - scene->_object3.fixPriority(-1); - scene->_object3.setPosition(Common::Point(260, 156)); - scene->_object3.setObjectWrapper(new SceneObjectWrapper()); - scene->_object3.animate(ANIM_MODE_1, NULL); - - Common::Point pt(166, 64); - PlayerMover *mover = new PlayerMover(); - scene->_object3.addMover(mover, &pt, this); - - setAction(&scene->_action6, NULL); - break; - } - case 5: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 6: { - _globals->_player.fixPriority(1); - Common::Point pt(144, 54); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 7: { - scene->_object3.fixPriority(2); - Common::Point pt1(163, 55); - NpcMover *mover1 = new NpcMover(); - scene->_object3.addMover(mover1, &pt1, NULL); - - scene->_object2.fixPriority(2); - Common::Point pt2(158, 55); - NpcMover *mover2 = new NpcMover(); - scene->_object2.addMover(mover2, &pt2, this); - break; - } - case 8: - _globals->_player.fixPriority(1); - _globals->_player.setStrip(1); - scene->_object3.fixPriority(1); - scene->_object3.setStrip(2); - scene->_object2.fixPriority(2); - scene->_object2.setStrip(3); - - setDelay(45); - break; - case 9: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 10: - _globals->setFlag(70); - _globals->_stripNum = 2101; - _globals->_sceneManager.changeScene(2320); - break; - } -} - -void Scene2100::Action11::signal() { - // Miranda stands up and walks to the elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - scene->_object3._numFrames = 10; - scene->_object3.setAction(NULL); - scene->_object3.setVisage(2105); - scene->_object3.setStrip(2); - scene->_object3.setFrame(1); - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 2: { - scene->_object3.setVisage(2705); - scene->_object3.setStrip2(-1); - scene->_object3.changeZoom(-1); - scene->_object3.fixPriority(-1); - scene->_object3.setPosition(Common::Point(260, 156)); - scene->_object3.setObjectWrapper(new SceneObjectWrapper()); - scene->_object3.animate(ANIM_MODE_1, NULL); - - Common::Point pt(158, 62); - PlayerMover *mover = new PlayerMover(); - scene->_object3.addMover(mover, &pt, this); - - setAction(&scene->_action6, NULL); - break; - } - case 3: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 4: { - scene->_object3.fixPriority(1); - Common::Point pt1(163, 55); - NpcMover *mover1 = new NpcMover(); - scene->_object3.addMover(mover1, &pt1, NULL); - - scene->_object2.fixPriority(1); - Common::Point pt2(158, 55); - NpcMover *mover2 = new NpcMover(); - scene->_object2.addMover(mover2, &pt2, this); - break; - } - case 5: - scene->_object3.setStrip(2); - scene->_object2.setStrip(3); - setDelay(45); - break; - case 6: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 7: - scene->_object3.remove(); - scene->_object2.remove(); - _globals->setFlag(70); - _globals->_stripNum = 2102; - _globals->_player.enableControl(); - _globals->_player._canWalk = false; - break; - } -} - -void Scene2100::Action12::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_stripManager.start(6000, this); - break; - case 2: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 3: { - Common::Point pt1(158, 74); - NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); - - Common::Point pt2(158, 68); - NpcMover *mover2 = new NpcMover(); - scene->_object2.addMover(mover2, &pt2, NULL); - break; - } - case 4: { - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, NULL); - - _globals->_player.fixPriority(-1); - Common::Point pt1(277, 84); - PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); - - scene->_object2.fixPriority(-1); - Common::Point pt2(255, 76); - PlayerMover *mover2 = new PlayerMover(); - scene->_object2.addMover(mover2, &pt2, this); - break; - } - case 6: - _globals->_player.setStrip(4); - scene->_object2.setStrip(4); - setDelay(60); - break; - case 7: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(6052, this); - break; - case 8: - if (scene->_stripManager._field2E8 == 320) - _globals->setFlag(74); - setDelay(30); - break; - case 9: - _globals->_events.setCursor(OBJECT_STUNNER); - scene->_object2.setAction(&scene->_action13); - setDelay(60); - break; - case 10: - if (_globals->getFlag(74)) - setDelay(1); - else - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); - break; - case 11: - scene->_stripManager.start(2170, this); - break; - case 12: - setDelay(5); - break; - case 13: - scene->_stripManager.start(_globals->getFlag(74) ? 2172 : 2174, this); - break; - case 14: - if (_globals->getFlag(74)) { - _globals->_stripNum = 6100; - _globals->_sceneManager.changeScene(2320); - } else { - _globals->_sceneManager.changeScene(6100); - } - remove(); - break; - } -} - -void Scene2100::Action13::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: { - scene->_object2.fixPriority(113); - Common::Point pt(178, 116); - PlayerMover *mover = new PlayerMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 2: { - Common::Point pt(150, 116); - NpcMover *mover = new NpcMover(); - scene->_object2.addMover(mover, &pt, this); - break; - } - case 3: - scene->_object2.setVisage(2108); - scene->_object2._strip = 3; - scene->_object2.setPosition(Common::Point(150, 100)); - scene->_object2.animate(ANIM_MODE_NONE, NULL); - scene->_object2.changeZoom(100); - scene->_object2.setAction(&scene->_action3); - setDelay(15); - break; - case 4: - remove(); - break; - } -} - -void Scene2100::Action14::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); - break; - case 2: - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); - break; - case 3: - scene->_stripManager.start(6008, this); - break; - case 4: - scene->_soundHandler.play(99); - scene->_object4.show(); - scene->_object4.animate(ANIM_MODE_5, this); - break; - case 5: - scene->_object4.setStrip(2); - scene->_stripManager.start(6009, this, scene); - break; - case 6: - scene->_soundHandler.fadeOut(NULL); - scene->_object4.setStrip(1); - scene->_object4.setFrame(scene->_object4.getFrameCount()); - scene->_object4.animate(ANIM_MODE_6, this); - break; - case 7: - scene->_stripManager.start(6060, this); - break; - case 8: - scene->_object3._numFrames = 10; - scene->_object3.setAction(NULL); - scene->_object3.setVisage(2105); - scene->_object3.setStrip(2); - scene->_object3.setFrame(1); - scene->_object3.animate(ANIM_MODE_5, this); - break; - case 9: { - scene->_object3.setVisage(2705); - scene->_object3.setStrip2(-1); - scene->_object3.changeZoom(-1); - scene->_object3.fixPriority(-1); - scene->_object3.setPosition(Common::Point(260, 156)); - scene->_object3.setObjectWrapper(new SceneObjectWrapper()); - scene->_object3.animate(ANIM_MODE_1, NULL); - - Common::Point pt(157, 65); - PlayerMover *mover = new PlayerMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 10: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 11: { - Common::Point pt(159, 51); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 12: - scene->_object3.setStrip(2); - setDelay(30); - break; - case 13: - scene->_object3.fixPriority(1); - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 14: - setDelay(90); - break; - case 15: - _globals->_sceneManager.changeScene(7000); - remove(); - break; - } -} - -void Scene2100::Action15::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: - scene->_object3.postInit(); - scene->_object3.setVisage(2705); - scene->_object3.animate(ANIM_MODE_1, NULL); - scene->_object3.setObjectWrapper(new SceneObjectWrapper()); - scene->_object3.setPosition(Common::Point(157, 56)); - scene->_object3.fixPriority(1); - scene->_object3.changeZoom(-1); - - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 2: { - scene->_object3.fixPriority(-1); - Common::Point pt(177, 68); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 3: { - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - - Common::Point pt(272, 140); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 4: { - Common::Point pt(266, 150); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 5: { - scene->_object3.fixPriority(156); - - Common::Point pt(260, 156); - NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 6: - scene->_object3.setVisage(2105); - scene->_object3._strip = 1; - scene->_object3._frame = 1; - scene->_object3.setPosition(Common::Point(256, 156)); - scene->_object3.animate(ANIM_MODE_5, this); - scene->_object3.changeZoom(100); - - scene->_object3.animate(ANIM_MODE_NONE, NULL); - break; - case 7: - remove(); - break; - } -} - -void Scene2100::Action16::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - case 4: - setDelay(3); - break; - case 1: - scene->_stripManager.start(7001, this); - break; - case 2: - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); - break; - case 3: { - _globals->_player.disableControl(); - Common::Point pt(155, 63); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 5: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 6: { - Common::Point pt(160, 54); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 7: - _globals->_player.fixPriority(1); - _globals->_player.setStrip(3); - setDelay(45); - break; - case 8: - scene->_soundHandler.play(162); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 9: - _globals->setFlag(15); - _globals->setFlag(36); - _globals->_sceneManager.changeScene(7000); - remove(); - break; - } -} - -void Scene2100::Action17::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); - break; - case 2: - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); - break; - case 3: - scene->_stripManager.start(7070, this); - break; - case 4: - scene->_soundHandler.play(99); - scene->_object4.show(); - scene->_object4.animate(ANIM_MODE_5, this); - break; - case 5: - scene->_soundHandler.play(12); - scene->_object4.setStrip(2); - scene->_stripManager.start(7071, this, scene); - break; - case 6: - scene->_soundHandler.fadeOut(NULL); - scene->_object4.setStrip(1); - scene->_object4.setFrame(scene->_object4.getFrameCount()); - scene->_object4.animate(ANIM_MODE_6, this); - break; - case 7: - scene->_stripManager.start(7072, this); - break; - case 8: - RING_INVENTORY._stasisNegator._sceneNumber = 1; - _globals->_sceneManager.changeScene(9100); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2100::Hotspot2::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 3); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2100, 29); - else { - _globals->_player.disableControl(); - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Hotspot3::doAction(int action) { - // Computer, on the left - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 4); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2100, 29); - else { - _globals->_player.disableControl(); - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Hotspot4::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 5); - break; - case CURSOR_USE: - SceneItem::display2(2100, 6); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Hotspot8::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 12); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2100, 29); - else { - _globals->_player.disableControl(); - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Hotspot10::doAction(int action) { - // Quinn's Console - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 13); - break; - case CURSOR_USE: - if (scene->_sitFl) { - _globals->_player.disableControl(); - scene->_sceneMode = 2102; - scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL); - } else if (_globals->getFlag(13)) { - SceneItem::display2(2100, 28); - } else { - _globals->_player.disableControl(); - scene->_sceneMode = 2101; - scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Hotspot14::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(0)) - SceneItem::display2(2100, 19); - else - SceneItem::display2(2100, 18); - break; - case CURSOR_USE: - if (_globals->getFlag(1)) - SceneItem::display2(2100, 21); - else - SceneItem::display2(2100, 20); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Object1::doAction(int action) { - // Elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 1); - break; - case CURSOR_USE: - scene->setAction(&scene->_action1); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Object2::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2100, 30); - break; - case CURSOR_TALK: - if (_globals->getFlag(72)) { - _globals->_player.disableControl(); - if (!_globals->getFlag(52)) { - scene->_sceneMode = 2111; - scene->setAction(&scene->_sequenceManager, scene, 2111, NULL); - } else { - scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL); - } - } else if (_globals->getFlag(13)) { - SceneItem::display2(2100, 31); - } else if (_globals->getFlag(14)) { - SceneItem::display2(2100, 32); - } else { - _globals->setFlag(14); - _globals->_player.disableControl(); - scene->_sceneMode = 2108; - scene->setAction(&scene->_sequenceManager, scene, 2109, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2100::Object3::doAction(int action) { - // Miranda - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(59)) - SceneItem::display2(2100, 34); - else - error("***I have no response."); - break; - - case CURSOR_TALK: - if (_globals->getFlag(59)) { - _globals->_player.disableControl(); - scene->_sceneMode = 2108; - scene->setAction(&scene->_sequenceManager, scene, 2108, NULL); - } else { - error("***I have no response."); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene2100::Scene2100() : - _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END), - _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END), - _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END), - _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END), - _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END), - _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END), - _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END), - _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) { - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, OBJECT_TRANSLATOR); - _area4._pt = Common::Point(237, 77); -} - -void Scene2100::postInit(SceneObjectList *OwnerList) { - loadScene(2100); - Scene::postInit(); - setZoomPercents(60, 80, 200, 100); - - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerMR); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerSAL); - _stripManager.addSpeaker(&_speakerHText); - _stripManager.addSpeaker(&_speakerGameText); - _speakerMText._npc = &_object3; - _speakerQText._npc = &_globals->_player; - _speakerSText._npc = &_object2; - - _object1.postInit(); - _object1.setVisage(2100); - _object1.animate(ANIM_MODE_NONE, NULL); - _object1.setPosition(Common::Point(157, 57)); - _object1.fixPriority(5); - - _hotspot3.postInit(); - _hotspot3.setVisage(2101); - _hotspot3._frame = 1; - _hotspot3.animate(ANIM_MODE_2, NULL); - _hotspot3.setPosition(Common::Point(53, 44)); - _hotspot3.changeZoom(100); - _hotspot3.fixPriority(1); - - _hotspot4.postInit(); - _hotspot4.setVisage(2101); - _hotspot4._frame = 1; - _hotspot4._strip = 3; - _hotspot4.animate(ANIM_MODE_8, 0, NULL); - _hotspot4.setPosition(Common::Point(274, 52)); - _hotspot4.changeZoom(100); - _hotspot4.fixPriority(1); - - _hotspot5.postInit(); - _hotspot5.setVisage(2101); - _hotspot5._frame = 1; - _hotspot5._strip = 4; - _hotspot5.animate(ANIM_MODE_8, 0, NULL); - _hotspot5.setPosition(Common::Point(219, 141)); - _hotspot5.changeZoom(100); - _hotspot5.fixPriority(160); - - _hotspot6.postInit(); - _hotspot6.setVisage(2101); - _hotspot6._frame = 1; - _hotspot6._strip = 5; - _hotspot6.fixPriority(175); - _hotspot6.animate(ANIM_MODE_8, 0, NULL); - _hotspot6.setPosition(Common::Point(97, 142)); - _hotspot6.changeZoom(100); - - _hotspot7.postInit(); - _hotspot7.setVisage(2101); - _hotspot7._frame = 1; - _hotspot7._strip = 6; - _hotspot7.animate(ANIM_MODE_NONE, NULL); - _hotspot7.setPosition(Common::Point(133, 46)); - _hotspot7.changeZoom(100); - _hotspot7.fixPriority(1); - - _hotspot8.postInit(); - _hotspot8.setVisage(2101); - _hotspot8._frame = 1; - _hotspot8._strip = 7; - _hotspot8.animate(ANIM_MODE_8, 0, NULL); - _hotspot8.setPosition(Common::Point(20, 45)); - _hotspot8.changeZoom(100); - _hotspot8.fixPriority(1); - - _hotspot2.postInit(); - _hotspot2.setVisage(2101); - _hotspot2._frame = 1; - _hotspot2._strip = 8; - _hotspot2.animate(ANIM_MODE_8, 0, NULL); - _hotspot2.setPosition(Common::Point(88, 41)); - _hotspot2.changeZoom(100); - _hotspot2.fixPriority(1); - - _hotspot11.setBounds(Rect(139, 74, 173, 96)); - _hotspot10.setBounds(Rect(71, 100, 91, 135)); - _hotspot9.setBounds(Rect(225, 110, 251, 136)); - _hotspot14.setBounds(Rect(100, 97, 216, 130)); - _hotspot13.setBounds(Rect(13, 124, 94, 168)); - _hotspot12.setBounds(Rect(217, 141, 307, 155)); - _hotspot15.setBounds(Rect(14, 90, 46, 107)); - _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - - if (!_globals->getFlag(36) && !_globals->getFlag(70) && !_globals->getFlag(43)) { - _object3.postInit(); - _object3.setPosition(Common::Point(246, 156)); - _object3.animate(ANIM_MODE_NONE, NULL); - _object3.changeZoom(100); - _object3.fixPriority(156); - _object3.setVisage(2107); - _object3.setStrip(1); - _object3.setAction(&_action2); - _globals->_sceneItems.push_back(&_object3); - } - - if (!_globals->getFlag(59) && !_globals->getFlag(70) && !_globals->getFlag(37) && !_globals->getFlag(114)) { - _object2.postInit(); - _object2.setVisage(2108); - _object2._strip = 3; - _object2.setPosition(Common::Point(150, 100)); - _object2.animate(ANIM_MODE_NONE, NULL); - _object2.changeZoom(100); - _object2.fixPriority(113); - _object2.setAction(&_action3); - _globals->_sceneItems.push_back(&_object2); - } - - _globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14, - &_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, - &_hotspot6, &_hotspot7, &_hotspot1, NULL); - - _globals->_player.postInit(); - if (_globals->getFlag(13)) { - _globals->_player.setVisage(2170); - _globals->_player._moveDiff.y = 1; - } else { - _globals->_player.setVisage(0); - _globals->_player._moveDiff.y = 3; - } - - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff.x = 4; - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); - _sitFl = 0; - - switch (_globals->_sceneManager._previousScene) { - case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _object1.fixPriority(-1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(80, 66)); - _globals->_player.enableControl(); - break; - case 2150: - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); - _sceneMode = 2104; - setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); - break; - case 2222: - if (_globals->_sceneObjects->contains(&_object3)) - _object3.remove(); - - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(144, 55)); - - _object2.setVisage(2806); - _object2.changeZoom(-1); - _object2.setPosition(Common::Point(158, 55)); - _object2.fixPriority(1); - _object2.setAction(NULL); - _object2.setObjectWrapper(new SceneObjectWrapper()); - _object2.animate(ANIM_MODE_1, NULL); - _object2.setStrip(3); - setAction(&_action12); - break; - case 2320: - if (_globals->_stripNum == 2321) { - if (_globals->_sceneObjects->contains(&_object3)) - _object3.remove(); - - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(144, 55)); - - _object2.postInit(); - _object2.setVisage(2806); - _object2.setStrip(1); - _object2.changeZoom(-1); - _object2.setPosition(Common::Point(158, 55)); - _object2.fixPriority(1); - _object2.setAction(NULL); - _object2.setObjectWrapper(new SceneObjectWrapper()); - _object2.animate(ANIM_MODE_1, NULL); - - setAction(&_action12); - } else if (_globals->_stripNum == 6100) { - _globals->_player.setPosition(Common::Point(157, 56)); - _globals->_player.fixPriority(1); - - _object4.postInit(); - _object4.setVisage(2102); - _object4.setPosition(Common::Point(160, 199)); - _object4.hide(); - - setAction(&_action14); - } else { - _globals->_player.disableControl(); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); - _sceneMode = 2104; - - setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); - } - break; - case 3700: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - Scene::setZoomPercents(80, 75, 100, 90); - - if (_globals->_sceneObjects->contains(&_object2)) - _object2.remove(); - - _globals->_player._angle = 225; - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(272, 127)); - - _object3.setPosition(Common::Point(246, 156)); - _object3.fixPriority(156); - _sceneMode = 2105; - setAction(&_sequenceManager, this, 2105, &_object3, NULL); - break; - case 4250: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->clearFlag(43); - - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); - - _object4.postInit(); - _object4.setVisage(2102); - _object4.setPosition(Common::Point(160, 199)); - _object4.hide(); - - _sceneMode = 2107; - setAction(&_sequenceManager, this, 2107, &_object4, NULL); - break; - case 5000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - if (_globals->_sceneObjects->contains(&_object2)) - _object2.remove(); - - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); - - _object3.setPosition(Common::Point(246, 156)); - _object3.fixPriority(156); - - setAction(&_action5); - break; - case 5100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); - - _sitFl = 1; - - _object4.postInit(); - _object4.setVisage(2102); - _object4.setPosition(Common::Point(160, 199)); - _object4.hide(); - - RING_INVENTORY._stasisBox._sceneNumber = 0; - setAction(&_action9); - break; - case 7000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - if (RING_INVENTORY._stasisBox2._sceneNumber == 1) { - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); - - _object4.postInit(); - _object4.setVisage(2102); - _object4.setPosition(Common::Point(160, 199)); - _object4.hide(); - _globals->clearFlag(15); - _globals->clearFlag(109); - _globals->clearFlag(72); - - setAction(&_action17); - } else { - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); - - _sitFl = 1; - setAction(&_action16); - } - break; - case 7600: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - if (_globals->_sceneObjects->contains(&_object2)) - _object2.remove(); - - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); - - setAction(&_action8); - break; - case 8100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); - - _sceneMode = 2106; - setAction(&_sequenceManager, this, 2106, NULL); - break; - case 9750: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); - - _object4.postInit(); - _object4.setVisage(2102); - _object4.setPosition(Common::Point(160, 199)); - _object4.hide(); - - _sceneMode = 2103; - setAction(&_sequenceManager, this, 2103, &_object4, NULL); - break; - default: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - _globals->_player._uiEnabled = true; - break; - } - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2100::stripCallback(int v) { - switch (v) { - case 1: - _object4._numFrames = 4; - _object4.animate(ANIM_MODE_7, NULL); - break; - case 2: - _object4.animate(ANIM_MODE_NONE, NULL); - break; - } -} - -void Scene2100::signal() { - switch (_sceneMode) { - case 2101: - _sitFl = 1; - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - break; - case 2102: - _sitFl = 0; - _globals->_player.enableControl(); - break; - case 2103: - _globals->_stripNum = 9000; - _globals->_sceneManager.changeScene(4000); - break; - case 2106: - _globals->_sceneManager.changeScene(7000); - break; - case 2107: - _globals->_sceneManager.changeScene(5000); - break; - case 2104: - case 2105: - case 2108: - case 2110: - case 2111: - case 2112: - _globals->_player.enableControl(); - break; - } -} - -void Scene2100::synchronize(Serializer &s) { - Scene::synchronize(s); - if (s.getVersion() >= 3) - s.syncAsSint16LE(_sitFl); -} - -/*-------------------------------------------------------------------------- - * Scene 2120 - Encyclopedia - * - *--------------------------------------------------------------------------*/ - -Scene2120::Action1::Action1() { - _entries.push_back(Entry(0, 0, 0)); - _entries.push_back(Entry(0, 0, 0)); - _entries.push_back(Entry(4, 1, 2123)); - _entries.push_back(Entry(1, 6, 0)); - _entries.push_back(Entry(2, 8, 0)); - _entries.push_back(Entry(1, 11, 0)); - _entries.push_back(Entry(4, 13, 2131)); - _entries.push_back(Entry(2, 18, 0)); - _entries.push_back(Entry(4, 21, 0)); - _entries.push_back(Entry(7, 26, 2128)); - _entries.push_back(Entry(3, 34, 0)); - _entries.push_back(Entry(0, 38, 0)); - _entries.push_back(Entry(3, 39, 2126)); - _entries.push_back(Entry(3, 43, 0)); - _entries.push_back(Entry(4, 47, 2125)); - _entries.push_back(Entry(3, 52, 0)); - _entries.push_back(Entry(4, 56, 2129)); - _entries.push_back(Entry(7, 61, 0)); - _entries.push_back(Entry(2, 69, 2127)); - _entries.push_back(Entry(7, 72, 2122)); - _entries.push_back(Entry(0, 80, 2124)); - _entries.push_back(Entry(0, 81, 0)); - _entries.push_back(Entry(0, 82, 0)); - _entries.push_back(Entry(1, 83, 0)); - _entries.push_back(Entry(2, 85, 2132)); - _entries.push_back(Entry(1, 88, 2133)); - _entries.push_back(Entry(2, 90, 2136)); - _entries.push_back(Entry(1, 93, 0)); - _entries.push_back(Entry(10, 95, 2135)); - _entries.push_back(Entry(5, 106, 0)); - _entries.push_back(Entry(2, 112, 2134)); - _entries.push_back(Entry(1, 115, 2130)); - _entries.push_back(Entry(0, 117, 0)); -} - -void Scene2120::Action1::signal() { - Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - _globals->_events.setCursor(CURSOR_WALK); - break; - case 1: - // First page of index - SceneItem::display(2120, 0, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, - SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); - break; - case 2: - // Second page of index - SceneItem::display(2120, 1, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, - SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); - break; - case 3: - // Display an image associated with the encyclopedia entry - SceneItem::display(0, 0); - - scene->_visageHotspot.postInit(); - scene->_visageHotspot.setVisage(_entries[scene->_subjectIndex]._visage); - scene->_visageHotspot.setPosition(Common::Point(129, 180)); - scene->_visageHotspot.animate(ANIM_MODE_NONE, NULL); - scene->_visageVisable = true; - break; - case 4: - // Display page of text - SceneItem::display(2121, _entries[scene->_subjectIndex]._lineNum + scene->_lineOffset, - SET_X, 130, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, SET_WIDTH, 200, - SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END); - _actionIndex = 4; - break; - } -} - -void Scene2120::Action1::dispatch() { - Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; - - Event event; - if (_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) { - if (scene->_listRect.contains(event.mousePos) && (scene->_dbMode != 2)) { - scene->_topicArrowHotspot.setPosition(Common::Point(scene->_topicArrowHotspot._position.x, event.mousePos.y)); - } - - // Subject button handling - if (scene->_subjectButton._bounds.contains(event.mousePos) && (scene->_dbMode != 2)) { - scene->_arrowHotspot.setPosition(Common::Point(291, 34)); - scene->_arrowHotspot._strip = 1; - scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); - - if (scene->_dbMode == 0) - scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 48) / 8; - else - scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 44) / 8 + 16; - - if ((scene->_subjectIndex == 27) && _globals->getFlag(70)) - _globals->setFlag(75); - - scene->_topicArrowHotspot.hide(); - scene->_prevDbMode = scene->_dbMode; - scene->_dbMode = 2; - scene->_lineOffset = 0; - - _actionIndex = !_entries[scene->_subjectIndex]._visage ? 4 : 3; - setDelay(30); - scene->_soundHandler.play(159); - } - - // Next Page button handling - if (scene->_nextPageButton._bounds.contains(event.mousePos)) { - if (!scene->_dbMode) { - scene->_arrowHotspot._strip = 2; - scene->_arrowHotspot.setPosition(Common::Point(291, 76)); - scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); - scene->_dbMode = 1; - - _actionIndex = 2; - setDelay(30); - } - - if ((scene->_dbMode == 2) && (scene->_lineOffset < _entries[scene->_subjectIndex]._size)) { - if (!scene->_visageVisable) { - ++scene->_lineOffset; - } else { - scene->_visageVisable = false; - scene->_visageHotspot.remove(); - } - setDelay(30); - } - - if ((scene->_subjectIndex == 20) && scene->_visageVisable) { - scene->_visageVisable = false; - scene->_visageHotspot.remove(); - setDelay(30); - } - - scene->_soundHandler.play(159); - } - - // Previous Page button handling - if (scene->_previousPageButton._bounds.contains(event.mousePos)) { - switch (scene->_dbMode) { - case 1: - scene->_arrowHotspot._strip = 3; - scene->_arrowHotspot.setPosition(Common::Point(291, 117)); - scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); - - scene->_dbMode = 0; - _actionIndex = 1; - setDelay(30); - break; - case 2: - if (scene->_lineOffset > 0) { - --scene->_lineOffset; - setDelay(20); - } - if ((_entries[scene->_subjectIndex]._visage != 0) && (scene->_lineOffset == 0)) { - _actionIndex = 3; - setDelay(30); - } - break; - } - - scene->_soundHandler.play(159); - } - - // Exit button handling - if (scene->_exitButton._bounds.contains(event.mousePos)) { - if (scene->_dbMode != 2) { - // In the index, so return to the previous scene - setAction(NULL); - SceneItem::display(0, 0); - - _globals->_gfxManagerInstance._font.setFontNumber(2); - _globals->_sceneText._fontNumber = 2; - _globals->_sceneManager.changeScene(_globals->_sceneManager._previousScene); - } else { - // Exit out of topic display to index - SceneItem::display(0, 0); - - if (_entries[scene->_subjectIndex]._visage) - scene->_visageHotspot.remove(); - - scene->_arrowHotspot._strip = 4; - scene->_arrowHotspot.setPosition(Common::Point(291, 159)); - scene->_arrowHotspot.animate(ANIM_MODE_5, NULL); - scene->_dbMode = scene->_prevDbMode; - _actionIndex = scene->_prevDbMode + 1; - - scene->_topicArrowHotspot.show(); - setDelay(1); - } - - scene->_soundHandler.play(159); - } - } - - Action::dispatch(); -} - -/*--------------------------------------------------------------------------*/ - -Scene2120::Scene2120(): Scene() { - _listRect = Rect(18, 48, 260, 177); - _dbMode = 0; - _prevDbMode = 0; - _visageVisable = false; - _subjectIndex = 0; -} - -void Scene2120::postInit(SceneObjectList *OwnerList) { - loadScene(2120); - setZoomPercents(0, 100, 200, 100); - _globals->_player.disableControl(); - - _subjectButton.setBounds(Rect(266, 13, 320, 56)); - _nextPageButton.setBounds(Rect(266, 56, 320, 98)); - _previousPageButton.setBounds(Rect(266, 98, 320, 140)); - _exitButton.setBounds(Rect(266, 140, 320, 182)); - - _topicArrowHotspot.postInit(); - _topicArrowHotspot.setVisage(2120); - _topicArrowHotspot.animate(ANIM_MODE_NONE, NULL); - _topicArrowHotspot.setPosition(Common::Point(240, 55)); - - _arrowHotspot.postInit(); - _arrowHotspot.setVisage(2121); - _arrowHotspot.animate(ANIM_MODE_NONE, NULL); - _arrowHotspot._frame = 1; - _arrowHotspot.setPosition(Common::Point(400, 200)); - - setAction(&_action1); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2120::synchronize(Serializer &s) { - Scene::synchronize(s); - - s.syncAsSint16LE(_dbMode); - s.syncAsSint16LE(_prevDbMode); - s.syncAsSint16LE(_visageVisable); - s.syncAsSint16LE(_subjectIndex); - s.syncAsSint16LE(_lineOffset); -} - -/*-------------------------------------------------------------------------- - * Scene 2150 - Starcraft Level 2 - * - *--------------------------------------------------------------------------*/ - -void Scene2150::Action1::signal() { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(158, 103); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler.play(162); - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 2: { - _globals->_player.setStrip2(4); - Common::Point pt(158, 95); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_player.setStrip2(-1); - _globals->_player._strip = 3; - setDelay(10); - break; - case 4: - scene->_area1.display(); - scene->_area2.display(); - scene->_area3.display(); - scene->_area4.display(); - - scene->_area2.draw(true); - _state = 0; - _globals->_events.setCursor(CURSOR_USE); - - while (!_state && !_vm->shouldQuit()) { - // Wait for an event - Event event; - if (!_globals->_events.getEvent(event)) { - g_system->updateScreen(); - g_system->delayMillis(10); - continue; - } - - if (scene->_area1._bounds.contains(event.mousePos)) { - scene->_area2.draw(false); - scene->_area1.draw(true); - _state = scene->_area1._actionId; - } - if (scene->_area2._bounds.contains(event.mousePos)) { - scene->_area2.draw(true); - _state = scene->_area2._actionId; - } - if (scene->_area3._bounds.contains(event.mousePos)) { - scene->_area2.draw(false); - scene->_area3.draw(true); - _state = scene->_area3._actionId; - } - } - - scene->_soundHandler.play(161); - scene->_area1.restore(); - scene->_area2.restore(); - scene->_area3.restore(); - scene->_area4.restore(); - - if (_state == 2150) { - setDelay(1); - } else { - scene->_soundHandler.play(162); - scene->_hotspot1.animate(ANIM_MODE_6, this); - } - break; - case 5: - if (_state == 2150) { - Common::Point pt(158, 103); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } else { - _globals->_sceneManager.changeScene(_state); - } - break; - case 6: - scene->_soundHandler.play(162); - scene->_hotspot1.animate(ANIM_MODE_6, this); - break; - case 7: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2150::Action2::signal() { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(47, 85); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_player.setVisage(2152); - _globals->_player.setFrame(1); - _globals->_player.setStrip(8); - _globals->_player.animate(ANIM_MODE_8, 1, this); - - scene->_soundHandler.play(163); - break; - case 2: - scene->_soundHandler.play(164); - scene->_hotspot10.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start((RING_INVENTORY._ale._sceneNumber == 2150) ? 2151 : 2152, this); - break; - case 4: - scene->_hotspot14.postInit(); - scene->_hotspot14.setVisage(2152); - scene->_hotspot14.setStrip(6); - scene->_hotspot14.setPosition(Common::Point(59, 54)); - - if (scene->_stripManager._field2E8 == 15) { - scene->_hotspot14.setFrame(5); - RING_INVENTORY._ale._sceneNumber = 1; - } else { - scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5); - } - - _globals->_player.setFrame(1); - _globals->_player.setStrip(7); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 5: - scene->_soundHandler.play(164); - scene->_hotspot10.animate(ANIM_MODE_6, NULL); - scene->_hotspot14.remove(); - - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 6: - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); - - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2150::Hotspot1::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2150, 0); - break; - case CURSOR_USE: - scene->setAction(&scene->_action1); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2150::Hotspot2::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2150, 1); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 2156; - scene->setAction(&scene->_sequenceManager, scene, 2156, &_globals->_player, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2150::Hotspot4::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2150, 3); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 2155; - scene->setAction(&scene->_sequenceManager, scene, 2155, &_globals->_player, &scene->_hotspot4, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2150::Hotspot7::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2150, 7); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2150, 19); - else { - _globals->_player.disableControl(); - scene->_sceneMode = 2154; - scene->setAction(&scene->_sequenceManager, scene, 2154, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2150::Hotspot10::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2150, 10); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2150, 19); - else - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene2150::Scene2150() : - _hotspot3(18, CURSOR_LOOK, 2150, 2, CURSOR_USE, 2150, 18, LIST_END), - _hotspot5(17, CURSOR_LOOK, 2150, 4, CURSOR_USE, 2150, 18, LIST_END), - _hotspot6(0, CURSOR_LOOK, 2150, 5, CURSOR_USE, 2150, 18, LIST_END), - _hotspot8(16, CURSOR_LOOK, 2150, 8, LIST_END), - _hotspot9(0, CURSOR_LOOK, 2150, 9, CURSOR_USE, 2150, 13, LIST_END), - _hotspot11(0, CURSOR_LOOK, 2150, 12, LIST_END) { - _rect1 = Rect(260, 70, 270, 77); - _rect2 = Rect(222, 142, 252, 150); - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, 10); - _area4._pt = Common::Point(237, 77); - -} - -void Scene2150::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(55, 85, 200, 100); - loadScene(2150); - - _stripManager.addSpeaker(&_speakerGameText); - - _hotspot7.postInit(); - _hotspot7.setVisage(2152); - _hotspot7._frame = 1; - _hotspot7._strip = 2; - _hotspot7.animate(ANIM_MODE_8, 0, NULL); - _hotspot7.setPosition(Common::Point(122, 62)); - _hotspot7.changeZoom(100); - _hotspot7.fixPriority(76); - - _hotspot2.postInit(); - _hotspot2.setVisage(2151); - _hotspot2._frame = 1; - _hotspot2._strip = 3; - _hotspot2.animate(ANIM_MODE_NONE, NULL); - _hotspot2.setPosition(Common::Point(257, 67)); - _hotspot2.changeZoom(100); - _hotspot2.fixPriority(60); - - _hotspot1.postInit(); - _hotspot1.setVisage(2151); - _hotspot1._frame = 1; - _hotspot1._strip = 2; - _hotspot1.animate(ANIM_MODE_NONE, NULL); - _hotspot1.setPosition(Common::Point(158, 99)); - _hotspot1.changeZoom(100); - _hotspot1.fixPriority(99); - - _hotspot4.postInit(); - _hotspot4.setVisage(2150); - _hotspot4._frame = 1; - _hotspot4._strip = 2; - _hotspot4.animate(ANIM_MODE_NONE, NULL); - _hotspot4.setPosition(Common::Point(218, 200)); - _hotspot4.changeZoom(100); - _hotspot4.fixPriority(200); - - _hotspot10.postInit(); - _hotspot10.setVisage(2152); - _hotspot10.setStrip(5); - _hotspot10.setPosition(Common::Point(59, 56)); - - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.fixPriority(-1); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff.y = 3; - - _hotspot8.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot9.setBounds(Rect(133, 0, 198, 91)); - _hotspot11.setBounds(Rect(142, 119, 176, 158)); - - _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, - &_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL); - - switch (_globals->_sceneManager._previousScene) { - case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->_player.setPosition(Common::Point(108, 99)); - break; - case 2200: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(159, 240)); - _sceneMode = 2152; - setAction(&_sequenceManager, this, 2152, &_globals->_player, NULL); - break; - case 2280: - _globals->_player.disableControl(); - _globals->_player._angle = 180; - _globals->_player.setPosition(Common::Point(265, 80)); - - _hotspot2._frame = _hotspot2.getFrameCount(); - _sceneMode = 2157; - setAction(&_sequenceManager, this, 2157, &_hotspot2, NULL); - break; - case 2230: - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player._strip = 4; - _globals->_player.setPosition(Common::Point(229, 139)); - break; - case 2100: - default: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(158, 95)); - _globals->_player.setStrip(3); - _sceneMode = 2151; - - setAction(&_sequenceManager, this, 2151, &_globals->_player, &_hotspot1, NULL); - break; - } - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2150::synchronize(Serializer &s) { - Scene::synchronize(s); - _rect1.synchronize(s); - _rect2.synchronize(s); -} - -void Scene2150::signal() { - switch (_sceneMode) { - case 2151: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); - break; - case 2152: - case 2153: - case 2157: - _globals->_player.enableControl(); - break; - case 2154: - _globals->_sceneManager.changeScene(2120); - break; - case 2155: - _globals->_sceneManager.changeScene(2230); - break; - case 2156: - _globals->_sceneManager.changeScene(2280); - break; - } -} - -void Scene2150::dispatch() { - Scene::dispatch(); - - if (!_action) { - if (_rect1.contains(_globals->_player._position)) { - _globals->_player.disableControl(); - _sceneMode = 2156; - setAction(&_sequenceManager, this, 2156, &_globals->_player, &_hotspot2, NULL); - } - if (_rect2.contains(_globals->_player._position)) { - _globals->_player.disableControl(); - _sceneMode = 2155; - setAction(&_sequenceManager, this, 2155, &_globals->_player, &_hotspot4, NULL); - } - if (_globals->_player._position.y >= 196) { - _globals->_player.disableControl(); - SceneItem::display2(2150, 20); - - _sceneMode = 2153; - setAction(&_sequenceManager, this, 2153, &_globals->_player, NULL); - } - } -} - -/*-------------------------------------------------------------------------- - * Scene 2200 - Starcraft - AutoDoc - * - *--------------------------------------------------------------------------*/ - -void Scene2200::Action1::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(6); - break; - case 1: - scene->_hotspot4.animate(ANIM_MODE_5, this); - break; - case 2: - SceneItem::display2(2200, 7); - _globals->_sceneManager.changeScene(2150); - remove(); - break; - } -} - -void Scene2200::Action2::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - setDelay(30); - break; - case 2: - scene->_hotspot4.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_hotspot4.setStrip(4); - setDelay(30); - break; - case 4: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(2040, this, scene); - break; - case 5: - scene->_hotspot4.setStrip(4); - scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - _globals->_player._uiEnabled = true; - remove(); - break; - } -} - -void Scene2200::Action3::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_soundHandler2.play(103); - - scene->_hotspot4.setStrip(4); - scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - _globals->_player.disableControl(); - - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(2201); - scene->_hotspot2._strip = 2; - scene->_hotspot2.setPosition(Common::Point(218, 0)); - - Common::Point pt(218, 63); - NpcMover *mover = new NpcMover(); - scene->_hotspot2.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler2.play(104); - scene->_hotspot4.setStrip(2); - scene->_hotspot4.setFrame(2); - setDelay(120); - break; - case 2: - if (_globals->getFlag(83)) { - _actionIndex = 8; - setDelay(5); - } else { - for (SynchronizedList::iterator i = _globals->_sceneObjects->begin(); - i != _globals->_sceneObjects->end(); ++i) { - (*i)->hide(); - } - - _globals->_sceneManager._scene->loadScene(66); - - scene->_hotspot6.postInit(); - scene->_hotspot6.setVisage(66); - scene->_hotspot6.setPosition(Common::Point(160, 197)); - - scene->_hotspot7.postInit(); - scene->_hotspot7.setVisage(65); - scene->_hotspot7.setStrip(4); - scene->_hotspot7.setFrame(1); - scene->_hotspot7.setPosition(Common::Point(145, 165)); - - SceneItem::display(60, 1, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34, - SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); - _state = 1; - setDelay(1800); - } - break; - case 3: - case 4: - case 5: - SceneItem::display(60, _actionIndex - 2, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34, - SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); - setDelay(1800); - break; - case 6: - scene->_hotspot7.remove(); - SceneItem::display(0, 0); - _state = 0; - setDelay(5); - break; - case 7: - for (SynchronizedList::iterator i = _globals->_sceneObjects->begin(); - i != _globals->_sceneObjects->end(); ++i) - (*i)->show(); - - scene->_hotspot6.remove(); - _globals->_sceneManager._scene->loadScene(2200); - setDelay(5); - break; - case 8: - scene->_stripManager.start(2060, this, scene); - break; - case 9: - scene->_hotspot4.setStrip(4); - scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - break; - case 10: - _globals->_sceneManager.changeScene(2000); - remove(); - break; - } -} - -void Scene2200::Action3::process(Event &event) { - if (!event.handled && ((event.eventType == EVENT_KEYPRESS) || (event.eventType == EVENT_BUTTON_DOWN))) { - _state = 0; - event.handled = true; - setDelay(1); - } - - Action::process(event); -} - -void Scene2200::Action4::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - scene->_stripManager.start(2202, this, scene); - break; - case 2: - scene->_hotspot4.setStrip(4); - scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - setDelay(10); - break; - case 3: - _globals->_player._uiEnabled = true; - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2200::Hotspot3::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2200, 10); - break; - case CURSOR_USE: - SceneItem::display2(2200, 11); - break; - case CURSOR_TALK: - _globals->_player._uiEnabled = false; - scene->setAction(&scene->_action4); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2200::Hotspot5::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2200, 8); - break; - case CURSOR_USE: - SceneItem::display2(2200, 9); - break; - case CURSOR_TALK: - scene->_sceneMode = 2201; - _globals->_player._uiEnabled = false; - scene->setAction(&scene->_sequenceManager, scene, 2201, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2200::Hotspot9::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2200, _globals->getFlag(8) ? 1 : 0); - break; - case CURSOR_USE: - SceneItem::display2(2200, 3); - break; - case OBJECT_INFODISK: - if (_globals->_sceneManager._previousScene == 2310) { - scene->_soundHandler2.play(35); - _globals->_player.disableControl(); - scene->setAction(&scene->_action3); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - - -Scene2200::Scene2200() : - _hotspot1(0, CURSOR_LOOK, 2200, 5, CURSOR_USE, 2200, 6, LIST_END), - _hotspot10(0, CURSOR_LOOK, 2200, 4, LIST_END) { -} - -void Scene2200::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 200, 200, 200); - loadScene(2200); - - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerMR); - _stripManager.addSpeaker(&_speakerGameText); - - _speakerQText._npc = &_globals->_player; - _speakerSText._npc = &_hotspot5; - _speakerMText._npc = &_hotspot3; - - _stripManager.setCallback(this); - - _hotspot5.postInit(); - _hotspot5.setVisage(2840); - _hotspot5.setPosition(Common::Point(50, 235)); - - _hotspot8.postInit(); - _hotspot8.setVisage(2840); - _hotspot8.setStrip(2); - _hotspot8.setPosition(Common::Point(96, 184)); - _hotspot8.fixPriority(236); - - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player.setFrame2(3); - _globals->_player.setPosition(Common::Point(110, 233)); - _globals->_player.disableControl(); - - switch (_globals->_sceneManager._previousScene) { - case 2150: - _hotspot5.remove(); - _hotspot8.remove(); - break; - case 4000: - _globals->_soundHandler.play(100); - _globals->_soundHandler.holdAt(true); - _globals->_player.remove(); - _hotspot5.remove(); - _hotspot8.remove(); - - _hotspot1.postInit(); - _hotspot1.setVisage(2202); - _hotspot1.setPosition(Common::Point(175, 173)); - _hotspot1.fixPriority(99); - - _hotspot3.postInit(); - _hotspot3.setVisage(2202); - _hotspot3._strip = 2; - _hotspot3.setPosition(Common::Point(152, 76)); - _hotspot3.fixPriority(100); - - _hotspot4.postInit(); - _hotspot4.setVisage(2202); - _hotspot4._strip = 3; - _hotspot4.setPosition(Common::Point(115, 76)); - _hotspot4.fixPriority(200); - - setAction(&_action1); - break; - case 2310: - default: - RING_INVENTORY._infoDisk._sceneNumber = 1; - - _hotspot3.postInit(); - _hotspot3.setVisage(2215); - _hotspot3.setPosition(Common::Point(144, 132)); - _globals->_sceneItems.push_back(&_hotspot3); - - _hotspot4.postInit(); - _hotspot4.setVisage(2215); - _hotspot4._strip = 2; - _hotspot4.setPosition(Common::Point(120, 78)); - _hotspot4.fixPriority(255); - _globals->_sceneItems.push_back(&_hotspot4); - - _soundHandler1.play(101); - _soundHandler2.play(100); - _globals->_soundHandler.holdAt(true); - - _globals->_sceneItems.push_back(&_hotspot5); - setAction(&_action2); - break; - } - - _exitRect = Rect(0, 0, 35, SCREEN_HEIGHT); - _hotspot9.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot10.setBounds(Rect(87, 43, 149, 109)); - - _globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2200::stripCallback(int v) { - switch (v) { - case 1: - _hotspot4.setStrip(3); - _hotspot4.animate(ANIM_MODE_7, 0, NULL); - break; - case 2: - _hotspot4.setStrip(4); - _hotspot4.animate(ANIM_MODE_NONE, NULL); - break; - } -} - -void Scene2200::synchronize(Serializer &s) { - Scene::synchronize(s); - _exitRect.synchronize(s); -} - -void Scene2200::signal() { - if ((_sceneMode == 2201) || (_sceneMode == 2202)) - _globals->_player._uiEnabled = true; -} - -void Scene2200::dispatch() { - Scene::dispatch(); - - if (!_action) { - if (_exitRect.contains(_globals->_player._position)) - _globals->_sceneManager.changeScene(2150); - } -} - -/*-------------------------------------------------------------------------- - * Scene 2222 - Stasis Field Map - * - *--------------------------------------------------------------------------*/ - -void Scene2222::Action1::signal() { - Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - scene->_stripManager.start(2222, this); - break; - case 2: - setDelay(30); - break; - case 3: - _globals->_sceneManager.changeScene(1000); - break; - } -} - -void Scene2222::Action2::signal() { - Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - scene->_stripManager.start(5700, this); - break; - case 2: - setDelay(120); - break; - case 3: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(2100); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2222::postInit(SceneObjectList *OwnerList) { - loadScene((_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerML); - - _hotspot1.postInit(); - _hotspot1.setVisage(3401); - _hotspot1.setStrip2(1); - _hotspot1._frame = 1; - _hotspot1.animate(ANIM_MODE_2, 0); - - _hotspot2.postInit(); - _hotspot2.setVisage(3401); - _hotspot2.setStrip2(2); - _hotspot2._frame = 2; - _hotspot2.animate(ANIM_MODE_2, 0); - - _hotspot3.postInit(); - _hotspot3.setVisage(3401); - _hotspot3.setStrip2(2); - _hotspot3._frame = 3; - _hotspot3.animate(ANIM_MODE_2, 0); - - _hotspot4.postInit(); - _hotspot4.setVisage(3401); - _hotspot4.setStrip2(2); - _hotspot4._frame = 4; - _hotspot4.animate(ANIM_MODE_2, 0); - - _hotspot5.postInit(); - _hotspot5.setVisage(3401); - _hotspot5.setStrip2(2); - _hotspot5.setFrame(5); - _hotspot5.animate(ANIM_MODE_2, 0); - - if (_globals->_sceneManager._previousScene == 2100) { - _hotspot1.setPosition(Common::Point(61, 101)); - _hotspot2.setPosition(Common::Point(239, 149)); - _hotspot3.setPosition(Common::Point(184, 85)); - _hotspot4.setPosition(Common::Point(105, 165)); - _hotspot5.remove(); - - setAction(&_action2); - } else { - _hotspot1.setPosition(Common::Point(110, 108)); - _hotspot2.setPosition(Common::Point(175, 136)); - _hotspot3.setPosition(Common::Point(162, 96)); - _hotspot4.setPosition(Common::Point(118, 141)); - _hotspot5.setPosition(Common::Point(124, 107)); - - setAction(&_action1); - } - - _soundHandler.play(116); - _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position); - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - - -/*-------------------------------------------------------------------------- - * Scene 2230 - Starcraft - Quinn's Room - * - *--------------------------------------------------------------------------*/ - -void Scene2230::Action1::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - switch (scene->_field30A) { - case 1: - scene->setAction(&scene->_action3); - break; - case 2: - scene->setAction(&scene->_action6); - break; - default: - setDelay(10); - break; - } - break; - case 1: { - Common::Point pt(84, 74); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 3: { - Common::Point pt(63, 60); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 4: - scene->_hotspot1.animate(ANIM_MODE_6, this); - break; - case 5: - _globals->_sceneManager.changeScene(2150); - break; - } -} - -void Scene2230::Action2::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - switch (scene->_field30A) { - case 2: - scene->setAction(&scene->_action6, this); - break; - default: - setDelay(10); - break; - } - break; - case 1: { - _globals->_player.disableControl(); - scene->_field30A = 1; - _globals->_player._regionBitList |= ~0x80; - Common::Point pt(160, 96); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_player.setVisage(2235); - _globals->_player.setStrip2(1); - _globals->_player.fixPriority(100); - _globals->_player._frame = 1; - _globals->_player.setPosition(Common::Point(200, 68)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_soundHandler.play(157); - _globals->_player._moveDiff = Common::Point(1, 1); - _globals->_player.setAction(&scene->_action4); - _globals->_player._uiEnabled = true; - - _globals->_events.setCursor(CURSOR_USE); - remove(); - break; - } -} - -void Scene2230::Action3::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.setAction(NULL); - _globals->_player._moveDiff = Common::Point(5, 3); - _globals->_player.setStrip2(_globals->_player._strip); - - Common::Point pt(190, 74); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - - scene->_soundHandler.stop(); - break; - } - case 1: - _globals->_player._strip = 3; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player._regionBitList |= 0x80; - scene->_field30A = 0; - - _globals->_player.setVisage(0); - _globals->_player.setStrip2(-1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(164, 96)); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._canWalk = true; - - _globals->_events.setCursor(CURSOR_USE); - remove(); - } -} - -void Scene2230::Action4::signal() { - switch (_actionIndex++) { - case 0: - Common::Point pt(190 + _globals->_randomSource.getRandomNumber(9), 68); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - _actionIndex = 0; - break; - } -} - -void Scene2230::Action5::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - switch (scene->_field30A) { - case 2: - scene->setAction(&scene->_action3, this); - break; - default: - setDelay(10); - break; - } - break; - case 1: { - _globals->_player.disableControl(); - Common::Point pt(209, 124); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_player.fixPriority(1430); - _globals->_player.setVisage(2232); - _globals->_player._strip = 1; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_events.setCursor(CURSOR_USE); - _globals->_player._uiEnabled = true; - scene->_field30A = 2; - remove(); - break; - } -} - -void Scene2230::Action6::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 1: - scene->_field30A = 0; - _globals->_player.setVisage(0); - _globals->_player._strip = 1; - _globals->_player._canWalk = true; - _globals->_player.animate(ANIM_MODE_1, NULL); - remove(); - break; - } -} - -void Scene2230::Action7::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - - switch (scene->_field30A) { - case 1: - scene->setAction(&scene->_action3, this); - break; - case 2: - scene->setAction(&scene->_action6, this); - break; - default: - setDelay(10); - break; - } - break; - case 1: { - Common::Point pt(140, 119); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_soundHandler.play(158); - scene->_hotspot8.setStrip2(2); - - Common::Point pt(scene->_hotspot8._position.x, 97); - NpcMover *mover = new NpcMover(); - scene->_hotspot8.addMover(mover, &pt, this); - break; - } - case 3: - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(2231); - scene->_hotspot2._strip = 3; - scene->_hotspot2.setPosition(Common::Point(166, 116)); - scene->_hotspot2.fixPriority(131); - scene->_hotspot2.animate(ANIM_MODE_5, this); - - scene->_hotspot8._frame = 2; - break; - case 4: - _globals->_sceneItems.push_front(&scene->_hotspot10); - _globals->_sceneItems.push_front(&scene->_hotspot11); - _globals->_sceneItems.push_front(&scene->_hotspot12); - - scene->_hotspot2.remove(); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2230::Action8::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - - switch (scene->_field30A) { - case 1: - scene->setAction(&scene->_action3, this); - break; - case 2: - scene->setAction(&scene->_action6, this); - break; - default: - setDelay(10); - break; - } - break; - case 1: { - Common::Point pt(140, 119); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: { - _globals->_sceneItems.remove(&scene->_hotspot10); - _globals->_sceneItems.remove(&scene->_hotspot11); - _globals->_sceneItems.remove(&scene->_hotspot12); - - switch (scene->_field30A) { - case 1: - scene->setAction(&scene->_action3, this); - break; - case 2: - scene->setAction(&scene->_action6, this); - break; - default: - setDelay(10); - break; - } - break; - } - case 3: - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(2231); - scene->_hotspot2._strip = 3; - scene->_hotspot2._frame = scene->_hotspot2.getFrameCount(); - scene->_hotspot2.setPosition(Common::Point(166, 116)); - scene->_hotspot2.fixPriority(131); - scene->_hotspot2.animate(ANIM_MODE_6, this); - break; - case 4: { - scene->_soundHandler.play(158); - scene->_hotspot2.remove(); - scene->_hotspot8._frame = 1; - - Common::Point pt(scene->_hotspot8._position.x, 133); - NpcMover *mover = new NpcMover(); - scene->_hotspot8.addMover(mover, &pt, this); - break; - } - case 5: - scene->_hotspot8.setStrip2(1); - _globals->_player.enableControl(); - - remove(); - break; - } -} - - -/*--------------------------------------------------------------------------*/ - -void Scene2230::Hotspot1::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2230, 0); - break; - case CURSOR_USE: - scene->setAction(&scene->_action1); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot3::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(4)) - SceneItem::display2(2230, 1); - else { - SceneItem::display2(2230, 1); - SceneItem::display2(2230, 2); - SceneItem::display2(2230, 3); - _globals->setFlag(4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot4::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(30)) - SceneItem::display2(2230, 6); - else if (_globals->getFlag(29)) { - SceneItem::display2(2230, 5); - _globals->setFlag(30); - } else { - SceneItem::display2(2230, 4); - _globals->setFlag(29); - } - break; - case CURSOR_USE: - SceneItem::display2(2230, 7); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot5::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(5)) - SceneItem::display2(2230, 9); - else { - _globals->setFlag(5); - SceneItem::display2(2230, 8); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot6::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(6)) - SceneItem::display2(2230, 11); - else { - _globals->setFlag(6); - SceneItem::display2(2230, 10); - } - break; - case CURSOR_USE: - if (scene->_field30A == 1) - scene->setAction(&scene->_action3); - else if (_globals->getFlag(13)) - SceneItem::display2(2230, 28); - else - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot7::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(7)) - SceneItem::display2(2230, 13); - else { - _globals->setFlag(6); - SceneItem::display2(2230, 12); - } - break; - case CURSOR_USE: - if (scene->_field30A == 2) - scene->setAction(&scene->_action6); - else if (_globals->getFlag(13)) - SceneItem::display2(2230, 29); - else - scene->setAction(&scene->_action5); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot8::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (scene->_hotspot8._strip == 1) { - if (_globals->getFlag(22)) - SceneItem::display2(2230, 19); - else { - _globals->setFlag(22); - SceneItem::display2(2230, 14); - } - } else { - if (_globals->getFlag(25)) - SceneItem::display2(2230, 21); - else { - _globals->setFlag(25); - SceneItem::display2(2230, 20); - } - } - break; - case CURSOR_USE: - if (scene->_hotspot8._strip == 1) - scene->setAction(&scene->_action7); - else - scene->setAction(&scene->_action8); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot10::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(26)) - SceneItem::display2(2230, 25); - else { - _globals->setFlag(26); - SceneItem::display2(2230, 24); - } - break; - case CURSOR_USE: - SceneItem::display2(2230, 28); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot11::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(27)) - SceneItem::display2(2230, 23); - else { - _globals->setFlag(27); - SceneItem::display2(2230, 22); - } - break; - case CURSOR_USE: - SceneItem::display2(2230, 28); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2230::Hotspot12::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(28)) - SceneItem::display2(2230, 27); - else { - _globals->setFlag(28); - SceneItem::display2(2230, 26); - } - break; - case CURSOR_USE: - SceneItem::display2(2230, 28); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene2230::Scene2230() : - _hotspot9(0, CURSOR_LOOK, 2230, 16, CURSOR_USE, 2230, 18, LIST_END) { -} - -void Scene2230::postInit(SceneObjectList *OwnerList) { - loadScene(2230); - Scene::postInit(); - setZoomPercents(75, 80, 120, 100); - - _hotspot1.postInit(); - _hotspot1.setVisage(2230); - _hotspot1._frame = 1; - _hotspot1.animate(ANIM_MODE_NONE, 0); - _hotspot1.setPosition(Common::Point(72, 69)); - _hotspot1.changeZoom(100); - - _hotspot8.postInit(); - _hotspot8.setVisage(2231); - _hotspot8._frame = 1; - _hotspot8.animate(ANIM_MODE_NONE, 0); - _hotspot8.setPosition(Common::Point(164, 133)); - _hotspot8.changeZoom(100); - _hotspot8.fixPriority(129); - - _rect1 = Rect(59, 64, 89, 74); - - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, 0); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(80, 80)); - _globals->_player._moveDiff.y = 3; - _globals->_player._regionBitList |= 0x80; - _globals->_player.changeZoom(-1); - - _field30A = 0; - _globals->_player.enableControl(); - - _hotspot5.setBounds(Rect(108, 34, 142, 76)); - _hotspot4.setBounds(Rect(92, 14, 106, 57)); - _hotspot6.setBounds(Rect(169, 58, 261, 95)); - _hotspot7.setBounds(Rect(111, 117, 222, 158)); - _hotspot3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot10.setBounds(Rect(170, 96, 176, 106)); - _hotspot11.setBounds(Rect(158, 109, 164, 115)); - _hotspot12.setBounds(Rect(170, 109, 177, 115)); - - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7, - &_hotspot1, &_hotspot3, NULL); - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2230::synchronize(Serializer &s) { - Scene::synchronize(s); - _rect1.synchronize(s); - s.syncAsSint16LE(_field30A); -} - -void Scene2230::dispatch() { - Scene::dispatch(); - - if (!_action) { - if (_rect1.contains(_globals->_player._position)) - setAction(&_action1); - } -} - -/*-------------------------------------------------------------------------- - * Scene 2280 - Starcraft - Storage Room - * - *--------------------------------------------------------------------------*/ - -void Scene2280::Action1::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(192, 97); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler.play(162); - scene->_hotspot16.animate(ANIM_MODE_5, this); - break; - case 2: { - Common::Point pt(218, 87); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_player.setStrip(3); - setDelay(10); - break; - case 4: - _globals->_player.fixPriority(1); - scene->_soundHandler.play(162); - scene->_hotspot16.animate(ANIM_MODE_6, this); - break; - case 5: - _globals->_sceneManager.changeScene(7000); - break; - } -} - -void Scene2280::Action2::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(94, 117); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler.play(265); - - _globals->_player.setVisage(2162); - _globals->_player._frame = 1; - _globals->_player._strip = 1; - _globals->_player.animate(ANIM_MODE_5, this); - - scene->_hotspot8.remove(); - scene->_hotspot10.remove(); - break; - case 2: - _globals->_player._frame = 1; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_4, 3, 1, this); - break; - case 3: - _globals->_player.animate(ANIM_MODE_5, this); - scene->_hotspot12.remove(); - break; - case 4: - scene->_soundHandler.play(266); - _globals->_player.setVisage(2170); - _globals->_player._frame = 1; - _globals->_player._strip = 4; - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(4, 1); - - _globals->setFlag(13); - SceneItem::display2(2280, 37); - - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2280::Action3::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - Common::Point pt(94, 117); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler.play(265); - - _globals->_player.setVisage(2162); - _globals->_player._frame = 6; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_4, 3, -1, this); - break; - case 2: - scene->_hotspot12.postInit(); - scene->_hotspot12.setVisage(2280); - scene->_hotspot12._strip = 2; - scene->_hotspot12._frame = 3; - scene->_hotspot12.setPosition(Common::Point(88, 76)); - scene->_hotspot12.fixPriority(1); - - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player._strip = 1; - _globals->_player._frame = 12; - - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 4: - scene->_hotspot8.postInit(); - scene->_hotspot8.setVisage(2280); - scene->_hotspot8._strip = 2; - scene->_hotspot8._frame = 1; - scene->_hotspot8.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot8.setPosition(Common::Point(79, 108)); - scene->_hotspot8.changeZoom(100); - scene->_hotspot8.fixPriority(1); - - scene->_hotspot10.postInit(); - scene->_hotspot10.setVisage(2280); - scene->_hotspot10._strip = 2; - scene->_hotspot10._frame = 2; - scene->_hotspot10.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot10.setPosition(Common::Point(79, 104)); - scene->_hotspot10.changeZoom(100); - scene->_hotspot10.fixPriority(1); - - _globals->clearFlag(13); - - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._strip = 4; - _globals->_player._moveDiff = Common::Point(3, 5); - - SceneItem::display2(2280, 38); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2280::Action4::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - switch (_state) { - case 1: - case 51: { - Common::Point pt(163, 67); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: - case 50: { - Common::Point pt(173, 63); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - } - break; - } - case 1: - _globals->_player.setVisage(2161); - _globals->_player._strip = 1; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - switch (_state) { - case 1: - scene->_hotspot18.remove(); - RING_INVENTORY._scanner._sceneNumber = 1; - break; - case 6: - scene->_hotspot17.remove(); - RING_INVENTORY._medkit._sceneNumber = 1; - break; - case 50: - scene->_hotspot17.postInit(); - scene->_hotspot17.setVisage(2161); - scene->_hotspot17._strip = 2; - scene->_hotspot17._frame = 1; - scene->_hotspot17.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot17.setPosition(Common::Point(162, 39)); - scene->_hotspot17.changeZoom(100); - scene->_hotspot17.fixPriority(1); - - RING_INVENTORY._medkit._sceneNumber = 2280; - _globals->_sceneItems.push_front(&scene->_hotspot17); - break; - case 51: - scene->_hotspot18.postInit(); - scene->_hotspot18.setVisage(2161); - scene->_hotspot18._strip = 2; - scene->_hotspot18._frame = 2; - scene->_hotspot18.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot18.setPosition(Common::Point(152, 43)); - scene->_hotspot18.changeZoom(100); - scene->_hotspot18.fixPriority(1); - - RING_INVENTORY._scanner._sceneNumber = 2280; - _globals->_sceneItems.push_front(&scene->_hotspot18); - break; - } - - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player.enableControl(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._strip = 2; - - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2280::Hotspot1::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(16)) - SceneItem::display2(2280, 22); - else { - _globals->setFlag(16); - SceneItem::display2(2230, 21); - } - break; - case CURSOR_USE: - if (!_globals->getFlag(15)) - SceneItem::display2(2280, 23); - else if (!_globals->getFlag(13)) - SceneItem::display2(2280, 46); - else { - _globals->_player.disableControl(); - scene->setAction(&scene->_action1); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot2::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(2)) - SceneItem::display2(2280, 1); - else { - _globals->setFlag(2); - SceneItem::display2(2280, 0); - } - break; - case CURSOR_USE: - SceneItem::display2(2280, 2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot4::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(21)) - SceneItem::display2(2280, 33); - else { - _globals->setFlag(21); - SceneItem::display2(2280, 32); - } - break; - case CURSOR_USE: - SceneItem::display2(2280, 34); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot7::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2280, 24); - break; - case OBJECT_SCANNER: - if (_globals->getFlag(13)) - SceneItem::display2(2280, 43); - else { - _globals->_player.disableControl(); - scene->_action4._state = 51; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_events._currentCursor = CURSOR_700; - scene->setAction(&scene->_action4); - } - break; - case OBJECT_MEDKIT: - if (_globals->getFlag(13)) - SceneItem::display2(2280, 43); - else { - _globals->_player.disableControl(); - scene->_action4._state = 50; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_events._currentCursor = CURSOR_700; - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot8::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2280, 3); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot10::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2280, 4); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot12::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2280, 11); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot14::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2280, 3); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - if (_globals->getFlag(13)) - scene->setAction(&scene->_action3); - else - scene->setAction(&scene->_action2); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot17::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(18)) - SceneItem::display2(2280, 26); - else { - _globals->setFlag(18); - SceneItem::display2(2280, 25); - } - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2280, 29); - else { - _globals->_player.disableControl(); - scene->_action4._state = 6; - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2280::Hotspot18::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(19)) - SceneItem::display2(2280, 28); - else { - _globals->setFlag(19); - SceneItem::display2(2280, 27); - } - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2280, 29); - else { - _globals->_player.disableControl(); - scene->_action4._state = 1; - scene->setAction(&scene->_action4); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene2280::Scene2280() : - _hotspot3(0, CURSOR_LOOK, 2280, 30, CURSOR_USE, 2280, 31, LIST_END), - _hotspot5(0, CURSOR_LOOK, 2280, 35, CURSOR_USE, 2280, 36, LIST_END), - _hotspot6(0, CURSOR_LOOK, 2280, 19, CURSOR_USE, 2280, 20, LIST_END), - _hotspot9(0, CURSOR_LOOK, 2280, 5, CURSOR_USE, 2280, 6, LIST_END), - _hotspot11(0, CURSOR_LOOK, 2280, 7, CURSOR_USE, 2280, 8, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2280, 9, CURSOR_USE, 2280, 10, LIST_END), - _hotspot15(0, CURSOR_LOOK, 2280, 45, LIST_END), - _hotspot16(0, CURSOR_LOOK, 2280, 16, CURSOR_USE, 2280, 42, LIST_END) { -} - -void Scene2280::postInit(SceneObjectList *OwnerList) { - loadScene(2280); - Scene::postInit(); - setZoomPercents(0, 70, 200, 100); - - _hotspot16.postInit(); - _hotspot16.setVisage(2281); - _hotspot16.setPosition(Common::Point(208, 90)); - _hotspot16.fixPriority(80); - - if (RING_INVENTORY._medkit._sceneNumber == 2280) { - _hotspot17.postInit(); - _hotspot17.setVisage(2161); - _hotspot17._strip = 2; - _hotspot17.setPosition(Common::Point(162, 39)); - _hotspot17.fixPriority(1); - - _globals->_sceneItems.push_back(&_hotspot17); - } - - if (RING_INVENTORY._scanner._sceneNumber == 2280) { - _hotspot18.postInit(); - _hotspot18.setVisage(2161); - _hotspot18._strip = 2; - _hotspot18._frame = 2; - _hotspot17.setPosition(Common::Point(152, 43)); - _hotspot17.fixPriority(1); - - _globals->_sceneItems.push_back(&_hotspot17); - } - - if (!_globals->getFlag(13)) { - _hotspot8.postInit(); - _hotspot8.setVisage(2280); - _hotspot8._strip = 2; - _hotspot8.setPosition(Common::Point(79, 108)); - _hotspot8.fixPriority(1); - - _hotspot10.postInit(); - _hotspot10.setVisage(2280); - _hotspot10._strip = 2; - _hotspot10._frame = 2; - _hotspot10.setPosition(Common::Point(79, 104)); - _hotspot10.fixPriority(2); - - _hotspot12.postInit(); - _hotspot12.setVisage(2280); - _hotspot12._strip = 2; - _hotspot12._frame = 3; - _hotspot12.setPosition(Common::Point(88, 76)); - _hotspot12.fixPriority(1); - - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL); - } - - _hotspot14.setBounds(Rect(70, 50, 90, 104)); - - _hotspot9.postInit(); - _hotspot9.setVisage(2280); - _hotspot9.setPosition(Common::Point(104, 96)); - _hotspot9.fixPriority(1); - - _hotspot11.postInit(); - _hotspot11.setVisage(2280); - _hotspot11._frame = 2; - _hotspot11.setPosition(Common::Point(130, 79)); - _hotspot11.fixPriority(1); - - _hotspot13.postInit(); - _hotspot13.setVisage(2280); - _hotspot13._frame = 3; - _hotspot13.setPosition(Common::Point(113, 63)); - _hotspot13.fixPriority(1); - - _hotspot1.setBounds(Rect(225, 70, 234, 80)); - _hotspot2.setBounds(Rect(44, 78, 56, 105)); - _hotspot3.setBounds(Rect(47, 108, 56, 117)); - _hotspot4.setBounds(Rect(56, 78, 69, 101)); - _hotspot5.setBounds(Rect(56, 108, 66, 113)); - _hotspot6.setBounds(Rect(261, 39, 276, 90)); - _hotspot7.setBounds(Rect(142, 19, 174, 38)); - _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - - _exitRect = Rect(145, 180, 195, 195); - - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(146, 161)); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff = Common::Point(4, 3); - - if ((_globals->_sceneManager._previousScene != 7300) && (_globals->_sceneManager._previousScene != 7000)) { - _globals->_player.enableControl(); - } else { - _globals->setFlag(109); - _globals->_player.fixPriority(76); - _globals->_player.disableControl(); - - _sceneMode = 2281; - setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL); - - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - } - - _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, - &_hotspot6, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot1, &_hotspot16, &_hotspot15, NULL); - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; -} - -void Scene2280::signal() { - if (_sceneMode == 2281) { - _globals->_player.fixPriority(-1); - _globals->_player.enableControl(); - } -} - -void Scene2280::dispatch() { - Scene::dispatch(); - if (!_action) { - if (_exitRect.contains(_globals->_player._position)) - _globals->_sceneManager.changeScene(2150); - } -} - -void Scene2280::synchronize(Serializer &s) { - Scene::synchronize(s); - _exitRect.synchronize(s); -} - -/*-------------------------------------------------------------------------- - * Scene 2300 - Starcraft - Hanger Bay - * - *--------------------------------------------------------------------------*/ - -void Scene2300::Action1::signal() { - // Quinn and Seeker - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: { - Common::Point pt(SCREEN_WIDTH, SCREEN_HEIGHT); - NpcMover *mover = new NpcMover(); - scene->_hotspot2.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_hotspot8.setAction(&scene->_action4); - scene->_soundHandler2.play(21); - - Common::Point pt1(95, scene->_hotspot5._position.y); - NpcMover *mover1 = new NpcMover(); - scene->_hotspot5.addMover(mover1, &pt1, this); - - Common::Point pt2(99, scene->_hotspot6._position.y); - NpcMover *mover2 = new NpcMover(); - scene->_hotspot6.addMover(mover2, &pt2, NULL); - break; - } - case 3: - setDelay(2); - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_WALK); - break; - case 4: { - scene->_hotspot5.setVisage(93); - scene->_hotspot6.setVisage(94); - scene->_hotspot5.setStrip(1); - scene->_hotspot6.setStrip(1); - scene->_hotspot5.changeZoom(50); - scene->_hotspot6.changeZoom(50); - scene->_hotspot5._moveDiff.x = 5; - scene->_hotspot6._moveDiff.x = 5; - scene->_hotspot5.animate(ANIM_MODE_1, NULL); - scene->_hotspot6.animate(ANIM_MODE_1, NULL); - - Common::Point pt1(178, 147); - NpcMover *mover1 = new NpcMover(); - scene->_hotspot5.addMover(mover1, &pt1, this); - - Common::Point pt2(170, 145); - NpcMover *mover2 = new NpcMover(); - scene->_hotspot6.addMover(mover2, &pt2, this); - break; - } - case 6: - scene->_soundHandler1.play(28); - _globals->_player.disableControl(); - - scene->_hotspot2.setVisage(40); - scene->_hotspot2.setStrip(4); - scene->_hotspot2.setFrame(1); - scene->_hotspot2.animate(ANIM_MODE_5, NULL); - - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 7: - _globals->_soundHandler.play(77, this); - break; - case 8: - _globals->_game->endGame(2300, 0); - remove(); - break; - case 9: - if (scene->_hotspot5._mover) - scene->_hotspot5.addMover(NULL); - if (scene->_hotspot6._mover) - scene->_hotspot6.addMover(NULL); - - scene->_hotspot5.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot6.animate(ANIM_MODE_NONE, NULL); - - _globals->_player.disableControl(); - _globals->_player.setVisage(2672); - _globals->_player._strip = 5; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 10: - _globals->_player.setVisage(2674); - _globals->_player._strip = 5; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 11: - scene->_soundHandler1.play(28); - - scene->_hotspot5._strip = 2; - scene->_hotspot6._strip = 2; - scene->_hotspot5._frame = 1; - scene->_hotspot6._frame = 1; - scene->_hotspot5.animate(ANIM_MODE_5, NULL); - scene->_hotspot6.animate(ANIM_MODE_5, NULL); - scene->_hotspot5.fixPriority(20); - scene->_hotspot6.fixPriority(20); - - _globals->_player.setVisage(2672); - _globals->_player._strip = 5; - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 12: - scene->_soundHandler1.play(77); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(4); - _globals->_player._uiEnabled = false; - setDelay(60); - break; - case 13: - scene->_stripManager.start(2300, this); - break; - case 14: - setDelay(5); - _actionIndex = 16; - break; - case 15: { - Common::Point pt1(101, 148); - PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); - - Common::Point pt2(scene->_hotspot5._position.x + 5, scene->_hotspot5._position.y + 5); - NpcMover *mover2 = new NpcMover(); - scene->_hotspot2.addMover(mover2, &pt2, NULL); - break; - } - case 16: - _globals->_sceneManager.changeScene(2000); - remove(); - break; - } -} - -void Scene2300::Action2::signal() { - // Miranda tearing cables - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(30); - break; - case 1: { - Common::Point pt(153, 135); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(2030, this); - break; - case 3: - _globals->_player.enableControl(); - setDelay(600); - break; - case 4: { - _globals->_player.disableControl(); - - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(2801); - scene->_hotspot2.setPosition(Common::Point(109, 145)); - scene->_hotspot2.changeZoom(50); - scene->_hotspot2.animate(ANIM_MODE_1, NULL); - scene->_hotspot2.setObjectWrapper(new SceneObjectWrapper()); - - Common::Point pt(160, 145); - NpcMover *mover = new NpcMover(); - scene->_hotspot2.addMover(mover, &pt, this); - break; - } - case 5: - scene->_stripManager.start(2032, this); - break; - case 6: - scene->_hotspot2.setVisage(93); - scene->_hotspot2.setStrip(3); - scene->_hotspot2.setFrame(1); - scene->_hotspot2.animate(ANIM_MODE_5, this); - - scene->_soundHandler1.play(28); - scene->_soundHandler2.play(97); - break; - case 7: - scene->_hotspot7._strip = 2; - scene->_hotspot7._frame = 1; - scene->_hotspot7.animate(ANIM_MODE_5, this); - break; - case 8: - scene->_hotspot2.animate(ANIM_MODE_6, this); - break; - case 9: - scene->_stripManager.start(2035, this); - break; - case 10: - _globals->_sceneManager.changeScene(2310); - break; - } -} - -void Scene2300::Action3::signal() { - // Stunned Miranda - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - Common::Point pt(153, 135); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - _globals->_player.disableControl(); - _globals->_player.setVisage(2672); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player.setVisage(2674); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_soundHandler1.play(97); - scene->_soundHandler2.play(28); - - scene->_hotspot7._strip = 2; - scene->_hotspot7._frame = 1; - scene->_hotspot7.animate(ANIM_MODE_5, this); - - _globals->_player.setVisage(2672); - _globals->_player._strip = 2; - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, NULL); - break; - case 4: - scene->_soundHandler2.play(97); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); - scene->_stripManager.start(2034, this); - break; - case 5: - setDelay(10); - break; - case 6: - _globals->_sceneManager.changeScene(2310); - break; - } -} - -void Scene2300::Action4::signal() { - // Ennemies coming - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_hotspot8.animate(ANIM_MODE_5, this); - scene->_soundHandler1.play(11); - break; - case 1: - scene->_hotspot9.postInit(); - scene->_hotspot9.setVisage(2301); - scene->_hotspot9.setStrip2(2); - scene->_hotspot9.setFrame(3); - scene->_hotspot9.setPosition(Common::Point(273, 199)); - scene->_hotspot9.fixPriority(19); - scene->_hotspot9.animate(ANIM_MODE_5, this); - scene->_soundHandler1.play(11); - break; - case 2: - scene->_hotspot8.remove(); - - scene->_hotspot10.postInit(); - scene->_hotspot10.setVisage(2301); - scene->_hotspot10.setStrip(3); - scene->_hotspot10.setFrame(4); - scene->_hotspot10.setPosition(Common::Point(292, 113)); - scene->_hotspot10.animate(ANIM_MODE_5, this); - scene->_soundHandler1.play(11); - break; - case 3: - scene->_soundHandler1.play(13); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2300::Hotspot5::doAction(int action) { - // Ennemies - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - scene->_action1.setActionIndex(9); - scene->_action1.setDelay(1); - break; - case CURSOR_LOOK: - SceneItem::display2(2300, 3); - break; - case CURSOR_USE: - SceneItem::display2(2300, 4); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2300::Hotspot7::doAction(int action) { - // Miranda - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - scene->setAction(&scene->_action3); - break; - case CURSOR_LOOK: - SceneItem::display2(2300, 2); - break; - case CURSOR_USE: - SceneItem::display2(2300, 21); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene2300::Scene2300() : - _hotspot11(0, CURSOR_LOOK, 2300, 6, CURSOR_USE, 2300, 14, LIST_END), - _hotspot12(0, CURSOR_LOOK, 2300, 5, CURSOR_USE, 2300, 13, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2300, 9, CURSOR_USE, 2300, 20, LIST_END), - _hotspot14(0, CURSOR_LOOK, 2300, 7, CURSOR_USE, 2300, 15, LIST_END), - _hotspot15(0, CURSOR_LOOK, 2300, 1, LIST_END) { -} - -void Scene2300::postInit(SceneObjectList *OwnerList) { - loadScene(2300); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - - RING_INVENTORY._stunner._sceneNumber = 1; - RING_INVENTORY._infoDisk._sceneNumber = 1; - - _hotspot8.postInit(); - _hotspot8.setVisage(2301); - _hotspot8.setPosition(Common::Point(288, 74)); - - _globals->_soundHandler.play(96); - if (_globals->_sceneManager._previousScene == 2000) { - _hotspot8.remove(); - - _hotspot9.postInit(); - _hotspot9.setVisage(2301); - _hotspot9.setStrip2(2); - _hotspot9._frame = _hotspot9.getFrameCount(); - _hotspot9.setPosition(Common::Point(273, 199)); - _hotspot9.fixPriority(1); - - _hotspot10.postInit(); - _hotspot10.setVisage(2301); - _hotspot10.setStrip(3); - _hotspot10._frame = _hotspot10.getFrameCount(); - _hotspot10.setPosition(Common::Point(292, 113)); - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(109, 139)); - _globals->_player.changeZoom(40); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.disableControl(); - - _hotspot7.postInit(); - _hotspot7.setVisage(2302); - _hotspot7.animate(ANIM_MODE_2, NULL); - _hotspot7.setPosition(Common::Point(229, 125)); - _hotspot7._numFrames = 5; - - _soundHandler1.play(95); - _soundHandler2.play(96); - _globals->_sceneItems.push_back(&_hotspot7); - - setAction(&_action2); - } else { - _hotspot8._numFrames = 3; - - _hotspot3.postInit(); - _hotspot3.setVisage(2331); - _hotspot3.setStrip(7); - _hotspot3.setPosition(Common::Point(231, 190)); - _hotspot3.changeZoom(40); - - _hotspot2.postInit(); - _hotspot2.setVisage(2801); - _hotspot2.setPosition(Common::Point(269, 195)); - _hotspot2.changeZoom(50); - _hotspot2.animate(ANIM_MODE_1, NULL); - _hotspot2.setObjectWrapper(new SceneObjectWrapper()); - - _hotspot1.postInit(); - _hotspot1.setVisage(2331); - _hotspot1.setStrip(7); - _hotspot1.setPosition(Common::Point(255, 190)); - _hotspot1.changeZoom(40); - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(203, 191)); - _globals->_player.changeZoom(40); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.disableControl(); - - _hotspot5.postInit(); - _hotspot5.setVisage(91); - _hotspot5.setPosition(Common::Point(343, 145)); - _hotspot5._moveDiff = Common::Point(35, 35); - _hotspot5.changeZoom(40); - _hotspot5.setObjectWrapper(new SceneObjectWrapper()); - - _hotspot6.postInit(); - _hotspot6.setVisage(92); - _hotspot6.setPosition(Common::Point(343, 130)); - _hotspot6._moveDiff = Common::Point(35, 35); - _hotspot6.changeZoom(40); - _hotspot6.setObjectWrapper(new SceneObjectWrapper()); - - _globals->_sceneItems.push_back(&_hotspot5); - setAction(&_action1); - } - - _hotspot12._sceneRegionId = 8; - _hotspot11._sceneRegionId = 9; - _hotspot13._sceneRegionId = 10; - _hotspot14._sceneRegionId = 11; - - _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL); -} - -/*-------------------------------------------------------------------------- - * Scene 2310 - Starcraft - Copy Protection Screen - * - *--------------------------------------------------------------------------*/ - -Scene2310::Scene2310() { - _pageList[0].set(0, 0, 0, 0, 0, 0); - _pageList[1].set(1, 0, 3, 2, 1, 4); - _pageList[2].set(2, 1, 4, 3, 2, 0); - _pageList[3].set(3, 2, 0, 4, 3, 1); - _pageList[4].set(4, 3, 1, 0, 2, 4); - _pageList[5].set(5, 4, 2, 1, 3, 0); - _pageList[6].set(6, 0, 4, 2, 3, 1); - _pageList[7].set(7, 1, 0, 2, 4, 3); - _pageList[8].set(8, 2, 1, 3, 0, 4); - _pageList[9].set(9, 3, 2, 4, 1, 0); - _pageList[10].set(10, 4, 1, 2, 0, 3); - _pageList[11].set(11, 0, 2, 3, 4, 1); - _pageList[12].set(12, 1, 2, 0, 4, 3); - _pageList[13].set(13, 2, 4, 0, 3, 1); - _pageList[14].set(14, 3, 4, 1, 0, 2); - _pageList[15].set(15, 4, 3, 1, 2, 0); - _pageList[16].set(16, 0, 1, 4, 2, 3); - _pageList[17].set(17, 1, 3, 4, 0, 2); - _pageList[18].set(18, 2, 3, 0, 1, 4); - _pageList[19].set(19, 3, 0, 1, 4, 2); - _pageList[20].set(20, 4, 0, 3, 1, 2); - - _rectList[0].set(135, 70, 151, 140); - _rectList[1].set(151, 70, 167, 140); - _rectList[2].set(167, 70, 183, 140); - _rectList[3].set(183, 70, 199, 140); - _rectList[4].set(199, 70, 215, 140); - - _wireIndex = 5; -} - -void Scene2310::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - loadScene(2301); - Common::Point pointList[5] = { Common::Point(142, 82), Common::Point(158, 82), Common::Point(174, 82), - Common::Point(190, 82), Common::Point(205, 82) }; - - for (int idx = 0; idx < 5; ++idx) { - _wireList[idx].postInit(); - _wireList[idx].setVisage(2300); - _wireList[idx]._strip = idx + 1; - _wireList[idx]._frame = 1; - _wireList[idx].setPosition(pointList[idx]); - } - - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_WALK); - - if (_vm->getFeatures() & GF_CD) - _pageIndex = _globals->_randomSource.getRandomNumber(14) + 2; - else - _pageIndex = _globals->_randomSource.getRandomNumber(19) + 1; - signal(); -} - -void Scene2310::signal() { - switch (_sceneMode++) { - case 0: { - Common::String fmtString = _resourceManager->getMessage(2300, 22); - Common::String msg = Common::String::format(fmtString.c_str(), _pageList[_pageIndex]._pageNumber); - - _sceneText._width = 280; - _sceneText._textMode = ALIGN_CENTER; - _sceneText._color1 = 35; - _sceneText._fontNumber = 2; - _sceneText.setup(msg); - _sceneText.fixPriority(255); - _sceneText.setPosition(Common::Point(30, 20)); - break; - } - case 1: { - Common::String msg = _resourceManager->getMessage(2300, 23); - _sceneText.setup(msg); - _sceneText.fixPriority(255); - _sceneText.setPosition(Common::Point(30, 170)); - - _globals->_sceneObjects->draw(); - _globals->_events.waitForPress(); - - _sceneText.hide(); - _globals->_sceneObjects->draw(); - - _globals->_sceneManager.changeScene(2200); - break; - } - } -} - -void Scene2310::synchronize(Serializer &s) { - Scene::synchronize(s); - - s.syncAsSint16LE(_wireIndex); - s.syncAsSint16LE(_pageIndex); -} - -void Scene2310::process(Event &event) { - int frameNum = 0; - - if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) { - int idx = 0; - while (idx < 5) { - if (_rectList[idx].contains(event.mousePos)) - break; - ++idx; - } - - if (idx < 5) { - // In handled rectangle area - if (_wireIndex == 5) { - // No wire is currently active, so start moving designated wire - _wireIndex = idx; - frameNum = idx + 2; - - if (event.mousePos.y > 105) - idx = findObject(idx); - - if (idx != 5) { - _wireList[idx].hide(); - _globals->_sceneObjects->draw(); - _wireList[idx].setFrame(frameNum); - - _wireList[idx].show(); - _globals->_sceneObjects->draw(); - } - } else { - // End the moving of the currently active wire - _wireList[_wireIndex].setFrame(idx + 2); - _wireIndex = 5; - - // Check if solution has been reached - int idx2 = 0; - do { - int objIndex = findObject(idx2); - if (_pageList[_pageIndex]._connectionList[idx2] != objIndex) - // Mismatch - break; - } while (++idx2 < 5); - - if (idx2 == 5) - // All the entries are correct - signal(); - } - - event.handled = true; - } else if (_wireIndex != 5) { - // Reset the active wire back to unplugged - _wireList[_wireIndex].setFrame(1); - _wireIndex = 5; - } - } -} - -void Scene2310::dispatch() { - if (_wireIndex != 5) { - for (int idx = 0; idx < 5; ++idx) { - if (_rectList[idx].contains(_globals->_events._mousePos)) { - _wireList[_wireIndex].setFrame(idx + 2); - return; - } - } - - _wireList[_wireIndex].setFrame(1); - } -} - -int Scene2310::findObject(int objIndex) { - for (int idx = 0; idx < 5; ++idx) { - if (_wireList[idx]._frame == (objIndex + 2)) - return idx; - } - - return 5; -} - -/*-------------------------------------------------------------------------- - * Scene 2320 - Starcraft - Lander Bay - * - *--------------------------------------------------------------------------*/ - -void Scene2320::Action1::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - if (_globals->_sceneManager._previousScene == 2120) - _actionIndex = 3; - break; - case 1: { - Common::Point pt(513, 144); - NpcMover *mover = new NpcMover(); - scene->_hotspot11.addMover(mover, &pt, this); - break; - } - case 2: { - Common::Point pt(510, 164); - NpcMover *mover = new NpcMover(); - scene->_hotspot11.addMover(mover, &pt, this); - break; - } - case 3: - setAction(&scene->_sequenceManager2, this, 2328, &scene->_hotspot11, NULL); - break; - case 4: - scene->_hotspot11.animate(ANIM_MODE_NONE); - setDelay(120); - _actionIndex = 3; - break; - } -} - -void Scene2320::Action2::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_soundHandler.play(253); - scene->_hotspot13.fixPriority(99); - - Common::Point pt(scene->_hotspot13._position.x, 200); - NpcMover *mover = new NpcMover(); - scene->_hotspot13.addMover(mover, &pt, this); - break; - } - case 1: - scene->_hotspot13.hide(); - remove(); - break; - } -} - -void Scene2320::Action3::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - Common::Point pt(320, 86); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 1: - scene->_soundHandler.play(162); - scene->_hotspot6.animate(ANIM_MODE_5, this); - break; - case 2: { - Common::Point pt(320, 79); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_player.fixPriority(scene->_hotspot6._priority - 1); - _globals->_player._strip = 3; - setDelay(10); - break; - case 4: - scene->_area1.display(); - scene->_area2.display(); - scene->_area3.display(); - scene->_area4.display(); - - scene->_area3.draw(true); - _state = 0; - _globals->_events.setCursor(CURSOR_USE); - - while (!_state && !_vm->shouldQuit()) { - // Wait for an event - Event event; - if (!_globals->_events.getEvent(event)) { - g_system->updateScreen(); - g_system->delayMillis(10); - continue; - } - - if (scene->_area1._bounds.contains(event.mousePos)) { - scene->_area1.draw(true); - scene->_area3.draw(false); - _state = scene->_area1._actionId; - } - if (scene->_area2._bounds.contains(event.mousePos)) { - scene->_area3.draw(false); - scene->_area2.draw(true); - _state = scene->_area2._actionId; - } - if (scene->_area3._bounds.contains(event.mousePos)) { - scene->_area3.draw(true); - _state = scene->_area3._actionId; - } - } - - scene->_soundHandler.play(161); - scene->_area1.restore(); - scene->_area2.restore(); - scene->_area3.restore(); - scene->_area4.restore(); - - if (_state == 2320) { - setDelay(10); - } else { - scene->_soundHandler.play(162); - scene->_hotspot6.animate(ANIM_MODE_6, this); - } - break; - case 5: { - if (_state == 2320) - _globals->_player.fixPriority(-1); - else - _globals->_sceneManager.changeScene(_state); - - Common::Point pt(320, 86); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: - scene->_soundHandler.play(162); - scene->_hotspot6.animate(ANIM_MODE_6, this); - break; - case 7: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2320::Action4::signal() { - // Fly Cycle actions - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: { - Common::Point pt(213, 84); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - case 16: - _globals->_player.setVisage(2109); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_player.animate(ANIM_MODE_6, NULL); - setAction(&scene->_action2, this); - break; - case 4: { - scene->_hotspot16.postInit(); - scene->_hotspot16.setVisage(2331); - scene->_hotspot16.setStrip(3); - scene->_hotspot16.fixPriority(149); - scene->_hotspot16.setPosition(Common::Point(320, 202)); - scene->_hotspot16.show(); - - Common::Point pt(320, 121); - NpcMover *mover = new NpcMover(); - scene->_hotspot16.addMover(mover, &pt, this); - break; - } - case 5: { - scene->_hotspot16.fixPriority(200); - Common::Point pt(320, 180); - NpcMover *mover = new NpcMover(); - scene->_hotspot16.addMover(mover, &pt, this); - break; - } - case 6: { - scene->_hotspot16.fixPriority(-1); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - - Common::Point pt(233, 176); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 7: { - Common::Point pt(291, 194); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 8: - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - setDelay(13); - break; - case 9: - // Quinn sits in the flycycle - scene->_hotspot16.hide(); - _globals->_player.setVisage(2323); - _globals->_player.setPosition(Common::Point(303, 176)); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 10: - if (_globals->getFlag(109)) { - _globals->_soundHandler.play(40); - _globals->_soundHandler.holdAt(true); - - Common::Point pt(303, 240); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - } else { - setDelay(3); - } - break; - case 11: - if (_globals->getFlag(109)) { - _globals->_sceneManager.changeScene(7600); - } else { - SceneItem::display2(2320, 19); - setDelay(3); - } - break; - case 12: - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 13: - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(291, 194)); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_1, NULL); - - scene->_hotspot16.show(); - setDelay(3); - break; - case 14: { - Common::Point pt(233, 176); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 15: { - Common::Point pt(213, 85); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 17: { - _globals->_player.animate(ANIM_MODE_6, NULL); - scene->_hotspot16.fixPriority(160); - - Common::Point pt(320, 121); - NpcMover *mover = new NpcMover(); - scene->_hotspot16.addMover(mover, &pt, this); - break; - } - case 18: { - scene->_hotspot16.fixPriority(149); - Common::Point pt(320, 202); - PlayerMover *mover = new PlayerMover(); - scene->_hotspot16.addMover(mover, &pt, this); - break; - } - case 19: { - scene->_hotspot16.remove(); - scene->_soundHandler.play(253); - - scene->_hotspot13.show(); - Common::Point pt(319, 157); - NpcMover *mover = new NpcMover(); - scene->_hotspot13.addMover(mover, &pt, this); - break; - } - case 20: - _globals->_player.enableControl(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - - scene->_hotspot13.fixPriority(1); - remove(); - break; - } -} - -void Scene2320::Action5::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_PLAYER_MOVER(163, 126); - break; - case 1: - ADD_PLAYER_MOVER(165, 132); - break; - case 2: - setDelay(2); - break; - case 3: - if (!_globals->getFlag(59)) - setDelay(10); - else - scene->_stripManager.start(2323, this); - break; - case 4: - _globals->_player.setVisage(2347); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(137); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 5: - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 6: - if (_globals->getFlag(72)) - _globals->_sceneManager.changeScene(7000); - else if (_globals->getFlag(59)) - _globals->_sceneManager.changeScene(5000); - else if (!_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1)) - setDelay(10); - else { - scene->_hotspot11.setAction(NULL); - scene->_hotspot11.setVisage(2705); - scene->_hotspot11.animate(ANIM_MODE_1, NULL); - scene->_hotspot11.setObjectWrapper(new SceneObjectWrapper()); - - Common::Point pt(185, 135); - NpcMover *mover = new NpcMover(); - scene->_hotspot11.addMover(mover, &pt, NULL); - - _globals->clearFlag(43); - scene->_stripManager.start(2325, this); - } - break; - case 7: - setDelay(10); - break; - case 8: - _globals->_sceneManager.changeScene(4000); - break; - } -} - -void Scene2320::Action6::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 2: - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player.setVisage(0); - _globals->_player.setStrip(3); - _globals->_player.fixPriority(-1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - - setDelay(60); - break; - case 4: - if ((_globals->_sceneManager._previousScene != 4000) || _globals->getFlag(43)) - setDelay(3); - else if (_globals->getFlag(35)) { - _globals->setFlag(43); - scene->_stripManager.start(4200, this); - _globals->setFlag(69); - } else if (_globals->getFlag(36)) { - setDelay(3); - } else { - _globals->setFlag(43); - scene->_stripManager.start(4210, this); - break; - } - break; - case 5: - if (_globals->_sceneObjects->contains(&scene->_hotspot11)) { - scene->_hotspot11.setAction(&scene->_action1); - - if (_globals->_sceneObjects->contains(&scene->_hotspot10)) { - ADD_MOVER(scene->_hotspot10, 491, 160); - } else { - setDelay(60); - } - - _globals->_sceneItems.push_front(&scene->_hotspot11); - } else { - setDelay(3); - } - break; - case 6: - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene2320::Action7::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - _globals->_soundHandler.play(162); - scene->_hotspot6.animate(ANIM_MODE_5, this); - break; - case 2: - scene->_hotspot10.fixPriority(-1); - ADD_MOVER_NULL(scene->_hotspot10, 321, 94); - scene->_hotspot11.fixPriority(-1); - ADD_MOVER_NULL(scene->_hotspot11, 346, 85); - - _globals->_player.fixPriority(-1); - ADD_MOVER(_globals->_player, 297, 89); - break; - case 3: - ADD_PLAYER_MOVER(462, 182); - break; - case 4: - ADD_MOVER(scene->_hotspot11, 391, 88); - break; - case 5: - ADD_MOVER(scene->_hotspot11, 500, 164); - ADD_MOVER(scene->_hotspot10, 382, 93); - _globals->_player.setStrip(3); - break; - case 6: - ADD_MOVER_NULL(scene->_hotspot10, 491, 160); - ADD_MOVER(_globals->_player, 391, 88); - break; - case 7: - ADD_PLAYER_MOVER(462, 182); - break; - case 8: - _globals->_player.setStrip(7); - setDelay(15); - break; - case 9: - scene->_stripManager.start(6020, this); - break; - case 10: - setDelay(6); - break; - case 11: - scene->_stripManager.start(6022, this); - break; - case 12: - _globals->_player.enableControl(); - RING_INVENTORY._stasisBox._sceneNumber = 2320; - break; - } -} - -void Scene2320::Action8::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - ADD_PLAYER_MOVER(462, 182); - break; - case 2: - _globals->_player.setStrip(7); - setDelay(5); - break; - case 3: - scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); - scene->_stripManager.start(_globals->getFlag(75) ? 6030 : 2320, this); - break; - case 4: - if (_globals->getFlag(75)) - setDelay(3); - else - _globals->_player.enableControl(); - break; - case 5: - RING_INVENTORY._stasisBox._sceneNumber = 2320; - scene->_sceneMode = 2326; - scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); - scene->setAction(&scene->_sequenceManager1, scene, 2326, &_globals->_player, &scene->_hotspot11, NULL); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene2320::Hotspot5::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 13); - break; - case CURSOR_USE: - if (_globals->getFlag(70)) - SceneItem::display2(2320, 33); - else if (_globals->getFlag(13)) - SceneItem::display2(2320, 18); - else - scene->setAction(&scene->_action5); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot6::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 2); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot8::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 23); - break; - case CURSOR_USE: - scene->_sceneMode = 2336; - scene->setAction(&scene->_sequenceManager1, scene, 2336, &_globals->_player, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot10::doAction(int action) { - // Seeker - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 26); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->_sceneMode = 2329; - - if (_globals->getFlag(13)) { - scene->_stripManager.start(2337, scene); - } else if (_globals->getFlag(70)) { - scene->setAction(&scene->_action8); - } else if (_globals->getFlag(109)) { - scene->setAction(&scene->_sequenceManager1, scene, 2337, NULL); - } else if (!_state) { - ++_state; - scene->setAction(&scene->_sequenceManager1, scene, 2334, NULL); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 2335, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot11::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 25); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->_sceneMode = 2329; - - if (_globals->getFlag(13)) { - _globals->_player.disableControl(); - scene->_sceneMode = 5000; - scene->_stripManager.start(2336, scene); - } else if (_globals->getFlag(70)) { - scene->setAction(&scene->_action8); - } else { - scene->_sceneMode = 2329; - - if (RING_INVENTORY._ale._sceneNumber == 1) { - scene->setAction(&scene->_sequenceManager1, scene, 2329, NULL); - } else if (!_globals->getFlag(110)) { - _globals->setFlag(110); - scene->setAction(&scene->_sequenceManager1, scene, 2330, NULL); - } else if (RING_INVENTORY._peg._sceneNumber != 1) { - scene->setAction(&scene->_sequenceManager1, scene, 2331, NULL); - } else if (!_state) { - ++_state; - scene->setAction(&scene->_sequenceManager1, scene, 2332, NULL); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 2333, NULL); - } - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot12::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 5); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2320, 24); - else { - _globals->_player.disableControl(); - scene->_sceneMode = 2322; - scene->setAction(&scene->_sequenceManager1, scene, 2322, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot14::doAction(int action) { - // Right Console - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 17); - break; - case CURSOR_USE: - if (_globals->getFlag(24)) { - _globals->clearFlag(24); - _globals->_player.disableControl(); - - scene->_hotspot8.postInit(); - scene->_hotspot8.setVisage(2345); - scene->_hotspot8.setPosition(Common::Point(634, 65)); - scene->_hotspot8.hide(); - - _globals->_sceneItems.push_front(&scene->_hotspot8); - RING_INVENTORY._waldos._sceneNumber = 2320; - - scene->_hotspot9.postInit(); - scene->_hotspot9.setVisage(2345); - scene->_hotspot9._strip = 6; - scene->_hotspot9.setPosition(Common::Point(536, 103)); - scene->_hotspot9.fixPriority(200); - scene->_hotspot9.hide(); - - scene->_hotspot16.postInit(); - scene->_hotspot16.setVisage(2345); - scene->_hotspot16.setStrip(8); - scene->_hotspot16.setPosition(Common::Point(536, 103)); - scene->_hotspot16.hide(); - - scene->_sceneMode = 2324; - scene->setAction(&scene->_sequenceManager1, scene, 2324, &_globals->_player, &scene->_hotspot7, - &scene->_hotspot8, &scene->_hotspot9, &scene->_hotspot16, NULL); - } else if (_globals->getFlag(13)) { - SceneItem::display2(2320, 24); - } else if (!_globals->getFlag(76)) { - SceneItem::display2(2320, 28); - } else if (!RING_INVENTORY._waldos._sceneNumber) { - SceneItem::display2(2320, 27); - } else { - SceneItem::display2(2320, 29); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene2320::Hotspot15::doAction(int action) { - // Left console (Flycycle console) - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(2320, 16); - break; - case CURSOR_USE: - if (_globals->getFlag(13)) - SceneItem::display2(2320, 24); - else - scene->setAction(&scene->_action4); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - - -/*--------------------------------------------------------------------------*/ - -Scene2320::Scene2320() : - _hotspot1(0, CURSOR_LOOK, 2320, 0, LIST_END), - _hotspot2(0, CURSOR_LOOK, 2320, 1, LIST_END), - _hotspot3(0, CURSOR_LOOK, 2320, 11, LIST_END), - _hotspot4(0, CURSOR_LOOK, 2320, 14, LIST_END), - _hotspot13(0, CURSOR_LOOK, 2320, 12, LIST_END) -{ - _area1.setup(2153, 2, 1, 2100); - _area1._pt = Common::Point(200, 31); - _area2.setup(2153, 3, 1, 2150); - _area2._pt = Common::Point(200, 50); - _area3.setup(2153, 4, 1, 2320); - _area3._pt = Common::Point(200, 75); - _area4.setup(2153, 1, 1, 10); - _area4._pt = Common::Point(237, 77); -} - -void Scene2320::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(60, 75, 100, 100); - - _stripManager.addSpeaker(&_speakerMR); - _stripManager.addSpeaker(&_speakerML); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerSAL); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - - _speakerMText._npc = &_hotspot11; - _speakerQText._npc = &_globals->_player; - _hotspotPtr = &_hotspot10; - - _hotspot6.postInit(); - _hotspot6.setVisage(2321); - _hotspot6.setPosition(Common::Point(320, 67)); - - _hotspot7.postInit(); - _hotspot7.setVisage(2344); - _hotspot7.setPosition(Common::Point(604, 92)); - - _hotspot13.postInit(); - _hotspot13.setVisage(2323); - _hotspot13.setPosition(Common::Point(319, 157)); - _hotspot13.fixPriority(1); - - _hotspot12.postInit(); - _hotspot12.setVisage(2321); - _hotspot12._strip = 4; - _hotspot12.animate(ANIM_MODE_8, 0, NULL); - _hotspot12.setPosition(Common::Point(412, 46)); - - if (RING_INVENTORY._waldos._sceneNumber == 2320) { - _hotspot8.postInit(); - _hotspot8.setVisage(2345); - _hotspot8.setStrip(5); - _hotspot8.setFrame(8); - _hotspot8.setPosition(Common::Point(541, 103)); - _hotspot8.fixPriority(201); - - _globals->_sceneItems.push_back(&_hotspot8); - } - - if (_globals->getFlag(43)) { - _hotspot11.postInit(); - _hotspot11.setVisage(2705); - _hotspot11._strip = 3; - _hotspot11.setPosition(Common::Point(510, 156)); - _globals->_sceneItems.push_back(&_hotspot11); - _hotspot11._state = 0; - _hotspot11.setAction(&_action1); - } - - _globals->_player.postInit(); - if (_globals->getFlag(13)) - _globals->_player.setVisage(2170); - else - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(320, 79)); - _globals->_player.fixPriority(10); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff.y = 3; - _globals->_player.disableControl(); - - if (_globals->getFlag(114)) { - _hotspot10.postInit(); - _hotspot10.setVisage(2806); - _hotspot10.setPosition(Common::Point(481, 162)); - _hotspot10.changeZoom(-1); - _hotspot10.setStrip(5); - _hotspot10._state = 0; - - _globals->_sceneItems.push_back(&_hotspot10); - } - - if (_globals->getFlag(70)) { - _hotspot11.postInit(); - _hotspot11.setVisage(2705); - _hotspot11.setPosition(Common::Point(500, 164)); - - _hotspot10.postInit(); - _hotspot10.setVisage(2806); - _hotspot10.setPosition(Common::Point(481, 162)); - _hotspot10.changeZoom(-1); - _hotspot10.setStrip(5); - - _globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL); - } - - switch (_globals->_sceneManager._previousScene) { - case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(389, 72)); - _globals->_player.enableControl(); - break; - case 4000: - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { - _hotspot11.postInit(); - _hotspot11.setVisage(2705); - _hotspot11.setPosition(Common::Point(178, 118)); - _hotspot11.animate(ANIM_MODE_1, NULL); - } - // Deliberate fall-through - case 4250: - case 5000: - case 7000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80)) - _globals->setFlag(36); - - _globals->_player.disableControl(); - _globals->_player.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setObjectWrapper(NULL); - _globals->_player.setVisage(2347); - _globals->_player.setStrip(2); - _globals->_player.setFrame(5); - _globals->_player.fixPriority(137); - _globals->_player.setPosition(Common::Point(165, 132)); - - setAction(&_action6); - break; - case 6100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - - _hotspot8.postInit(); - _hotspot8.setVisage(2345); - _hotspot8.setPosition(Common::Point(634, 65)); - _hotspot8.hide(); - - _sceneMode = 2325; - setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); - break; - case 7600: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _soundHandler.play(21); - - _globals->_player.setVisage(2323); - _globals->_player.setStrip(2); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.setPosition(Common::Point(303, 176)); - _globals->_player.fixPriority(-1); - _globals->_player.disableControl(); - - _hotspot13.setPosition(Common::Point(319, 199)); - - _hotspot16.postInit(); - _hotspot16.setVisage(2331); - _hotspot16._strip = 3; - _hotspot16.fixPriority(160); - _hotspot16.setPosition(Common::Point(320, 202)); - _hotspot16.hide(); - - _sceneMode = 2338; - setAction(&_sequenceManager1, this, 2338, &_globals->_player, &_hotspot16, &_hotspot13, NULL); - break; - default: - switch (_globals->_stripNum) { - case 2101: - _globals->_player.disableControl(); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(307, 84)); - - _hotspot11.postInit(); - _hotspot11.setVisage(2705); - _hotspot11._strip = 2; - _hotspot11.fixPriority(10); - _hotspot11.setPosition(Common::Point(322, 80)); - _hotspot11.setObjectWrapper(new SceneObjectWrapper()); - _hotspot11.animate(ANIM_MODE_1, NULL); - - _hotspot10.postInit(); - _hotspot10.setVisage(2806); - _hotspot10.setObjectWrapper(new SceneObjectWrapper()); - _hotspot10.changeZoom(-1); - _hotspot10.fixPriority(10); - _hotspot10.setPosition(Common::Point(318, 89)); - _hotspot10._strip = 3; - _hotspot10.animate(ANIM_MODE_1, NULL); - - setAction(&_action7); - break; - case 6100: - _hotspot8.postInit(); - _hotspot8.setVisage(2345); - _hotspot8.setPosition(Common::Point(634, 65)); - _hotspot8.hide(); - - _sceneMode = 2325; - setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); - break; - default: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _sceneMode = 2321; - - _globals->_player.setStrip(3); - setAction(&_sequenceManager1, this, 2321, &_globals->_player, &_hotspot6, NULL); - break; - } - } - - _globals->_stripNum = 0; - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); - loadScene(2320); - - _hotspot14._sceneRegionId = 8; - _hotspot1.setBounds(Rect(0, 0, 640, 200)); - _hotspot2.setBounds(Rect(278, 0, 362, 61)); - _hotspot3.setBounds(Rect(282, 62, 367, 98)); - _hotspot4.setBounds(Rect(67, 38, 112, 113)); - _hotspot5.setBounds(Rect(104, 122, 174, 157)); - _hotspot15.setBounds(Rect(191, 53, 205, 63)); - - _globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12, - &_hotspot13, &_hotspot4, &_hotspot3, &_hotspot2, &_hotspot1, NULL); -} - -void Scene2320::synchronize(Serializer &s) { - Scene::synchronize(s); - SYNC_POINTER(_hotspotPtr); -} - -void Scene2320::signal() { - switch (_sceneMode) { - case 2321: - case 2327: - case 2329: - if (_globals->getFlag(43) && !_hotspot11._action) - _hotspot11.setAction(&_action1); - _globals->_player.enableControl(); - break; - case 2322: - _globals->_sceneManager.changeScene(2120); - break; - case 2323: - _globals->_player.disableControl(); - break; - case 2338: - case 2324: - _hotspot16.remove(); - _globals->_player.enableControl(); - break; - case 2325: - _globals->setFlag(76); - _globals->clearFlag(70); - _globals->_stripNum = 6100; - _globals->_sceneManager.changeScene(2100); - break; - case 2326: - _globals->clearFlag(70); - RING_INVENTORY._nullifier._sceneNumber = 1; - _globals->_stripNum = 2321; - _globals->_sceneManager.changeScene(2100); - break; - case 2336: - _globals->setFlag(77); - RING_INVENTORY._waldos._sceneNumber = 1; - _hotspot8.remove(); - break; - case 5000: - _globals->_player.enableControl(); - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 2400 - Descending in Lander - * - *--------------------------------------------------------------------------*/ - -void Scene2400::Action1::signal() { - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - ADD_MOVER(_globals->_player, 160, 71); - break; - case 2: - ADD_MOVER(_globals->_player, 160, 360); - break; - case 3: - _globals->_player._moveDiff = Common::Point(1, 1); - ADD_MOVER(_globals->_player, 140, 375); - break; - case 4: - ADD_MOVER(_globals->_player, 87, 338); - break; - case 5: - _globals->_player.hide(); - setDelay(60); - break; - case 6: - _globals->_sceneManager.changeScene(4000); - break; - } -} - -void Scene2400::Action1::dispatch() { - Action::dispatch(); - if ((_actionIndex == 4) && (_globals->_player._percent > 5)) - _globals->_player.changeZoom(_globals->_player._percent - 2); -} - -/*--------------------------------------------------------------------------*/ - -void Scene2400::postInit(SceneObjectList *OwnerList) { - loadScene(2400); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _globals->_player.postInit(); - _globals->_player.setVisage(2410); - _globals->_player.setPosition(Common::Point(340, -10)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.disableControl(); - - setAction(&_action1); - - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - - _globals->_soundHandler.play(153); -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld_scenes3.h deleted file mode 100644 index 711360c190..0000000000 --- a/engines/tsage/ringworld_scenes3.h +++ /dev/null @@ -1,895 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES3_H -#define TSAGE_RINGWORLD_SCENES3_H - -#include "common/scummsys.h" -#include "tsage/core.h" -#include "tsage/converse.h" -#include "tsage/ringworld_logic.h" - -namespace tSage { - -class Scene2000 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - class Action9 : public Action { - public: - virtual void signal(); - }; - class Action10 : public Action { - public: - virtual void signal(); - }; - class Action11 : public Action { - public: - virtual void signal(); - }; - class Action12 : public Action { - public: - virtual void signal(); - }; - class Action13 : public Action { - public: - virtual void signal(); - }; - class Action14 : public Action { - public: - virtual void signal(); - }; - -public: - SpeakerSL _speakerSL; - SpeakerQR _speakerQR; - SpeakerMR _speakerMR; - SpeakerQText _speakerQText; - SpeakerMText _speakerMText; - SpeakerSText _speakerSText; - SpeakerHText _speakerHText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Action9 _action9; - Action10 _action10; - Action11 _action11; - Action12 _action12; - Action13 _action13; - Action14 _action14; - SceneObject _object1, _object2, _object3, _object4, _object5; - SceneObject _object6, _object7, _object8, _object9, _object10; - ASound _soundHandler1, _soundHandler2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void stripCallback(int v); -}; - -class Scene2100 : public Scene { - /* Actions */ - class Action1 : public ActionExt { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - class Action9 : public Action { - public: - virtual void signal(); - }; - class Action10 : public Action { - public: - virtual void signal(); - }; - class Action11 : public Action { - public: - virtual void signal(); - }; - class Action12 : public Action { - public: - virtual void signal(); - }; - class Action13 : public Action { - public: - virtual void signal(); - }; - class Action14 : public Action { - public: - virtual void signal(); - }; - class Action15 : public Action { - public: - virtual void signal(); - }; - class Action16 : public Action { - public: - virtual void signal(); - }; - class Action17 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot14 : public SceneObject { - public: - virtual void doAction(int action); - }; - - /* Objects */ - class Object1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object3 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - ASound _soundHandler; - SpeakerMText _speakerMText; - SpeakerMR _speakerMR; - SpeakerQL _speakerQL; - SpeakerQR _speakerQR; - SpeakerQText _speakerQText; - SpeakerGameText _speakerGameText; - SpeakerSText _speakerSText; - SpeakerSL _speakerSL; - SpeakerSAL _speakerSAL; - SpeakerHText _speakerHText; - - DisplayHotspot _hotspot1; - Hotspot2 _hotspot2; - Hotspot3 _hotspot3; - Hotspot4 _hotspot4; - DisplayHotspot _hotspot5, _hotspot6, _hotspot7; - Hotspot8 _hotspot8; - DisplayHotspot _hotspot9; - Hotspot10 _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13; - Hotspot14 _hotspot14; - DisplayHotspot _hotspot15; - - Object1 _object1; - Object2 _object2; - Object3 _object3; - SceneObject _object4; - - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Action9 _action9; - Action10 _action10; - Action11 _action11; - Action12 _action12; - Action13 _action13; - Action14 _action14; - Action15 _action15; - Action16 _action16; - Action17 _action17; - int _sitFl; - SceneArea _area1, _area2, _area3, _area4; - - Scene2100(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void stripCallback(int v); - virtual void signal(); - virtual void synchronize(Serializer &s); -}; - -class Scene2120 : public Scene { - /* Actions */ - class Entry { - public: - int _size; - int _lineNum; - int _visage; - - Entry() { _size = 0; _lineNum = 0; _visage = 0; } - Entry(int size, int lineNum, int visage) { _size = size; _lineNum = lineNum; _visage = visage; } - }; - - class Action1 : public Action { - private: - Common::Array _entries; - public: - Action1(); - - virtual void signal(); - virtual void dispatch(); - }; - -public: - ASound _soundHandler; - SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot; - SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton; - Action1 _action1; - Rect _listRect; - int _dbMode, _prevDbMode; - bool _visageVisable; - int _subjectIndex; - int _lineOffset; - - Scene2120(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); -}; - -class Scene2150 : public Scene { - /* Actions */ - class Action1 : public ActionExt { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - SpeakerGameText _speakerGameText; - - Rect _rect1, _rect2; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - DisplayHotspot _hotspot3; - Hotspot4 _hotspot4; - DisplayHotspot _hotspot5, _hotspot6; - Hotspot7 _hotspot7; - DisplayHotspot _hotspot8, _hotspot9; - Hotspot10 _hotspot10; - DisplayHotspot _hotspot11; - SceneObject _hotspot12, _hotspot13, _hotspot14; - SceneArea _area1, _area2, _area3, _area4; - Action1 _action1; - Action2 _action2; - - Scene2150(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene2200 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public ActionExt { - public: - virtual void signal(); - virtual void process(Event &event); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot5 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot9 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SpeakerMText _speakerMText; - SpeakerSText _speakerSText; - SpeakerQText _speakerQText; - SpeakerSL _speakerSL; - SpeakerQR _speakerQR; - SpeakerQL _speakerQL; - SpeakerMR _speakerMR; - SpeakerGameText _speakerGameText; - Rect _exitRect; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - DisplayHotspot _hotspot1; - Hotspot3 _hotspot3; - Hotspot5 _hotspot5; - Hotspot9 _hotspot9; - DisplayHotspot _hotspot10; - SceneObject _hotspot2, _hotspot4; - SceneObject _hotspot6, _hotspot7, _hotspot8; - ASound _soundHandler1, _soundHandler2; - - Scene2200(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void stripCallback(int v); - virtual void synchronize(Serializer &s); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene2222 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - -public: - ASound _soundHandler; - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SpeakerQText _speakerQText; - SpeakerML _speakerML; - SpeakerSR _speakerSR; - Action1 _action1; - Action2 _action2; - SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene2230 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot5 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot6 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot11 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot12 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Hotspot1 _hotspot1; - Hotspot3 _hotspot3; - Hotspot4 _hotspot4; - SceneObject _hotspot2; - Hotspot5 _hotspot5; - Hotspot6 _hotspot6; - Hotspot7 _hotspot7; - Hotspot8 _hotspot8; - DisplayHotspot _hotspot9; - Hotspot10 _hotspot10; - Hotspot11 _hotspot11; - Hotspot12 _hotspot12; - Rect _rect1; - int _field30A; - - Scene2230(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void dispatch(); -}; - -class Scene2280 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public ActionExt { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot12 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot14 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot15 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot16 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot17 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot18 : public SceneObject { - public: - virtual void doAction(int action); - }; - -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - Rect _exitRect; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - DisplayHotspot _hotspot3; - Hotspot4 _hotspot4; - DisplayHotspot _hotspot5, _hotspot6; - Hotspot7 _hotspot7; - Hotspot8 _hotspot8; - DisplayHotspot _hotspot9; - Hotspot10 _hotspot10; - DisplayHotspot _hotspot11; - Hotspot12 _hotspot12; - DisplayHotspot _hotspot13; - Hotspot14 _hotspot14; - DisplayHotspot _hotspot15, _hotspot16; - Hotspot17 _hotspot17; - Hotspot18 _hotspot18; - - Scene2280(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene2300 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public ActionExt { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot5 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler1, _soundHandler2; - SpeakerSL _speakerSL; - SpeakerMText _speakerMText; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4; - Hotspot5 _hotspot5; - SceneObject _hotspot6; - Hotspot7 _hotspot7; - SceneObject _hotspot8, _hotspot9, _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15; - - Scene2300(); - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene2310 : public Scene { -private: - int findObject(int objIndex); - - /* Custom classes */ - class ProtectionEntry { - public: - int _pageNumber; - int _connectionList[5]; - - void set(int pageNumber, int v1, int v2, int v3, int v4, int v5) { - _pageNumber = pageNumber; - _connectionList[0] = v1; _connectionList[1] = v2; _connectionList[2] = v3; - _connectionList[3] = v4; _connectionList[4] = v5; - } - }; - -public: - SequenceManager _sequenceManager; - int _wireIndex, _pageIndex; - SceneObject _wireList[5]; - Rect _rectList[5]; - SceneText _sceneText; - ProtectionEntry _pageList[21]; - - Scene2310(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); -}; - -class Scene2320 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public ActionExt { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot5 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot6 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class Hotspot11 : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class Hotspot12 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot14 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot15 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - SequenceManager _sequenceManager1, _sequenceManager2; - SpeakerMText _speakerMText; - SpeakerMR _speakerMR; - SpeakerML _speakerML; - SpeakerQText _speakerQText; - SpeakerQL _speakerQL; - SpeakerQR _speakerQR; - SpeakerSAL _speakerSAL; - SpeakerSL _speakerSL; - SpeakerSR _speakerSR; - SpeakerSText _speakerSText; - SpeakerGameText _speakerGameText; - SceneArea _area1, _area2, _area3, _area4; - DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4; - Hotspot5 _hotspot5; - Hotspot6 _hotspot6; - SceneObject _hotspot7, _hotspot9; - Hotspot8 _hotspot8; - Hotspot10 _hotspot10; - Hotspot11 _hotspot11; - Hotspot12 _hotspot12; - DisplayHotspot _hotspot13; - Hotspot14 _hotspot14; - Hotspot15 _hotspot15; - SceneObject _hotspot16; - SceneItem *_hotspotPtr; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - - Scene2320(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void signal(); -}; - -class Scene2400 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; -public: - Action1 _action1; - SceneObject _object; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes4.cpp b/engines/tsage/ringworld_scenes4.cpp deleted file mode 100644 index 838769e4af..0000000000 --- a/engines/tsage/ringworld_scenes4.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "tsage/ringworld_scenes4.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 3500 - Ringworld Scan - * - *--------------------------------------------------------------------------*/ - -void Scene3500::Action1::signal() { - Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_stripManager.start(3500, this); - break; - case 2: - setDelay(3); - break; - case 3: - _globals->_sceneManager.changeScene(9999); - break; - } -} - -void Scene3500::Action2::signal() { - Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_stripManager.start(3501, this); - break; - case 2: - setDelay(3); - break; - case 3: - _globals->_sceneManager.changeScene(2012); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene3500::postInit(SceneObjectList *OwnerList) { - loadScene((_globals->_stripNum == 3600) ? 3600 : 3500); - Scene::postInit(); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerSText); - - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160; - - setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1); -} - -/*-------------------------------------------------------------------------- - * Scene 3700 - Remote Viewer - * - *--------------------------------------------------------------------------*/ - -#define VIEW_FRAME_DELAY 10 - -Scene3700::Viewer::Viewer() { - _images1.setVisage(3705, 1); - _images2.setVisage(3705, 2); - - _frameList[0] = 1; - for (int idx = 1; idx <= 3; ++idx) - _frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1; - - _active = true; - _countdownCtr = 0; - _percentList[0] = 120; - _percentList[1] = 50; - _percentList[2] = 75; - _percentList[3] = 114; -} - -void Scene3700::Viewer::synchronize(Serializer &s) { - SceneObject::synchronize(s); - s.syncAsByte(_active); - s.syncAsSint16LE(_countdownCtr); - for (int idx = 0; idx < 4; ++idx) { - s.syncAsSint16LE(_frameList[idx]); - s.syncAsSint16LE(_percentList[idx]); - } -} - -void Scene3700::Viewer::dispatch() { - if (_active) { - if (_countdownCtr-- <= 0) { - _countdownCtr = VIEW_FRAME_DELAY; - - for (int idx = 3; idx > 1; --idx) - _frameList[idx] = _frameList[idx - 1]; - - int newFrame; - do { - newFrame = _globals->_randomSource.getRandomNumber(4) + 1; - } while (newFrame == _frameList[2]); - - _frameList[1] = newFrame; - _flags |= OBJFLAG_PANES; - } - } -} - -void Scene3700::Viewer::reposition() { - _bounds = Rect(123, 40, 285, 123); -} - -void Scene3700::Viewer::draw() { - Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1); - - for (int idx = 0; idx < 4; ++idx) { - Visage &v = (idx == 0) ? _images1 : _images2; - - GfxSurface img = v.getFrame(_frameList[idx]); - Rect destRect = img.getBounds(); - destRect.resize(img, (_position.x - _globals->_sceneOffset.x), - (_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]); - - destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left, - -_globals->_sceneManager._scene->_sceneBounds.top); - - _globals->gfxManager().copyFrom(img, destRect, priorityRegion); - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene3700::Action1::signal() { - Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_stripManager.start(2162, this); - break; - case 2: - scene->_viewer._active = false; - setDelay(90); - break; - case 3: - scene->_soundHandler.play(196); - scene->_viewer.hide(); - - scene->_hotspot1.postInit(); - scene->_hotspot1.setVisage(3710); - scene->_hotspot1.setStrip(1); - scene->_hotspot1.setFrame(1); - scene->_hotspot1.setPosition(Common::Point(204, 120)); - - setDelay(90); - break; - case 4: - scene->_soundHandler.play(197); - scene->_hotspot1.hide(); - - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(3710); - scene->_hotspot2.setStrip(2); - scene->_hotspot2.setFrame(1); - scene->_hotspot2.setPosition(Common::Point(204, 120)); - - setDelay(30); - break; - case 5: - scene->_soundHandler.play(198); - scene->_hotspot2.hide(); - scene->_hotspot1.show(); - setDelay(90); - break; - case 6: - scene->_stripManager.start(2166, this); - break; - case 7: - setDelay(60); - break; - case 8: - scene->_hotspot1.remove(); - scene->_hotspot2.show(); - _globals->setFlag(59); - setDelay(30); - break; - case 9: - _globals->_sceneManager.changeScene(2100); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene3700::postInit(tSage::SceneObjectList *OwnerList) { - Scene::postInit(); - loadScene(3700); - - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerMR); - _speakerSText.setTextPos(Common::Point(20, 15)); - _speakerMText.setTextPos(Common::Point(20, 15)); - - _viewer.postInit(); - _viewer.setVisage(3705); - _viewer.setStrip(1); - _viewer.setFrame(2); - _viewer.setPosition(Common::Point(195, 83)); - - setAction(&_action1); - _globals->_soundHandler.play(195); -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes4.h b/engines/tsage/ringworld_scenes4.h deleted file mode 100644 index 0b575d02d3..0000000000 --- a/engines/tsage/ringworld_scenes4.h +++ /dev/null @@ -1,92 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES4_H -#define TSAGE_RINGWORLD_SCENES4_H - -#include "common/scummsys.h" -#include "tsage/core.h" -#include "tsage/converse.h" -#include "tsage/ringworld_logic.h" - -namespace tSage { - -class Scene3500 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; -public: - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SpeakerQText _speakerQText; - Action1 _action1; - Action2 _action2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene3700 : public Scene { - /* Custom classes */ - class Viewer : public SceneObject { - public: - Visage _images1; - Visage _images2; - - int _frameList[4]; - int _percentList[4]; - bool _active; - int _countdownCtr; - - Viewer(); - virtual Common::String getClassName() { return "Viewer"; } - virtual void synchronize(Serializer &s); - virtual void dispatch(); - virtual void reposition(); - virtual void draw(); - }; - - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; -public: - Viewer _viewer; - Action1 _action1; - SceneObject _hotspot1, _hotspot2; - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SpeakerMR _speakerMR; - ASound _soundHandler; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp deleted file mode 100644 index fccc7e1b50..0000000000 --- a/engines/tsage/ringworld_scenes5.cpp +++ /dev/null @@ -1,4441 +0,0 @@ -/* 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. - * - */ - -#include "common/config-manager.h" -#include "tsage/ringworld_scenes5.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 4000 - Village - * - *--------------------------------------------------------------------------*/ - -void Scene4000::Action1::signal() { - // Quinn has the peg. Everybody enter the screen. - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_hotspot5.postInit(); - scene->_hotspot5.setVisage(2870); - scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); - scene->_hotspot5.animate(ANIM_MODE_1, NULL); - scene->_hotspot5.setPosition(Common::Point(116, 160)); - - Common::Point pt(208, 169); - NpcMover *mover = new NpcMover(); - scene->_hotspot5.addMover(mover, &pt, this); - - RING_INVENTORY._ale._sceneNumber = 0; - _globals->clearFlag(42); - _globals->clearFlag(36); - _globals->clearFlag(43); - _globals->clearFlag(37); - break; - } - case 1: { - scene->_guardRock.postInit(); - scene->_guardRock.setVisage(4001); - scene->_guardRock.animate(ANIM_MODE_1, NULL); - scene->_guardRock.setObjectWrapper(new SceneObjectWrapper()); - scene->_guardRock.setPosition(Common::Point(314, 132)); - scene->_guardRock._moveDiff = Common::Point(4, 2); - - ADD_PLAYER_MOVER_NULL(scene->_guardRock, 288, 167); - - scene->_olo.postInit(); - scene->_olo.setVisage(4006); - scene->_olo.animate(ANIM_MODE_1, NULL); - scene->_olo.setStrip(1); - scene->_olo.setPosition(Common::Point(207, 136)); - - ADD_PLAYER_MOVER_NULL(scene->_olo, 220, 151); - - scene->_miranda.postInit(); - scene->_miranda.setVisage(2701); - scene->_miranda.animate(ANIM_MODE_1, NULL); - scene->_miranda.setObjectWrapper(new SceneObjectWrapper()); - scene->_miranda._moveDiff = Common::Point(4, 2); - scene->_miranda.setPosition(Common::Point(300, 135)); - - ADD_PLAYER_MOVER_THIS(scene->_miranda, 266, 169); - - ADD_PLAYER_MOVER_NULL(_globals->_player, 241, 155); - break; - } - case 2: - scene->_stripManager.start(4400, this); - break; - case 3: { - Common::Point pt1(30, 86); - PlayerMover *mover1 = new PlayerMover(); - scene->_miranda.addMover(mover1, &pt1, this); - - ADD_PLAYER_MOVER_NULL(scene->_hotspot5, 3, 86); - break; - } - case 4: - ADD_MOVER(scene->_miranda, -30, 86); - ADD_MOVER_NULL(scene->_hotspot5, -40, 86); - break; - case 5: - _globals->_soundHandler.play(155); - _globals->setFlag(43); - _globals->setFlag(114); - scene->_stripManager.start(4430, this); - break; - case 6: - ADD_PLAYER_MOVER_THIS(scene->_olo, 277, 175); - ADD_PLAYER_MOVER_NULL(_globals->_player, 258, 187); - break; - case 7: - scene->_stripManager.start(4440, this); - break; - case 8: - setDelay(30); - break; - case 9: - _globals->setFlag(96); - _globals->_sceneManager.changeScene(4025); - break; - } -} - -void Scene4000::Action2::signal() { - // Quinn, Seeker and Miranda walks down to the village - // Then, they talk to Rock, and enter the priest hut - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); - - scene->_hotspot5.postInit(); - scene->_hotspot5.setVisage(2801); - scene->_hotspot5.animate(ANIM_MODE_1, NULL); - scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); - scene->_hotspot5._moveDiff.x = 5; - scene->_hotspot5.setPosition(Common::Point(-8, 88)); - - scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL); - scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); - break; - case 1: - _globals->_player.disableControl(); - - scene->_lander.remove(); - ADD_MOVER(scene->_guardRock, scene->_hotspot5._position.x + 30, scene->_hotspot5._position.y - 10); - break; - case 2: - _globals->_player.checkAngle(&scene->_guardRock); - scene->_hotspot5.checkAngle(&scene->_guardRock); - scene->_miranda.checkAngle(&scene->_guardRock); - scene->_stripManager.start(4000, this); - break; - case 3: - scene->_hotspot2.setVisage(4017); - scene->_hotspot2.animate(ANIM_MODE_1, NULL); - scene->_hotspot2.setStrip(2); - - ADD_MOVER(scene->_hotspot2, 116, 160); - ADD_MOVER(scene->_hotspot5, 116, 160); - - _globals->setFlag(37); - break; - case 4: - break; - case 5: - scene->_stripManager.start(4010, this); - break; - case 6: - ADD_PLAYER_MOVER_NULL(scene->_guardRock, 230, 149); - ADD_PLAYER_MOVER(210, 136); - ADD_PLAYER_MOVER_NULL(scene->_miranda, 210, 133); - break; - case 7: - _globals->_sceneManager.changeScene(4045); - break; - } -} - -void Scene4000::Action3::signal() { - // The guard walks to the left and exits the screen - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_hotspot8.setVisage(4017); - scene->_hotspot8.setFrame2(-1); - scene->_hotspot8.animate(ANIM_MODE_1, NULL); - scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper()); - ADD_MOVER(scene->_hotspot8, 118, 145); - break; - case 1: - scene->_hotspot8.remove(); - remove(); - break; - } -} - -void Scene4000::Action4::signal() { - // Quinn ties the rope to the rock - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player._uiEnabled = false; - ADD_MOVER(_globals->_player, 257, 57); - break; - case 1: - _globals->_player.setVisage(4008); - _globals->_player.setPosition(Common::Point(258, 83)); - _globals->_player._frame = 1; - _globals->_player._strip = 3; - _globals->_player.animate(ANIM_MODE_4, 2, 1, this); - break; - case 2: - scene->_rope.postInit(); - scene->_rope.setVisage(4000); - scene->_rope.setStrip(7); - scene->_rope.setFrame(3); - scene->_rope.setPosition(Common::Point(268, 44)); - - RING_INVENTORY._rope._sceneNumber = 4000; - _globals->_events.setCursor(CURSOR_USE); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player.setVisage(2602); - _globals->_player.setPosition(Common::Point(257, 57)); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._uiEnabled = true; - - _globals->setFlag(41); - remove(); - break; - } -} - -void Scene4000::Action5::signal() { - // Chat with Miranda - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(15); - break; - case 1: - scene->_stripManager.start(_globals->_stripNum, this); - break; - case 2: - setDelay(10); - break; - case 3: - scene->_hotspot8.setVisage(4017); - scene->_hotspot8.animate(ANIM_MODE_1, NULL); - scene->_hotspot8.setFrame2(-1); - scene->_hotspot8.setAction(&scene->_action3); - - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4000::Action6::signal() { - // Quinn and Miranda enter the screen and walk to the village. - // Rock comes and notices the alcohol. They all enter his hut. - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(30); - break; - case 1: - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); - - if (!_globals->getFlag(36)) - scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); - break; - case 2: - _globals->_player.disableControl(); - ADD_MOVER(scene->_guardRock, _globals->_player._position.x + 30, _globals->_player._position.y - 5); - break; - case 3: - scene->_stripManager.start(_globals->getFlag(35) ? 4500 : 4502, this); - break; - case 4: - _globals->clearFlag(35); - ADD_MOVER_NULL(scene->_guardRock, 292, 138); - ADD_PLAYER_MOVER(283, 147); - - if (!_globals->getFlag(36)) - ADD_PLAYER_MOVER_NULL(scene->_miranda, 280, 150); - RING_INVENTORY._ale._sceneNumber = 4100; - break; - case 5: - _globals->_sceneManager.changeScene(4100); - break; - } -} - -void Scene4000::Action7::signal() { - // Climb down left Chimney using a rope - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - - scene->_rope.setFrame(1); - ADD_MOVER(_globals->_player, 247, 53); - break; - case 1: - _globals->_player.setVisage(4008); - _globals->_player.setStrip(4); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(16); - _globals->_player.setPosition(Common::Point(260, 55)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_sceneManager.changeScene(4050); - break; - } -} - -void Scene4000::Action8::signal() { - // Climb down right Chimney using a rope - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - if (_globals->getFlag(41)) - scene->_rope.setFrame(2); - - ADD_MOVER(_globals->_player, 289, 53); - break; - case 1: - _globals->_player.setVisage(4008); - _globals->_player.setStrip(5); - _globals->_player.fixPriority(16); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(283, 52)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player.remove(); - setDelay(60); - break; - case 3: - _globals->_soundHandler.play(170); - scene->_smoke2.setVisage(4000); - scene->_smoke2.setStrip(6); - scene->_smoke2.animate(ANIM_MODE_2, NULL); - setDelay(60); - break; - case 4: - _globals->_soundHandler.play(77, this); - break; - case 5: - _globals->_game->endGame(4000, 15); - remove(); - break; - } -} - -void Scene4000::Action9::signal() { - // Villager animations - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 240); - break; - case 1: - static_cast(_owner)->animate(ANIM_MODE_8, 1, this); - _actionIndex = 0; - break; - } -} - -void Scene4000::Action10::signal() { - // Villager animations - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 240); - break; - case 1: - static_cast(_owner)->animate(ANIM_MODE_8, 1, this); - _actionIndex = 0; - break; - } -} - -void Scene4000::Action11::signal() { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_MOVER(scene->_lander, -30, 70); - break; - case 1: - setDelay(60); - break; - case 2: - scene->_hotspot5.postInit(); - scene->_hotspot5.setVisage(2801); - scene->_hotspot5.animate(ANIM_MODE_1, NULL); - scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper()); - scene->_hotspot5._moveDiff.x = 4; - scene->_hotspot5.setPosition(Common::Point(-8, 88)); - - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); - - scene->_miranda.setPosition(Common::Point(-210, 139)); - scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); - scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL); - break; - case 3: - scene->_stripManager.start(8000, this); - break; - case 4: - ADD_MOVER(scene->_olo, 263, 187); - scene->_olo.animate(ANIM_MODE_1, NULL); - break; - case 5: - scene->_soundHandler1.stop(); - scene->_forceField.remove(); - - ADD_MOVER(_globals->_player, 340, 163); - ADD_MOVER_NULL(scene->_miranda, 340, 169); - ADD_MOVER_NULL(scene->_hotspot5, 340, 165); - break; - case 6: - _globals->_sceneManager.changeScene(4250); - break; - } -} - -void Scene4000::Action12::signal() { - // Quinn enter Rock's hut - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(5); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(4015, this); - break; - case 2: - _globals->setFlag(32); - if (scene->_stripManager._field2E8 == 275) { - _globals->setFlag(82); - ADD_MOVER_NULL(scene->_guardRock, 292, 138); - ADD_PLAYER_MOVER(283, 147); - } else { - setDelay(30); - } - break; - case 3: - if (scene->_stripManager._field2E8 == 275) { - _globals->_sceneManager.changeScene(4100); - } else { - ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132); - } - break; - case 4: - scene->_guardRock.hide(); - scene->_stripManager.start(4020, this); - break; - case 5: - _globals->setFlag(35); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4000::Action13::signal() { - // Lander is landing - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - scene->_soundHandler2.play(151); - scene->_soundHandler2.holdAt(true); - ADD_MOVER(scene->_lander, -30, 70); - break; - case 2: - scene->_soundHandler2.release(); - _globals->_sceneManager.changeScene(4010); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4000::Miranda::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(4000, 31); - break; - case CURSOR_LOOK: - SceneItem::display2(4000, 29); - break; - case CURSOR_TALK: - if (_globals->getFlag(31)) { - if (!_globals->getFlag(111)) { - _globals->setFlag(111); - _globals->_stripNum = 4070; - } else if (!_globals->getFlag(33)) - _globals->_stripNum = 4094; - else if (!_globals->getFlag(112)) { - _globals->setFlag(112); - _globals->_stripNum = 4300; - } else if (!_globals->getFlag(113)) { - _globals->setFlag(113); - _globals->_stripNum = 4093; - } else - _globals->_stripNum = 4094; - } else { - if (!_globals->getFlag(33)) - _globals->_stripNum = 4094; - else if (!_globals->getFlag(112)) { - _globals->setFlag(112); - _globals->_stripNum = 4300; - } else - _globals->_stripNum = 4094; - } - - scene->setAction(&scene->_action5); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot8::doAction(int action) { - // Guard - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(4000, 26); - break; - case CURSOR_LOOK: - SceneItem::display2(4000, 25); - break; - case CURSOR_TALK: - if (RING_INVENTORY._peg._sceneNumber == 1) - SceneItem::display2(4000, 34); - else { - switch (_ctr) { - case 0: - _globals->_stripNum = 4090; - break; - case 1: - _globals->_stripNum = 4091; - break; - case 2: - _globals->_stripNum = 4092; - break; - default: - SceneItem::display2(4000, 34); - break; - } - - if (_globals->_stripNum) { - setAction(NULL); - addMover(NULL); - ++_ctr; - scene->setAction(&scene->_action5); - } - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::GuardRock::doAction(int action) { - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(4000, 28); - break; - case CURSOR_LOOK: - SceneItem::display2(4000, 27); - break; - case CURSOR_TALK: - error("*** Do we need dialog."); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Ladder::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 30); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - if (_globals->getFlag(40)) { - scene->_sceneMode = 4005; - scene->setAction(&scene->_sequenceManager1, scene, 4005, &_globals->_player, NULL); - } else { - scene->_sceneMode = 4004; - scene->setAction(&scene->_sequenceManager1, scene, 4004, &_globals->_player, &scene->_ladder, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::TheTech::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 13); - break; - case OBJECT_SCANNER: - SceneItem::display2(4000, 19); - break; - case OBJECT_STUNNER: - SceneItem::display2(4000, 20); - break; - case CURSOR_USE: - if (_globals->getFlag(40)) - SceneItem::display2(4000, 37); - else { - _globals->_player.disableControl(); - if (_globals->_sceneObjects->contains(&scene->_miranda)) - _globals->clearFlag(96); - - scene->_sceneMode = 4012; - scene->setAction(&scene->_sequenceManager1, scene, 4012, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot13::doAction(int action) { - // Rock between the two chimneys - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 21); - break; - case OBJECT_ROPE: - if (_globals->getFlag(40)) - scene->setAction(&scene->_action4); - else - SceneItem::display2(4000, 22); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot::doAction(int action) { - // Wall between the two doors - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 16); - break; - case OBJECT_SCANNER: - SceneItem::display2(4000, 17); - break; - case OBJECT_STUNNER: - SceneItem::display2(4000, 18); - break; - case OBJECT_LADDER: { - _globals->_player.disableControl(); - - scene->_ladder.postInit(); - scene->_ladder.setVisage(4000); - scene->_ladder.setStrip(5); - scene->_ladder.setPosition(Common::Point(245, 147)); - scene->_ladder.hide(); - _globals->_sceneItems.push_front(&scene->_ladder); - - if (_globals->_sceneObjects->contains(&scene->_hotspot8)) { - scene->_hotspot8.setAction(NULL); - Common::Point pt(118, 145); - NpcMover *mover = new NpcMover(); - scene->_hotspot18.addMover(mover, &pt, NULL); - } - - scene->_sceneMode = 4004; - scene->setAction(&scene->_sequenceManager1, scene, 4011, &_globals->_player, &scene->_ladder, NULL); - break; - } - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot17::doAction(int action) { - // Left Chimney - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 23); - break; - case CURSOR_USE: - if (_globals->getFlag(40)) - scene->setAction(&scene->_action7); - else - SceneItem::display2(4000, 24); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot18::doAction(int action) { - // Right Chimney - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, 36); - break; - case CURSOR_USE: - if (_globals->getFlag(40)) - scene->setAction(&scene->_action8); - else - SceneItem::display2(4000, 24); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4000::Hotspot23::doAction(int action) { - // Door of the temple - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4000::Scene4000() : - _forceField(0, CURSOR_LOOK, 4000, 14, CURSOR_USE, 4000, 32, OBJECT_STUNNER, 4000, 33, - OBJECT_SCANNER, 4000, 19, LIST_END), - _hotspot19(0, CURSOR_LOOK, 4000, 7, LIST_END), - _hotspot20(0, CURSOR_LOOK, 4000, 3, LIST_END), - _hotspot21(0, CURSOR_LOOK, 4000, 1, LIST_END), - _hotspot22(0, CURSOR_LOOK, 4000, 8, LIST_END), - _hotspot24(0, CURSOR_LOOK, 4000, 11, LIST_END), - _hotspot25(0, CURSOR_LOOK, 4000, 4, LIST_END), - _hotspot26(0, CURSOR_LOOK, 4000, 0, LIST_END) { -} - -void Scene4000::postInit(SceneObjectList *OwnerList) { - loadScene(4000); - Scene::postInit(); - setZoomPercents(0, 20, 70, 50); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerML); - _stripManager.addSpeaker(&_speakerMR); - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerCHFL); - _stripManager.addSpeaker(&_speakerPL); - _stripManager.addSpeaker(&_speakerPText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerCHFR); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerCHFText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerMText); - - _speakerCHFText._npc = &_guardRock; - _speakerSText._npc = &_hotspot5; - _speakerMText._npc = &_miranda; - _speakerPText._npc = &_olo; - _speakerQText._npc = &_globals->_player; - - _hotspot13.setBounds(Rect(263, 41, 278, 55)); - _hotspot14.setBounds(Rect(96 /*140*/, 177, 140 /*96*/, 204)); - _hotspot15.setBounds(Rect(227, 101, 264, 143)); - _hotspot16.setBounds(Rect(306, 100, 319, 148)); - _hotspot17.setBounds(Rect(231, 53, 254, 60)); - _hotspot18.setBounds(Rect(285, 51, 310, 60)); - _hotspot26.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot21.setBounds(Rect(28, 7, 53, 64)); - _hotspot22.setBounds(Rect(125, 155, 140, 189)); - _hotspot23.setBounds(Rect(205, 102, 220, 142)); - _hotspot24.setBounds(Rect(270, 111, 297, 147)); - - _hotspot19._sceneRegionId = 16; - _hotspot20._sceneRegionId = 18; - _hotspot25._sceneRegionId = 17; - - _smoke1.postInit(); - _smoke1.setVisage(4000); - _smoke1.fixPriority(1); - _smoke1.setFrame(2); - _smoke1.setPosition(Common::Point(242, 59)); - _smoke1.animate(ANIM_MODE_2, NULL); - - _smoke2.postInit(); - _smoke2.setVisage(4000); - _smoke2.setStrip(2); - _smoke2.fixPriority(1); - _smoke2.setFrame(2); - _smoke2.setPosition(Common::Point(299, 59)); - _smoke2.animate(ANIM_MODE_2, NULL); - - if (RING_INVENTORY._ladder._sceneNumber != 4000) { - // if ladder is not in the scene, activate the hotspot on the wall - _hotspot8.postInit(); - _hotspot8.setVisage(4018); - _hotspot8.setObjectWrapper(new SceneObjectWrapper()); - _hotspot8._strip = 2; - _hotspot8._numFrames = 5; - _hotspot8.setPosition(Common::Point(306, 154)); - _hotspot8.setAction(&_action9); - } - - _theTech.postInit(); - _theTech.setVisage(4000); - _theTech.setStrip(3); - _theTech.setFrame(3); - _theTech.fixPriority(200); - _theTech.setPosition(Common::Point(281, 176)); - - if (_globals->getFlag(34)) { - _soundHandler1.play(156); - - _forceField.postInit(); - _forceField.setVisage(4000); - _forceField.setStrip(4); - _forceField.setPosition(Common::Point(312, 174)); - _forceField.fixPriority(200); - _forceField.animate(ANIM_MODE_8, 0, NULL); - - _globals->_sceneItems.push_back(&_forceField); - } - - _globals->_player.postInit(); - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-28, 86)); - - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { - _miranda.postInit(); - _miranda.setVisage(2701); - _miranda.animate(ANIM_MODE_1, NULL); - _miranda.setObjectWrapper(new SceneObjectWrapper()); - _miranda._moveDiff = Common::Point(4, 2); - _miranda.setPosition(Common::Point(-210, 139)); - - _globals->_sceneItems.push_back(&_miranda); - } - - _globals->clearFlag(40); - - switch (_globals->_sceneManager._previousScene) { - case 2320: - _globals->_soundHandler.play(155); - - if (RING_INVENTORY._ale._sceneNumber == 1) { - _guardRock.postInit(); - _guardRock.setVisage(4001); - _guardRock.animate(ANIM_MODE_1, NULL); - _guardRock.setObjectWrapper(new SceneObjectWrapper()); - _guardRock.setPosition(Common::Point(314, 132)); - - setAction(&_action6); - } else { - _globals->_player.disableControl(); - _sceneMode = 4001; - setAction(&_sequenceManager1, this, 4001, &_globals->_player, NULL); - - if (!_globals->getFlag(36) && !_globals->getFlag(43)) - _miranda.setAction(&_sequenceManager2, NULL, 4002, &_miranda, NULL); - } - - if (_globals->getFlag(42)) - _hotspot8.setAction(&_action3); - else if (_globals->getFlag(91)) - _hotspot8.remove(); - break; - - case 4010: - _miranda.setPosition(Common::Point(-210, 139)); - - _guardRock.postInit(); - _guardRock.setVisage(4001); - _guardRock.animate(ANIM_MODE_1, NULL); - _guardRock.setObjectWrapper(new SceneObjectWrapper()); - _guardRock.setPosition(Common::Point(314, 132)); - - _hotspot2.postInit(); - _hotspot2.setVisage(4018); - _hotspot2._strip = 1; - _hotspot2._numFrames = 5; - _hotspot2.setPosition(Common::Point(182, 146)); - _hotspot2.setAction(&_action10); - - setAction(&_action2); - break; - - case 4025: - if (RING_INVENTORY._ladder._sceneNumber == 4000) - _hotspot8.remove(); - - _globals->_player.setPosition(Common::Point(260, 185)); - - if (!_globals->getFlag(36) && !_globals->getFlag(43)) - _miranda.setPosition(Common::Point(246, 146)); - - if (_globals->getFlag(96)) { - _olo.postInit(); - _olo.setVisage(4006); - _olo.animate(ANIM_MODE_1, NULL); - _olo.setObjectWrapper(new SceneObjectWrapper()); - _olo.setPosition(Common::Point(290, 163)); - } - - if (_globals->_stripNum == 4025) { - _soundHandler1.play(182); - _forceField.remove(); - - _hotspot5.postInit(); - _hotspot5.setVisage(2801); - _hotspot5.animate(ANIM_MODE_1, NULL); - _hotspot5.setObjectWrapper(new SceneObjectWrapper()); - _hotspot5._moveDiff.x = 4; - _hotspot5.setPosition(Common::Point(-18, 86)); - - _globals->_player.disableControl(); - - if (!_globals->getFlag(96)) { - _olo.postInit(); - _olo.setVisage(4006); - _olo.animate(ANIM_MODE_1, NULL); - _olo.setObjectWrapper(new SceneObjectWrapper()); - _olo.setPosition(Common::Point(195, 128)); - - Common::Point pt(268, 157); - PlayerMover *mover = new PlayerMover(); - _olo.addMover(mover, &pt, NULL); - } - - _sceneMode = 4003; - setAction(&_sequenceManager1, this, 4003, &_hotspot5, NULL); - } else if (_globals->getFlag(96)) { - _globals->_player.disableControl(); - _sceneMode = 4013; - setAction(&_sequenceManager1, this, 4013, &_olo, NULL); - } - - _globals->clearFlag(96); - break; - - case 4045: - _globals->_player.enableControl(); - - if (RING_INVENTORY._ladder._sceneNumber != 4000) { - _hotspot8.setVisage(4017); - _hotspot8.animate(ANIM_MODE_1, NULL); - _hotspot8.setPosition(Common::Point(199, 188)); - _hotspot8.setAction(&_action3); - } - - _globals->_player.setPosition(Common::Point(208, 153)); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) - _miranda.setPosition(Common::Point(246, 146)); - - if (_globals->getFlag(39)) { - // Ollo follows Quinn and gives explanations on the Tech. - _globals->clearFlag(39); - - _olo.postInit(); - _olo.setVisage(4006); - _olo.animate(ANIM_MODE_1, NULL); - _olo.setObjectWrapper(new SceneObjectWrapper()); - _olo.setPosition(Common::Point(219, 150)); - - _sceneMode = 4010; - _globals->_player.disableControl(); - // This is the buggy animation where Miranda comments the Tech even - // if she's not in the room but in the lander. - setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL); - } - - if (_globals->_stripNum == 4000) { - _globals->_stripNum = 0; - - _guardRock.postInit(); - _guardRock.setVisage(4001); - _guardRock.animate(ANIM_MODE_1, NULL); - _guardRock.setObjectWrapper(new SceneObjectWrapper()); - _guardRock.setPosition(Common::Point(231, 159)); - _guardRock.setStrip(4); - - setAction(&_action12); - } - break; - - case 4050: - _globals->_soundHandler.play(155); - _globals->_player.disableControl(); - - if (_globals->_stripNum == 4050) { - _globals->_player.setVisage(4008); - _globals->_player.setStrip(4); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.fixPriority(16); - _globals->_player.setPosition(Common::Point(260, 55)); - - _sceneMode = 4007; - setAction(&_sequenceManager1, this, 4007, &_globals->_player, NULL); - } else { - _globals->_player.setPosition(Common::Point(208, 153)); - _globals->_player.enableControl(); - } - - if (RING_INVENTORY._ladder._sceneNumber != 4000) - _hotspot8.remove(); - break; - - case 4100: - _globals->_player.enableControl(); - _globals->_player.setPosition(Common::Point(270, 155)); - - if (_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) { - _hotspot8.setVisage(4017); - _hotspot8.animate(ANIM_MODE_1, NULL); - _hotspot8.setPosition(Common::Point(244, 151)); - _hotspot8.setAction(&_action3); - } - - if (!_globals->getFlag(36) && !_globals->getFlag(43)) - _miranda.setPosition(Common::Point(246, 146)); - break; - - default: - _globals->_soundHandler.play(155); - - _lander.postInit(); - _lander.setVisage(4002); - _lander._moveDiff = Common::Point(10, 10); - _lander.setPosition(Common::Point(-100, 80)); - _lander.changeZoom(-1); - _lander.setPosition(Common::Point(130, -1)); - _lander.animate(ANIM_MODE_2, NULL); - - if (_globals->_stripNum == 9000) { - _olo.postInit(); - _olo.setVisage(4006); - _olo.setPosition(Common::Point(235, 153)); - - _guardRock.postInit(); - _guardRock.setVisage(4001); - _guardRock.setStrip(3); - _guardRock.setPosition(Common::Point(255, 153)); - - setAction(&_action11); - RING_INVENTORY._ladder._sceneNumber = 4100; - RING_INVENTORY._rope._sceneNumber = 4150; - - _soundHandler1.play(156); - - _forceField.postInit(); - _forceField.setVisage(4000); - _forceField.setStrip(4); - _forceField.setPosition(Common::Point(312, 174)); - _forceField.fixPriority(200); - _forceField.animate(ANIM_MODE_8, 0, NULL); - } else { - if (!_globals->getFlag(37)) { - _hotspot2.postInit(); - _hotspot2.setVisage(4018); - _hotspot2._strip = 1; - _hotspot2._numFrames = 5; - _hotspot2.setPosition(Common::Point(182, 146)); - _hotspot2.setAction(&_action10); - } - _miranda.setPosition(Common::Point(-210, 139)); - setAction(&_action13); - } - - break; - } - - if (RING_INVENTORY._ladder._sceneNumber == 4000) { - _ladder.postInit(); - _ladder.setVisage(4000); - _ladder.setStrip(5); - _ladder.setPosition(Common::Point(245, 147)); - - _globals->_sceneItems.push_back(&_ladder); - } - - if (RING_INVENTORY._rope._sceneNumber == 4000) { - _rope.postInit(); - _rope.setVisage(4000); - _rope.setStrip(7); - _rope.fixPriority(1); - _rope.setPosition(Common::Point(268, 44)); - } - - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15, - &_hotspot16, &_theTech, &_hotspot13, &_hotspot21, &_hotspot20, &_hotspot22, &_hotspot23, - &_hotspot24, &_hotspot25, &_hotspot19, &_hotspot26, NULL); -} - -void Scene4000::signal() { - switch (_sceneMode) { - case 4010: - _globals->setFlag(38); - _olo.remove(); - // Deliberate fall-through - case 4001: - _globals->_player.enableControl(); - break; - case 4002: - case 4011: - break; - case 4003: - _sceneMode = 4014; - setAction(&_sequenceManager1, this, 4014, &_globals->_player, &_hotspot5, NULL); - break; - case 4004: - RING_INVENTORY._ladder._sceneNumber = 4000; - // Deliberate fall-through - case 4007: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - _globals->setFlag(40); - break; - case 4005: - _globals->_player.enableControl(); - _globals->_events.setCursor(CURSOR_WALK); - _globals->clearFlag(40); - break; - case 4006: - _globals->_sceneManager.changeScene(4045); - break; - case 4008: - _globals->_sceneManager.changeScene(2320); - break; - case 4009: - _globals->_sceneManager.changeScene(2200); - break; - case 4012: - _globals->_player.checkAngle(&_theTech); - _globals->_sceneManager.changeScene(4025); - break; - case 4013: - _globals->_player.enableControl(); - _olo.remove(); - break; - case 4014: - _globals->_sceneManager.changeScene(4250); - break; - case 4015: - ADD_MOVER_NULL(_miranda, 0, _miranda._position.y - 5); - break; - } -} - -void Scene4000::dispatch() { - Scene::dispatch(); - - if ((_globals->_player.getRegionIndex() == 10) || (_globals->_player.getRegionIndex() == 6)) - _globals->_player.fixPriority(200); - if (_globals->_player.getRegionIndex() == 11) - _globals->_player.fixPriority(-1); - if (_globals->_player.getRegionIndex() == 5) - _globals->_player.fixPriority(94); - - if (_globals->_sceneObjects->contains(&_hotspot5)) { - if ((_hotspot5.getRegionIndex() == 10) || (_hotspot5.getRegionIndex() == 6)) - _hotspot5.fixPriority(200); - if (_hotspot5.getRegionIndex() == 11) - _hotspot5.fixPriority(-1); - if (_hotspot5.getRegionIndex() == 5) - _hotspot5.fixPriority(94); - } - - if (_globals->_sceneObjects->contains(&_miranda)) { - if (!_miranda._mover) - _miranda.checkAngle(&_globals->_player); - if (!_action && _globals->_player.getRegionIndex() == 23) { - ADD_MOVER_NULL(_miranda, 204, 186); - } - - if ((_miranda.getRegionIndex() == 10) || (_miranda.getRegionIndex() == 6)) - _miranda.fixPriority(200); - if (_miranda.getRegionIndex() == 11) - _miranda.fixPriority(-1); - if (_miranda.getRegionIndex() == 5) - _miranda.fixPriority(94); - } - - if (!_action) { - if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) && - _globals->getFlag(37) && !_globals->getFlag(40)) { - _globals->_player.disableControl(); - _soundHandler1.play(177); - _globals->_soundHandler.play(178); - - setAction(&_action1); - } - - if (_globals->_player.getRegionIndex() == 2) - _globals->_sceneManager.changeScene(4045); - if (_globals->_player.getRegionIndex() == 15) - _globals->_sceneManager.changeScene(4100); - - if ((_globals->_player._position.x <= 5) && (_globals->_player._position.y < 100)) { - _globals->_player.disableControl(); - - if (!_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) { - _sceneMode = 4008; - setAction(&_sequenceManager1, this, 4008, &_globals->_player, NULL); - } else { - _sceneMode = 4015; - _globals->_player.addMover(NULL); - setAction(&_sequenceManager1, this, 4015, &_globals->_player, &_miranda, NULL); - } - } - } -} - -/*-------------------------------------------------------------------------- - * Scene 4010 - Village - Outside Lander - * - *--------------------------------------------------------------------------*/ - -void Scene4010::postInit(SceneObjectList *OwnerList) { - loadScene(4010); - Scene::postInit(); - setZoomPercents(0, 20, 70, 50); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerMText); - _speakerSText._npc = &_hotspot1; - _speakerMText._npc = &_hotspot2; - _speakerQText._npc = &_globals->_player; - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-38, 175)); - _globals->_player.changeZoom(75); - - _hotspot2.postInit(); - _hotspot2.setVisage(2705); - _hotspot2.animate(ANIM_MODE_1, NULL); - _hotspot2.setObjectWrapper(new SceneObjectWrapper()); - _hotspot2._moveDiff = Common::Point(4, 2); - _hotspot2.setPosition(Common::Point(-50, 185)); - _hotspot2.changeZoom(75); - - _hotspot1.postInit(); - _hotspot1.setVisage(2806); - _hotspot1.setPosition(Common::Point(-20, 175)); - _hotspot1.changeZoom(75); - _hotspot1.animate(ANIM_MODE_1, NULL); - _hotspot1.setObjectWrapper(new SceneObjectWrapper()); - - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, 4017, &_globals->_player, &_hotspot1, &_hotspot2, NULL); -} - -void Scene4010::signal() { - _globals->_sceneManager.changeScene(4000); -} - -/*-------------------------------------------------------------------------- - * Scene 4025 - Village - Puzzle Board - * - *--------------------------------------------------------------------------*/ - -void Scene4025::Action1::signal() { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_armHotspot._strip = scene->_pegPtr->_armStrip; - scene->_armHotspot._frame = 4; - scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this); - - if (scene->_pegPtr->_armStrip > 3) { - if (scene->_hole1._armStrip == scene->_pegPtr->_armStrip) - scene->_hole1._pegPtr = NULL; - if (scene->_hole2._armStrip == scene->_pegPtr->_armStrip) - scene->_hole2._pegPtr = NULL; - if (scene->_hole3._armStrip == scene->_pegPtr->_armStrip) - scene->_hole3._pegPtr = NULL; - if (scene->_hole4._armStrip == scene->_pegPtr->_armStrip) - scene->_hole4._pegPtr = NULL; - if (scene->_hole5._armStrip == scene->_pegPtr->_armStrip) - scene->_hole5._pegPtr = NULL; - } - break; - case 1: - scene->_pegPtr->hide(); - - if (scene->_pegPtr2) { - if (scene->_pegPtr->_armStrip == 3) - scene->_pegPtr2->_strip = 2; - - scene->_pegPtr2->setPosition(scene->_pegPtr->_position); - scene->_pegPtr2->show(); - scene->_pegPtr2->_armStrip = scene->_pegPtr->_armStrip; - } - - scene->_pegPtr->_armStrip = 0; - scene->_pegPtr->setPosition(Common::Point(-10, -10)); - scene->_pegPtr2 = scene->_pegPtr; - scene->_armHotspot.animate(ANIM_MODE_5, this); - break; - - case 2: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - remove(); - break; - } -} - -void Scene4025::Action2::signal() { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_armHotspot._strip = scene->_holePtr->_armStrip; - scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this); - break; - case 1: - if (!scene->_pegPtr2) { - // Getting a peg from a hole - scene->_holePtr->_pegPtr->hide(); - scene->_pegPtr = scene->_holePtr->_pegPtr; - scene->_pegPtr->_armStrip = 0; - scene->_pegPtr->setPosition(Common::Point(-10, -10)); - scene->_pegPtr2 = scene->_holePtr->_pegPtr; - scene->_holePtr->_pegPtr = NULL; - } else { - // Placing a peg into a hole - scene->_pegPtr2 = NULL; - if (scene->_holePtr->_pegPtr) { - scene->_holePtr->_pegPtr->hide(); - scene->_pegPtr2 = scene->_holePtr->_pegPtr; - } - - assert(scene->_pegPtr); - scene->_pegPtr->setPosition(scene->_holePtr->_newPosition); - scene->_pegPtr->setStrip(1); - scene->_pegPtr->show(); - scene->_pegPtr->_armStrip = scene->_holePtr->_armStrip; - - scene->_holePtr->_pegPtr = scene->_pegPtr; - scene->_pegPtr = scene->_pegPtr2; - } - scene->_armHotspot.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - remove(); - break; - } -} - -void Scene4025::Action3::signal() { - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - _globals->_scenePalette.addRotation(64, 111, -1); - setDelay(120); - break; - case 1: - _globals->clearFlag(34); - _globals->_stripNum = 4025; - _globals->_sceneManager.changeScene(4000); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4025::Hole::synchronize(Serializer &s) { - SceneObject::synchronize(s); - SYNC_POINTER(_pegPtr); - s.syncAsSint16LE(_armStrip); - s.syncAsSint16LE(_newPosition.x); - s.syncAsSint16LE(_newPosition.y); -} - -void Scene4025::Hole::doAction(int action) { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4025, 3); - break; - case CURSOR_USE: - if (!scene->_pegPtr && !_pegPtr) { - setAction(&scene->_sequenceManager, scene, 4028, NULL); - } else { - _globals->_player.disableControl(); - scene->_holePtr = this; - scene->setAction(&scene->_action2); - } - break; - case OBJECT_PEG: - if (!scene->_pegPtr2) { - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_USE); - RING_INVENTORY._peg._sceneNumber = 4025; - - scene->_pegPtr = &scene->_peg5; - scene->_holePtr = this; - scene->_pegPtr->_armStrip = 0; - scene->_pegPtr2 = scene->_pegPtr; - - scene->setAction(&scene->_action2); - } else { - scene->_sceneMode = 4027; - scene->setAction(&scene->_sequenceManager, scene, 4027, NULL); - } - break; - } -} - -void Scene4025::Peg::synchronize(Serializer &s) { - SceneObject::synchronize(s); - s.syncAsSint16LE(_field88); - s.syncAsSint16LE(_armStrip); -} - -void Scene4025::Peg::doAction(int action) { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4025, 1); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_pegPtr = this; - scene->setAction(&scene->_action1); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4025::Scene4025() : Scene() { - _holePtr = NULL; - _pegPtr = _pegPtr2 = NULL; -} - -void Scene4025::postInit(SceneObjectList *OwnerList) { - loadScene(4025); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _globals->_events.setCursor(CURSOR_USE); - _pegPtr = _pegPtr2 = NULL; - - _peg1.postInit(); - _peg1._field88 = 1; - _peg1.setVisage(4025); - _peg1.setStrip(2); - _peg1.setFrame(1); - _peg1.setPosition(Common::Point(203, 61)); - - _peg2.postInit(); - _peg2._field88 = 4; - _peg2.setVisage(4025); - _peg2.setStrip(2); - _peg2.setFrame(2); - _peg2.setPosition(Common::Point(195, 57)); - - _peg3.postInit(); - _peg3._field88 = 0; - _peg3.setVisage(4025); - _peg3.setStrip(2); - _peg3.setFrame(3); - _peg3.setPosition(Common::Point(202, 66)); - - _peg4.postInit(); - _peg4._field88 = 3; - _peg4.setVisage(4025); - _peg4.setStrip(2); - _peg4.setFrame(4); - _peg4.setPosition(Common::Point(194, 68)); - - _peg5.postInit(); - _peg5._field88 = 2; - _peg5.setVisage(4025); - _peg5.setStrip(1); - _peg5.setFrame(5); - _peg5.hide(); - - // Hole N-W - _hole1.postInit(); - _hole1.setVisage(4025); - _hole1.setStrip(1); - _hole1.setFrame2(6); - _hole1.setPosition(Common::Point(123, 51)); - _hole1._pegPtr = NULL; - _hole1._newPosition = Common::Point(123, 44); - _hole1._armStrip = 8; - - // Hole N-E - _hole2.postInit(); - _hole2.setVisage(4025); - _hole2.setStrip(1); - _hole2.setFrame2(7); - _hole2.setPosition(Common::Point(167, 51)); - _hole2._pegPtr = NULL; - _hole2._newPosition = Common::Point(166, 44); - _hole2._armStrip = 7; - - // Hole Center - _hole3.postInit(); - _hole3.setVisage(4025); - _hole3.setStrip(1); - _hole3.setFrame2(8); - _hole3.setPosition(Common::Point(145, 69)); - _hole3._pegPtr = NULL; - _hole3._newPosition = Common::Point(145, 60); - _hole3._armStrip = 6; - - // Hole S-W - _hole4.postInit(); - _hole4.setVisage(4025); - _hole4.setStrip(1); - _hole4.setFrame2(9); - _hole4.setPosition(Common::Point(123, 87)); - _hole4._pegPtr = NULL; - _hole4._newPosition = Common::Point(123, 80); - _hole4._armStrip = 5; - - // Hole S-E - _hole5.postInit(); - _hole5.setVisage(4025); - _hole5.setStrip(1); - _hole5.setFrame2(10); - _hole5.setPosition(Common::Point(167, 87)); - _hole5._pegPtr = NULL; - _hole5._newPosition = Common::Point(166, 80); - _hole5._armStrip = 4; - - _hole1.fixPriority(1); - _hole2.fixPriority(1); - _hole3.fixPriority(1); - _hole4.fixPriority(1); - _hole5.fixPriority(1); - - _armHotspot.postInit(); - _armHotspot.setVisage(4025); - _armHotspot.setPosition(Common::Point(190, 161)); - _armHotspot.setStrip(3); - _armHotspot.setFrame(4); - - _globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5, - &_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL); - - _globals->_player._uiEnabled = true; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, 4026, NULL); -} - -void Scene4025::synchronize(Serializer &s) { - Scene::synchronize(s); - SYNC_POINTER(_pegPtr); - SYNC_POINTER(_pegPtr2); - SYNC_POINTER(_holePtr); -} - -void Scene4025::remove() { - _globals->_scenePalette.clearListeners(); - Scene::remove(); -} - -void Scene4025::signal() { - if (_sceneMode != 4027) { - if (_sceneMode != 4028) { - _gfxButton.setText(EXIT_MSG); - _gfxButton._bounds.center(144, 107); - _gfxButton.draw(); - _gfxButton._bounds.expandPanes(); - } - - _globals->_player._uiEnabled = true; - } - - _globals->_events.setCursor(CURSOR_USE); -} - -void Scene4025::process(Event &event) { - Scene::process(event); - - if (_gfxButton.process(event)) { - if (RING_INVENTORY._peg._sceneNumber == 4025) - RING_INVENTORY._peg._sceneNumber = 1; - - _globals->_sceneManager.changeScene(4000); - } -} - -void Scene4025::dispatch() { - if (!_action && (_peg1._armStrip == 7) && (_peg2._armStrip == 4) && (_peg3._armStrip == 8) && - (_peg4._armStrip == 5) && (_peg5._armStrip == 6)) - setAction(&_action3); - - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 4045 - Village - Temple Antechamber - * - *--------------------------------------------------------------------------*/ - -void Scene4045::Action1::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(60); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(4040, this, scene); - break; - case 2: - scene->_olloFace.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot4.animate(ANIM_MODE_5, this); - break; - case 3: - setDelay(60); - break; - case 4: - scene->_hotspot4.animate(ANIM_MODE_6, this); - break; - case 5: - ADD_MOVER(_globals->_player, 150, 300); - break; - case 6: - _globals->_stripNum = 4000; - _globals->_sceneManager.changeScene(4000); - remove(); - break; - } -} - -void Scene4045::Action2::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(15); - break; - case 1: - scene->_stripManager.start(_globals->_stripNum, this, scene); - break; - case 2: - scene->_olloFace.animate(ANIM_MODE_NONE, NULL); - setDelay(10); - break; - case 3: - if (_globals->getFlag(38)) { - _globals->_player.enableControl(); - remove(); - } else { - ADD_MOVER(_globals->_player, 150, 300); - } - break; - case 4: - _globals->setFlag(39); - _globals->_sceneManager.changeScene(4000); - break; - } -} - -void Scene4045::Action3::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - scene->_hotspot4.animate(ANIM_MODE_5, this); - break; - case 1: - scene->_stripManager.start(4504, this, scene); - break; - case 2: - scene->_hotspot4.animate(ANIM_MODE_6, NULL); - scene->_olloFace.animate(ANIM_MODE_NONE, NULL); - ADD_MOVER(_globals->_player, 91, 1264); - break; - case 3: - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4045::OlloStand::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(4045, 19); - break; - case CURSOR_LOOK: - SceneItem::display2(4045, (_strip == 1) ? 5 : 14); - break; - case CURSOR_USE: - SceneItem::display2(4045, 18); - break; - case CURSOR_TALK: - if (_strip == 5) { - setStrip(6); - animate(ANIM_MODE_NONE, NULL); - } - if (_globals->_player._position.y < 135) { - scene->_sceneMode = 4046; - _numFrames = 10; - _globals->_player.disableControl(); - - scene->setAction(&scene->_sequenceManager, this, 4046, &_globals->_player, this, NULL); - } else { - if (!_globals->getFlag(31)) { - _globals->setFlag(31); - _globals->_stripNum = 4080; - } else if (!_globals->getFlag(38)) - _globals->_stripNum = 4060; - else - _globals->_stripNum = 4503; - - scene->setAction(&scene->_action2); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4045::Miranda::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4045, 9); - break; - case CURSOR_TALK: - scene->_sceneMode = 4102; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager, scene, 4104, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4045::Necklace::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4045, 17); - break; - case CURSOR_USE: - if (_globals->_player._position.y < 135) { - SceneItem::display2(4045, 16); - RING_INVENTORY._peg._sceneNumber = 1; - _globals->_events.setCursor(CURSOR_WALK); - remove(); - } else { - scene->_sceneMode = 4047; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager, scene, 4047, &_globals->_player, &scene->_olloStand, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4045::Scene4045() : - _flame(0, CURSOR_LOOK, 4045, 1, CURSOR_USE, 4100, 21, LIST_END), - _hotspot7(9, CURSOR_LOOK, 4045, 0, CURSOR_USE, 4045, 15, LIST_END), - _hotspot8(10, CURSOR_LOOK, 4045, 2, LIST_END), - _hotspot9(11, CURSOR_LOOK, 4045, 3, CURSOR_USE, 4045, 15, LIST_END), - _hotspot10(12, CURSOR_LOOK, 4045, 4, CURSOR_USE, 4100, 19, LIST_END), - _hotspot11(13, CURSOR_LOOK, 4045, 6, CURSOR_USE, 4045, 15, LIST_END), - _hotspot12(14, CURSOR_LOOK, 4045, 7, CURSOR_USE, 4150, 29, LIST_END), - _hotspot13(15, CURSOR_LOOK, 4045, 8, CURSOR_USE, 4100, 19, LIST_END), - _hotspot14(0, CURSOR_LOOK, 4045, 10, LIST_END) { - - _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); -} - -void Scene4045::postInit(SceneObjectList *OwnerList) { - loadScene(4045); - Scene::postInit(); - setZoomPercents(100, 60, 200, 100); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerML); - _stripManager.addSpeaker(&_speakerPR); - _stripManager.addSpeaker(&_speakerPText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.setCallback(this); - - _speakerQText._textPos.y = 140; - - _flame.postInit(); - _flame.setVisage(4045); - _flame.setPosition(Common::Point(47, 111)); - _flame.animate(ANIM_MODE_2, NULL); - _flame.fixPriority(156); - _globals->_sceneItems.push_back(&_flame); - - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(7, 4); - - _olloStand.postInit(); - _olloStand.setVisage(4051); - - _olloFace.postInit(); - _olloFace.setVisage(4051); - _olloFace.setStrip(4); - _olloFace.fixPriority(152); - - if(_globals->_sceneManager._previousScene == 4050) { - _globals->_soundHandler.play(155); - _globals->_player.setPosition(Common::Point(72, 128)); - _globals->_player.enableControl(); - - _olloStand.setStrip(5); - _olloStand.setPosition(Common::Point(173, 99)); - _olloStand._numFrames = 1; - _olloStand.animate(ANIM_MODE_2, NULL); - - _olloFace.setPosition(Common::Point(177, 40)); - - if (RING_INVENTORY._peg._sceneNumber == 4045) { - _necklace.postInit(); - _necklace.setVisage(4045); - _necklace.setStrip(2); - _necklace.setPosition(Common::Point(108, 82)); - _globals->_sceneItems.push_back(&_necklace); - } - } else { - _globals->_player.setPosition(Common::Point(108, 192)); - _globals->_player.setStrip(4); - - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { - _miranda.postInit(); - _miranda.setVisage(4102); - _miranda.animate(ANIM_MODE_NONE, NULL); - _miranda.setStrip(3); - _miranda.setFrame(2); - _miranda.changeZoom(-1); - - _miranda.setPosition(Common::Point(66, 209)); - _globals->_sceneItems.push_back(&_miranda); - } - - if (_globals->getFlag(31)) { - // Olo asleep - _olloStand.setVisage(4051); - _olloStand.setStrip(5); - _olloStand.setPosition(Common::Point(173, 99)); - _olloStand._numFrames = 1; - _olloStand.animate(ANIM_MODE_2, NULL); - - _olloFace.setPosition(Common::Point(177, 40)); - - if (RING_INVENTORY._peg._sceneNumber == 4045) { - _necklace.postInit(); - _necklace.setVisage(4045); - _necklace.setStrip(2); - _necklace.setPosition(Common::Point(108, 82)); - _globals->_sceneItems.push_back(&_necklace); - } - } else { - _olloStand.setPosition(Common::Point(186, 149)); - - _hotspot4.postInit(); - _hotspot4.setVisage(4051); - _hotspot4.setStrip(2); - _hotspot4.fixPriority(152); - _hotspot4.setPosition(Common::Point(202, 80)); - - _olloFace.setPosition(Common::Point(192, 77)); - _globals->setFlag(31); - setAction(&_action1); - - _globals->_player.disableControl(); - } - } - - _globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10, - &_hotspot13, &_hotspot11, &_hotspot12, &_hotspot14, NULL); -} - -void Scene4045::stripCallback(int v) { - switch (v) { - case 1: - _olloFace.animate(ANIM_MODE_7, 0, NULL); - break; - case 2: - _olloFace.animate(ANIM_MODE_NONE, NULL); - break; - } -} - -void Scene4045::signal() { - switch (_sceneMode) { - case 4046: - case 4047: - _olloFace.animate(ANIM_MODE_NONE, NULL); - break; - case 4050: - _globals->_sceneManager.changeScene(4000); - break; - case 4102: - _globals->_player.enableControl(); - break; - } -} - -void Scene4045::dispatch() { - if (!_action) { - if (_globals->_player.getRegionIndex() == 8) { - _globals->_player.addMover(NULL); - if (_olloStand._strip != 1) { - _globals->_player.disableControl(); - _sceneMode = 4046; - _olloStand._numFrames = 10; - setAction(&_sequenceManager, this, 4046, &_globals->_player, &_olloStand, NULL); - } else { - setAction(&_action3); - } - } - - if (_globals->_player.getRegionIndex() == 10) - _globals->_sceneManager.changeScene(4050); - if (_globals->_player._position.y >= 196) { - _sceneMode = 4050; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); - } - } - - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 4050 - Village - Outside - * - *--------------------------------------------------------------------------*/ - -void Scene4050::Action1::signal() { - // "Map" on the wall - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: { - Common::Point pt(204, 152); - PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_player.checkAngle(&scene->_hotspot17); - - scene->_hotspot14.postInit(); - scene->_hotspot14.setVisage(4050); - scene->_hotspot14.setStrip(2); - scene->_hotspot14.setPosition(Common::Point(91, 154)); - scene->_hotspot14.fixPriority(200); - setDelay(10); - break; - case 3: - _globals->_events.waitForPress(); - _globals->setFlag(45); - scene->_hotspot14.remove(); - - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4050::Action2::signal() { - // Climb down the rope - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(120); - break; - case 1: - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player.setVisage(4202); - _globals->_player.changeZoom(100); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(192, 130)); - - ADD_MOVER(_globals->_player, 215, 130); - break; - case 3: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(236, 130)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 4: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setPosition(Common::Point(210, 185)); - _globals->_player.fixPriority(-1); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4050::Action3::signal() { - // Climb up the rope - switch (_actionIndex++) { - case 0: - ADD_PLAYER_MOVER(210, 185); - break; - case 1: - _globals->_player.fixPriority(200); - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.changeZoom(100); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.setPosition(Common::Point(236, 130)); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 2: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(215, 130)); - ADD_MOVER(_globals->_player, 212, 130); - break; - case 3: - _globals->_stripNum = 4050; - _globals->_sceneManager.changeScene(4000); - break; - } -} - -void Scene4050::Action4::signal() { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_MOVER(_globals->_player, 189, 135); - _globals->_player.fixPriority(200); - break; - case 1: - _globals->_player._moveDiff.y = 3; - _globals->_player.setStrip2(3); - _globals->_player._frame = 1; - _globals->_player.setPosition(Common::Point(189, 129)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(192, 130)); - _globals->_player.changeZoom(100); - ADD_MOVER(_globals->_player, 215, 130); - - scene->_hotspot16.postInit(); - scene->_hotspot16.setVisage(4052); - scene->_hotspot16.animate(ANIM_MODE_1, NULL); - scene->_hotspot16.setStrip2(6); - scene->_hotspot16.setPosition(Common::Point(160, 240)); - ADD_MOVER(scene->_hotspot16, 172, 188); - break; - case 3: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(238, 130)); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 4: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(216, 184)); - _globals->_player.fixPriority(-1); - break; - case 5: - scene->_hotspot16.setStrip2(4); - scene->_hotspot16.setFrame(1); - scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);; - break; - case 6: - scene->_hotspot16.animate(ANIM_MODE_5, NULL); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 7: - _globals->_player.setVisage(4202); - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); - - scene->_stripManager.start(4051, this); - break; - case 8: - setDelay(15); - break; - case 9: - _globals->_sceneManager.changeScene(4000); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4050::Hotspot15::doAction(int action) { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4050, 14); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4050::Hotspot17::doAction(int action) { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - scene->setAction(&scene->_action1); - break; - case CURSOR_USE: - SceneItem::display2(4050, 24); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4050::Scene4050() : - _hotspot1(0, CURSOR_LOOK, 4050, 0, LIST_END), - _hotspot2(0, CURSOR_LOOK, 4050, 1, CURSOR_USE, 4050, 15, LIST_END), - _hotspot3(0, CURSOR_LOOK, 4050, 2, CURSOR_USE, 4050, 16, LIST_END), - _hotspot4(0, CURSOR_LOOK, 4050, 4, LIST_END), - _hotspot5(0, CURSOR_LOOK, 4050, 5, LIST_END), - _hotspot6(0, CURSOR_LOOK, 4050, 5, LIST_END), - _hotspot7(0, CURSOR_LOOK, 4050, 6, CURSOR_USE, 4050, 18, LIST_END), - _hotspot8(0, CURSOR_LOOK, 4050, 7, CURSOR_USE, 4050, 19, LIST_END), - _hotspot9(0, CURSOR_LOOK, 4050, 8, CURSOR_USE, 4050, 20, LIST_END), - _hotspot10(0, CURSOR_LOOK, 4050, 9, CURSOR_USE, 4050, 21, LIST_END), - _hotspot11(0, CURSOR_LOOK, 4050, 10, CURSOR_USE, 4050, 22, LIST_END), - _hotspot12(0, CURSOR_LOOK, 4050, 11, CURSOR_USE, 4050, 23, LIST_END), - _hotspot13(0, CURSOR_LOOK, 4050, 3, CURSOR_USE, 4050, 17, LIST_END) { -} - -void Scene4050::postInit(SceneObjectList *OwnerList) { - loadScene(4050); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerPText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerGameText); - - _globals->_player.postInit(); - - switch (_globals->_sceneManager._previousScene) { - case 4000: - if (_globals->getFlag(41)) { - // Using a rope - _hotspot15.postInit(); - _hotspot15.setVisage(4054); - _hotspot15.setPosition(Common::Point(206, 103)); - _globals->_sceneItems.push_back(&_hotspot15); - - _globals->_player.setVisage(4008); - _globals->_player.setPosition(Common::Point(206, 62)); - _globals->_player.changeZoom(130); - _globals->_player.fixPriority(200); - _globals->_player.setStrip(2); - - setAction(&_action2); - _globals->_soundHandler.play(175); - } else { - // Without the rope - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(189, 83)); - _globals->_player.changeZoom(130); - _globals->_player.setStrip2(2); - _globals->_player._moveDiff.y = 10; - _globals->_player.animate(ANIM_MODE_2, NULL); - - setAction(&_action4); - _globals->_soundHandler.play(176); - } - break; - case 4045: - _hotspot15.postInit(); - _hotspot15.setVisage(4054); - _hotspot15.setPosition(Common::Point(206, 103)); - _globals->_sceneItems.push_back(&_hotspot15); - - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(193, 193)); - - _globals->_soundHandler.play(175); - break; - default: - break; - } - - _hotspot13.postInit(); - _hotspot13.setVisage(4053); - _hotspot13.animate(ANIM_MODE_2, NULL); - _hotspot13.setPosition(Common::Point(190, 97)); - - _hotspot17.postInit(); - _hotspot17.setVisage(4050); - _hotspot17.setPosition(Common::Point(209, 119)); - _hotspot17.fixPriority(2); - - _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot2.setBounds(Rect(150, 25, 198, 125)); - _hotspot3.setBounds(Rect(56, 94, 88, 153)); - _hotspot4.setBounds(Rect(170, 7, 209, 18)); - _hotspot5.setBounds(Rect(190, 72, 212, 92)); - _hotspot6.setBounds(Rect(122, 75, 145, 93)); - _hotspot7.setBounds(Rect(109, 103, 263, 158)); - _hotspot8.setBounds(Rect(157, 160, 213, 173)); - _hotspot9.setBounds(Rect(95, 157, 120, 178)); - _hotspot10.setBounds(Rect(278, 43, 310, 115)); - _hotspot11.setBounds(Rect(263, 105, 279, 147)); - _hotspot12.setBounds(Rect(258, 154, 307, 180)); - - _globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13, - &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot8, &_hotspot9, - &_hotspot7, &_hotspot1, NULL); -} - -void Scene4050::signal() { - if (_sceneMode == 4050) - _globals->_sceneManager.changeScene(4045); -} - -void Scene4050::dispatch() { - if (!_action) { - if ((_globals->_player._canWalk) && (_globals->_player._position.y > 196)) { - _sceneMode = 4050; - _globals->_player.disableControl(); - - Common::Point pt(160, 275); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - } - } - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 4100 - Village - Hut - * - *--------------------------------------------------------------------------*/ - -void Scene4100::Action1::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(10); - break; - case 1: - scene->_stripManager.start(_globals->_stripNum, this); - break; - case 2: - setDelay(30); - break; - case 3: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4100::Action2::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_hotspot2.postInit(); - scene->_hotspot2.changeZoom(95); - scene->_hotspot2.setVisage(4120); - scene->_hotspot2.animate(ANIM_MODE_1, NULL); - scene->_hotspot2.setStrip2(4); - scene->_hotspot2.fixPriority(100); - scene->_hotspot2.setPosition(Common::Point(214, 119)); - - setDelay(3); - break; - case 1: - ADD_MOVER(scene->_hotspot2, 249, 131); - break; - case 2: - scene->_hotspot2.setStrip2(3); - scene->_hotspot2.setFrame2(5); - scene->_hotspot2.animate(ANIM_MODE_NONE, NULL); - setDelay(3); - break; - case 3: - remove(); - break; - } -} - - -void Scene4100::Action3::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->clearFlag(43); - _globals->setFlag(36); - setDelay(15); - break; - case 1: - scene->_stripManager.start(4505, this); - break; - case 2: - setAction(&scene->_action2, this); - break; - case 3: - scene->_stripManager.start(4510, this); - break; - case 4: - setDelay(15); - break; - case 5: - _globals->_sceneManager.changeScene(4150); - break; - default: - break; - } -} - -void Scene4100::Action4::signal() { - // Rock getting drunk - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 2: - scene->_hotspot1.setVisage(4105); - scene->_hotspot1.setFrame(1); - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->clearFlag(43); - _globals->setFlag(42); - scene->_stripManager.start(4119, this); - break; - case 4: - setDelay(15); - break; - case 5: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4100::Action5::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_PLAYER_MOVER(58, 151); - break; - case 1: - if (RING_INVENTORY._ladder._sceneNumber == 4100) { - RING_INVENTORY._ladder._sceneNumber = 1; - scene->_ladder.remove(); - } else { - scene->_ladder.postInit(); - scene->_ladder.setVisage(4101); - scene->_ladder.setPosition(Common::Point(49, 144)); - - RING_INVENTORY._ladder._sceneNumber = 4100; - _globals->_sceneItems.push_front(&scene->_ladder); - } - - _globals->_player.enableControl(); - remove(); - break; - } -} - - -void Scene4100::Action6::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - scene->_stripManager.start(4103, this); - ADD_PLAYER_MOVER(245, 167); - break; - case 1: - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4100::Hotspot1::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_STUNNER: - SceneItem::display2(4100, 16); - break; - case OBJECT_ALE: - _globals->_player.disableControl(); - scene->setAction(&scene->_action3); - break; - case CURSOR_LOOK: - SceneItem::display2(4100, _globals->getFlag(42) ? 24 : 12); - break; - case CURSOR_USE: - SceneItem::display2(4100, 22); - break; - case CURSOR_TALK: - if (RING_INVENTORY._peg._sceneNumber == 1) { - _globals->_player.disableControl(); - scene->_sceneMode = 4109; - scene->setAction(&scene->_sequenceManager, scene, 4109, NULL); - } else if (_globals->getFlag(42)) { - scene->_sceneMode = 4102; - scene->setAction(&scene->_sequenceManager, scene, 4102, NULL); - } else { - if (_globals->getFlag(33)) - _globals->_stripNum = 4077; - else if (_globals->getFlag(82)) { - _globals->clearFlag(82); - _globals->_stripNum = 4100; - } else { - _globals->_stripNum = 4075; - _globals->setFlag(33); - } - - scene->setAction(&scene->_action1); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4100::Hotspot2::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - error("*** The Chief's daughter... WOW!"); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4100::Miranda::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4100, 14); - break; - case CURSOR_TALK: - scene->_sceneMode = 4102; - scene->setAction(&scene->_sequenceManager, scene, 4104, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4100::Ladder::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4100, 2); - break; - case CURSOR_USE: - if (_globals->getFlag(42)) { - _globals->_player.disableControl(); - scene->setAction(&scene->_action5); - } else { - scene->_sceneMode = 4102; - scene->setAction(&scene->_sequenceManager, scene, 4103, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/** - Exit hotspot, South - */ -void Scene4100::Hotspot14::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4100, 0); - break; - case OBJECT_LADDER: - _globals->_player.disableControl(); - scene->setAction(&scene->_action5); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - - -/*--------------------------------------------------------------------------*/ - -Scene4100::Scene4100() : - _hotspot3(0, CURSOR_LOOK, 4100, 10, CURSOR_USE, 4100, 21, LIST_END), - _hotspot4(0, CURSOR_LOOK, 4100, 8, LIST_END), - _hotspot7(0, CURSOR_USE, 4100, 3, CURSOR_USE, 4150, 29, LIST_END), - _hotspot8(0, CURSOR_LOOK, 4100, 5, LIST_END), - _hotspot9(0, CURSOR_LOOK, 4100, 6, CURSOR_USE, 4100, 20, LIST_END), - _hotspot10(0, CURSOR_LOOK, 4100, 7, CURSOR_USE, 4100, 19, LIST_END), - _hotspot11(0, CURSOR_LOOK, 4100, 8, CURSOR_USE, 4100, 18, LIST_END), - _hotspot12(0, CURSOR_LOOK, 4100, 9, LIST_END), - _hotspot13(0, CURSOR_LOOK, 4100, 11, CURSOR_USE, 4100, 17, LIST_END) { -} - -void Scene4100::postInit(SceneObjectList *OwnerList) { - loadScene(4100); - Scene::postInit(); - setZoomPercents(135, 80, 190, 100); - - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerCHFText); - _stripManager.addSpeaker(&_speakerCDRText); - _stripManager.addSpeaker(&_speakerCDR); - _stripManager.addSpeaker(&_speakerML); - _stripManager.addSpeaker(&_speakerQR); - - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(4); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(88, 180)); - _globals->_player._moveDiff = Common::Point(7, 4); - - _hotspot1.postInit(); - _hotspot1.setVisage(4102); - _hotspot1.fixPriority(129); - _hotspot1.setPosition(Common::Point(171, 120)); - - _hotspot3.postInit(); - _hotspot3.setVisage(4130); - _hotspot3.animate(ANIM_MODE_2, NULL); - _hotspot3.fixPriority(200); - _hotspot3.setPosition(Common::Point(272, 110)); - - _hotspot4.postInit(); - _hotspot4.setVisage(4130); - _hotspot4.animate(ANIM_MODE_2, NULL); - _hotspot4.setStrip2(2); - _hotspot4.setPosition(Common::Point(152, 167)); - - if (_globals->getFlag(36)) { - _hotspot1.setVisage(4105); - _hotspot1.setStrip(1); - _hotspot1.setFrame(4); - } else if (!_globals->getFlag(43)) { - _miranda.postInit(); - _miranda.setVisage(4102); - _miranda.setStrip2(3); - _miranda.setFrame(2); - _miranda.setPosition(Common::Point(65, 188)); - - _globals->_sceneItems.push_back(&_miranda); - } - - if (RING_INVENTORY._ladder._sceneNumber == 4100) { - _ladder.postInit(); - _ladder.setVisage(4101); - _ladder.setPosition(Common::Point(49, 144)); - - _globals->_sceneItems.push_back(&_ladder); - } - - _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot7._sceneRegionId = 16; - _hotspot8.setBounds(Rect(90, 0, 211, 113)); - _hotspot9.setBounds(Rect(207, 96, 235, 115)); - _hotspot10.setBounds(Rect(87, 81, 212, 107)); - _hotspot11.setBounds(Rect(61, 148, 243, 168)); - _hotspot12.setBounds(Rect(229, 59, 256, 122)); - _hotspot13.setBounds(Rect(255, 152, 286, 183)); - - _globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4, - &_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL); - - if (_globals->_sceneManager._previousScene == 4150) { - _globals->_soundHandler.play(155); - - if (!_globals->getFlag(42)) { - _hotspot1.setVisage(4104); - _hotspot1.setPosition(Common::Point(152, 118)); - _hotspot1.setStrip2(-1); - _hotspot1.setFrame2(-1); - _hotspot1.setFrame(1); - - _globals->_player.setStrip(2); - _globals->_player.disableControl(); - setAction(&_action4); - - _globals->clearFlag(43); - } else { - // Workaround: In the original, the mouse is hidden when Quinn - // goes back to scene 4150 then to scene 4100. This enables everything. - _globals->_player.enableControl(); - } - - _globals->_player.setPosition(Common::Point(252, 139)); - _globals->_player.setStrip(2); - } else { - if ((RING_INVENTORY._ale._sceneNumber == 4100) && !_globals->getFlag(42)) { - _globals->_player.disableControl(); - setAction(&_action3); - } - if (_globals->getFlag(35)) { - _globals->_player.disableControl(); - _sceneMode = 4101; - setAction(&_sequenceManager, this, 4101, &_globals->_player, NULL); - } - } -} - -void Scene4100::signal() { - switch (_sceneMode) { - case 4101: - _globals->_sceneManager.changeScene(4000); - break; - case 4102: - case 4103: - case 4109: - _globals->_player.enableControl(); - break; - } -} - -void Scene4100::dispatch() { - if (!_action) { - if ((_globals->_player.getRegionIndex() == 15) && !_globals->getFlag(42)) - setAction(&_action6); - - if (_globals->_player.getRegionIndex() == 8) - _globals->_sceneManager.changeScene(4150); - - if (_globals->_player._position.y >= 196) { - _globals->_player.disableControl(); - _sceneMode = 4101; - setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); - } - } - - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 4150 - Village - Bedroom - * - *--------------------------------------------------------------------------*/ - -void Scene4150::Action1::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; - byte adjustData[4] = {0, 0, 0, 0}; - - switch (_actionIndex++) { - case 0: - setDelay(60); - break; - case 1: - scene->_stripManager.start(4520, this); - break; - case 2: - setDelay(15); - break; - case 3: - setAction(&scene->_action2, this); - break; - case 4: { - for (int idx = 100; idx >= 0; idx -= 5) { - _globals->_scenePalette.fade(adjustData, false, idx); - g_system->updateScreen(); - g_system->delayMillis(10); - } - - scene->_hotspot4.postInit(); - scene->_hotspot4.setVisage(4150); - scene->_hotspot4.setStrip(2); - scene->_hotspot4.setPosition(Common::Point(166, 157)); - - scene->_hotspot1.postInit(); - scene->_hotspot1.setVisage(4156); - scene->_hotspot1.setStrip(1); - scene->_hotspot1.setFrame(1); - - setDelay(120); - break; - } - case 5: - _globals->_scenePalette.loadPalette(4150); - _globals->_scenePalette.refresh(); - setDelay(60); - break; - case 6: - scene->_stripManager.start(4522, this); - break; - case 7: - for (int idx = 100; idx >= 0; idx -= 5) { - _globals->_scenePalette.fade(adjustData, false, idx); - g_system->updateScreen(); - g_system->delayMillis(10); - } - - scene->_hotspot4.remove(); - scene->_hotspot1.setVisage(4157); - scene->_hotspot1.animate(ANIM_MODE_NONE, NULL); - scene->_hotspot1.setStrip(1); - scene->_hotspot1.setFrame(1); - scene->_hotspot1.show(); - - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(139, 166)); - _globals->_player._moveDiff = Common::Point(7, 3); - _globals->_player.show(); - - setDelay(120); - break; - case 8: - _globals->_scenePalette.loadPalette(4150); - _globals->_scenePalette.refresh(); - setDelay(30); - break; - case 9: - scene->_stripManager.start(4523, this); - break; - case 10: - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._moveDiff = Common::Point(7, 4); - _globals->_player.setStrip(3); - _globals->_player.enableControl(); - - remove(); - break; - } -} - -void Scene4150::Action2::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - scene->_hotspot1.setVisage(4152); - scene->_hotspot1.setStrip(1); - scene->_hotspot1.setFrame(1); - scene->_hotspot1.animate(ANIM_MODE_5, this); - - _globals->_player.animate(ANIM_MODE_5, NULL); - break; - case 2: - _globals->_player.hide(); - scene->_hotspot1.setVisage(4153); - scene->_hotspot1.setStrip(1); - scene->_hotspot1.setFrame(1); - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 3: - remove(); - break; - } -} - -void Scene4150::Action3::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(15); - break; - case 1: - _globals->_player.checkAngle(&scene->_hotspot3); - - if (RING_INVENTORY._rope._sceneNumber == 1) { - scene->_hotspot3.postInit(); - scene->_hotspot3.setVisage(4150); - scene->_hotspot3.setPosition(Common::Point(175, 70)); - - RING_INVENTORY._rope._sceneNumber = 4150; - _globals->_sceneItems.push_front(&scene->_hotspot3); - } else { - RING_INVENTORY._rope._sceneNumber = 1; - scene->_hotspot3.remove(); - } - - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4150::HotspotGroup1::doAction(int action) { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4150, 0); - break; - case OBJECT_ROPE: - scene->setAction(&scene->_action3); - break; - } -} - -void Scene4150::HotspotGroup3::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4150, _globals->getFlag(46) ? 9 : 8); - _globals->setFlag(46); - break; - case CURSOR_USE: - SceneItem::display2(4150, 30); - break; - } -} - -void Scene4150::HotspotGroup6::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4150, _globals->getFlag(47) ? 16 : 15); - _globals->setFlag(47); - break; - case CURSOR_USE: - SceneItem::display2(4150, 31); - break; - } -} - -void Scene4150::Hotspot3::doAction(int action) { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4150, 20); - break; - case CURSOR_USE: - scene->setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4150::Scene4150() : - _hotspot1(0, CURSOR_LOOK, 4150, 17, CURSOR_USE, 4150, 21, CURSOR_TALK, 4150, 21, - OBJECT_SCANNER, 4150, 22, OBJECT_STUNNER, 4150, 23, LIST_END), - _hotspot2(0, CURSOR_LOOK, 4150, 4, CURSOR_USE, 4150, 24, LIST_END), - _hotspot7(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END), - _hotspot8(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END), - _hotspot9(0, CURSOR_LOOK, 4150, 2, CURSOR_USE, 4150, 27, OBJECT_SCANNER, 4150, 28, - OBJECT_STUNNER, 4150, 32, LIST_END), - _hotspot10(0, CURSOR_LOOK, 4150, 5, CURSOR_USE, 4150, 29, LIST_END), - _hotspot11(0, CURSOR_LOOK, 4150, 6, CURSOR_USE, 4150, 29, LIST_END), - _hotspot12(0, CURSOR_LOOK, 4150, 7, CURSOR_USE, 4150, 29, LIST_END), - _hotspot17(0, CURSOR_LOOK, 4150, 10, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), - _hotspot18(0, CURSOR_LOOK, 4150, 11, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), - _hotspot19(0, CURSOR_LOOK, 4150, 12, CURSOR_USE, 4150, 29, LIST_END), - _hotspot20(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), - _hotspot21(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), - _hotspot22(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END), - _hotspot23(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END), - _hotspot24(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END) - { -} - -void Scene4150::postInit(SceneObjectList *OwnerList) { - loadScene(4150); - Scene::postInit(); - setZoomPercents(60, 85, 200, 100); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerCDL); - _stripManager.addSpeaker(&_speakerQText); - - _hotspot2.postInit(); - _hotspot2.setVisage(4171); - _hotspot2.animate(ANIM_MODE_2, NULL); - _hotspot2.fixPriority(100); - _hotspot2.setPosition(Common::Point(76, 147)); - - _hotspot1.postInit(); - _hotspot1.setPosition(Common::Point(177, 201)); - - if (_globals->getFlag(44)) { - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(2); - _globals->_player.setPosition(Common::Point(328, 160)); - _globals->_player._moveDiff = Common::Point(7, 4); - _globals->_player.disableControl(); - - _sceneMode = 4151; - setAction(&_sequenceManager, this, 4151, &_globals->_player, NULL); - - _hotspot1.setVisage(4157); - _hotspot1.setPosition(Common::Point(177, 201)); - } else { - _globals->_player.postInit(); - _globals->_player.setVisage(4154); - _globals->_player._canWalk = false; - _globals->_player.setPosition(Common::Point(198, 202)); - _globals->_player.disableControl(); - - _hotspot1.setVisage(4152); - setAction(&_action1); - _globals->setFlag(44); - } - - if (RING_INVENTORY._rope._sceneNumber == 4150) { - _hotspot3.postInit(); - _hotspot3.setVisage(4150); - _hotspot3.setPosition(Common::Point(175, 70)); - - _globals->_sceneItems.push_back(&_hotspot3); - } - - _globals->_sceneItems.push_back(&_hotspot1); - - _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot6.setBounds(Rect(28, 121, 80, 148)); - _hotspot7.setBounds(Rect(27, 17, 127, 100)); - _hotspot8.setBounds(Rect(62, 11, 117, 22)); - _hotspot9.setBounds(Rect(48, 78, 104, 94)); - _hotspot10.setBounds(Rect(32, 107, 58, 119)); - _hotspot11.setBounds(Rect(1, 130, 17, 163)); - _hotspot12.setBounds(Rect(1, 158, 78, 197)); - _hotspot13.setBounds(Rect(253, 11, 274, 188)); - _hotspot14.setBounds(Rect(4, 15, 29, 153)); - _hotspot15.setBounds(Rect(127, 22, 146, 133)); - _hotspot16.setBounds(Rect(165, 22, 181, 141)); - _hotspot17.setBounds(Rect(186, 31, 217, 52)); - _hotspot18.setBounds(Rect(200, 31, 251, 86)); - _hotspot19.setBounds(Rect(183, 81, 234, 111)); - _hotspot20.setBounds(Rect(188, 120, 219, 142)); - _hotspot21.setBounds(Rect(235, 122, 249, 145)); - _hotspot22.setBounds(Rect(283, 125, 320, 146)); - _hotspot23.setBounds(Rect(284, 27, 306, 160)); - _hotspot24.setBounds(Rect(257, 72, 284, 99)); - _hotspot25.setBounds(Rect(183, 155, 316, 190)); - _hotspot26.setBounds(Rect(98, 169, 238, 198)); - - _globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25, - &_hotspot26, &_hotspot19, &_hotspot22, &_hotspot20, &_hotspot17, &_hotspot16, - &_hotspot15, &_hotspot11, &_hotspot14, &_hotspot18, &_hotspot21, &_hotspot12, - &_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2, - &_hotspot5, NULL); - - _globals->_soundHandler.play(165); - _soundHandler.play(311); -} - -void Scene4150::signal() { - if (_sceneMode == 4151) - _globals->_player.enableControl(); - else if (_sceneMode == 4152) - _globals->_sceneManager.changeScene(4100); -} - -void Scene4150::dispatch() { - Scene::dispatch(); - - if (!_action && (_globals->_player._position.x >= 316)) { - _globals->_soundHandler.fadeOut(NULL); - _soundHandler.fadeOut(NULL); - _globals->_player.disableControl(); - _sceneMode = 4152; - setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); - } -} - -/*-------------------------------------------------------------------------- - * Scene 4000 - Village - * - *--------------------------------------------------------------------------*/ - -void Scene4250::Action1::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - ADD_MOVER_NULL(_globals->_player, 6, 190); - ADD_MOVER_NULL(scene->_hotspot3, 9, 195); - ADD_MOVER(scene->_hotspot1, 12, 185); - break; - case 2: - setDelay(30); - break; - case 3: - scene->_stripManager.start(4450, this); - break; - case 4: - case 7: - setDelay(15); - break; - case 5: - ADD_PLAYER_MOVER(220, 175); - scene->_hotspot1.fixPriority(105); - ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173); - break; - case 6: - scene->_stripManager.start(4470, this); - break; - case 8: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4250::Action2::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_PLAYER_MOVER(247, 182); - break; - case 1: - _globals->_player.setVisage(2670); - _globals->_player.changeZoom(50); - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { - scene->_stripManager.start(4205, this); - } else { - scene->_stripManager.start(4490, this); - } - break; - case 3: - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 4: - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.changeZoom(70); - - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { - _globals->_player.enableControl(); - remove(); - } else { - ADD_PLAYER_MOVER(6, 180); - ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 12, 185); - } - break; - case 5: - ADD_PLAYER_MOVER(-16, 180); - ADD_PLAYER_MOVER_NULL(scene->_hotspot1, -12, 185); - scene->_hotspot3.setStrip2(2); - ADD_MOVER_NULL(scene->_hotspot5, -30, 195); - break; - case 6: - _globals->clearFlag(59); - _globals->clearFlag(70); - _globals->clearFlag(37); - _globals->clearFlag(114); - _globals->clearFlag(36); - _globals->clearFlag(43); - _globals->_sceneManager.changeScene(2100); - break; - } -} - -void Scene4250::Action3::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - scene->_stripManager.start(4480, this); - break; - case 2: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4250::Action4::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - _globals->_player.addMover(NULL); - scene->_stripManager.start((RING_INVENTORY._helmet._sceneNumber == 4250) ? 4259 : 4256, this); - break; - case 2: - ADD_PLAYER_MOVER(_globals->_player._position.x + 5, _globals->_player._position.y); - break; - case 3: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene4250::Action5::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - scene->_hotspot4.fixPriority(195); - scene->_hotspot1.fixPriority(105); - ADD_MOVER_NULL(_globals->_player, 6, 185); - ADD_MOVER_NULL(scene->_hotspot4, 9, 190); - ADD_MOVER(scene->_hotspot1, 12, 180); - break; - case 2: - ADD_PLAYER_MOVER(252, 176); - ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173); - ADD_PLAYER_MOVER_NULL(scene->_hotspot4, 239, 195); - break; - case 3: - scene->_hotspot4.fixPriority(-1); - scene->_hotspot1.setStrip(5); - scene->_hotspot4.setStrip(7); - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4250::Hotspot1::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 19 : 14); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - if (!_globals->_sceneObjects->contains(&scene->_hotspot4)) { - scene->setAction(&scene->_action3); - } else { - scene->_sceneMode = 4260; - if (RING_INVENTORY._helmet._sceneNumber == 4250) { - scene->_sceneMode = 4265; - scene->setAction(&scene->_sequenceManager, scene, 4265, this, NULL); - } else { - scene->setAction(&scene->_sequenceManager, scene, - _globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL); - } - } - break; - case OBJECT_SCANNER: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - SceneItem::display2(4250, 21); - else - SceneHotspot::doAction(action); - break; - case OBJECT_STUNNER: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - SceneItem::display2(4250, 22); - else - SceneHotspot::doAction(action); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4250::Hotspot2::doAction(int action) { - //Ship with stasis field - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - case CURSOR_USE: - SceneItem::display2(4250, 16); - break; - case OBJECT_SCANNER: - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) - scene->setAction(&scene->_action2); - else if (_globals->getFlag(55)) - SceneItem::display2(4250, 17); - else { - _globals->setFlag(55); - scene->setAction(&scene->_action2); - } - break; - case OBJECT_STASIS_NEGATOR: - _globals->_player.disableControl(); - scene->_sceneMode = 4252; - scene->setAction(&scene->_sequenceManager, scene, 4252, &_globals->_player, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4250::Hotspot4::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 18 : 5); - break; - case OBJECT_SCANNER: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - SceneItem::display2(4250, 21); - else - SceneHotspot::doAction(action); - break; - case OBJECT_STUNNER: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - SceneItem::display2(4250, 22); - else - SceneHotspot::doAction(action); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - if (!_globals->_sceneObjects->contains(&scene->_hotspot6)) { - scene->_sceneMode = 4254; - scene->setAction(&scene->_sequenceManager, scene, 4263, NULL); - } else { - scene->_sceneMode = 4254; - - if (RING_INVENTORY._helmet._sceneNumber == 4250) { - scene->_sceneMode = 4266; - scene->setAction(&scene->_sequenceManager, scene, 4266, this, NULL); - } else { - scene->setAction(&scene->_sequenceManager, scene, - (RING_INVENTORY._concentrator._sceneNumber == 1) ? 4255 : 4254, NULL); - } - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4250::Hotspot6::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 7 : 6); - break; - case OBJECT_SCANNER: - SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 1 : 2); - break; - case OBJECT_STUNNER: - SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3); - break; - case OBJECT_HELMET: - _globals->_soundHandler.play(354); - _globals->_player.disableControl(); - RING_INVENTORY._helmet._sceneNumber = 4250; - - if (RING_INVENTORY._concentrator._sceneNumber == 1) { - if (_globals->getFlag(115)) { - scene->_sceneMode = 4269; - scene->setAction(&scene->_sequenceManager, scene, 4269, this, NULL); - } else { - _globals->setFlag(115); - _globals->_events.setCursor(CURSOR_WALK); - scene->_sceneMode = 4256; - scene->setAction(&scene->_sequenceManager, scene, 4256, this, NULL); - } - } else if (RING_INVENTORY._keyDevice._sceneNumber == 1) { - scene->_sceneMode = 4267; - scene->setAction(&scene->_sequenceManager, scene, 4267, this, NULL); - } else if (RING_INVENTORY._keyDevice._sceneNumber == 4300) { - scene->_sceneMode = 4268; - scene->setAction(&scene->_sequenceManager, scene, 4268, this, NULL); - } else { - _globals->_events.setCursor(CURSOR_WALK); - ADD_MOVER_NULL(scene->_hotspot1, 241, 169); - scene->_sceneMode = 4261; - scene->setAction(&scene->_sequenceManager, scene, 4261, &_globals->_player, this, NULL); - } - break; - case OBJECT_NULLIFIER: - if (RING_INVENTORY._helmet._sceneNumber == 4250) { - _globals->_soundHandler.play(353); - _globals->_player.disableControl(); - RING_INVENTORY._helmet._sceneNumber = 1; - - scene->_sceneMode = 4257; - scene->setAction(&scene->_sequenceManager, scene, 4257, &_globals->_player, this, NULL); - } else { - SceneItem::display2(4250, 4); - } - break; - case CURSOR_TALK: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - doAction(OBJECT_HELMET); - else { - _globals->_player.disableControl(); - scene->_sceneMode = 4264; - scene->setAction(&scene->_sequenceManager, scene, 4264, this, NULL); - } - break; - case CURSOR_USE: - if (RING_INVENTORY._helmet._sceneNumber == 4250) - doAction(OBJECT_HELMET); - else { - _globals->_player.disableControl(); - if ((RING_INVENTORY._items._sceneNumber != 1) || (RING_INVENTORY._concentrator._sceneNumber != 1)) { - scene->_sceneMode = 4258; - scene->setAction(&scene->_sequenceManager, scene, 4258, this, NULL); - } else { - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(4251); - scene->_hotspot2.setFrame(scene->_hotspot2.getFrameCount()); - scene->_hotspot2.setPosition(Common::Point(267, 172)); - scene->_hotspot2.hide(); - - scene->_sceneMode = 4259; - scene->setAction(&scene->_sequenceManager, scene, 4259, &_globals->_player, this, &scene->_hotspot2, NULL); - } - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4250::Hotspot8::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - case CURSOR_USE: - _globals->_sceneManager.changeScene(4300); - break; - case OBJECT_SCANNER: - SceneItem::display2(4250, 24); - break; - case OBJECT_STUNNER: - SceneItem::display2(4250, 25); - break; - case OBJECT_STASIS_NEGATOR: - _globals->_player.disableControl(); - scene->_sceneMode = 4270; - scene->setAction(&scene->_sequenceManager, scene, - (RING_INVENTORY._helmet._sceneNumber == 4250) ? 4270 : 4271, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4250::Scene4250() : - _hotspot7(0, CURSOR_LOOK, 4250, 0, LIST_END) { -} - -void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { - loadScene(4250); - Scene::postInit(); - setZoomPercents(160, 90, 185, 100); - - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerPText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerFLText); - - _speakerSText.setTextPos(Common::Point(40, 40)); - _speakerPText.setTextPos(Common::Point(40, 100)); - _hotspot8._sceneRegionId = 16; - - _globals->_player.postInit(); - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-13, 190)); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff = Common::Point(4, 1); - - _hotspot1.postInit(); - _hotspot1.setVisage(2801); - _hotspot1.animate(ANIM_MODE_1, NULL); - _hotspot1.setObjectWrapper(new SceneObjectWrapper()); - _hotspot1.setPosition(Common::Point(-18, 185)); - _hotspot1.changeZoom(-1); - _hotspot1._moveDiff = Common::Point(4, 1); - _globals->_sceneItems.push_back(&_hotspot1); - - if (_globals->_sceneManager._previousScene == 4300) { - _hotspot5.postInit(); - _hotspot5.setVisage(4250); - _hotspot5.setPosition(Common::Point(268, 168)); - _hotspot5.fixPriority(1); - - _hotspot4.postInit(); - _hotspot4.setVisage(2701); - _hotspot4.animate(ANIM_MODE_1, NULL); - _hotspot4.setObjectWrapper(new SceneObjectWrapper()); - _hotspot4.setPosition(Common::Point(272, 175)); - _hotspot4.setStrip(2); - _hotspot4._moveDiff = Common::Point(4, 1); - _hotspot4.changeZoom(70); - _globals->_sceneItems.push_back(&_hotspot4); - - _hotspot1.setPosition(Common::Point(197, 173)); - _hotspot1.changeZoom(70); - - _globals->_player.setPosition(Common::Point(252, 176)); - _globals->_player.changeZoom(70); - - _hotspot6.postInit(); - _hotspot6.setVisage(4302); - _hotspot6.setStrip(4); - _hotspot6.setFrame(3); - _hotspot6.changeZoom(50); - _hotspot6.fixPriority(70); - _hotspot6.setPosition(Common::Point(261, 175)); - - if (RING_INVENTORY._helmet._sceneNumber == 4250) { - _hotspot6.setStrip(6); - _hotspot6.setFrame(_hotspot6.getFrameCount()); - } - - if (_globals->getFlag(98)) { - _globals->_sceneItems.push_front(&_hotspot6); - } else { - _hotspot6.hide(); - if ((_globals->_stripNum == 4300) || (_globals->_stripNum == 4301)) { - _globals->setFlag(98); - _globals->_player.setVisage(4302); - _globals->_player.setStrip(5); - _globals->_player.changeZoom(50); - _globals->_player.disableControl(); - - _hotspot4.setPosition(Common::Point(239, 195)); - _sceneMode = 4253; - _globals->_sceneItems.push_front(&_hotspot6); - - setAction(&_sequenceManager, this, 4253, &_globals->_player, &_hotspot6, &_hotspot4, NULL); - } - } - } else if (_globals->_stripNum == 9000) { - _hotspot4.postInit(); - _hotspot4.setVisage(2701); - _hotspot4.animate(ANIM_MODE_1, NULL); - _hotspot4.setObjectWrapper(new SceneObjectWrapper()); - _hotspot4.setPosition(Common::Point(-15, 195)); - _hotspot4._moveDiff = Common::Point(4, 1); - _globals->_sceneItems.push_back(&_hotspot4); - - setAction(&_action5); - } else { - _hotspot3.postInit(); - _hotspot3.setVisage(4006); - _hotspot3.animate(ANIM_MODE_1, NULL); - _hotspot3.setObjectWrapper(new SceneObjectWrapper()); - _hotspot3.setPosition(Common::Point(-15, 195)); - _hotspot3.setStrip2(3); - _hotspot3._moveDiff = Common::Point(4, 1); - - setAction(&_action1); - _globals->clearFlag(43); - _globals->clearFlag(114); - _globals->clearFlag(36); - } - - if (_globals->getFlag(17)) { - _globals->_sceneItems.push_back(&_hotspot8); - } else { - _hotspot2.postInit(); - _hotspot2.setVisage(4251); - _hotspot2.setStrip2(1); - _hotspot2.fixPriority(2); - _hotspot2.setFrame(1); - _hotspot2.setPosition(Common::Point(267, 172)); - - _globals->_sceneItems.push_back(&_hotspot2); - } - - _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot7); - _globals->_soundHandler.play(185); -} - -void Scene4250::signal() { - switch (_sceneMode) { - case 4252: - _globals->setFlag(17); - _globals->_sceneManager.changeScene(4301); - break; - case 4253: - if (_globals->_stripNum == 4301) { - _sceneMode = 4261; - ADD_MOVER_NULL(_hotspot1, 241, 169); - setAction(&_sequenceManager, this, 4261, &_globals->_player, &_hotspot6, NULL); - } else { - _globals->_player.enableControl(); - } - break; - case 4254: - case 4256: - case 4257: - case 4258: - case 4260: - case 4264: - case 4265: - case 4266: - case 4267: - case 4268: - case 4269: - case 4270: - _globals->_player.enableControl(); - break; - case 4259: - _globals->_soundHandler.play(360); - _globals->_sceneManager.changeScene(9900); - break; - case 4261: - RING_INVENTORY._keyDevice._sceneNumber = 1; - _globals->_player.enableControl(); - break; - case 4255: - case 4262: - case 4263: - default: - break; - } -} - -void Scene4250::dispatch() { - if (_globals->_player.getRegionIndex() == 8) - _globals->_player.changeZoom(90 - (_globals->_player._position.y - 153)); - if (_globals->_player.getRegionIndex() == 12) - _globals->_player.changeZoom(70); - if (_globals->_player.getRegionIndex() == 15) { - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(-1); - } - - if (_hotspot1.getRegionIndex() == 8) - _hotspot1.changeZoom(90 - (_hotspot1._position.y - 153)); - if (_hotspot1.getRegionIndex() == 12) - _hotspot1.changeZoom(70); - if (_hotspot1.getRegionIndex() == 15) { - _hotspot1.changeZoom(-1); - _hotspot1.fixPriority(-1); - } - - if (_hotspot4.getRegionIndex() == 8) - _hotspot4.changeZoom(90 - (_hotspot4._position.y - 153)); - if (_hotspot4.getRegionIndex() == 12) - _hotspot4.changeZoom(70); - if (_hotspot4.getRegionIndex() == 15) { - _hotspot4.changeZoom(-1); - _hotspot4.fixPriority(-1); - } - - Scene::dispatch(); - - if (!_action) { - if (!_globals->getFlag(55) && (_globals->_player.getRegionIndex() == 12)) { - setAction(&_action4); - } - - if (_globals->_sceneObjects->contains(&_hotspot6) && (_globals->_player.getRegionIndex() == 12)) - setAction(&_action4); - } -} - -/*-------------------------------------------------------------------------- - * Scene 4300 - Village - Slaver Ship - * - *--------------------------------------------------------------------------*/ - -void Scene4300::Action1::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->setFlag(56); - _globals->_scenePalette.addRotation(240, 254, -1); - scene->_hotspot7.animate(ANIM_MODE_6, this); - _globals->_soundHandler.play(164); - break; - case 1: - _globals->_soundHandler.play(340); - scene->_soundHandler1.play(341); - scene->_hotspot1.remove(); - setDelay(3); - break; - case 2: - scene->_soundHandler1.play(341); - scene->_hotspot2.remove(); - setDelay(6); - break; - case 3: - scene->_soundHandler1.play(341); - scene->_hotspot3.remove(); - setDelay(6); - break; - case 4: - scene->_soundHandler1.play(341); - scene->_hotspot4.remove(); - setDelay(12); - break; - case 5: - scene->_soundHandler1.play(341); - scene->_hotspot5.remove(); - setDelay(12); - break; - case 6: - scene->_soundHandler1.play(341); - scene->_hotspot6.remove(); - setDelay(60); - break; - case 7: - scene->_hotspot10.fixPriority(250); - scene->_hotspot10.animate(ANIM_MODE_5, this); - break; - case 8: - scene->_hotspot13.show(); - scene->_stripManager.start(8015, this, scene); - break; - case 9: - _globals->_soundHandler.play(350); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_events.setCursor(CURSOR_USE); - _globals->_player.enableControl(); - - remove(); - break; - } -} - -void Scene4300::Action2::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: - scene->_stripManager.start(8016, this, scene); - break; - case 2: - _globals->_player.enableControl(); - remove(); - break; - } -} - - -/*--------------------------------------------------------------------------*/ - -void Scene4300::Hotspot8::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, 15); - break; - case CURSOR_USE: - SceneItem::display2(4300, 18); - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 14); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 19); - break; - case OBJECT_KEY_DEVICE: - RING_INVENTORY._keyDevice._sceneNumber = 4300; - _globals->_scenePalette.addRotation(240, 254, -1); - animate(ANIM_MODE_5, NULL); - - _globals->setFlag(99); - _globals->_sceneItems.push_back(this); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4300::Hotspot9::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || - (RING_INVENTORY._concentrator._sceneNumber == 1)) - SceneItem::display2(4300, 7); - else - SceneItem::display2(4300, 1); - break; - case CURSOR_USE: - if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || - (RING_INVENTORY._concentrator._sceneNumber == 1)) - SceneItem::display2(4300, 7); - else - SceneItem::display2(4300, 3); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 24); - break; - case OBJECT_SCANNER: - if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || - (RING_INVENTORY._concentrator._sceneNumber != 1)) - SceneItem::display2(4300, 22); - else - SceneItem::display2(4300, 23); - break; - default: - NamedHotspot::doAction(action); - break; - } -} - -void Scene4300::Hotspot10::doAction(int action) { - // Alien - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, 2); - break; - case CURSOR_TALK: - _globals->_player.disableControl(); - scene->setAction(&scene->_action2); - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 20); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 21); - break; - case CURSOR_USE: - case OBJECT_HELMET: - _globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301; - _globals->_events.setCursor(CURSOR_NONE); - _globals->_sceneManager.changeScene(4250); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4300::Hotspot15::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - scene->_soundHandler2.play(345); - - _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1; - if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || - (RING_INVENTORY._concentrator._sceneNumber == 1)) { - setStrip(1); - setFrame(1); - animate(ANIM_MODE_NONE, NULL); - } else { - animate(ANIM_MODE_5, this); - } -} - -void Scene4300::Hotspot16::doAction(int action) { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, 8); - break; - case CURSOR_USE: - if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) && - (RING_INVENTORY._concentrator._sceneNumber != 4300)) { - SceneItem::display2(4300, 16); - } else { - scene->_sceneMode = 4302; - scene->setAction(&scene->_sequenceManager, scene, 4302, this, NULL); - } - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 27); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 24); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene4300::Hotspot17::doAction(int action) { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, (RING_INVENTORY._stasisBox2._sceneNumber == 4300) ? 17 : 11); - break; - case CURSOR_USE: - if (RING_INVENTORY._stasisBox2._sceneNumber != 4300) - SceneItem::display2(4300, 13); - else { - _globals->_scenePalette.clearListeners(); - remove(); - - SceneItem::display2(4300, 12); - RING_INVENTORY._concentrator._sceneNumber = 1; - } - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 25); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 26); - break; - case OBJECT_STASIS_BOX2: - scene->_soundHandler1.play(352); - _globals->_events.setCursor(CURSOR_USE); - scene->_sceneMode = 4303; - - scene->setAction(&scene->_sequenceManager, scene, 4303, this, NULL); - break; - } -} - -void Scene4300::Hotspot19::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, 9); - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 28); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 24); - break; - case CURSOR_USE: - if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) && - (RING_INVENTORY._concentrator._sceneNumber != 4300)) - SceneItem::display2(4300, 10); - else - SceneItem::display2(4300, 29); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene4300::Scene4300() : - _hotspot18(0, CURSOR_LOOK, 4300, 0, LIST_END) { -} - -void Scene4300::postInit(SceneObjectList *OwnerList) { - loadScene(4300); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerFLText); - - _hotspot11.setup(76, 97, 102, 127, 4300, 5, 6); - - _hotspot7.postInit(); - _hotspot7.setPosition(Common::Point(90, 128)); - _hotspot7.setVisage(4303); - _hotspot7.fixPriority(250); - _globals->_sceneItems.push_back(&_hotspot7); - - _hotspot9.setup(120, 49, 174, 91, 4300, -1, -1); - - _hotspot15.postInit(); - _hotspot15.setVisage(4300); - _hotspot15.setPosition(Common::Point(149, 79)); - _hotspot15.signal(); - - if (!_globals->getFlag(99)) { - _hotspot8.postInit(); - _hotspot8.setVisage(4300); - _hotspot8.setStrip(3); - _hotspot8.setPosition(Common::Point(196, 47)); - _globals->_sceneItems.push_back(&_hotspot8); - } - - if (RING_INVENTORY._concentrator._sceneNumber == 4300) { - _hotspot17.postInit(); - _hotspot17.setVisage(4300); - _hotspot17.setStrip(6); - _hotspot17.fixPriority(1); - _hotspot17.setPosition(Common::Point(200, 69)); - - if (RING_INVENTORY._stasisBox2._sceneNumber == 4300) - _hotspot17.setFrame(_hotspot17.getFrameCount()); - - _globals->_sceneItems.push_back(&_hotspot17); - } - - if (!_globals->getFlag(98)) { - _hotspot10.postInit(); - _hotspot10.setVisage(4302); - _hotspot10.setPosition(Common::Point(244, 179)); - _hotspot10.fixPriority(100); - _globals->_sceneItems.push_back(&_hotspot10); - - _hotspot12.postInit(); - _hotspot12.setVisage(4302); - _hotspot12.setStrip2(3); - _hotspot12.setPosition(Common::Point(231, 185)); - _hotspot12.fixPriority(251); - _hotspot12.hide(); - - _hotspot13.postInit(); - _hotspot13.hide(); - _hotspot13.setVisage(4302); - _hotspot13.setStrip2(2); - _hotspot13.setPosition(Common::Point(256, 168)); - _hotspot13.fixPriority(251); - _hotspot13._numFrames = 1; - _hotspot13.animate(ANIM_MODE_8, 0, NULL); - } - - if (RING_INVENTORY._items._sceneNumber == 4300) { - _hotspot16.postInit(); - _hotspot16.setVisage(4300); - _hotspot16.setPosition(Common::Point(169, 141)); - _hotspot16.fixPriority(1); - _hotspot16.setStrip(4); - _globals->_sceneItems.push_back(&_hotspot16); - } - - if (_globals->_sceneManager._previousScene == 4301) { - _globals->_player.disableControl(); - _hotspot7.setFrame(_hotspot7.getFrameCount()); - - _hotspot1.postInit(); - _hotspot1.setVisage(4301); - _hotspot1.fixPriority(145); - _hotspot1.setPosition(Common::Point(160, 64)); - - _hotspot2.postInit(); - _hotspot2.setVisage(4301); - _hotspot2.setStrip2(2); - _hotspot2.fixPriority(140); - _hotspot2.setPosition(Common::Point(166, 90)); - - _hotspot3.postInit(); - _hotspot3.setVisage(4301); - _hotspot3.setStrip2(3); - _hotspot3.fixPriority(135); - _hotspot3.setPosition(Common::Point(173, 114)); - - _hotspot4.postInit(); - _hotspot4.setVisage(4301); - _hotspot4.setStrip2(4); - _hotspot4.fixPriority(130); - _hotspot4.setPosition(Common::Point(187, 141)); - - _hotspot5.postInit(); - _hotspot5.setVisage(4301); - _hotspot5.setStrip2(5); - _hotspot5.fixPriority(125); - _hotspot5.setPosition(Common::Point(201, 164)); - - _hotspot6.postInit(); - _hotspot6.setVisage(4301); - _hotspot6.setStrip2(6); - _hotspot6.fixPriority(120); - _hotspot6.setPosition(Common::Point(219, 186)); - - setAction(&_action1); - } else { - _globals->_player.disableControl(); - _sceneMode = 4304; - setAction(&_sequenceManager, this, 4304, NULL); - } - - _hotspot10.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot19._sceneRegionId = 0; - _globals->_sceneItems.push_back(&_hotspot19); - _globals->_sceneItems.push_back(&_hotspot18); -} - -void Scene4300::stripCallback(int v) { - switch (v) { - case 1: - _hotspot12.show(); - _hotspot12.animate(ANIM_MODE_7, 0, NULL); - break; - case 2: - _hotspot12.hide(); - break; - } -} - -void Scene4300::remove() { - _globals->_scenePalette.clearListeners(); - Scene::remove(); -} - -void Scene4300::signal() { - switch (_sceneMode) { - case 4302: - RING_INVENTORY._items._sceneNumber = 1; - _hotspot16.remove(); - _globals->_player.enableControl(); - break; - case 4303: - RING_INVENTORY._stasisBox2._sceneNumber = 4300; - _hotspot15.setStrip(1); - _hotspot15.setFrame(1); - _hotspot15.animate(ANIM_MODE_NONE, NULL); - break; - case 4304: - _hotspot14.postInit(); - _hotspot14.setVisage(4300); - _hotspot14.setStrip(7); - _hotspot14.setPosition(Common::Point(60, 199)); - - _gfxButton.setText(EXIT_MSG); - _gfxButton._bounds.center(60, 193); - _gfxButton.draw(); - _gfxButton._bounds.expandPanes(); - - _globals->_player.enableControl(); - _globals->_scenePalette.addRotation(240, 254, -1); - break; - } -} - -void Scene4300::dispatch() { - if (_action) - _action->dispatch(); -} - -void Scene4300::process(Event &event) { - Scene::process(event); - if (_gfxButton.process(event)) - _globals->_sceneManager.changeScene(4250); -} - -/*-------------------------------------------------------------------------- - * Scene 4301 - Village - Slaver Ship Keypad - * - *--------------------------------------------------------------------------*/ - -void Scene4301::Action1::synchronize(Serializer &s) { - Action::synchronize(s); - s.syncAsSint16LE(_field34E); - for (int idx = 0; idx < 6; ++idx) - s.syncAsSint16LE(_indexList[idx]); -} - -void Scene4301::Action1::remove() { - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; - _globals->_player.enableControl(); - - for (_state = 0; _state < 6; ++_state) - _buttonList[_state].remove(); - - scene->_hotspot3.remove(); - scene->_hotspot2.remove(); - - scene->_hotspot1.animate(ANIM_MODE_6, NULL); - Action::remove(); -} - -void Scene4301::Action1::signal() { - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_soundHandler.play(164); - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 1: - _globals->_soundHandler.play(335); - _globals->_events.setCursor(CURSOR_USE); - - scene->_hotspot2.postInit(); - scene->_hotspot2.setVisage(4303); - scene->_hotspot2.setStrip(2); - scene->_hotspot2.setFrame(1); - scene->_hotspot2.setPosition(Common::Point(30, 15)); - scene->_hotspot2.fixPriority(255); - - scene->_hotspot3.postInit(); - scene->_hotspot3.setVisage(4303); - scene->_hotspot3.setStrip(2); - scene->_hotspot3.setFrame(2); - scene->_hotspot3.setPosition(Common::Point(48, 29)); - scene->_hotspot3.fixPriority(255); - scene->_hotspot3.hide(); - - _field34E = 0; - _state = 0; - _actionIndex = 2; - break; - case 10: - // Puzzle: Wrong code - _globals->_events.setCursor(CURSOR_NONE); - scene->_soundHandler.play(337); - if (scene->_hotspot3._flags & OBJFLAG_HIDE) - scene->_hotspot3.show(); - else - scene->_hotspot3.hide(); - setDelay(20); - - if (_state <= 8) - _actionIndex = 10; - ++_state; - break; - case 11: - for (_state = 0; _state < 6; ++_state) - _buttonList[_state].remove(); - - scene->_soundHandler.play(338); - scene->_hotspot3.hide(); - - _actionIndex = 2; - _state = 0; - _globals->_events.setCursor(CURSOR_USE); - break; - case 20: - // Puzzle: Correct code - _globals->_player.disableControl(); - scene->_soundHandler.play(339); - scene->_hotspot3._frame = 3; - if (scene->_hotspot3._flags & OBJFLAG_HIDE) - scene->_hotspot3.show(); - else - scene->_hotspot3.hide(); - - if (_state <= 8) - _actionIndex = 20; - ++_state; - - setDelay(20); - break; - case 21: - scene->_field68E = true; - remove(); - break; - } -} - -void Scene4301::Action1::process(Event &event) { - // Puzzle - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; - Rect buttonsRect; - - Action::process(event); - if (event.handled || (_actionIndex != 2)) - return; - - buttonsRect = Rect(14, 35, 112, 100); - buttonsRect.translate(30, 15); - - if ((event.eventType == EVENT_BUTTON_DOWN) && buttonsRect.contains(event.mousePos)) { - event.handled = true; - scene->_soundHandler.play(336); - - int buttonIndex = ((event.mousePos.y - buttonsRect.top) / 33) * 3 + - ((event.mousePos.x - buttonsRect.left) / 33); - - _buttonList[_state].postInit(); - _buttonList[_state].setVisage(4303); - _buttonList[_state].setStrip(buttonIndex + 3); - _buttonList[_state].setFrame(1); - _buttonList[_state].setPosition(Common::Point((_state % 3) * 25 + 55, (_state / 3) * 25 + 121)); - _buttonList[_state].fixPriority(255); - _buttonList[_state]._numFrames = 25; - _buttonList[_state].animate(ANIM_MODE_5, NULL); - - _indexList[_state++] = buttonIndex; - - if (_state == 6) { - // Six buttons pressed - if ((_indexList[0] == 2) && (_indexList[1] == 3) && (_indexList[2] == 0) && - (_indexList[3] == 4) && (_indexList[4] == 1) && (_indexList[5] == 5)) { - // Entered the correct full combination - _state = 0; - _actionIndex = 20; - } else { - // Incorrect combination entered - _state = 0; - _actionIndex = 10; - } - - signal(); - } - } - - if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { - event.handled = true; - remove(); - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4301::Hotspot4::doAction(int action) { - // Hatch near door - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; - - if (action == CURSOR_USE) { - _globals->_player.disableControl(); - scene->setAction(&scene->_action1); - } else { - NamedHotspot::doAction(action); - } -} - -void Scene4301::Hotspot5::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(4300, 0); - break; - case CURSOR_USE: - SceneItem::display2(4300, 30); - break; - case OBJECT_SCANNER: - SceneItem::display2(4300, 31); - break; - case OBJECT_STUNNER: - SceneItem::display2(4300, 32); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene4301::postInit(SceneObjectList *OwnerList) { - _globals->setFlag(50); - loadScene(4301); - Scene::postInit(); - setZoomPercents(0, 100, 200, 100); - - _field68E = false; - RING_INVENTORY._stasisBox2._sceneNumber = 1; - _hotspot4.setup(97, 76, 127, 102, 4300, 5, 6); - - _hotspot1.postInit(); - _hotspot1.setPosition(Common::Point(90, 128)); - _hotspot1.setVisage(4303); - _hotspot1._strip = 1; - _hotspot1._frame = 1; - _hotspot1.fixPriority(250); - - _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot5); - - _globals->_player.enableControl(); -} - -void Scene4301::dispatch() { - if (_action) { - _action->dispatch(); - } else if (_field68E) { - _field68E = 0; - _globals->clearFlag(50); - _globals->_sceneManager._fadeMode = FADEMODE_NONE; - _globals->_sceneManager.setNewScene(4300); - } -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes5.h b/engines/tsage/ringworld_scenes5.h deleted file mode 100644 index c3ae9f4aa9..0000000000 --- a/engines/tsage/ringworld_scenes5.h +++ /dev/null @@ -1,693 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES5_H -#define TSAGE_RINGWORLD_SCENES5_H - -#include "common/scummsys.h" -#include "tsage/core.h" -#include "tsage/converse.h" -#include "tsage/ringworld_logic.h" - -namespace tSage { - -class Scene4000 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - class Action9 : public Action { - public: - virtual void signal(); - }; - class Action10 : public Action { - public: - virtual void signal(); - }; - class Action11 : public Action { - public: - virtual void signal(); - }; - class Action12 : public Action { - public: - virtual void signal(); - }; - class Action13 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Miranda : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - private: - int _ctr; - public: - virtual void synchronize(Serializer &s) { - SceneObject::synchronize(s); - s.syncAsUint16LE(_ctr); - } - virtual void doAction(int action); - }; - class GuardRock : public SceneObject { - public: - virtual void doAction(int action); - }; - class Ladder : public SceneObject { - public: - virtual void doAction(int action); - }; - class TheTech : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot13 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot17 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot18 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot23 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; - ASound _soundHandler1, _soundHandler2; - SpeakerQR _speakerQR; - SpeakerML _speakerML; - SpeakerMR _speakerMR; - SpeakerSR _speakerSR; - SpeakerCHFL _speakerCHFL; - SpeakerPL _speakerPL; - SpeakerPText _speakerPText; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SpeakerCHFR _speakerCHFR; - SpeakerQL _speakerQL; - SpeakerCHFText _speakerCHFText; - SceneObject _smoke1, _hotspot2, _lander, _olo, _hotspot5, _rope; - Miranda _miranda; - Hotspot8 _hotspot8; - GuardRock _guardRock; - Ladder _ladder; - DisplayHotspot _forceField; - TheTech _theTech; - Hotspot13 _hotspot13; - Hotspot _hotspot14, _hotspot15, _hotspot16; - Hotspot17 _hotspot17; - Hotspot18 _hotspot18; - DisplayHotspot _hotspot19, _hotspot20, _hotspot21, _hotspot22; - Hotspot23 _hotspot23; - DisplayHotspot _hotspot24, _hotspot25, _hotspot26; - SceneObject _smoke2; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Action9 _action9; - Action10 _action10; - Action11 _action11; - Action12 _action12; - Action13 _action13; - - Scene4000(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4010 : public Scene { -public: - SequenceManager _sequenceManager; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SceneObject _hotspot1, _hotspot2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); -}; - -class Scene4025 : public Scene { - /* Custom classes */ - class Peg; - - class Hole : public SceneObject { - public: - Peg *_pegPtr; - int _armStrip; - Common::Point _newPosition; - - virtual void synchronize(Serializer &s); - virtual void doAction(int action); - }; - class Peg : public SceneObject { - public: - int _field88; - int _armStrip; - - Peg() : SceneObject() { _field88 = 0; _armStrip = 3; } - virtual void synchronize(Serializer &s); - virtual void doAction(int action); - }; - - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; -public: - SequenceManager _sequenceManager; - GfxButton _gfxButton; - SceneObject _armHotspot; - Hole _hole1, _hole2, _hole3, _hole4, _hole5; - Peg _peg1, _peg2, _peg3, _peg4, _peg5; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Peg *_pegPtr, *_pegPtr2; - Hole *_holePtr; - - Scene4025(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void synchronize(Serializer &s); - virtual void remove(); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); -}; - -class Scene4045 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class OlloStand : public SceneObject { - public: - virtual void doAction(int action); - }; - class Miranda : public SceneObject { - public: - virtual void doAction(int action); - }; - class Necklace : public SceneObject { - public: - virtual void doAction(int action); - }; - -public: - SequenceManager _sequenceManager; - SpeakerQR _speakerQR; - SpeakerML _speakerML; - SpeakerPR _speakerPR; - SpeakerPText _speakerPText; - SpeakerQText _speakerQText; - SpeakerQL _speakerQL; - OlloStand _olloStand; - Miranda _miranda; - DisplayHotspot _flame; - SceneObject _hotspot4, _olloFace; - Necklace _necklace; - DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14; - Action1 _action1; - Action2 _action2; - Action3 _action3; - - Scene4045(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void stripCallback(int v); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4050 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot15 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot17 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SpeakerPText _speakerPText; - SpeakerQText _speakerQText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5; - DisplayHotspot _hotspot6, _hotspot7, _hotspot8, _hotspot9, _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13; - SceneObject _hotspot14; - Hotspot15 _hotspot15; - SceneObject _hotspot16; - Hotspot17 _hotspot17; - - Scene4050(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4100 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Miranda : public SceneObject { - public: - virtual void doAction(int action); - }; - class Ladder : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot14 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - SpeakerMText _speakerMText; - SpeakerML _speakerML; - SpeakerQText _speakerQText; - SpeakerQR _speakerQR; - SpeakerCHFText _speakerCHFText; - SpeakerCDRText _speakerCDRText; - SpeakerCDR _speakerCDR; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - DisplayHotspot _hotspot3, _hotspot4; - Miranda _miranda; - Ladder _ladder; - DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13; - Hotspot14 _hotspot14; - - Scene4100(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4150 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class HotspotGroup1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class HotspotGroup3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class HotspotGroup6 : public SceneObject { - public: - virtual void doAction(int action); - }; - - class Hotspot3 : public SceneObject { - public: - virtual void doAction(int action); - }; - -public: - SequenceManager _sequenceManager; - ASound _soundHandler; - SpeakerQText _speakerQText; - SpeakerQR _speakerQR; - SpeakerCDL _speakerCDL; - Action1 _action1; - Action2 _action2; - Action3 _action3; - DisplayHotspot _hotspot1, _hotspot2; - Hotspot3 _hotspot3; - SceneObject _hotspot4; - HotspotGroup1 _hotspot5, _hotspot6; - DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10, _hotspot11, _hotspot12; - HotspotGroup3 _hotspot13, _hotspot14, _hotspot15, _hotspot16; - DisplayHotspot _hotspot17, _hotspot18, _hotspot19, _hotspot20, _hotspot21; - DisplayHotspot _hotspot22, _hotspot23, _hotspot24; - HotspotGroup6 _hotspot25, _hotspot26; - - Scene4150(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4250 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot6 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - -public: - SequenceManager _sequenceManager; - ASound _soundHandler; - SpeakerSR _speakerSR; - SpeakerSL _speakerSL; - SpeakerSText _speakerSText; - SpeakerGameText _speakerGameText; - SpeakerQL _speakerQL; - SpeakerQR _speakerQR; - SpeakerQText _speakerQText; - SpeakerPText _speakerPText; - SpeakerMText _speakerMText; - SpeakerFLText _speakerFLText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - SceneObject _hotspot3; - Hotspot4 _hotspot4; - SceneObject _hotspot5; - Hotspot6 _hotspot6; - DisplayHotspot _hotspot7; - Hotspot8 _hotspot8; - - Scene4250(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene4300 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot9 : public NamedHotspot { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot15 : public SceneObject { - public: - virtual void signal(); - }; - class Hotspot16 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot17 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot19 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler1, _soundHandler2; - SequenceManager _sequenceManager; - GfxButton _gfxButton; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - SpeakerMText _speakerMText; - SpeakerFLText _speakerFLText; - - SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4; - SceneObject _hotspot5, _hotspot6, _hotspot7; - Hotspot8 _hotspot8; - Hotspot9 _hotspot9; - Hotspot10 _hotspot10; - NamedHotspot _hotspot11; - SceneObject _hotspot12, _hotspot13, _hotspot14; - Hotspot15 _hotspot15; - Hotspot16 _hotspot16; - Hotspot17 _hotspot17; - DisplayHotspot _hotspot18; - Hotspot19 _hotspot19; - Action1 _action1; - Action2 _action2; - - Scene4300(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void stripCallback(int v); - virtual void remove(); - virtual void signal(); - virtual void dispatch(); - virtual void process(Event &event); -}; - -class Scene4301 : public Scene { - /* Actions */ - class Action1 : public ActionExt { - public: - SceneObject _buttonList[6]; - int _field34E; - int _indexList[6]; - - virtual void synchronize(Serializer &s); - virtual void remove(); - virtual void signal(); - virtual void process(Event &event); - }; - - /* Hotspots */ - class Hotspot4 : public NamedHotspot { - public: - virtual void doAction(int action); - }; - class Hotspot5 : public NamedHotspot { - public: - virtual void doAction(int action); - }; - -public: - Common::List _list1; - SequenceManager _sequenceManager; - ASound _soundHandler; - Action1 _action1; - SceneObject _hotspot1, _hotspot2, _hotspot3; - Hotspot4 _hotspot4; - Hotspot5 _hotspot5; - bool _field68E; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void dispatch(); - virtual void synchronize(Serializer &s) { - Scene::synchronize(s); - s.syncAsSint16LE(_field68E); - } -}; - - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp deleted file mode 100644 index 68c184196c..0000000000 --- a/engines/tsage/ringworld_scenes6.cpp +++ /dev/null @@ -1,2200 +0,0 @@ -/* 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. - * - */ - -#include "tsage/ringworld_scenes6.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -/*-------------------------------------------------------------------------- - * Scene 5000 - Caverns - Entrance - * - *--------------------------------------------------------------------------*/ - -void Scene5000::Action1::signal() { - // Ship landing - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_soundHandler.play(190); - scene->_soundHandler.holdAt(true); - ADD_MOVER(scene->_hotspot1, 283, 12); - break; - case 2: - break; - case 3: - scene->_hotspot1._moveDiff.y = 1; - scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x, - scene->_hotspot1._position.y + 15)); - scene->_hotspot4.show(); - setDelay(15); - break; - case 4: - scene->_soundHandler.release(); - ADD_MOVER(scene->_hotspot1, 233, 80); - break; - case 5: - scene->_hotspot3.animate(ANIM_MODE_8, 0, NULL); - scene->_hotspot3.show(); - ADD_MOVER(scene->_hotspot1, 233, 90); - break; - case 6: - scene->_hotspot3.remove(); - scene->_hotspot2.setPosition(Common::Point(233, 76)); - scene->_hotspot2.show(); - scene->_hotspot2.animate(ANIM_MODE_5, this); - - scene->_hotspot4.remove(); - break; - case 7: - setDelay(60); - scene->_hotspot2.remove(); - break; - case 8: - scene->_hotspot5.show(); - scene->_hotspot5.animate(ANIM_MODE_5, this); - break; - case 9: - scene->setAction(&scene->_action2); - break; - } -} - -void Scene5000::Action1::dispatch() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - Action::dispatch(); - - if (_actionIndex == 3) { - if (scene->_hotspot1._percent % 2 == 0) { - ++scene->_hotspot1._position.y; - if (scene->_hotspot1._position.x > 233) - --scene->_hotspot1._position.x; - } - - scene->_hotspot1.changeZoom(++scene->_hotspot1._percent); - scene->_hotspot1._flags |= OBJFLAG_PANES; - - if (scene->_hotspot1._percent >= 100) - signal(); - } - - if ((_actionIndex == 5) || (_actionIndex == 6)) { - scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x, - scene->_hotspot1._position.y + 15)); - } -} - -void Scene5000::Action2::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.setPosition(Common::Point(217, 76)); - setDelay(10); - break; - case 1: - _globals->_player.setStrip2(3); - _globals->_player.animate(ANIM_MODE_1, NULL); - ADD_MOVER(_globals->_player, 214, 89); - break; - case 2: - if (!_globals->getFlag(59)) - setAction(&scene->_action3, this); - _globals->_player.fixPriority(15); - ADD_MOVER(_globals->_player, 208, 100); - break; - case 3: - ADD_MOVER(_globals->_player, 213, 98); - break; - case 4: - _globals->_player.fixPriority(20); - ADD_MOVER(_globals->_player, 215, 115); - break; - case 5: - _globals->_player.changeZoom(47); - ADD_MOVER(_globals->_player, 220, 125); - break; - case 6: - ADD_MOVER(_globals->_player, 229, 115); - break; - case 7: - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(35); - ADD_MOVER(_globals->_player, 201, 166); - break; - case 8: - _globals->_player.updateZoom(); - ADD_MOVER(_globals->_player, 205, 146); - break; - case 9: - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(50); - ADD_MOVER(_globals->_player, 220, 182); - break; - case 10: - _globals->_player.updateZoom(); - ADD_MOVER(_globals->_player, 208, 163); - break; - case 11: - _globals->_player.changeZoom(-1); - _globals->_player.setStrip2(-1); - _globals->_player.fixPriority(-1); - ADD_MOVER(_globals->_player, 208, 175); - break; - case 12: - _globals->_player.setStrip(8); - _globals->_player.setFrame(1); - setDelay(10); - break; - case 13: - if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) - setDelay(10); - break; - case 14: - setDelay(30); - break; - case 15: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene5000::Action3::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(10); - break; - case 1: - scene->_hotspot7.postInit(); - scene->_hotspot7.setVisage(2809); - scene->_hotspot7.setObjectWrapper(new SceneObjectWrapper()); - scene->_hotspot7.setPosition(Common::Point(217, 76)); - scene->_hotspot7.changeZoom(10); - scene->_hotspot7.setStrip2(3); - scene->_hotspot7.fixPriority(200); - scene->_hotspot7._moveDiff.y = 2; - scene->_hotspot7.animate(ANIM_MODE_1, NULL); - ADD_MOVER(scene->_hotspot7, 214, 89); - - _globals->_sceneItems.push_front(&scene->_hotspot7); - break; - case 2: - scene->_hotspot7.changeZoom(-1); - scene->_hotspot7.fixPriority(14); - ADD_MOVER(scene->_hotspot7, 208, 100); - break; - case 3: - ADD_MOVER(scene->_hotspot7, 213, 98); - break; - case 4: - scene->_hotspot7.fixPriority(19); - ADD_MOVER(scene->_hotspot7, 215, 115); - break; - case 5: - scene->_hotspot7.changeZoom(46); - ADD_MOVER(scene->_hotspot7, 220, 125); - break; - case 6: - ADD_MOVER(scene->_hotspot7, 229, 115); - break; - case 7: - scene->_hotspot7.changeZoom(-1); - scene->_hotspot7.fixPriority(34); - ADD_MOVER(scene->_hotspot7, 201, 166); - break; - case 8: - scene->_hotspot7.updateZoom(); - ADD_MOVER(scene->_hotspot7, 205, 146); - break; - case 9: - scene->_hotspot7.changeZoom(-1); - scene->_hotspot7.fixPriority(49); - ADD_MOVER(scene->_hotspot7, 210, 182); - break; - case 10: - scene->_hotspot7.updateZoom(); - ADD_MOVER(scene->_hotspot7, 208, 163); - break; - case 11: - scene->_hotspot7.changeZoom(-1); - scene->_hotspot7.setStrip2(-1); - scene->_hotspot7.fixPriority(-1); - ADD_MOVER(scene->_hotspot7, 175, 166); - break; - case 12: - ADD_MOVER(scene->_hotspot7, 126, 146); - break; - case 13: - scene->_hotspot7.setStrip(2); - remove(); - break; - } -} - -void Scene5000::Action4::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: - _globals->_player.fixPriority(50); - _globals->_player.setStrip2(4); - ADD_MOVER(_globals->_player, 210, 182); - break; - case 2: - ADD_MOVER(_globals->_player, 205, 146); - break; - case 3: - _globals->_player.fixPriority(35); - ADD_MOVER(_globals->_player, 201, 166); - break; - case 4: - ADD_MOVER(_globals->_player, 229, 115); - break; - case 5: - _globals->_player.fixPriority(20); - _globals->_player.changeZoom(47); - ADD_MOVER(_globals->_player, 220, 125); - break; - case 6: - ADD_MOVER(_globals->_player, 215, 115); - break; - case 7: - _globals->_player.changeZoom(-1); - ADD_MOVER(_globals->_player, 213, 98); - break; - case 8: - _globals->_player.fixPriority(15); - ADD_MOVER(_globals->_player, 208, 100); - break; - case 9: - ADD_MOVER(_globals->_player, 214, 89); - break; - case 10: - ADD_MOVER(_globals->_player, 217, 76); - break; - case 11: - _globals->_player.hide(); - setDelay(60); - break; - case 12: - if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) - _globals->_sceneManager.changeScene(2320); - remove(); - break; - } -} - -void Scene5000::Action5::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_MOVER(_globals->_player, 91, 155); - break; - case 1: - _globals->_player.setVisage(2670); - _globals->_player._strip = 4; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - SceneItem::display2(5000, _globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - _globals->_player.setVisage(0); - _globals->_player._strip = 8; - _globals->_player.animate(ANIM_MODE_1, NULL); - - _globals->_player.enableControl(); - remove(); - } -} - -void Scene5000::Action6::signal() { - // Discussion between the hero and Seeker, then the hero goes back to the lander - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - _globals->_events.setCursor(CURSOR_WALK); - scene->_stripManager.start(2150, this); - break; - case 2: - _globals->_events.setCursor(CURSOR_NONE); - scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL); - break; - case 3: - ADD_PLAYER_MOVER(208, 163); - break; - case 4: - _globals->_player.fixPriority(50); - _globals->_player.setStrip2(4); - ADD_MOVER(_globals->_player, 210, 182); - break; - case 5: - _globals->_sceneManager.changeScene(2100); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene5000::Hotspot7::doAction(int action) { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5000, 12); - break; - case CURSOR_TALK: - scene->setAction(&scene->_action6); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5000::Hotspot8::doAction(int action) { - // Cave - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5000, 10); - break; - case OBJECT_STUNNER: - SceneItem::display2(5000, 14); - break; - case OBJECT_SCANNER: - scene->setAction(&scene->_action5); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5000::HotspotGroup1::doAction(int action) { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; - - if (_globals->_sceneObjects->contains(&scene->_hotspot7)) - scene->setAction(&scene->_action6); - else - SceneItem::display2(5000, 11); -} -/*--------------------------------------------------------------------------*/ - -Scene5000::Scene5000() : - _hotspot1(0, CURSOR_LOOK, 5000, 3, LIST_END), - _hotspot12(0, CURSOR_LOOK, 5000, 6, CURSOR_USE, 5000, 7, OBJECT_STUNNER, 5000, 14, - OBJECT_SCANNER, 5000, 16, LIST_END), - _hotspot13(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0, - OBJECT_SCANNER, 5000, 16, LIST_END), - _hotspot14(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0, - OBJECT_SCANNER, 5000, 16, LIST_END), - _hotspot15(0, CURSOR_LOOK, 5000, 2, OBJECT_STUNNER, 5000, 15, LIST_END), - _hotspot16(0, CURSOR_LOOK, 5000, 4, CURSOR_USE, 5000, 5, LIST_END), - _hotspot17(0, CURSOR_LOOK, 5000, 1, LIST_END), - _hotspot18(0, CURSOR_LOOK, 5000, 0, LIST_END) { -} - - -void Scene5000::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - loadScene(5000); - - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerQText); - - _globals->_player.postInit(); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(4, 2); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); - - _hotspot1.postInit(); - _hotspot1.setVisage(5001); - _hotspot1.setFrame2(1); - _hotspot1._moveDiff = Common::Point(5, 5); - _hotspot1.fixPriority(10); - _hotspot1.changeZoom(10); - - _hotspot4.postInit(); - _hotspot4.setVisage(5001); - _hotspot4.setStrip2(2); - _hotspot4._moveDiff = Common::Point(5, 1); - _hotspot4.fixPriority(10); - _hotspot4.changeZoom(100); - _hotspot4.animate(ANIM_MODE_8, 0, NULL); - _hotspot4.hide(); - - _hotspot2.postInit(); - _hotspot2.setVisage(5001); - _hotspot2.setStrip2(3); - _hotspot2._numFrames = 5; - _hotspot2.hide(); - - _hotspot3.postInit(); - _hotspot3.setVisage(5001); - _hotspot3.setStrip2(5); - _hotspot3._numFrames = 5; - _hotspot3.setPosition(Common::Point(233, 76)); - _hotspot3.hide(); - - _hotspot5.postInit(); - _hotspot5.setVisage(5001); - _hotspot5.setStrip2(4); - _hotspot5._numFrames = 5; - _hotspot5.fixPriority(15); - _hotspot5.setPosition(Common::Point(218, 76)); - _hotspot5.hide(); - - _hotspot9.postInit(); - _hotspot9.setVisage(5002); - _hotspot9.fixPriority(80); - _hotspot9.setPosition(Common::Point(71, 174)); - - _hotspot10.postInit(); - _hotspot10.setVisage(5002); - _hotspot10.setStrip2(2); - _hotspot10.setPosition(Common::Point(87, 120)); - - _hotspot11.postInit(); - _hotspot11.setVisage(5002); - _hotspot11.setStrip2(2); - _hotspot11.setFrame(3); - _hotspot10.setPosition(Common::Point(93, 118)); - - setZoomPercents(95, 10, 145, 100); - - _hotspot8.setBounds(Rect(0, 73, 87, 144)); - _hotspot18.setBounds(Rect(54, 0, 319, 85)); - _hotspot17.setBounds(Rect(184, 0, 199, 79)); - _hotspot13.setBounds(Rect(0, 164, 135, 200)); - _hotspot14.setBounds(Rect(0, 0, 105, 140)); - _hotspot15.setBounds(Rect(266, 70, 291, 85)); - _hotspot16.setBounds(Rect(0, 86, 319, 200)); - _hotspot12.setBounds(Rect(230, 143, 244, 150)); - - _globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13, - &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL); - - switch (_globals->_sceneManager._previousScene) { - case 1000: - case 2100: - case 2320: - if (_globals->getFlag(59)) { - _hotspot1.setPosition(Common::Point(233, 90)); - _hotspot1.changeZoom(100); - _hotspot1.show(); - - _hotspot5.setFrame(1); - _hotspot5.animate(ANIM_MODE_5, NULL); - _hotspot5.setPosition(Common::Point(218, 76)); - _hotspot5.show(); - - _globals->_player.setPosition(Common::Point(217, -10)); - _globals->_player.disableControl(); - - setAction(&_action2); - } else { - _globals->_player.setPosition(Common::Point(217, -10)); - _hotspot1.setPosition(Common::Point(320, -10)); - _globals->_player.disableControl(); - - setAction(&_action1); - } - break; - default: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(0, 146)); - - _hotspot1.changeZoom(100); - _hotspot1.setPosition(Common::Point(233, 90)); - _hotspot1.show(); - - _hotspot5.setFrame(_hotspot5.getFrameCount()); - _hotspot5.show(); - - _sceneMode = 5004; - setAction(&_sequenceManager, this, 5004, &_globals->_player, NULL); - break; - } - - _globals->_soundHandler.play(190); -} - -void Scene5000::signal() { - switch (_sceneMode) { - case 5002: - case 5003: - case 5004: - _globals->_player.enableControl(); - break; - case 5005: - _globals->_sceneManager.changeScene(5100); - break; - } -} - -void Scene5000::dispatch() { - Scene::dispatch(); - - if (!_action) { - if (!_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 10)) { - _globals->_player.disableControl(); - _sceneMode = 5005; - setAction(&_sequenceManager, this, 5005, &_globals->_player, NULL); - } - - if (_globals->_player.getRegionIndex() == 8) { - _globals->_player.disableControl(); - - if (_globals->_sceneObjects->contains(&_hotspot7)) { - _sceneMode = 5003; - _globals->_player.addMover(NULL); - setAction(&_sequenceManager, this, 5003, &_globals->_player, NULL); - } else { - setAction(&_action4); - } - } - - if (_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 15)) { - _sceneMode = 5002; - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - setAction(&_sequenceManager, this, 5002, &_globals->_player, NULL); - } - } -} - -/*-------------------------------------------------------------------------- - * Scene 5100 - Caverns - * - *--------------------------------------------------------------------------*/ - -void Scene5100::Action1::signal() { - // Quinn enters the cave for the first time - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - ADD_MOVER(_globals->_player, 1111, 165); - break; - case 2: - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); - setDelay(60); - break; - case 3: - if (_globals->getFlag(10)) { - _globals->_player.enableControl(); - remove(); - } else { - _globals->setFlag(10); - scene->_stripManager.start(5102, this); - } - break; - case 4: - scene->_soundHandler.play(206); - - scene->_hotspot5.postInit(); - scene->_hotspot5.setVisage(5362); - scene->_hotspot5.setPosition(Common::Point(1160, 34)); - scene->_hotspot5.setStrip2(2); - scene->_hotspot5.animate(ANIM_MODE_1, NULL); - scene->_hotspot5.fixPriority(10); - - _globals->_sceneItems.push_front(&scene->_hotspot5); - ADD_MOVER(scene->_hotspot5, 999, 14); - break; - case 5: - scene->_hotspot5.setStrip2(4); - scene->_hotspot5._frame = 1; - scene->_hotspot5.animate(ANIM_MODE_5, this); - break; - case 6: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene5100::Action2::signal() { - // Quinn and Seeker exit the cave - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(5); - break; - case 1: - if (scene->_hotspot8._visage == 2806) - setDelay(1); - else - scene->_hotspot8.animate(ANIM_MODE_5, this); - break; - case 2: - if (scene->_hotspot8._visage != 2806) { - scene->_hotspot8.setVisage(2806); - scene->_hotspot8.setPosition(Common::Point(548, 193)); - scene->_hotspot8.animate(ANIM_MODE_1, NULL); - scene->_hotspot8._angle = 325; - scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper()); - scene->_hotspot8.setStrip(8); - } - - scene->_stripManager.start(5129, this); - break; - case 3: - if (_globals->_player._position.x >= 966) { - ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); - } else { - ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185); - } - - if (_globals->_player._position.x >= 966) { - setDelay(1); - } else { - ADD_PLAYER_MOVER(966, 190); - } - break; - case 4: - ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); - ADD_PLAYER_MOVER(1215, 155); - break; - case 5: - _globals->_sceneManager.changeScene(2100); - break; - } -} - -void Scene5100::Action3::signal() { - // Quinns shots flesheater - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->setFlag(62); - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - - scene->_hotspot2.addMover(NULL); - scene->_hotspot3.addMover(NULL); - _globals->_player.setVisage(2672); - - if (static_cast(_owner)->_position.x >= _globals->_player._position.x) - _globals->_player._strip = 4; - else - _globals->_player._strip = 3; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 1: - _globals->_player.setVisage(2674); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 2: - scene->_soundHandler.play(28); - if (static_cast(_owner)->_position.x < _globals->_player._position.x) { - scene->_hotspot2.setVisage(5130); - scene->_hotspot2._strip = 1; - scene->_hotspot2._frame = 1; - scene->_hotspot2.animate(ANIM_MODE_5, this); - scene->_hotspot2.setAction(NULL); - - scene->_hotspot3.setStrip2(1); - ADD_PLAYER_MOVER_NULL(scene->_hotspot3, 1200, 100); - } else { - scene->_hotspot3.setVisage(5130); - scene->_hotspot3._strip = 1; - scene->_hotspot3._frame = 1; - scene->_hotspot3.animate(ANIM_MODE_5, this); - scene->_hotspot3.setAction(NULL); - - scene->_hotspot2.setStrip2(2); - ADD_PLAYER_MOVER_NULL(scene->_hotspot2, 10, 140); - - } - - _globals->_player.setVisage(2672); - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, this); - break; - case 3: - break; - case 4: - SceneItem::display2(5100, 38); - _globals->_player.enableControl(); - - _globals->_player.setVisage(0); - _globals->_player._strip = 8; - _globals->_player.animate(ANIM_MODE_1, NULL); - remove(); - break; - } -} - -void Scene5100::Action4::signal() { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - _globals->_player.disableControl(); - scene->_soundHandler.play(208); - SceneItem::display2(5100, 15); - - ObjectMover3 *mover = new ObjectMover3(); - scene->_hotspot2.addMover(mover, &_globals->_player, 20, this); - break; - } - case 1: - scene->_hotspot1.postInit(); - scene->_hotspot1.setVisage(5120); - scene->_hotspot1.setPosition(Common::Point(795, 161)); - scene->_hotspot1._strip = 4; - scene->_hotspot1.animate(ANIM_MODE_5, this); - break; - case 2: - setDelay(15); - break; - case 3: - _globals->_sceneManager.changeScene(5200); - break; - } -} - -void Scene5100::Action5::signal() { - // Quinns forgot the statis box in the throne room, and goes back - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(60); - break; - case 1: - scene->_stripManager.start(5128, this); - break; - case 2: - setDelay(15); - break; - case 3: - scene->_sceneMode = 5106; - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene5100::HotspotGroup1::doAction(int action) { - // Flesh Eaters - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, _globals->getFlag(62) ? 41 : 26); - break; - case CURSOR_USE: - SceneItem::display2(5100, 11); - break; - case OBJECT_SCANNER: - SceneItem::display2(5100, 17); - break; - case OBJECT_STUNNER: - if (_globals->getFlag(62)) - SceneItem::display2(5100, 42); - else - setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot4::doAction(int action) { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, 31); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 5110; - scene->setAction(&scene->_sequenceManager, scene, 5110, &_globals->_player, this, &scene->_hotspot7, NULL); - break; - case CURSOR_TALK: - SceneItem::display2(5100, 34); - break; - case OBJECT_STUNNER: - SceneItem::display2(5100, 36); - break; - case OBJECT_SCANNER: - SceneItem::display2(5100, 37); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::HotspotGroup2::doAction(int action) { - // Bat - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, _globals->getFlag(108) ? 47 : 23); - break; - case CURSOR_USE: - SceneItem::display2(5100, 29); - break; - case CURSOR_TALK: - if (_position.x >= 600) - SceneItem::display2(5100, 28); - else { - _globals->_player.disableControl(); - scene->_sceneMode = 5114; - scene->setAction(&scene->_sequenceManager, scene, 5114, NULL); - } - break; - case OBJECT_SCANNER: - SceneItem::display2(5100, 43); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot9::doAction(int action) { - // Rope - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, 32); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 5117; - scene->setAction(&scene->_sequenceManager, scene, 5117, &_globals->_player, NULL); - break; - case OBJECT_STUNNER: - SceneItem::display2(5100, 35); - break; - case OBJECT_SCANNER: - SceneItem::display2(5100, 44); - break; - case OBJECT_BONE: - _globals->_player.disableControl(); - scene->_sceneMode = 5116; - scene->setAction(&scene->_sequenceManager, scene, 5116, &_globals->_player, this, &scene->_hotspot10, - &scene->_hotspot4, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot17::doAction(int action) { - // Rock blocking pit entrance - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, 18); - break; - case CURSOR_USE: - if (_globals->getFlag(67)) - SceneItem::display2(5100, 19); - else { - _globals->_player.disableControl(); - scene->_sceneMode = 5101; - scene->setAction(&scene->_sequenceManager, scene, 5101, &_globals->_player, this, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot18::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->_sceneManager._previousScene != 5000) { - SceneItem::display2(5100, 3); - } else { - switch (_index1) { - case 0: - SceneItem::display2(5100, 0); - ++_index1; - break; - case 1: - SceneItem::display2(5100, 1); - ++_index1; - break; - default: - SceneItem::display2(5100, 2); - break; - } - } - break; - case CURSOR_USE: - switch (_index2) { - case 0: - SceneItem::display2(5100, 8); - ++_index2; - break; - case 1: - SceneItem::display2(5100, 9); - ++_index2; - break; - default: - SceneItem::display2(5100, 10); - break; - } - break; - - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot19::doAction(int action) { - // Pillar - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, _globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - scene->_sceneMode = 5106; - - if (_globals->getFlag(66)) - scene->setAction(&scene->_sequenceManager, scene, 5113, &_globals->_player, NULL); - else { - _globals->setFlag(66); - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5100::Hotspot20::doAction(int action) { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5100, 21); - break; - case CURSOR_USE: - _globals->_player.disableControl(); - - if (_globals->getFlag(67)) { - scene->_sceneMode = 5112; - scene->setAction(&scene->_sequenceManager, scene, 5112, &_globals->_player, NULL); - } else { - scene->_sceneMode = 5101; - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot17, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene5100::Scene5100() : - _hotspot16(0, CURSOR_LOOK, 5100, 48, LIST_END), - _hotspot21(0, CURSOR_LOOK, 5100, 4, CURSOR_USE, 5100, 5, LIST_END) { -} - -void Scene5100::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(50, 10, 200, 100); - _sceneMode = 0; - - _stripManager.addSpeaker(&_speakerMText); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - _stripManager.addSpeaker(&_speakerBatText); - _speakerQText._npc = &_globals->_player; - _speakerMText._npc = &_globals->_player; - _speakerSText._npc = &_hotspot8; - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.disableControl(); - - if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { - _hotspot14.postInit(); - _hotspot14.setVisage(5101); - _hotspot14.setPosition(Common::Point(498, 147)); - _hotspot14.fixPriority(200); - _hotspot14._moveDiff.y = 10; - } - - _hotspot17.postInit(); - _hotspot17.setVisage(5101); - _hotspot17._strip = 2; - _hotspot17.fixPriority(200); - - if (_globals->getFlag(67)) - _hotspot17.setPosition(Common::Point(554, 192)); - else - _hotspot17.setPosition(Common::Point(539, 179)); - - _hotspot19.setBounds(Rect(488, 115, 508, 148)); - _hotspot21.setBounds(Rect(1150, 85, 1173, 112)); - _hotspot20.setBounds(Rect(517, 193, 562, 200)); - _globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL); - - if (_globals->getFlag(67)) { - _globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL); - } else { - _globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL); - } - - if (!_globals->getFlag(105)) { - _hotspot4.postInit(); - _hotspot4.setVisage(5363); - _hotspot4.setPosition(Common::Point(1025, 65)); - _hotspot4.setStrip(4); - _hotspot4.animate(ANIM_MODE_7, 0, NULL);; - _globals->_sceneItems.push_back(&_hotspot4); - - _hotspot9.postInit(); - _hotspot9.setVisage(5363); - _hotspot9.setPosition(Common::Point(966, 120)); - _globals->_sceneItems.push_back(&_hotspot9); - - _hotspot10.postInit(); - _hotspot10.setVisage(5363); - _hotspot10.setPosition(Common::Point(999, 68)); - _hotspot10.setStrip(2); - - _hotspot6.postInit(); - _hotspot6.setVisage(5362); - _hotspot6.setPosition(Common::Point(1017, 34)); - _hotspot6._strip = 4; - _hotspot6._frame = _hotspot6.getFrameCount(); - _globals->_sceneItems.push_back(&_hotspot6); - } - - _hotspot16._sceneRegionId = 15; - _globals->_sceneItems.push_back(&_hotspot16); - - if (!_globals->getFlag(62)) { - _hotspot2.postInit(); - _hotspot2.setVisage(5110); - _hotspot2.animate(ANIM_MODE_1, NULL); - _hotspot2._moveDiff.x = 4; - _globals->_sceneItems.push_back(&_hotspot2); - - _hotspot3.postInit(); - _hotspot3.setVisage(5110); - _hotspot3.animate(ANIM_MODE_1, NULL); - _hotspot3._moveDiff.x = 4; - _globals->_sceneItems.push_back(&_hotspot3); - - if (_globals->getFlag(61)) { - _hotspot2.setPosition(Common::Point(483, 189)); - _hotspot3.setPosition(Common::Point(811, 182)); - } else { - _hotspot2.setPosition(Common::Point(610, 170)); - _hotspot3.setPosition(Common::Point(600, 180)); - } - } - - if (_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) && - _globals->getFlag(107) && _globals->getFlag(67)) { - _hotspot8.postInit(); - _hotspot8.setVisage(2806); - _hotspot8.setPosition(Common::Point(557, 178)); - _hotspot8.animate(ANIM_MODE_1, NULL); - _hotspot8.setObjectWrapper(new SceneObjectWrapper()); - - _globals->clearFlag(59); - } - - switch (_globals->_sceneManager._previousScene) { - case 5000: - default: - _globals->_player.setPosition(Common::Point(1184, 160)); - setAction(&_action1); - break; - case 5200: - if (_globals->_stripNum == 5200) { - _globals->_player.setVisage(5101); - _globals->_player.fixPriority(200); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(513, 199)); - - _sceneMode = 5108; - setAction(&_sequenceManager, this, 5108, &_globals->_player, NULL); - } else { - _globals->_player.setPosition(Common::Point(20, 175)); - - _hotspot13.postInit(); - _hotspot13.setVisage(5110); - _hotspot13.setPosition(Common::Point(578, 192)); - _hotspot13._strip = 2; - - _hotspot11.postInit(); - _hotspot11.setVisage(5110); - _hotspot11.setPosition(Common::Point(5, 162)); - _hotspot11.setStrip2(1); - _hotspot11._moveDiff = Common::Point(4, 2); - _hotspot11.animate(ANIM_MODE_1, NULL); - - ObjectMover2 *mover = new ObjectMover2(); - _hotspot11.addMover(mover, 15, 20, &_globals->_player); - - _hotspot12.postInit(); - _hotspot12.setVisage(5110); - _hotspot12.setPosition(Common::Point(15, 164)); - _hotspot12.setStrip2(1); - _hotspot12._moveDiff = Common::Point(4, 2); - _hotspot12.animate(ANIM_MODE_1, NULL); - - ObjectMover2 *mover2 = new ObjectMover2(); - _hotspot12.addMover(mover2, 25, 50, &_globals->_player); - - _hotspot17.setPosition(Common::Point(554, 182)); - _globals->_player.disableControl(); - - _sceneMode = 5105; - setAction(&_sequenceManager, this, 5105, &_globals->_player, NULL); - } - break; - case 5300: - switch (_globals->_stripNum) { - case 5300: - _sceneMode = 5111; - - _globals->_player.setVisage(5101); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(170); - _globals->_player.setPosition(Common::Point(1168, 110)); - - setAction(&_sequenceManager, this, 5111, &_globals->_player, NULL); - _hotspot8.setPosition(Common::Point(1107, 178)); - break; - case 5302: - _globals->_player.setPosition(Common::Point(512, 190)); - - if (_globals->_sceneObjects->contains(&_hotspot8)) - setAction(&_action2); - else - _globals->_player.enableControl(); - break; - case 5303: - _hotspot8.setVisage(5102); - _hotspot8.setPosition(Common::Point(533, 172)); - _globals->_player.setPosition(Common::Point(512, 190)); - setAction(&_action2); - break; - } - - if (_globals->getFlag(108)) { - _hotspot6.postInit(); - _hotspot6.setVisage(5362); - _hotspot6.setPosition(Common::Point(542, 19)); - _hotspot6.setStrip(6); - _hotspot6.setFrame(1); - _globals->_sceneItems.push_back(&_hotspot6); - } else if (RING_INVENTORY._vial._sceneNumber != 5100) { - _hotspot6.postInit(); - _hotspot6.setVisage(5362); - _hotspot6.setPosition(Common::Point(1152, 70)); - _hotspot6.fixPriority(170); - _hotspot6.setStrip(6); - _hotspot6.setFrame(1); - _globals->_sceneItems.push_back(&_hotspot6); - } - break; - } - - _hotspot18.setBounds(Rect(0, 0, 1280, 200)); - _globals->_sceneItems.push_back(&_hotspot18); - - _hotspot15.postInit(); - _hotspot15.setVisage(5140); - _hotspot15.setStrip(3); - _hotspot15.setPosition(Common::Point(977, 173)); - _hotspot15.fixPriority(1); - - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); - loadScene(5100); - _globals->_soundHandler.play(205); -} - -void Scene5100::signal() { - switch (_sceneMode) { - case 5101: - case 5112: - _globals->setFlag(67); - _globals->_sceneManager.changeScene(5300); - break; - case 5102: - case 5114: - _globals->_player.enableControl(); - break; - case 5103: - if (_globals->getFlag(61)) { - SceneItem::display2(5100, 46); - _globals->_sceneManager.changeScene(5300); - } else { - SceneItem::display2(5100, 45); - _globals->_sceneManager.changeScene(5200); - } - break; - case 5105: - _globals->_sceneManager.changeScene(5300); - break; - case 5106: - _globals->_stripNum = 5111; - _globals->_sceneManager.changeScene(5200); - break; - case 5108: - if (!_globals->getFlag(60)) - _globals->_player.enableControl(); - else if (RING_INVENTORY._stasisBox._sceneNumber == 1) - setAction(&_action2); - else - setAction(&_action5); - break; - case 5110: - SceneItem::display2(5100, 30); - _globals->_player._angle = 325; - _globals->_player.enableControl(); - break; - case 5111: - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); - - if ((RING_INVENTORY._vial._sceneNumber != 5100) && !_globals->getFlag(108)) { - _globals->setFlag(108); - _sceneMode = 5130; - _globals->_player.disableControl(); - - _speakerBatText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 20, 30)); - setAction(&_sequenceManager, this, 5130, &_globals->_player, &_hotspot6, NULL); - } else if (_globals->_sceneObjects->contains(&_hotspot8)) { - setAction(&_action2); - } else { - _globals->_player.enableControl(); - } - break; - case 5116: - _globals->setFlag(105); - RING_INVENTORY._bone._sceneNumber = 0; - - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); - // No break on purpose - case 5117: - _globals->_player.enableControl(); - break; - case 5130: - _hotspot6.setVisage(5362); - _hotspot6.setPosition(Common::Point(542, 25)); - _hotspot6.setStrip(6); - _hotspot6.setFrame(1); - _globals->_player.enableControl(); - break; - case 5150: - _globals->clearFlag(60); - _globals->_sceneManager.changeScene(5300); - break; - } -} - -void Scene5100::dispatch() { - // Flesheater trap - if (_hotspot15._bounds.contains(_globals->_player._position) && !_globals->_player._visage) { - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - - _soundHandler.play(207); - _sceneMode = 5103; - setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103, - &_globals->_player, &_hotspot15, NULL); - } - - if (_globals->getFlag(61) && !_globals->getFlag(62) && - ((_globals->_player._position.x - _hotspot2._position.x) < 160) && - (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { - setAction(NULL); - _sceneMode = 5150; - _soundHandler.play(208); - - if (RING_INVENTORY._vial._sceneNumber == 5100) { - _globals->_player.addMover(NULL); - _globals->_player.disableControl(); - SceneItem::display2(5100, 39); - } - - _hotspot2.setStrip2(1); - _hotspot3.setStrip2(2); - - ObjectMover3 *mover1 = new ObjectMover3(); - _hotspot2.addMover(mover1, &_globals->_player, 20, this); - ObjectMover3 *mover2 = new ObjectMover3(); - _hotspot3.addMover(mover2, &_globals->_player, 20, this); - } - - if (!_action) { - if (((_globals->_player._position.x - _hotspot2._position.x) < 130) && !_globals->getFlag(61)) { - _globals->_player._canWalk = false; - _globals->_player.addMover(NULL); - - Common::Point pt(20, 25); - PlayerMover2 *mover = new PlayerMover2(); - _hotspot3.addMover(mover, &pt, &_globals->_player); - setAction(&_action4); - } - - if ((_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= _globals->_player._position.x) - _globals->_sceneManager.changeScene(5000); - - if (_globals->_player.getRegionIndex() == 8) { - _sceneMode = 5114; - setAction(&_sequenceManager, this, 5115, &_globals->_player, NULL); - } - } - - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 5200 - Caverns - Throne Room - * - *--------------------------------------------------------------------------*/ - -void Scene5200::Action1::signal() { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(59) + 120); - break; - case 1: - scene->_hotspot3.animate(ANIM_MODE_8, 1, this); - _actionIndex = 0; - break; - } -} - -void Scene5200::Action2::signal() { - // Quinn obtains the stasis box from the flesheater throne room - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - ADD_PLAYER_MOVER(92, 52); - break; - case 1: - _globals->_player.setVisage(5202); - _globals->_player._strip = 4; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_4, 3, 1, this); - break; - case 2: - scene->_soundHandler.stop(); - scene->_hotspot14.remove(); - - RING_INVENTORY._stasisBox._sceneNumber = 1; - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 3: - _globals->_player.setVisage(0); - _globals->_player._strip = 3; - _globals->_player.animate(ANIM_MODE_1, NULL); - - scene->_hotspot8.animate(ANIM_MODE_2, NULL); - ADD_MOVER(scene->_hotspot8, 141, 77); - break; - case 4: - scene->_soundHandler.play(303); - - scene->_hotspot8._strip = 2; - scene->_hotspot8._frame = 1; - scene->_hotspot8.animate(ANIM_MODE_5, this); - break; - case 5: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene5200::Action3::signal() { - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(5); - break; - case 1: - ADD_PLAYER_MOVER(285, 62); - break; - case 2: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene5200::Action4::signal() { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(120); - break; - case 1: - _globals->_soundHandler.play(209); - scene->_stripManager.start(5202, this, scene); - break; - case 2: - scene->_hotspot6.animate(ANIM_MODE_5, this); - break; - case 3: - setDelay(10); - break; - case 4: - scene->_stripManager.start(5204, this, scene); - break; - case 5: - setDelay(60); - break; - case 6: - _globals->_sceneManager.changeScene(5100); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene5200::Hotspot9::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (!_state) { - ++_state; - SceneItem::display2(5200, 5); - } else { - SceneItem::display2(5200, 6); - } - break; - case CURSOR_USE: - SceneItem::display2(5200, 14); - break; - default: - SceneItem::doAction(action); - break; - } -} - -void Scene5200::Hotspot10::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (!_state) { - ++_state; - SceneItem::display2(5200, 7); - } else { - SceneItem::display2(5200, 8); - } - break; - default: - SceneObject::doAction(action); - break; - } -} - -void Scene5200::Hotspot14::doAction(int action) { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5200, 4); - break; - case CURSOR_USE: - scene->setAction(&scene->_action2); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene5200::Scene5200() : - _hotspot11(0, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END), - _hotspot12(10, CURSOR_LOOK, 5200, 9, LIST_END), - _hotspot13(8, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END) { -} - - -void Scene5200::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(0, 150, 199, 150); - _fieldA = 5600; - _fieldE = 5100; - - _hotspot9._state = 0; - _hotspot10._state = 0; - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerGameText); - _stripManager.addSpeaker(&_speakerFLText); - _stripManager.addSpeaker(&_speakerFLL); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.setCallback(this); - - _speakerFLText._textPos.x = 160; - _speakerQText._textPos.x = 20; - - if (RING_INVENTORY._stasisBox._sceneNumber == 5200) { - _soundHandler.play(216); - _soundHandler.holdAt(true); - - _hotspot14.postInit(); - _hotspot14.setVisage(5202); - _hotspot14._strip = 3; - _hotspot14.setPosition(Common::Point(105, 52)); - _hotspot14.fixPriority(90); - - _hotspot8.postInit(); - _hotspot8.setVisage(5202); - _hotspot8._strip = 1; - _hotspot8.setPosition(Common::Point(96, 53)); - _hotspot8.fixPriority(90); - _globals->_sceneItems.push_back(&_hotspot14); - } - - if (_globals->_stripNum == 5111) { - // Happens when the player enters the throne room via the secret passage, - // after talking with the bat. No NPCs are around and the player can - // obtain the stasis box. - _globals->_soundHandler.play(205); - _globals->_player.disableControl(); - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.changeZoom(75); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); - _globals->_player.setFrame(3); - _globals->_player.setPosition(Common::Point(307, 62)); - - setAction(&_action3); - } else { - // Happens when the player is captured by the flesh eaters the first time. - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player._strip = 1; - _globals->_player._frame = 4; - _globals->_player.setPosition(Common::Point(105, 199)); - - _hotspot5.postInit(); - _hotspot5.setVisage(5210); - _hotspot5._frame = 2; - _hotspot5.setPosition(Common::Point(189, 167)); - - _hotspot6.postInit(); - _hotspot6.setVisage(5210); - _hotspot6._frame = 1; - _hotspot6._strip = 2; - _hotspot6.setPosition(Common::Point(159, 137)); - - _hotspot7.postInit(); - _hotspot7.setVisage(5210); - _hotspot7._frame = 1; - _hotspot7._strip = 4; - _hotspot7.fixPriority(168); - _hotspot7.setPosition(Common::Point(186, 106)); - - _hotspot1.postInit(); - _hotspot1.setVisage(5212); - _hotspot1._frame = 1; - _hotspot1.setPosition(Common::Point(62, 132)); - - _hotspot2.postInit(); - _hotspot2.setVisage(5212); - _hotspot2._strip = 3; - _hotspot2.setPosition(Common::Point(148, 141)); - _hotspot2.fixPriority(90); - - _hotspot3.postInit(); - _hotspot3.setVisage(5212); - _hotspot3._strip = 2; - _hotspot3.setPosition(Common::Point(62, 109)); - _hotspot3.fixPriority(138); - _hotspot3.setAction(&_action1); - - _hotspot4.postInit(); - _hotspot4.setVisage(5212); - _hotspot4._strip = 4; - _hotspot4.setPosition(Common::Point(146, 110)); - _hotspot4.fixPriority(90); - - _globals->_player.disableControl(); - _globals->setFlag(61); - - setAction(&_action4); - } - - _hotspot11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot9._sceneRegionId = 11; - _hotspot10._sceneRegionId = 9; - _hotspot12._sceneRegionId = 10; - _hotspot13._sceneRegionId = 8; - - _globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); - loadScene(5200); -} - -void Scene5200::stripCallback(int v) { - switch (v) { - case 1: - _hotspot7.animate(ANIM_MODE_2, NULL); - break; - case 2: - _hotspot7.animate(ANIM_MODE_NONE, NULL); - break; - } -} - -void Scene5200::dispatch() { - Scene::dispatch(); - - if (!_action && (_globals->_player.getRegionIndex() == 12)) { - _globals->_stripNum = 5200; - _globals->_sceneManager.changeScene(5100); - } -} - -/*-------------------------------------------------------------------------- - * Scene 5300 - Caverns - Pit - * - *--------------------------------------------------------------------------*/ - -void Scene5300::Action1::signal() { - // Seeker waking up - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - scene->_hotspot2._numFrames = 4; - scene->_hotspot2.animate(ANIM_MODE_8, 1, NULL); - setDelay(120); - break; - case 2: - scene->_hotspot2.animate(ANIM_MODE_NONE, NULL); - - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip2(-1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - ADD_MOVER(_globals->_player, 85, 170); - break; - case 3: - scene->_hotspot2.fixPriority(-1); - _globals->_player.checkAngle(&scene->_hotspot2); - setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL); - break; - case 4: - scene->_stripManager.start(5316, this); - break; - case 5: - if (!_globals->getFlag(106) || !_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { - _globals->_player.enableControl(); - remove(); - } else { - _globals->setFlag(60); - scene->_hotspot2._numFrames = 10; - - if (_globals->getFlag(67)) { - scene->_sceneMode = 5310; - scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL); - } else { - scene->_sceneMode = 5347; - scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); - } - } - break; - } -} - -void Scene5300::Action2::signal() { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(60); - break; - case 1: - _globals->setFlag(60); - scene->_stripManager.start(5328, this); - break; - case 2: - if (RING_INVENTORY._stasisBox._sceneNumber == 1) { - _globals->_stripNum = 5303; - setDelay(5); - } else { - _globals->_stripNum = 5302; - scene->_stripManager.start(5329, this); - } - break; - case 3: - _globals->_sceneManager.changeScene(5100); - remove(); - break; - } -} - -void Scene5300::Action3::signal() { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(30); - break; - case 1: - scene->_stripManager.start(_globals->_stripNum, this); - break; - case 2: - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene5300::Hotspot1::doAction(int action) { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5300, 24); - break; - case CURSOR_TALK: - _globals->_stripNum = 5312; - scene->setAction(&scene->_action3); - break; - default: - SceneHotspot::doAction(action); - break; - } -} -void Scene5300::Hotspot2::doAction(int action) { - // Seeker - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5300, 23); - break; - case CURSOR_USE: - if (!_globals->getFlag(106)) { - _globals->_player.disableControl(); - scene->_sceneMode = 5302; - scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); - } else { - SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20); - } - break; - case CURSOR_TALK: - if (!_globals->getFlag(106)) { - _globals->_player.disableControl(); - scene->_sceneMode = 5302; - scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); - } else if (!_globals->getFlag(107)) { - SceneItem::display2(5300, 11); - } else { - _globals->_player.disableControl(); - - if (RING_INVENTORY._stasisBox._sceneNumber != 1) { - scene->_sceneMode = 5316; - scene->setAction(&scene->_sequenceManager, scene, 5316, NULL); - } else { - _globals->setFlag(60); - if (_globals->getFlag(67)) { - scene->_sceneMode = 5315; - scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL); - } else { - scene->_sceneMode = 5347; - scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); - } - } - } - break; - case OBJECT_SCANNER: - SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9); - break; - case OBJECT_MEDKIT: - if (_globals->getFlag(106)) - SceneItem::display2(5300, 7); - else { - _globals->setFlag(106); - _globals->_player.disableControl(); - - scene->_sceneMode = 5303; - scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL); - } - break; - case OBJECT_VIAL: - if (_globals->getFlag(107)) { - SceneItem::display2(5300, 8); - } else { - RING_INVENTORY._vial._sceneNumber = 5300; - _globals->setFlag(107); - _globals->_player.disableControl(); - scene->_sceneMode = 5304; - - scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5300::Hotspot5::doAction(int action) { - // Sharp bone - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5300, 27); - break; - case CURSOR_USE: - RING_INVENTORY._bone._sceneNumber = 1; - _globals->_player.disableControl(); - - scene->_sceneMode = 5309; - scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5300::Hotspot6::doAction(int action) { - // Left Hole - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1)) - SceneItem::display2(5300, 4); - else - SceneItem::display2(5300, 26); - break; - case CURSOR_USE: - if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) { - _globals->_player.disableControl(); - scene->_sceneMode = 5301; - scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL); - } else { - _globals->_player.disableControl(); - scene->_sceneMode = 5307; - RING_INVENTORY._vial._sceneNumber = 1; - - scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player, - &scene->_hotspot4, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5300::Hotspot7::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(63)) - SceneItem::display2(5300, 2); - else { - _globals->setFlag(63); - SceneItem::display2(5300, 0); - SceneItem::display2(5300, 1); - } - break; - case CURSOR_USE: - if (_globals->getFlag(64)) - SceneItem::display2(5300, 15); - else { - _globals->setFlag(64); - SceneItem::display2(5300, 14); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene5300::Hotspot8::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5); - break; - case CURSOR_USE: - SceneItem::display2(5300, 18); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene5300::Scene5300() : - _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) { -} - -void Scene5300::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - loadScene(5300); - setZoomPercents(0, 100, 199, 100); - - _stripManager.addSpeaker(&_speakerQR); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerBatR); - _stripManager.addSpeaker(&_speakerSR); - _stripManager.addSpeaker(&_speakerSL); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerBatText); - _stripManager.addSpeaker(&_speakerSText); - _stripManager.addSpeaker(&_speakerGameText); - - if (_globals->getFlag(106) && _globals->getFlag(107)) { - _hotspot2.postInit(); - _hotspot2.setVisage(2806); - _hotspot2.setObjectWrapper(new SceneObjectWrapper()); - _hotspot2.setPosition(Common::Point(63, 170)); - _hotspot2.animate(ANIM_MODE_1, NULL); - } else { - _hotspot2.postInit(); - _hotspot2.setVisage(5310); - _hotspot2.setPosition(Common::Point(63, 170)); - _hotspot2.animate(ANIM_MODE_1, NULL); - _hotspot2.fixPriority(98); - } - - _hotspot1.postInit(); - _hotspot1.setVisage(5362); - _hotspot1.setStrip2(3); - _hotspot1.setFrame2(5); - _hotspot1.setPosition(Common::Point(76, 48)); - - _hotspot4.postInit(); - _hotspot4.setVisage(5316); - _hotspot4.setStrip(2); - _hotspot4.setPosition(Common::Point(89, 65)); - _hotspot4.animate(ANIM_MODE_2, NULL); - _hotspot4.hide(); - - if (_globals->getFlag(67)) { - _globals->_player.postInit(); - _globals->_player.setVisage(5316); - _globals->_player.setPosition(Common::Point(191, 27)); - _globals->_player.disableControl(); - - if (_globals->getFlag(107) && _globals->getFlag(106)) { - _hotspot2.setVisage(2806); - _hotspot2.postInit(); - _hotspot2.setObjectWrapper(new SceneObjectWrapper()); - _hotspot2.animate(ANIM_MODE_1, NULL); - - setAction(&_action2); - } else { - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(204, 86)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setStrip2(1); - _globals->_player._moveDiff.y = 12; - - _sceneMode = 5308; - setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL); - } - } else { - _hotspot3.postInit(); - _hotspot3.setVisage(5301); - _hotspot3.setPosition(Common::Point(172, 32)); - _hotspot3.fixPriority(1); - _hotspot3.animate(ANIM_MODE_NONE, NULL); - - _globals->_player.postInit(); - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(204, 86)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setStrip2(1); - _globals->_player._moveDiff.y = 12; - _globals->_player.disableControl(); - - _sceneMode = 5306; - setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL); - } - - _field1B0A = 1; - if (RING_INVENTORY._bone._sceneNumber == 5300) { - _hotspot5.postInit(); - _hotspot5.setVisage(5301); - _hotspot5.setStrip(2); - _hotspot5.setPosition(Common::Point(190, 147)); - _globals->_sceneItems.push_back(&_hotspot5); - } - - _hotspot6.setBounds(Rect(74, 51, 114, 69)); - _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _hotspot8._sceneRegionId = 8; - - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); - _globals->_soundHandler.play(212); -} - -void Scene5300::signal() { - switch (_sceneMode) { - case 5301: - _globals->_stripNum = 5300; - _globals->_sceneManager.changeScene(5100); - break; - case 5307: - _soundHandler.fadeOut(NULL); - // No break on purpose - case 5302: - case 5308: - case 5316: - case 5347: - _globals->_player.setStrip2(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); - break; - case 5303: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); - - if (_globals->getFlag(107)) - setAction(&_action1); - else - SceneItem::display2(5300, 28); - break; - case 5304: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); - - if (_globals->getFlag(106)) - setAction(&_action1); - else - SceneItem::display2(5300, 28); - break; - case 5306: - _globals->clearFlag(67); - _globals->_player.setStrip2(-1); - - if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300)) - _stripManager.start(5303, this); - else - _stripManager.start(5302, this); - _sceneMode = 5302; - break; - case 5309: - _hotspot5.remove(); - _globals->_player.enableControl(); - break; - case 5310: - _hotspot2.fixPriority(41); - _sceneMode = 5315; - - setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL); - break; - case 5315: - _globals->_stripNum = 5302; - _globals->_sceneManager.changeScene(5100); - break; - } -} - - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld_scenes6.h deleted file mode 100644 index 2e99f5ab87..0000000000 --- a/engines/tsage/ringworld_scenes6.h +++ /dev/null @@ -1,330 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES6_H -#define TSAGE_RINGWORLD_SCENES6_H - -#include "common/scummsys.h" -#include "tsage/ringworld_logic.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -class Scene5000 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - virtual void dispatch(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class HotspotGroup1 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - ASound _soundHandler; - SpeakerSText _speakerSText; - SpeakerQText _speakerQText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - DisplayHotspot _hotspot1; - SceneObject _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6; - Hotspot7 _hotspot7; - Hotspot8 _hotspot8; - HotspotGroup1 _hotspot9, _hotspot10, _hotspot11; - DisplayHotspot _hotspot12, _hotspot13, _hotspot14, _hotspot15; - DisplayHotspot _hotspot16, _hotspot17, _hotspot18; - - Scene5000(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene5100 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class HotspotGroup1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class HotspotGroup2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot4 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot9 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot17 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot18 : public SceneHotspot { - public: - int _index1; - int _index2; - - virtual void doAction(int action); - }; - class Hotspot19 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot20 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - SequenceManager _sequenceManager; - ASound _soundHandler; - SpeakerMText _speakerMText; - SpeakerQText _speakerQText; - SpeakerSText _speakerSText; - SpeakerBatText _speakerBatText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - HotspotGroup1 _hotspot1, _hotspot2, _hotspot3; - Hotspot4 _hotspot4; - HotspotGroup2 _hotspot5, _hotspot6, _hotspot7; - SceneObject _hotspot8; - Hotspot9 _hotspot9; - SceneObject _hotspot10, _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15; - DisplayHotspot _hotspot16; - Hotspot17 _hotspot17; - Hotspot18 _hotspot18; - Hotspot19 _hotspot19; - Hotspot20 _hotspot20; - DisplayHotspot _hotspot21; - - Scene5100(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene5200 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot9 : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class Hotspot10 : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class Hotspot14 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - SpeakerFLL _speakerFLL; - SpeakerFLText _speakerFLText; - SpeakerQL _speakerQL; - SpeakerQText _speakerQText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - - SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6, _hotspot7; - SceneObject _hotspot8; - Hotspot9 _hotspot9; - Hotspot10 _hotspot10; - DisplayHotspot _hotspot11, _hotspot12, _hotspot13; - Hotspot14 _hotspot14; - - Scene5200(); - virtual void stripCallback(int v); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void dispatch(); -}; - -class Scene5300 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - - /* Hotspots */ - class Hotspot1 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot2 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot5 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot6 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot7 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Hotspot8 : public SceneObject { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - SpeakerQR _speakerQR; - SpeakerQL _speakerQL; - SpeakerQText _speakerQText; - SpeakerBatR _speakerBatR; - SpeakerBatText _speakerBatText; - SpeakerSR _speakerSR; - SpeakerSL _speakerSL; - SpeakerSText _speakerSText; - SpeakerGameText _speakerGameText; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Hotspot1 _hotspot1; - Hotspot2 _hotspot2; - DisplayHotspot _hotspot3; - SceneObject _hotspot4; - Hotspot5 _hotspot5; - Hotspot6 _hotspot6; - Hotspot7 _hotspot7; - Hotspot8 _hotspot8; - int _field1B0A; - - Scene5300(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void synchronize(Serializer &s) { - Scene::synchronize(s); - s.syncAsSint16LE(_field1B0A); - } -}; - - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp deleted file mode 100644 index d0e7491d4a..0000000000 --- a/engines/tsage/ringworld_scenes8.cpp +++ /dev/null @@ -1,2545 +0,0 @@ -/* 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. - * - */ - -#include "graphics/cursorman.h" -#include "tsage/ringworld_scenes8.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -void NamedHotspotMult::synchronize(Serializer &s) { - SceneHotspot::synchronize(s); - s.syncAsSint16LE(_useLineNum); - s.syncAsSint16LE(_lookLineNum); -} - -void SceneObject7700::synchronize(Serializer &s) { - SceneObject::synchronize(s); - if (s.getVersion() >= 3) { - s.syncAsSint16LE(_lookLineNum); - s.syncAsSint16LE(_defltLineNum); - } -} - -/*-------------------------------------------------------------------------- - * Scene 7000 - Landing near beach - * - *--------------------------------------------------------------------------*/ - -void Scene7000::Action1::signal() { - // Quinn walks from the lander to the seaside (action6) then discuss with Skeenar - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - setAction(&scene->_action6, this); - break; - case 2: - scene->_soundHandler.play(252); - scene->_object8.remove(); - scene->_object1.postInit(); - scene->_object1.setVisage(7003); - scene->_object1.animate(ANIM_MODE_5, this); - scene->_object1.setPosition(Common::Point(151, 182)); - scene->_object1.fixPriority(205); - _globals->_sceneItems.push_front(&scene->_object1); - break; - case 3: - scene->_object1._numFrames = 4; - scene->_object1.setStrip(2); - scene->_object1.animate(ANIM_MODE_8, 0, NULL); - scene->_stripManager.start(7005, this); - break; - case 4: - scene->_object1.animate(ANIM_MODE_2, NULL); - setDelay(3); - break; - case 5: - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action2::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - _globals->_player.addMover(NULL); - _globals->_player.setVisage(7006); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(_globals->_player._position.x, _globals->_player._position.y + 13)); - _globals->_player.changeZoom(68); - _globals->_player.animate(ANIM_MODE_5, this); - scene->_object1.remove(); - break; - case 2: - _globals->_sceneManager.changeScene(7100); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action3::dispatch() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - Action::dispatch(); - if (_actionIndex == 4) - scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15)); -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action3::signal() { - // Lander is landing - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - scene->setZoomPercents(10, 10, 62, 100); - scene->_object4.postInit(); - scene->_object4.setVisage(5001); - scene->_object4.setStrip2(2); - scene->_object4.animate(ANIM_MODE_8, 0, NULL); - scene->_object4.setPosition(Common::Point(10, 18)); - scene->_object4.fixPriority(10); - scene->_object4.changeZoom(100); - scene->_object4.hide(); - break; - case 1: { - NpcMover *mover = new NpcMover(); - Common::Point pt(107, 65); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 2: - scene->_object3._moveDiff.y = 1; - scene->_object3.fixPriority(10); - scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15)); - scene->_object4.show(); - setDelay(30); - break; - case 3: { - NpcMover *mover = new NpcMover(); - Common::Point pt(107, 92); - scene->_object3.addMover(mover, &pt, this); - break; - } - case 4: - scene->_object4.remove(); - _globals->_sceneManager.changeScene(2100); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action4::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 1: - scene->_object1.hide(); - setDelay(300); - break; - case 2: - _globals->_soundHandler.play(252); - scene->_object1.show(); - scene->_object1.setStrip(3); - scene->_object1.setFrame(1); - scene->_object1.animate(ANIM_MODE_5, this); - break; - case 3: - scene->_object1.setStrip(4); - scene->_object1.animate(ANIM_MODE_8, 0, NULL); - _globals->setFlag(81); - _globals->_player.enableControl(); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action5::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - NpcMover *playerMover = new NpcMover(); - Common::Point pt(88, 121); - _globals->_player.addMover(playerMover, &pt, this); - break; - } - case 1: - _globals->_player.checkAngle(&scene->_object1); - _globals->_soundHandler.play(252); - scene->_object1.setStrip(2); - scene->_stripManager.start(7015, this); - break; - case 2: - scene->_object1.setStrip(1); - scene->_object1.setFrame(4); - scene->_object1.animate(ANIM_MODE_6, this); - break; - case 3: { - scene->_object1.remove(); - NpcMover *mover = new NpcMover(); - Common::Point pt(31, 94); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 4: { - NpcMover *mover = new NpcMover(); - Common::Point pt(11, 94); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 5: { - _globals->_player.fixPriority(10); - NpcMover *mover = new NpcMover(); - Common::Point pt(11, 89); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: { - NpcMover *mover = new NpcMover(); - Common::Point pt(41, 89); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 7: - _globals->clearFlag(36); - _globals->clearFlag(37); - _globals->clearFlag(72); - _globals->clearFlag(13); - _globals->_sceneManager.changeScene(2100); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action6::signal() { - // Quinn walks from the lander to the seaside - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: { - NpcMover *mover = new NpcMover(); - Common::Point pt(12, 91); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: { - NpcMover *mover = new NpcMover(); - Common::Point pt(8, 91); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: { - NpcMover *mover = new NpcMover(); - Common::Point pt(31, 96); - _globals->_player.addMover(mover, &pt, this); - _globals->_player.fixPriority(-1); - break; - } - case 4: { - NpcMover *mover = new NpcMover(); - Common::Point pt(83, 117); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 5: { - NpcMover *mover = new NpcMover(); - Common::Point pt(95, 121); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Action7::signal() { - switch (_actionIndex++) { - case 0: - _globals->_player.disableControl(); - setDelay(3); - break; - case 1: - setDelay(3); - break; - case 2: { - NpcMover *mover = new NpcMover(); - Common::Point pt(31, 94); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: { - NpcMover *mover = new NpcMover(); - Common::Point pt(11, 94); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 4: { - _globals->_player.fixPriority(10); - NpcMover *mover = new NpcMover(); - Common::Point pt(11, 89); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 5: { - NpcMover *mover = new NpcMover(); - Common::Point pt(41, 89); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 6: - if (_globals->getFlag(13)) - _globals->_sceneManager.changeScene(2280); - else - _globals->_sceneManager.changeScene(2320); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Hotspot1::doAction(int action) { - if (action == CURSOR_LOOK) - SceneItem::display2(7000, 2); - else - SceneHotspot::doAction(action); -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::Object1::doAction(int action) { - // Skeenar - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_TRANSLATOR: - _globals->_player.disableControl(); - RING_INVENTORY._translator._sceneNumber = 7000; - - if ((RING_INVENTORY._waldos._sceneNumber != 7000) && (RING_INVENTORY._jar._sceneNumber != 7000)) { - scene->_sceneMode = 7004; - scene->setAction(&scene->_sequenceManager, scene, 7004, &_globals->_player, this, NULL); - } else if (RING_INVENTORY._waldos._sceneNumber != 7000) { - scene->_sceneMode = 7011; - scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); - } else if (RING_INVENTORY._jar._sceneNumber != 7000) { - scene->_sceneMode = 7012; - scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); - } else { - scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7017, &_globals->_player, NULL); - } - break; - case OBJECT_WALDOS: - _globals->_player.disableControl(); - RING_INVENTORY._waldos._sceneNumber = 7000; - if (RING_INVENTORY._translator._sceneNumber == 7000) { - if (RING_INVENTORY._jar._sceneNumber == 7000) { - scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7015, &_globals->_player, NULL); - } else { - scene->_sceneMode = 7006; - scene->setAction(&scene->_sequenceManager, scene, 7006, &_globals->_player, NULL); - } - } else { - scene->_sceneMode = 7009; - scene->setAction(&scene->_sequenceManager, scene, 7009, &_globals->_player, NULL); - } - break; - case OBJECT_JAR: - _globals->_player.disableControl(); - RING_INVENTORY._jar._sceneNumber = 7000; - - if (RING_INVENTORY._translator._sceneNumber == 7000) { - if (RING_INVENTORY._waldos._sceneNumber != 7000) { - scene->_sceneMode = 7007; - scene->setAction(&scene->_sequenceManager, scene, 7007, &_globals->_player, &scene->_object1, NULL); - } else { - scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7016, &_globals->_player, NULL); - } - } else { - scene->_sceneMode = 7008; - scene->setAction(&scene->_sequenceManager, scene, 7008, &_globals->_player, NULL); - } - break; - case CURSOR_LOOK: - if (_globals->getFlag(81)) - SceneItem::display2(7000, 1); - else - SceneItem::display2(7000, 0); - break; - case CURSOR_USE: - if (_globals->getFlag(81)) { - RING_INVENTORY._stasisBox2._sceneNumber = 1; - _globals->_player.disableControl(); - scene->setAction(&scene->_action5); - } else { - SceneItem::display2(7000, 5); - } - break; - case CURSOR_TALK: - if (_globals->getFlag(81)) { - RING_INVENTORY._stasisBox2._sceneNumber = 1; - _globals->_player.disableControl(); - scene->setAction(&scene->_action5); - } else if (_globals->getFlag(52)) { - scene->_sceneMode = 7005; - scene->setAction(&scene->_sequenceManager, scene, 7013, NULL); - } else if (_globals->getFlag(13)) { - scene->_sceneMode = 7002; - scene->setAction(&scene->_sequenceManager, scene, 7014, NULL); - } else { - scene->_sceneMode = 7002; - scene->setAction(&scene->_sequenceManager, scene, 7002, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::dispatch() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - - if (!_action) { - if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 8) { - if (!_globals->getFlag(13)) { - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - SceneItem::display2(7000, 3); - _sceneMode = 7001; - setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); - } else if (!_globals->getFlag(52)) { - setAction(&_action2); - } else { - _globals->_player.disableControl(); - _sceneMode = 7003; - setAction(&scene->_sequenceManager, this, 7003, &_globals->_player, NULL); - } - } - if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 9) - scene->setAction(&scene->_action7); - } - Scene::dispatch(); -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::postInit(SceneObjectList *OwnerList) { - loadScene(7000); - Scene::postInit(); - setZoomPercents(93, 25, 119, 55); - _stripManager.addSpeaker(&_speakerSKText); - _stripManager.addSpeaker(&_speakerSKL); - _stripManager.addSpeaker(&_speakerQText); - _stripManager.addSpeaker(&_speakerQL); - _stripManager.addSpeaker(&_speakerQR); - - _speakerSKText._npc = &_object1; - _speakerQText._npc = &_globals->_player; - - _object5.postInit(); - _object5.setVisage(7001); - _object5.setStrip2(1); - _object5.animate(ANIM_MODE_2, NULL); - _object5.setPosition(Common::Point(49, 147)); - _object5.fixPriority(1); - - _object6.postInit(); - _object6.setVisage(7001); - _object6.setStrip2(2); - _object6.animate(ANIM_MODE_2, NULL); - _object6.setPosition(Common::Point(160, 139)); - _object6.fixPriority(1); - - _object7.postInit(); - _object7.setVisage(7001); - _object7.setStrip2(3); - _object7.animate(ANIM_MODE_2, NULL); - _object7.setPosition(Common::Point(272, 129)); - _object7.fixPriority(1); - - _object8.postInit(); - _object8.setVisage(7001); - _object8.setStrip2(4); - _object8.animate(ANIM_MODE_2, NULL); - _object8.setPosition(Common::Point(176, 175)); - _object8.fixPriority(1); - - if (_globals->getFlag(72)) { - _object3.postInit(); - _object3.setVisage(5001); - _object3.setStrip2(1); - _object3.setPosition(Common::Point(107, 92)); - _object3.changeZoom(100); - _object3.fixPriority(10); - - _object1.postInit(); - _object1.setVisage(7003); - if (_globals->getFlag(81)) - _object1.setStrip(4); - else - _object1.setStrip(2); - _object1.setPosition(Common::Point(87, 129)); - _object1._numFrames = 4; - _object1.changeZoom(45); - _object1.animate(ANIM_MODE_8, 0, NULL); - _globals->_sceneItems.push_back(&_object1); - } - _soundHandler.play(251); - if (_globals->_sceneManager._previousScene == 2100) { - if (_globals->getFlag(72)) { - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); - if (_globals->getFlag(81)) { - setAction(&_action4); - } else { - _object1.setPosition(Common::Point(151, 182)); - _object1.changeZoom(100); - setAction(&_action1); - } - } else { - _globals->_soundHandler.play(250); - _globals->setFlag(72); - - _object3.postInit(); - _object3.setVisage(5001); - _object3.setStrip2(1); - _object3.animate(ANIM_MODE_1, NULL); - _object3.setPosition(Common::Point(307, 0)); - _object3.changeZoom(-1); - setAction(&_action3); - } - } else if (_globals->_sceneManager._previousScene == 2280) { - _globals->_player.postInit(); - _globals->_player.setVisage(2170); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); - _globals->_player.disableControl(); - _sceneMode = 7001; - setAction(&_action6, this); - if (!_globals->getFlag(81)) { - _object1.setPosition(Common::Point(151, 182)); - _object1.changeZoom(100); - } - _object8.remove(); - _object9.remove(); - } else if (_globals->_sceneManager._previousScene == 2320) { - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); - _sceneMode = 7001; - setAction(&_action6, this); - } else { - _globals->setFlag(72); - - _object3.postInit(); - _object3.setVisage(5001); - _object3.setStrip2(1); - _object3.setPosition(Common::Point(307, 0)); - _soundHandler.play(151); - _soundHandler.holdAt(true); - _globals->_soundHandler.play(250); - setAction(&_action3); - } - - _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot1); -} - -/*--------------------------------------------------------------------------*/ - -void Scene7000::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; - switch (_sceneMode) { - case 7001: - case 7002: - case 7004: - case 7005: - case 7006: - case 7007: - case 7008: - case 7009: - _globals->_player.enableControl(); - break; - case 7003: - _sceneMode = 7001; - setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); - break; - case 7011: - _sceneMode = 7005; - setAction(&scene->_sequenceManager, this, 7005, &_globals->_player, NULL); - break; - case 7012: - _sceneMode = 7005; - setAction(&scene->_sequenceManager, this, 7012, &_globals->_player, NULL); - break; - case 7015: - setAction(&_action4); - break; - } -} - - -/*-------------------------------------------------------------------------- - * Scene 7100 - Underwater: swimming - * - *--------------------------------------------------------------------------*/ - -void Scene7100::Action3::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: { - Common::Point pt(433, 308); - NpcMover *mover = new NpcMover(); - scene->_object4.addMover(mover, &pt, this); - break; - } - case 2: - scene->_object4.remove(); - remove(); - break; - } -} - -void Scene7100::Action4::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(1) + 1); - break; - case 1: { - scene->_object5.setStrip(3); - Common::Point pt(85, 52); - NpcMover *mover = new NpcMover(); - scene->_object5.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object5.setStrip(4); - Common::Point pt(20, 52); - NpcMover *mover = new NpcMover(); - scene->_object5.addMover(mover, &pt, this); - break; - } - case 3: - _actionIndex = 0; - setDelay(1); - break; - } -} - -void Scene7100::Action5::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: { - Common::Point pt(59, 151); - NpcMover *mover = new NpcMover(); - scene->_object9.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object9.setStrip2(1); - Common::Point pt(127, 144); - NpcMover *mover = new NpcMover(); - scene->_object9.addMover(mover, &pt, this); - break; - } - case 3: { - scene->_object9.setStrip2(2); - scene->_object9.fixPriority(180); - Common::Point pt(8, 181); - NpcMover *mover = new NpcMover(); - scene->_object9.addMover(mover, &pt, this); - break; - } - case 4: { - scene->_object9.remove(); - remove(); - } - } -} - -void Scene7100::Action6::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - scene->_object10.fixPriority(8); - scene->_object10.setPosition(Common::Point(155, 187)); - - scene->_object11.fixPriority(8); - scene->_object11.setPosition(Common::Point(155, 190)); - - scene->_object12.fixPriority(8); - scene->_object12.setPosition(Common::Point(151, 193)); - break; - case 1: { - Common::Point pt1(167, 187); - NpcMover *mover1 = new NpcMover(); - scene->_object10.addMover(mover1, &pt1, this); - - Common::Point pt2(165, 185); - NpcMover *mover2 = new NpcMover(); - scene->_object11.addMover(mover2, &pt2, NULL); - - Common::Point pt3(163, 183); - NpcMover *mover3 = new NpcMover(); - scene->_object12.addMover(mover3, &pt3, NULL); - break; - } - case 2: { - scene->_object10.setStrip2(6); - Common::Point pt1(91, 187); - NpcMover *mover1 = new NpcMover(); - scene->_object10.addMover(mover1, &pt1, this); - - scene->_object11.setStrip2(6); - scene->_object11.fixPriority(50); - Common::Point pt2(89, 185); - NpcMover *mover2 = new NpcMover(); - scene->_object11.addMover(mover2, &pt2, NULL); - - scene->_object12.setStrip2(6); - scene->_object12.fixPriority(50); - Common::Point pt3(87, 183); - NpcMover *mover3 = new NpcMover(); - scene->_object12.addMover(mover3, &pt3, NULL); - break; - } - case 3: - _actionIndex = 0; - setDelay(1); - break; - } -} - -void Scene7100::Action7::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: { - scene->_object13.setStrip2(8); - Common::Point pt(324, 87); - NpcMover *mover = new NpcMover(); - scene->_object13.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object13.setStrip2(2); - Common::Point pt(524, 104); - NpcMover *mover = new NpcMover(); - scene->_object13.addMover(mover, &pt, NULL); - break; - } - case 3: - _actionIndex = 0; - setDelay(1); - break; - } -} - -void Scene7100::Action8::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: { - scene->_object17.setStrip2(4); - scene->_object18.setStrip2(4); - scene->_object19.setStrip2(4); - - Common::Point pt1(482, 153); - NpcMover *mover1 = new NpcMover(); - scene->_object17.addMover(mover1, &pt1, this); - - Common::Point pt2(480, 146); - NpcMover *mover2 = new NpcMover(); - scene->_object18.addMover(mover2, &pt2, NULL); - - Common::Point pt3(470, 153); - NpcMover *mover3 = new NpcMover(); - scene->_object19.addMover(mover3, &pt3, NULL); - break; - } - case 2: { - scene->_object17.setStrip2(3); - scene->_object18.setStrip2(3); - scene->_object19.setStrip2(3); - - Common::Point pt1(506, 186); - NpcMover *mover1 = new NpcMover(); - scene->_object17.addMover(mover1, &pt1, this); - - Common::Point pt2(502, 179); - NpcMover *mover2 = new NpcMover(); - scene->_object18.addMover(mover2, &pt2, NULL); - - Common::Point pt3(495, 184); - NpcMover *mover3 = new NpcMover(); - scene->_object19.addMover(mover3, &pt3, NULL); - break; - } - case 3: { - scene->_object17.setStrip2(4); - scene->_object18.setStrip2(4); - scene->_object19.setStrip2(4); - - Common::Point pt1(386, 167); - NpcMover *mover1 = new NpcMover(); - scene->_object17.addMover(mover1, &pt1, this); - - Common::Point pt2(379, 161); - NpcMover *mover2 = new NpcMover(); - scene->_object18.addMover(mover2, &pt2, NULL); - - Common::Point pt3(373, 167); - NpcMover *mover3 = new NpcMover(); - scene->_object19.addMover(mover3, &pt3, NULL); - break; - } - case 4: { - scene->_object17.setStrip2(3); - scene->_object18.setStrip2(3); - scene->_object19.setStrip2(3); - - Common::Point pt1(479, 193); - NpcMover *mover1 = new NpcMover(); - scene->_object17.addMover(mover1, &pt1, this); - - Common::Point pt2(473, 187); - NpcMover *mover2 = new NpcMover(); - scene->_object18.addMover(mover2, &pt2, NULL); - - Common::Point pt3(466, 192); - NpcMover *mover3 = new NpcMover(); - scene->_object19.addMover(mover3, &pt3, NULL); - break; - } - case 5: { - Common::Point pt1(552, 183); - NpcMover *mover1 = new NpcMover(); - scene->_object17.addMover(mover1, &pt1, this); - - Common::Point pt2(552, 178); - NpcMover *mover2 = new NpcMover(); - scene->_object18.addMover(mover2, &pt2, NULL); - - Common::Point pt3(541, 183); - NpcMover *mover3 = new NpcMover(); - scene->_object19.addMover(mover3, &pt3, NULL); - - _actionIndex = 0; - break; - } - } -} - -void Scene7100::Action9::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1); - break; - case 1: { - scene->_object24.setStrip2(1); - Common::Point pt(64, 159); - NpcMover *mover = new NpcMover(); - scene->_object24.addMover(mover, &pt, this); - break; - } - case 2: { - scene->_object24.setStrip2(2); - scene->_object24.fixPriority(160); - Common::Point pt(34, 159); - NpcMover *mover = new NpcMover(); - scene->_object24.addMover(mover, &pt, this); - break; - } - case 3: { - scene->_object24.setStrip2(1); - Common::Point pt(64, 159); - NpcMover *mover = new NpcMover(); - scene->_object24.addMover(mover, &pt, this); - break; - } - case 4: { - scene->_object24.setStrip2(2); - scene->_object24.fixPriority(180); - Common::Point pt(-12, 182); - NpcMover *mover = new NpcMover(); - scene->_object24.addMover(mover, &pt, this); - break; - } - case 5: { - _actionIndex = 0; - setDelay(1); - break; - } - } -} - -void Scene7100::Action10::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(1000); - break; - case 1: { - Common::Point pt(610, -60); - NpcMover *mover = new NpcMover(); - scene->_object25.addMover(mover, &pt, this); - break; - } - case 2: - scene->_object25.remove(); - remove(); - break; - } -} - -void Scene7100::Action11::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: { - Common::Point pt(154, 175); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - ObjectMover2 *mover2 = new ObjectMover2(); - scene->_object1.addMover(mover2, 25, 35, &_globals->_player); - break; - } - case 2: { - Common::Point pt(700, 155); - NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 3: - _globals->_sceneManager.changeScene(7200); - remove(); - break; - } -} - -void Scene7100::postInit(SceneObjectList *OwnerList) { - loadScene(7100); - Scene::postInit(); - setZoomPercents(60, 85, 200, 100); - - _object2.postInit(); - _object2.setVisage(7161); - _object2.animate(ANIM_MODE_2, NULL); - _object2.setPosition(Common::Point(10, 140)); - _object2._numFrames = 1; - _object2.fixPriority(180); - _object2.setAction(&_action1, NULL); - - _object3.postInit(); - _object3.setVisage(7161); - _object3.animate(ANIM_MODE_2, NULL); - _object3.setPosition(Common::Point(34, 115)); - _object3._numFrames = 1; - _object3.fixPriority(180); - _object3.setAction(&_action2, NULL); - - _object4.postInit(); - _object4.setVisage(7164); - _object4.animate(ANIM_MODE_2, NULL); - _object4.setPosition(Common::Point(-10, 159)); - _object4._numFrames = 2; - _object4.fixPriority(250); - _object4.setAction(&_action3, NULL); - - _object5.postInit(); - _object5.setVisage(7162); - _object5.setStrip(3); - _object5.animate(ANIM_MODE_2, NULL); - _object5.setPosition(Common::Point(20, 52)); - _object5.setAction(&_action4, NULL); - - _object9.postInit(); - _object9.setVisage(7160); - _object5.setStrip(2); - _object9.animate(ANIM_MODE_2, NULL); - _object9.setPosition(Common::Point(110, 168)); - _object9._numFrames = 2; - _object9.fixPriority(16); - _object9.setAction(&_action5, NULL); - - _object13.postInit(); - _object13.setVisage(7161); - _object13.setStrip(8); - _object13.animate(ANIM_MODE_2, NULL); - _object13.setPosition(Common::Point(524, 104)); - _object13._numFrames = 5; - _object13.fixPriority(250); - _object13.setAction(&_action7, NULL); - - _object17.postInit(); - _object17.setVisage(7160); - _object17.setStrip(3); - _object17.animate(ANIM_MODE_2, NULL); - _object17.setPosition(Common::Point(552, 183)); - _object17._numFrames = 4; - _object17._moveDiff.x = 12; - _object17._moveDiff.y = 12; - _object17.setAction(&_action8, NULL); - - _object18.postInit(); - _object18.setVisage(7160); - _object18.setStrip(3); - _object18.animate(ANIM_MODE_2, NULL); - _object18.setPosition(Common::Point(552, 178)); - _object18._numFrames = 4; - _object18._moveDiff.x = 12; - _object18._moveDiff.y = 12; - - _object19.postInit(); - _object19.setVisage(7160); - _object19.setStrip(3); - _object19.animate(ANIM_MODE_2, NULL); - _object19.setPosition(Common::Point(541, 183)); - _object19._numFrames = 4; - _object19._moveDiff.x = 12; - _object19._moveDiff.y = 12; - - _object24.postInit(); - _object24.setVisage(7162); - _object24.setStrip(1); - _object24.animate(ANIM_MODE_2, NULL); - _object24.setPosition(Common::Point(-12, 182)); - _object24._numFrames = 4; - _object24.fixPriority(180); - _object24.setAction(&_action9, NULL); - - _object25.postInit(); - _object25.setVisage(7163); - _object25.animate(ANIM_MODE_2, NULL); - _object25.setPosition(Common::Point(551, 145)); - _object25._numFrames = 5; - _object25.fixPriority(160); - _object25.setAction(&_action10, NULL); - - // Swimmer 1 - _globals->_player.postInit(); - _globals->_player.setVisage(7101); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player._moveDiff.x = 4; - _globals->_player._moveDiff.y = 2; - _globals->_player.setPosition(Common::Point(135, 135)); - _globals->_player.fixPriority(200); - _globals->_player.disableControl(); - - // Swimmer 2 - _object1.postInit(); - _object1.setVisage(7110); - _object1.animate(ANIM_MODE_1, NULL); - _object1._moveDiff.x = 4; - _object1._moveDiff.y = 2; - _object1.setPosition(Common::Point(100, 100)); - - setAction(&_action11); - _soundHandler1.play(270); - _soundHandler2.play(275); - _globals->_soundHandler.play(270); -} -/*-------------------------------------------------------------------------- - * Scene 7200 - Underwater: Entering the cave - * - *--------------------------------------------------------------------------*/ - -void Scene7200::Action1::signal() { - Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(15); - break; - case 1: { - PlayerMover *mover1 = new PlayerMover(); - Common::Point pt1(165, 147); - scene->_swimmer.addMover(mover1, &pt1, this); - Common::Point pt2(207, 138); - PlayerMover *mover2 = new PlayerMover(); - _globals->_player.addMover(mover2, &pt2, this); - break; - } - case 2: - break; - case 3: - _globals->_sceneManager.changeScene(7300); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7200::Action2::signal() { - Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(3); - break; - case 1: { - scene->_object2.fixPriority(25); - scene->_object3.fixPriority(25); - scene->_object4.fixPriority(25); - scene->_object2.setStrip(1); - scene->_object3.setStrip(1); - scene->_object4.setStrip(1); - NpcMover *mover1 = new NpcMover(); - Common::Point pt1(54, 90); - scene->_object2.addMover(mover1, &pt1, this); - NpcMover *mover2 = new NpcMover(); - Common::Point pt2(56, 85); - scene->_object3.addMover(mover2, &pt2, NULL); - NpcMover *mover3 = new NpcMover(); - Common::Point pt3(54, 80); - scene->_object4.addMover(mover3, &pt3, NULL); - break; - } - case 2: { - scene->_object2.fixPriority(160); - scene->_object3.fixPriority(160); - scene->_object4.fixPriority(160); - scene->_object2.setStrip(2); - scene->_object3.setStrip(2); - scene->_object4.setStrip(2); - NpcMover *mover1 = new NpcMover(); - Common::Point pt1(10, 89); - scene->_object2.addMover(mover1, &pt1, this); - NpcMover *mover2 = new NpcMover(); - Common::Point pt2(12, 84); - scene->_object3.addMover(mover2, &pt2, NULL); - NpcMover *mover3 = new NpcMover(); - Common::Point pt3(10, 79); - scene->_object4.addMover(mover3, &pt3, NULL); - break; - } - case 3: - _actionIndex = 0; - setDelay(1); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7200::postInit(SceneObjectList *OwnerList) { - loadScene(7200); - Scene::postInit(); - _object2.postInit(); - _object2.setVisage(7160); - _object2.animate(ANIM_MODE_2, NULL); - _object2.setZoom(10); - _object2.setPosition(Common::Point(53, 88)); - _object2.setAction(&_action2); - - _object3.postInit(); - _object3.setVisage(7160); - _object3.animate(ANIM_MODE_2, NULL); - _object3.setZoom(10); - _object3.setPosition(Common::Point(55, 83)); - - _object4.postInit(); - _object4.setVisage(7160); - _object4.animate(ANIM_MODE_2, NULL); - _object4.setZoom(10); - _object4.setPosition(Common::Point(57, 78)); - - _object5.postInit(); - _object5.setVisage(7201); - _object5.setPosition(Common::Point(300, 172)); - _object5.setPriority(172); - _object5.animate(ANIM_MODE_2, NULL); - _object5._numFrames = 3; - - _object6.postInit(); - _object6.setVisage(7201); - _object6.setStrip2(3); - _object6.setPosition(Common::Point(144, 97)); - _object6.setPriority(199); - _object6.animate(ANIM_MODE_2, NULL); - _object6._numFrames = 3; - - _object7.postInit(); - _object7.setVisage(7201); - _object7.setStrip2(4); - _object7.setPosition(Common::Point(115, 123)); - _object7.setPriority(199); - _object7.animate(ANIM_MODE_2, NULL); - _object7._numFrames = 3; - - _object8.postInit(); - _object8.setVisage(7201); - _object8.setStrip2(6); - _object8.setPosition(Common::Point(140, 173)); - _object8.setPriority(199); - _object8.animate(ANIM_MODE_2, NULL); - _object8._numFrames = 3; - - _object9.postInit(); - _object9.setVisage(7201); - _object9.setStrip2(7); - _object9.setPosition(Common::Point(215, 196)); - _object9.setPriority(199); - _object9.animate(ANIM_MODE_2, NULL); - _object9._numFrames = 3; - - // Orange swimmer - _globals->_player.postInit(); - _globals->_player.setVisage(7110); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setZoom(50); - _globals->_player.setPosition(Common::Point(-18, 16)); - _globals->_player.disableControl(); - - _swimmer.postInit(); - _swimmer.setVisage(7101); - _swimmer.animate(ANIM_MODE_1, NULL); - _swimmer.setObjectWrapper(new SceneObjectWrapper()); - _swimmer.setZoom(50); - _swimmer.setPosition(Common::Point(-8, 16)); - - setAction(&_action1); - _soundHandler.play(271); -} - -/*-------------------------------------------------------------------------- - * Scene 7300 - Underwater: Lord Poria - * - *--------------------------------------------------------------------------*/ - -void Scene7300::Action1::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - case 1: - case 3: - setDelay(30); - break; - case 2: - scene->_stripManager.start(7300, this); - break; - case 4: { - NpcMover *mover = new NpcMover(); - Common::Point pt(102, 122); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 5: - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - break; - case 6: - _globals->_player.setStrip(3); - _globals->_player._numFrames = 5; - _globals->_player.animate(ANIM_MODE_2, this); - if (RING_INVENTORY._translator._sceneNumber == 1) - scene->_stripManager.start(7310, this); - else - scene->_stripManager.start(7305, this); - break; - case 7: - setDelay(3); - _globals->_soundHandler.fadeOut(NULL); - break; - case 8: - _globals->_sceneManager.changeScene(2280); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7300::Action2::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - NpcMover *mover1 = new NpcMover(); - Common::Point pt(_globals->_randomSource.getRandomNumber(3) + 203, _globals->_randomSource.getRandomNumber(3) + 96); - scene->_object3.addMover(mover1, &pt, this); - _actionIndex = 0; - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7300::Action3::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; - - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - NpcMover *mover1 = new NpcMover(); - Common::Point pt(_globals->_randomSource.getRandomNumber(5) + 76, _globals->_randomSource.getRandomNumber(5) + 78); - scene->_object1.addMover(mover1, &pt, this); - _actionIndex = 0; - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7300::Action4::signal() { - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: - _actionIndex = 0; - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7300::dispatch() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; - scene->_object4.setPosition(Common::Point(scene->_object3._position.x + 15, scene->_object3._position.y + 61)); - scene->_object2.setPosition(Common::Point(scene->_object1._position.x + 1, scene->_object1._position.y - 31)); - - Scene::dispatch(); -} - -/*--------------------------------------------------------------------------*/ - -void Scene7300::postInit(SceneObjectList *OwnerList) { - loadScene(7300); - - Scene::postInit(); - setZoomPercents(60, 85, 200, 100); - - _globals->setFlag(52); - _globals->setFlag(24); - _globals->setFlag(109); - - _stripManager.addSpeaker(&_speakerPOR); - _stripManager.addSpeaker(&_speakerPOText); - _stripManager.addSpeaker(&_speakerSKText); - _stripManager.addSpeaker(&_speakerQU); - - _speakerSKText.setTextPos(Common::Point(100, 20)); - _speakerPOText.setTextPos(Common::Point(100, 160)); - - _object4.postInit(); - _object4.setVisage(7311); - _object4.setStrip(1); - _object4.setFrame(1); - _object4.setPosition(Common::Point(218, 157)); - - _object3.postInit(); - _object3.setVisage(7311); - _object3.setStrip(2); - _object3.setFrame(1); - _object3.setPosition(Common::Point(203, 96)); - _object3._numFrames = 2; - _object3._moveDiff = Common::Point(1, 1); - _object3.animate(ANIM_MODE_8, 0, NULL); - _object3._moveRate = 2; - _object3.setAction(&_action2); - - _globals->_player.postInit(); - _globals->_player.setVisage(7305); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setPosition(Common::Point(-100, 100)); - _globals->_player.disableControl(); - - _object1.postInit(); - _object1.setVisage(7312); - _object1.animate(ANIM_MODE_1, NULL); - _object1._moveDiff = Common::Point(1, 1); - _object1.setPosition(Common::Point(76, 78)); - _object1._moveRate = 1; - _object1.setAction(&_action3); - - _object2.postInit(); - _object2.setVisage(7312); - _object2.setStrip(2); - _object2.animate(ANIM_MODE_2, NULL); - _object2.setPosition(Common::Point(77, 47)); - _object2.fixPriority(190); - - _object5.postInit(); - _object5.setVisage(7300); - _object5.setPosition(Common::Point(106, 45)); - _object5.animate(ANIM_MODE_2, NULL); - _object5._numFrames = 5; - - _object6.postInit(); - _object6.setVisage(7300); - _object6.setStrip2(2); - _object6.setPosition(Common::Point(283, 193)); - _object6.animate(ANIM_MODE_2, NULL); - _object6._numFrames = 3; - - _object7.postInit(); - _object7.setVisage(7300); - _object7.setStrip(4); - _object7.setPosition(Common::Point(295, 77)); - _object7.animate(ANIM_MODE_2, NULL); - _object7._numFrames = 3; - - _object8.postInit(); - _object8.setVisage(7300); - _object8.setStrip(5); - _object8.setPosition(Common::Point(1, 147)); - _object8.animate(ANIM_MODE_2, NULL); - _object8._numFrames = 2; - - setAction(&_action1); - _globals->_soundHandler.play(272); -} - -/*-------------------------------------------------------------------------- - * Scene 7600 - Floating Buildings: Outside - * - *--------------------------------------------------------------------------*/ - -void Scene7600::Action1::signal() { - switch (_actionIndex++) { - case 0: - setDelay(120); - break; - case 1: { - PlayerMover *mover = new PlayerMover(); - Common::Point pt(389, 57); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_sceneManager.changeScene(7700); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7600::Action2::signal() { - switch (_actionIndex++) { - case 0: - setDelay(30); - break; - case 1: { - NpcMover *mover = new NpcMover(); - Common::Point pt(-30, 195); - _globals->_player.addMover(mover, &pt, this); - break; - } - case 2: - _globals->_sceneManager.changeScene(2320); - remove(); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -void Scene7600::postInit(SceneObjectList *OwnerList) { - Scene::postInit(); - setZoomPercents(100, 0, 200, 100); - - _object2.postInit(); - _object2.setVisage(7601); - _object2.setStrip(1); - _object2.animate(ANIM_MODE_2, NULL); - _object2.setPosition(Common::Point(48, 135)); - _object2.fixPriority(1); - - _object3.postInit(); - _object3.setVisage(7601); - _object3.setStrip(2); - _object3.animate(ANIM_MODE_2, NULL); - _object3.setPosition(Common::Point(158, 136)); - _object3.fixPriority(1); - - _object4.postInit(); - _object4.setVisage(7601); - _object4.setStrip(3); - _object4.animate(ANIM_MODE_2, NULL); - _object4.setPosition(Common::Point(293, 141)); - _object4.fixPriority(1); - - _object5.postInit(); - _object5.setVisage(7601); - _object5.setStrip(4); - _object5.animate(ANIM_MODE_2, NULL); - _object5.setPosition(Common::Point(405, 143)); - _object5.fixPriority(1); - - _object6.postInit(); - _object6.setVisage(7601); - _object6.setStrip(5); - _object6.animate(ANIM_MODE_2, NULL); - _object6.setPosition(Common::Point(379, 191)); - _object6.fixPriority(1); - - _globals->_player.postInit(); - _globals->_player.setVisage(2333); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(1); - _globals->_player._moveDiff = Common::Point(16, 16); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); - - if (_globals->_sceneManager._previousScene == 7700) { - _globals->_player.setPosition(Common::Point(389, 57)); - setAction(&_action2); - } else { - _globals->_player.setPosition(Common::Point(-50, 195)); - setAction(&_action1); - } - _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - loadScene(7600); - _soundHandler2.play(255); - _soundHandler1.play(251); -} - -/*-------------------------------------------------------------------------- - * Scene 7700 - Floating Buildings: In the lab - * - *--------------------------------------------------------------------------*/ - -void Scene7700::Action1::signal() { - SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler; - switch (_actionIndex++) { - case 0: { - PlayerMover *mover1 = new PlayerMover(); - Common::Point pt = Common::Point(fmtObj->_position.x, fmtObj->_position.y + 30); - _globals->_player.addMover(mover1, &pt, this); - break; - } - case 1: - _globals->_player.checkAngle(fmtObj); - if (fmtObj->_state == 0) - fmtObj->animate(ANIM_MODE_5, this); - else - fmtObj->animate(ANIM_MODE_6, this); - break; - case 2: - remove(); - break; - } -} - -void Scene7700::Action2::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - switch (_actionIndex++) { - case 0: - case 2: - setDelay(_globals->_randomSource.getRandomNumber(60) + 60); - break; - case 1: - scene->_prof.animate(ANIM_MODE_7, 0, NULL); - setDelay(20); - break; - case 3: - scene->_prof.animate(ANIM_MODE_6, this); - _actionIndex = 0; - break; - } -} - -void Scene7700::Action3::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - switch (_actionIndex++) { - case 0: - scene->_object15.animate(ANIM_MODE_5, this); - break; - case 1: - scene->_sceneItem10.remove(); - scene->_object15.remove(); - scene->_sceneHotspot8.remove(); - scene->_sceneHotspot9.remove(); - scene->_object19.remove(); - setDelay(60); - // No break on purpose! - case 2: - scene->_soundHandler.play(260); - scene->_object8.setVisage(7703); - scene->_object8.setPosition(Common::Point(177, 97)); - scene->_object8.setStrip2(3); - scene->_object8.animate(ANIM_MODE_5, this); - scene->_object8._numFrames = 3; - break; - case 3: - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene7700::Action4::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - switch (_actionIndex++) { - case 2: - scene->_object13.remove(); - // No break on purpose! - case 0: - setDelay(3); - break; - case 1: - CursorMan.showMouse(false); - scene->_object13.postInit(); - scene->_object13.setVisage(7700); - scene->_object13.setStrip2(7); - scene->_object13.setPosition(Common::Point(151, 33)); - scene->_object13.animate(ANIM_MODE_5, this); - break; - case 3: - CursorMan.showMouse(true); - SceneItem::display2(7700, 11); - _globals->_player.enableControl(); - remove(); - break; - } -} - -void Scene7700::Action5::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - switch (_actionIndex++) { - case 0: - setDelay(_globals->_randomSource.getRandomNumber(240)); - break; - case 1: { - scene->_cloud.setFrame(_globals->_randomSource.getRandomNumber(1) + 1); - scene->_cloud.setPosition(Common::Point(133, 145 + _globals->_randomSource.getRandomNumber(54))); - - Common::Point pt(360, scene->_cloud._position.y); - NpcMover *mover = new NpcMover(); - scene->_cloud.addMover(mover, &pt, this); - _actionIndex = 0; - break; - } - } -} - -void Scene7700::Action6::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - switch (_actionIndex++) { - case 0: - setDelay(5); - break; - case 1: { - Common::Point pt(2, 66); - NpcMover *mover = new NpcMover(); - scene->_easterEgg1.addMover(mover, &pt, this); - break; - } - case 2: - scene->_easterEgg1.setStrip(2); - scene->_easterEgg1.setPosition(Common::Point(43, 65)); - - scene->_easterEgg2.postInit(); - scene->_easterEgg2.setVisage(7708); - scene->_easterEgg2.setStrip(3); - scene->_easterEgg2.setPosition(Common::Point(116, 54)); - scene->_easterEgg2.animate(ANIM_MODE_2, NULL); - - setDelay(120); - break; - case 3: - scene->_easterEgg1.remove(); - scene->_easterEgg2.remove(); - remove(); - break; - } -} - -void Scene7700::SceneHotspot1::doAction(int action) { - if (action == CURSOR_LOOK) - SceneItem::display2(7700, 4); - else - SceneHotspot::doAction(action); -} - -void Scene7700::SceneHotspot2::doAction(int action) { - if (action == CURSOR_LOOK) - SceneItem::display2(7700, 6); - else - SceneHotspot::doAction(action); -} - -void Scene7700::SceneHotspot3::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_KEY: - SceneItem::display2(7702, 3); - RING_INVENTORY._key._sceneNumber = 7700; - break; - case CURSOR_LOOK: - if (RING_INVENTORY._key._sceneNumber == 7700) - scene->setAction(&scene->_action4, NULL); - else - SceneItem::display2(7700, 53); - break; - case CURSOR_USE: - if (!_globals->getFlag(78)) { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } else if (RING_INVENTORY._key._sceneNumber == 7700) { - _globals->_player.disableControl(); - scene->_sceneMode = 7705; - scene->setAction(&scene->_sequenceManager, scene, 7705, &_globals->_player, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneHotspot4::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 12); - break; - case CURSOR_USE: - if (!_globals->getFlag(78)) { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } else { - SceneItem::display2(7700, 12); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneHotspot5::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 28); - break; - case CURSOR_USE: - if (_globals->getFlag(78)) { - if (RING_INVENTORY._paper._sceneNumber == 7700) { - _globals->_player.disableControl(); - scene->_sceneMode = 7708; - scene->setAction(&scene->_sequenceManager, scene, 7708, &_globals->_player, NULL); - } - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneHotspot6::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 43); - break; - case CURSOR_USE: - SceneItem::display2(7700, 56); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneItem7::doAction(int action) { - if (action == CURSOR_LOOK) - SceneItem::display2(7700, 51); -} - -void Scene7700::SceneHotspot8::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 48); - break; - case CURSOR_USE: - scene->_sceneMode = 7709; - scene->_soundHandler.play(259); - scene->_object15.setFrame(scene->_object15.getFrameCount()); - scene->_object15.animate(ANIM_MODE_6, scene); - if ((scene->_field977 == 2) && (scene->_field97B == 0)) { - scene->_field979++; - } else { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneHotspot9::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 48); - break; - case CURSOR_USE: - scene->_sceneMode = 7709; - scene->_soundHandler.play(259); - scene->_object15.setFrame(1); - scene->_object15.animate(ANIM_MODE_5, scene); - if (scene->_field977 > 2) { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; - } - - if (scene->_field979 != 0) { - if (scene->_field979 != 4) { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; - } else { - scene->_field97B++; - if (scene->_field97B == 3) { - _globals->_player.disableControl(); - scene->setAction(&scene->_action3); - } - } - } else { - scene->_field977++; - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::SceneItem10::doAction(int action) { -} - -void Scene7700::Object1::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(7700, _lookLineNum); - } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { - _globals->_player.disableControl(); - scene->setAction(&scene->_action1, this); - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene7700::SceneHotspot11::doAction(int action) { - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, _lookLineNum); - break; - case CURSOR_USE: - SceneItem::display2(7701, _useLineNum); - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::Object1::signal() { - if (_state == 0) { - _state = 1; - SceneItem::display2(7701, _defltLineNum); - } else { - _state = 0; - } - _globals->_player.enableControl(); -} - -void Scene7700::Object3::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(7700, 34); - } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { - if (scene->_object3._frame == 1) { - _globals->_player.disableControl(); - scene->_sceneMode = 7707; - scene->setAction(&scene->_sequenceManager, scene, 7707, &_globals->_player, this, NULL); - } else { - SceneItem::display2(7700, 60); - } - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene7700::Object7::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - if (_globals->getFlag(78)) - SceneItem::display2(7700, 45); - else - SceneItem::display2(7700, 44); - break; - case CURSOR_USE: - if (_globals->getFlag(78)) { - SceneItem::display2(7701, 41); - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7714, NULL); - } - break; - case CURSOR_TALK: - if (_globals->getFlag(78)) { - SceneItem::display2(7702, 1); - } else { - _globals->_player.disableControl(); - if (_state == 0) { - _state = 1; - scene->_sceneMode = 7703; - scene->setAction(&scene->_sequenceManager, scene, 7703, NULL); - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7712, NULL); - } - } - break; - case OBJECT_STUNNER: - if (!_globals->getFlag(78)) { - _globals->_soundHandler.stop(); - _globals->setFlag(78); - setAction(NULL); - _globals->_player.disableControl(); - scene->_sceneMode = 7704; - scene->setAction(&scene->_sequenceManager, scene, 7704, &_globals->_player, this, NULL); - } - break; - default: - SceneHotspot::doAction(action); - break; - } -} - -void Scene7700::Object8::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { - if (_strip == 3) { - scene->_object9.postInit(); - scene->_object9.setVisage(7701); - scene->_object9.setStrip2(3); - scene->_object9.setPosition(Common::Point(91, 166)); - scene->_object9.fixPriority(200); - - scene->_object14.postInit(); - scene->_object14.setVisage(7701); - scene->_object14.setStrip(2); - scene->_object14.fixPriority(250); - scene->_object14.setPosition(Common::Point(139, 151)); - - scene->_gfxButton.setText(EXIT_MSG); - scene->_gfxButton._bounds.center(140, 189); - scene->_gfxButton.draw(); - - _globals->_sceneItems.push_front(&scene->_sceneItem10); - _globals->_sceneItems.push_front(&scene->_object9); - _globals->_player._canWalk = false; - } else if (_globals->getFlag(78)) { - scene->_object15.postInit(); - scene->_object15.setVisage(7701); - scene->_object15.setPosition(Common::Point(140, 165)); - scene->_object15.fixPriority(200); - - scene->_gfxButton.setText(EXIT_MSG); - scene->_gfxButton._bounds.center(140, 186); - scene->_gfxButton.draw(); - scene->_gfxButton._bounds.expandPanes(); - - scene->_object19.postInit(); - scene->_object19.setVisage(7700); - scene->_object19.setStrip(6); - scene->_object19.setPosition(Common::Point(140, 192)); - - _globals->_sceneItems.push_front(&scene->_sceneItem10); - _globals->_sceneItems.push_front(&scene->_sceneHotspot8); - _globals->_sceneItems.push_front(&scene->_sceneHotspot9); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player._canWalk = false; - } else { - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene7700::Object9::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case CURSOR_LOOK: - SceneItem::display2(7700, 49); - break; - case CURSOR_USE: - SceneItem::display2(7701, 42); - break; - case CURSOR_TALK: - SceneItem::display2(7702, 4); - break; - case OBJECT_KEY: - if (_frame == 1) { - if (!_globals->getFlag(80)) { - scene->_object10.postInit(); - scene->_object10.setVisage(7701); - scene->_object10.setStrip(4); - scene->_object10.setPosition(Common::Point(159, 136)); - _globals->_sceneItems.push_front(&scene->_object10); - scene->_object10.fixPriority(240); - } - - scene->_soundHandler.play(262); - scene->_object14.animate(ANIM_MODE_5, NULL); - } - _globals->_events.setCursor(CURSOR_WALK); - break; - default: - SceneHotspot::doAction(action); - } -} - -void Scene7700::Object10::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(7700, 50); - } else if (action == CURSOR_USE) { - _globals->_player._canWalk = true; - RING_INVENTORY._translator._sceneNumber = 1; - _globals->setFlag(80); - scene->_sceneItem10.remove(); - scene->_gfxButton._bounds.expandPanes(); - scene->_object14.remove(); - scene->_object9.remove(); - remove(); - } else { - SceneHotspot::doAction(action); - } -} - -void Scene7700::Object11::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - switch (action) { - case OBJECT_SCANNER: - if (_frame != 1) - SceneItem::display2(7701, 44); - else - SceneItem::doAction(action); - break; - case CURSOR_LOOK: - if (_frame != 1) - SceneItem::display2(7700, 9); - else - SceneItem::display2(7700, 52); - break; - case CURSOR_USE: - if (_frame != 1) { - SceneItem::display2(7701, 8); - } else { - _globals->setFlag(49); - _globals->_player.disableControl(); - scene->_sceneMode = 7706; - scene->setAction(&scene->_sequenceManager, scene, 7706, &_globals->_player, this, NULL); - } - break; - case OBJECT_EMPTY_JAR: - RING_INVENTORY._emptyJar._sceneNumber = 0; - RING_INVENTORY._jar._sceneNumber = 1; - _globals->_player.disableControl(); - scene->_sceneMode = 7710; - scene->setAction(&scene->_sequenceManager, scene, 7710, &_globals->_player, NULL); - break; - default: - SceneHotspot::doAction(action); - } -} - -void Scene7700::Object12::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; - - if (action == CURSOR_LOOK) { - SceneItem::display2(7700, 15); - } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { - scene->_sceneMode = 7713; - scene->setAction(&scene->_sequenceManager, scene, 7713, &_globals->_player, NULL); - } else { - scene->_sceneMode = 7712; - scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); - } - } else { - SceneHotspot::doAction(action); - } -} - -void Scene7700::signal() { - switch (_sceneMode) { - case 7701: - _globals->_player.fixPriority(-1); - _globals->_player.setStrip2(-1); - if (_globals->getFlag(78)) { - _globals->_player.enableControl(); - } else { - _sceneMode = 7711; - setAction(&_sequenceManager, this, 7711, NULL); - } - break; - case 7702: - _globals->_soundHandler.fadeOut(NULL); - _globals->_sceneManager.changeScene(7600); - break; - case 7703: - case 7706: - case 7707: - case 7711: - case 7712: - _globals->_player.enableControl(); - break; - case 7704: - _globals->_soundHandler.play(256); - _prof.setStrip2(4); - _prof.setFrame2(1); - _prof.setPosition(Common::Point(159, 87)); - _globals->_player.enableControl(); - break; - case 7705: - RING_INVENTORY._key._sceneNumber = 1; - _globals->_player.enableControl(); - break; - case 7708: - RING_INVENTORY._paper._sceneNumber = 1; - _globals->_player.enableControl(); - break; - case 7709: - _globals->_events.setCursor(CURSOR_USE); - break; - case 7710: - _globals->_player.enableControl(); - SceneItem::display2(7700, 62); - break; - case 7713: - _emptyJar.remove(); - RING_INVENTORY._emptyJar._sceneNumber = 1; - break; - default: - break; - } -} - -void Scene7700::process(Event &event) { - Scene::process(event); - - if (contains(_globals->_sceneItems, &_sceneItem10)) { - if (_gfxButton.process(event)) { - _sceneItem10.remove(); - _object15.remove(); - _object9.remove(); - if (_globals->_sceneObjects->contains(&_object10)) - _object10.remove(); - if (_globals->_sceneObjects->contains(&_object14)) - _object14.remove(); - _object19.remove(); - _gfxButton._bounds.expandPanes(); - _globals->_player._canWalk = true; - } - } - if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_p)) { - event.handled = true; - if (!_globals->_sceneObjects->contains(&_easterEgg1)) { - _easterEgg1.postInit(); - _easterEgg1.setVisage(7708); - _easterEgg1.setPosition(Common::Point(163, 50)); - _easterEgg1.fixPriority(1); - _easterEgg1.animate(ANIM_MODE_2, NULL); - _easterEgg1.setAction(&_action6); - } - } -} - -void Scene7700::dispatch() { - if ((_globals->_sceneRegions.indexOf(_globals->_player._position) == 6) || (_globals->_player._position.x < 10)) - _globals->_player.changeZoom(100 - ((_globals->_player._position.y - 68) / 2)); - else - _globals->_player.changeZoom(-1); - - if ((_action == 0) && (_globals->_sceneRegions.indexOf(_globals->_player._position) == 30)) { - _globals->_player.disableControl(); - _sceneMode = 7702; - setAction(&_sequenceManager, this, 7702, &_globals->_player, NULL); - } - Scene::dispatch(); -} - -void Scene7700::postInit(SceneObjectList *OwnerList) { - loadScene(7700); - Scene::postInit(); - setZoomPercents(100, 80, 200, 100); - _globals->setFlag(53); - _field97B = 0; - _field979 = 0; - _field977 = 0; - - _stripManager.addSpeaker(&_speakerEText); - _stripManager.addSpeaker(&_speakerQText); - _speakerQText._npc = &_globals->_player; - _speakerEText._npc = &_prof; - - _globals->_player.postInit(); - _globals->_player.setVisage(4201); - _globals->_player.animate(ANIM_MODE_1, NULL); - SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(-19, 68)); - _globals->_player.setStrip2(7); - _globals->_player.fixPriority(95); - _globals->_player.changeZoom(80); - _globals->_player._moveDiff.x = 6; - _globals->_player._moveDiff.y = 3; - _globals->_player.disableControl(); - - _prof.postInit(); - _prof.setVisage(7706); - - if (_globals->getFlag(78)) { - _prof.setStrip2(4); - _prof.fixPriority(80); - _prof.setPosition(Common::Point(159, 87)); - } else { - _prof.setPosition(Common::Point(203, 87)); - _prof.setStrip2(2); - _prof._numFrames = 6; - _prof.setAction(&_action2); - } - - _cloud.postInit(); - _cloud.setVisage(7700); - _cloud.setStrip2(5); - _cloud.fixPriority(1); - _cloud.setPosition(Common::Point(133, 160)); - _cloud._moveDiff.x = 1; - _cloud._moveRate = 7; - _cloud.setAction(&_action5); - - _object1.postInit(); - _object1.setVisage(7700); - _object1.setPosition(Common::Point(184, 61)); - _object1._lookLineNum = 18; - _object1._defltLineNum = 16; - - _object2.postInit(); - _object2.setVisage(7700); - _object2.setPosition(Common::Point(184, 70)); - _object2.fixPriority(60); - _object2._lookLineNum = 19; - _object2._defltLineNum = 17; - - _object3.postInit(); - _object3.setVisage(7703); - _object3.setPosition(Common::Point(288, 36)); - _object3.setStrip(2); - - _object4.postInit(); - _object4.setVisage(7700); - _object4.setPosition(Common::Point(268, 59)); - _object4.setStrip(2); - _object4._lookLineNum = 37; - _object4._defltLineNum = 35; - - _object5.postInit(); - _object5.setVisage(7700); - _object5.setPosition(Common::Point(268, 67)); - _object5.fixPriority(58); - _object5.setStrip2(3); - _object5._lookLineNum = 38; - _object5._defltLineNum = 36; - - _object6.postInit(); - _object6.setVisage(7700); - _object6.setPosition(Common::Point(268, 75)); - _object6.fixPriority(57); - _object6.setStrip2(4); - _object6._lookLineNum = 40; - _object6._defltLineNum = 43; - - _object8.postInit(); - _object8.setVisage(7703); - _object8.setPosition(Common::Point(203, 91)); - _object8.setStrip2(4); - _object8.fixPriority(86); - - _sceneHotspot8.setBounds(82, 141, 161, 92); - _sceneHotspot9.setBounds(82, 187, 161, 141); - - _cork.postInit(); - _cork.setVisage(7703); - _cork.setPosition(Common::Point(32, 128)); - - if (_globals->getFlag(49)) - _cork.setFrame(_cork.getFrameCount()); - - if (RING_INVENTORY._emptyJar._sceneNumber == 7700) { - _emptyJar.postInit(); - _emptyJar.setVisage(7700); - _emptyJar.setStrip(8); - _emptyJar.setPosition(Common::Point(189, 48)); - _globals->_sceneItems.addItems(&_emptyJar, NULL); - } - _sceneHotspot1._sceneRegionId = 28; - _sceneHotspot2._sceneRegionId = 6; - _sceneHotspot3._sceneRegionId = 10; - _sceneHotspot4._sceneRegionId = 11; - _sceneHotspot5._sceneRegionId = 9; - _sceneHotspot6._sceneRegionId = 7; - - _sceneItem7.setBounds(0, 320, 200, 0); - _sceneItem10.setBounds(0, 320, 200, 0); - - _sceneHotspot11._sceneRegionId = 57; - _sceneHotspot11._useLineNum = 0; - _sceneHotspot11._lookLineNum = 0; - _sceneHotspot12._sceneRegionId = 2; - _sceneHotspot12._useLineNum = 2; - _sceneHotspot12._lookLineNum = 2; - _sceneHotspot13._sceneRegionId = 12; - _sceneHotspot13._useLineNum = 3; - _sceneHotspot13._lookLineNum = 3; - _sceneHotspot14._sceneRegionId = 18; - _sceneHotspot14._useLineNum = 4; - _sceneHotspot14._lookLineNum = 5; - _sceneHotspot15.setBounds(0, 55, 50, 8); - _sceneHotspot15._useLineNum = 6; - _sceneHotspot15._lookLineNum = 7; - _sceneHotspot16.setBounds(0, 130, 34, 103); - _sceneHotspot16._useLineNum = 7; - _sceneHotspot16._lookLineNum = 8; - _sceneHotspot17.setBounds(41, 180, 46, 170); - _sceneHotspot17._useLineNum = 11; - _sceneHotspot17._lookLineNum = 13; - _sceneHotspot18.setBounds(38, 187, 46, 180); - _sceneHotspot18._useLineNum = 12; - _sceneHotspot18._lookLineNum = 14; - _sceneHotspot19._sceneRegionId = 3; - _sceneHotspot19._useLineNum = 14; - _sceneHotspot19._lookLineNum = 16; - _sceneHotspot20._sceneRegionId = 14; - _sceneHotspot20._useLineNum = 15; - _sceneHotspot20._lookLineNum = 17; - _sceneHotspot21.setBounds(9, 215, 26, 210); - _sceneHotspot21._useLineNum = 18; - _sceneHotspot21._lookLineNum = 20; - _sceneHotspot22.setBounds(10, 221, 26, 215); - _sceneHotspot22._useLineNum = 19; - _sceneHotspot22._lookLineNum = 21; - _sceneHotspot23.setBounds(6, 230, 26, 225); - _sceneHotspot23._useLineNum = 20; - _sceneHotspot23._lookLineNum = 22; - _sceneHotspot24._sceneRegionId = 13; - _sceneHotspot24._useLineNum = 21; - _sceneHotspot24._lookLineNum = 23; - _sceneHotspot25._sceneRegionId = 21; - _sceneHotspot25._useLineNum = 22; - _sceneHotspot25._lookLineNum = 24; - _sceneHotspot26._sceneRegionId = 19; - _sceneHotspot26._useLineNum = 23; - _sceneHotspot26._lookLineNum = 25; - _sceneHotspot27._sceneRegionId = 27; - _sceneHotspot27._useLineNum = 24; - _sceneHotspot27._lookLineNum = 26; - _sceneHotspot28._sceneRegionId = 15; - _sceneHotspot28._useLineNum = 25; - _sceneHotspot28._lookLineNum = 27; - _sceneHotspot29._sceneRegionId = 26; - _sceneHotspot29._useLineNum = 27; - _sceneHotspot29._lookLineNum = 29; - _sceneHotspot30.setBounds(0, 317, 34, 310); - _sceneHotspot30._useLineNum = 28; - _sceneHotspot30._lookLineNum = 30; - _sceneHotspot31._sceneRegionId = 17; - _sceneHotspot31._useLineNum = 29; - _sceneHotspot31._lookLineNum = 31; - _sceneHotspot32._sceneRegionId = 25; - _sceneHotspot32._useLineNum = 30; - _sceneHotspot32._lookLineNum = 32; - _sceneHotspot33._sceneRegionId = 5; - _sceneHotspot33._useLineNum = 31; - _sceneHotspot33._lookLineNum = 33; - _sceneHotspot34.setBounds(42, 292, 48, 281); - _sceneHotspot34._useLineNum = 32; - _sceneHotspot34._lookLineNum = 35; - _sceneHotspot35._sceneRegionId = 24; - _sceneHotspot35._useLineNum = 38; - _sceneHotspot35._lookLineNum = 41; - _sceneHotspot36._sceneRegionId = 1; - _sceneHotspot36._useLineNum = 39; - _sceneHotspot36._lookLineNum = 42; - - _globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL); - _globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL); - - _sceneMode = 7701; - setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL); - _soundHandler.play(256); -} - -Scene7700::Scene7700() { - _object1._state = 0; - _object2._state = 0; - _object4._state = 0; - _object5._state = 0; - _object6._state = 0; - _prof._state = 0; -} - -void Scene7700::synchronize(Serializer &s) { - Scene::synchronize(s); - if (s.getVersion() >= 3) { - s.syncAsSint16LE(_field977); - s.syncAsSint16LE(_field979); - s.syncAsSint16LE(_field97B); - } -} - -} // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld_scenes8.h deleted file mode 100644 index fe9560d9d8..0000000000 --- a/engines/tsage/ringworld_scenes8.h +++ /dev/null @@ -1,490 +0,0 @@ -/* 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. - * - */ - -#ifndef TSAGE_RINGWORLD_SCENES8_H -#define TSAGE_RINGWORLD_SCENES8_H - -#include "common/scummsys.h" -#include "tsage/ringworld_logic.h" -#include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" - -namespace tSage { - -class NamedHotspotMult : public SceneHotspot { -public: - int _useLineNum, _lookLineNum; - NamedHotspotMult() : SceneHotspot() {} - - virtual Common::String getClassName() { return "NamedHotspotMult"; } - virtual void synchronize(Serializer &s); -}; - -class SceneObject7700 : public SceneObjectExt { -public: - int _lookLineNum, _defltLineNum; - - virtual void synchronize(Serializer &s); - virtual Common::String getClassName() { return "SceneObject7700"; } -}; - -class Scene7000 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void dispatch(); - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - - /* Objects */ - class Object1 : public SceneObject { - public: - virtual void doAction(int action); - }; - - /* Items */ - class Hotspot1 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - SpeakerSKText _speakerSKText; - SpeakerSKL _speakerSKL; - SpeakerQL _speakerQL; - SpeakerQR _speakerQR; - SpeakerQText _speakerQText; - Object1 _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneObject _object7; - SceneObject _object8; - SceneObject _object9; - SceneObject _object10; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Hotspot1 _hotspot1; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void dispatch(); -}; - -class Scene7100 : public Scene { - /* Actions */ - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - class Action7 : public Action { - public: - virtual void signal(); - }; - class Action8 : public Action { - public: - virtual void signal(); - }; - class Action9 : public Action { - public: - virtual void signal(); - }; - class Action10 : public Action { - public: - virtual void signal(); - }; - class Action11 : public Action { - public: - virtual void signal(); - }; - -public: - ASound _soundHandler1; - ASound _soundHandler2; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneObject _object7; - SceneObject _object8; - SceneObject _object9; - SceneObject _object10; - SceneObject _object11; - SceneObject _object12; - SceneObject _object13; - SceneObject _object14; - SceneObject _object15; - SceneObject _object16; - SceneObject _object17; - SceneObject _object18; - SceneObject _object19; - SceneObject _object20; - SceneObject _object21; - SceneObject _object22; - SceneObject _object23; - SceneObject _object24; - SceneObject _object25; - Action _action1; - Action _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Action9 _action9; - Action10 _action10; - Action11 _action11; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene7200 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - -public: - Action1 _action1; - Action2 _action2; - SceneObject _swimmer; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneObject _object7; - SceneObject _object8; - SceneObject _object9; - ASound _soundHandler; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene7300 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - -public: - SpeakerPOR _speakerPOR; - SpeakerPOText _speakerPOText; - SpeakerSKText _speakerSKText; - SpeakerQU _speakerQU; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - SceneObject _object7; - SceneObject _object8; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void dispatch(); -}; - -class Scene7600 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - -public: - Action1 _action1; - Action2 _action2; - SceneObject _object1; - SceneObject _object2; - SceneObject _object3; - SceneObject _object4; - SceneObject _object5; - SceneObject _object6; - ASound _soundHandler1; - ASound _soundHandler2; - - virtual void postInit(SceneObjectList *OwnerList = NULL); -}; - -class Scene7700 : public Scene { - /* Actions */ - class Action1 : public Action { - public: - virtual void signal(); - }; - class Action2 : public Action { - public: - virtual void signal(); - }; - class Action3 : public Action { - public: - virtual void signal(); - }; - class Action4 : public Action { - public: - virtual void signal(); - }; - class Action5 : public Action { - public: - virtual void signal(); - }; - class Action6 : public Action { - public: - virtual void signal(); - }; - - class Object1 : public SceneObject7700 { - public: - virtual void signal(); - virtual void doAction(int action); - }; - class Object3 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object7 : public SceneObjectExt { - public: - virtual void doAction(int action); - }; - class Object8 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object9 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object10 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object11 : public SceneObject { - public: - virtual void doAction(int action); - }; - class Object12 : public SceneObject { - public: - virtual void doAction(int action); - }; - - /* Items */ - class SceneHotspot1 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot2 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot3 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot4 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot5 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot6 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneItem7 : public SceneItem { - public: - virtual void doAction(int action); - }; - class SceneHotspot8 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneHotspot9 : public SceneHotspot { - public: - virtual void doAction(int action); - }; - class SceneItem10 : public SceneItem { - public: - virtual void doAction(int action); - }; - class SceneHotspot11 : public NamedHotspotMult { - public: - virtual void doAction(int action); - }; -public: - ASound _soundHandler; - SequenceManager _sequenceManager; - GfxButton _gfxButton; - SpeakerEText _speakerEText; - SpeakerQText _speakerQText; - Object1 _object1; - Object1 _object2; - Object3 _object3; - Object1 _object4; - Object1 _object5; - Object1 _object6; - Object7 _prof; - Object8 _object8; - Object9 _object9; - Object10 _object10; - Object11 _cork; - Object12 _emptyJar; - SceneObject _object13; - SceneObject _object14; - SceneObject _object15; - SceneObject _cloud; - SceneObject _easterEgg1; - SceneObject _easterEgg2; - SceneObject _object19; - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - SceneHotspot1 _sceneHotspot1; - SceneHotspot2 _sceneHotspot2; - SceneHotspot3 _sceneHotspot3; - SceneHotspot4 _sceneHotspot4; - SceneHotspot5 _sceneHotspot5; - SceneHotspot6 _sceneHotspot6; - SceneItem7 _sceneItem7; - SceneHotspot8 _sceneHotspot8; - SceneHotspot9 _sceneHotspot9; - SceneItem10 _sceneItem10; - SceneHotspot11 _sceneHotspot11; - SceneHotspot11 _sceneHotspot12; - SceneHotspot11 _sceneHotspot13; - SceneHotspot11 _sceneHotspot14; - SceneHotspot11 _sceneHotspot15; - SceneHotspot11 _sceneHotspot16; - SceneHotspot11 _sceneHotspot17; - SceneHotspot11 _sceneHotspot18; - SceneHotspot11 _sceneHotspot19; - SceneHotspot11 _sceneHotspot20; - SceneHotspot11 _sceneHotspot21; - SceneHotspot11 _sceneHotspot22; - SceneHotspot11 _sceneHotspot23; - SceneHotspot11 _sceneHotspot24; - SceneHotspot11 _sceneHotspot25; - SceneHotspot11 _sceneHotspot26; - SceneHotspot11 _sceneHotspot27; - SceneHotspot11 _sceneHotspot28; - SceneHotspot11 _sceneHotspot29; - SceneHotspot11 _sceneHotspot30; - SceneHotspot11 _sceneHotspot31; - SceneHotspot11 _sceneHotspot32; - SceneHotspot11 _sceneHotspot33; - SceneHotspot11 _sceneHotspot34; - SceneHotspot11 _sceneHotspot35; - SceneHotspot11 _sceneHotspot36; - int _field977, _field979, _field97B; - - Scene7700(); - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); - virtual void synchronize(Serializer &s); -}; - -} // End of namespace tSage - -#endif diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 6a164a6b1e..954c63e081 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -22,7 +22,7 @@ #include "tsage/scenes.h" #include "tsage/globals.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" #include "tsage/tsage.h" #include "tsage/saveload.h" -- cgit v1.2.3 From 2a69bcbebafda402ba34cfd393790ef4277f49ee Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 13 Aug 2011 19:56:43 +1000 Subject: CGE: Fix backslashes in module.mk --- engines/tsage/module.mk | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 41078cdaaf..5c7104936e 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -1,9 +1,9 @@ MODULE := engines/tsage MODULE_OBJS := \ - blue_force\blueforce_logic.o \ - blue_force\blueforce_scenes0.o \ - blue_force\blueforce_scenes1.o \ + blue_force/blueforce_logic.o \ + blue_force/blueforce_scenes0.o \ + blue_force/blueforce_scenes1.o \ converse.o \ core.o \ debugger.o \ @@ -13,16 +13,16 @@ MODULE_OBJS := \ globals.o \ graphics.o \ resources.o \ - ringworld\ringworld_demo.o \ - ringworld\ringworld_logic.o \ - ringworld\ringworld_scenes1.o \ - ringworld\ringworld_scenes2.o \ - ringworld\ringworld_scenes3.o \ - ringworld\ringworld_scenes4.o \ - ringworld\ringworld_scenes5.o \ - ringworld\ringworld_scenes6.o \ - ringworld\ringworld_scenes8.o \ - ringworld\ringworld_scenes10.o \ + ringworld/ringworld_demo.o \ + ringworld/ringworld_logic.o \ + ringworld/ringworld_scenes1.o \ + ringworld/ringworld_scenes2.o \ + ringworld/ringworld_scenes3.o \ + ringworld/ringworld_scenes4.o \ + ringworld/ringworld_scenes5.o \ + ringworld/ringworld_scenes6.o \ + ringworld/ringworld_scenes8.o \ + ringworld/ringworld_scenes10.o \ saveload.o \ scenes.o \ sound.o \ -- cgit v1.2.3 From 2dbd8581866ea34db2051ee08cabf511b707f4e2 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 13 Aug 2011 21:14:48 +1000 Subject: TSAGE: Fix crash when exiting whilst a palette rotation is active --- engines/tsage/globals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 39850cd1a5..0b74244b35 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -117,6 +117,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface } Globals::~Globals() { + _scenePalette.clearListeners(); delete _inventory; delete _game; _globals = NULL; -- cgit v1.2.3 From 0e8840568bed09c8baa670f079a6fe438fffad56 Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Sat, 13 Aug 2011 20:38:21 +0300 Subject: README: Make 'Hotkeys' title consistent with ToC --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README b/README index f2c9de5fc2..b06e19dffe 100644 --- a/README +++ b/README @@ -1163,8 +1163,8 @@ Engines which currently support returning to the Launcher are: TUCKER -5.5) Hot Keys: ----- --------- +5.5) Hotkeys: +---- -------- ScummVM supports various in-game hotkeys. They differ between SCUMM games and other games. -- cgit v1.2.3 From 0bbd43eb3217bb04184ba9e1b27e43424a899c89 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Sat, 13 Aug 2011 20:18:23 +0200 Subject: MOHAWK: Implement Myst demo opcodes 298 and 299, sneak preview speech. --- engines/mohawk/graphics.cpp | 8 ++ engines/mohawk/graphics.h | 2 + engines/mohawk/myst_stacks/myst.h | 4 +- engines/mohawk/myst_stacks/preview.cpp | 166 +++++++++++++++++++++++++++------ engines/mohawk/myst_stacks/preview.h | 19 +++- engines/mohawk/sound.cpp | 2 +- 6 files changed, 169 insertions(+), 32 deletions(-) diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index b3653b1fdf..25a327bc14 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -672,6 +672,14 @@ void MystGraphics::simulatePreviousDrawDelay(const Common::Rect &dest) { _nextAllowedDrawTime = time + _constantDrawDelay + dest.height() * dest.width() / _proportionalDrawDelay; } +void MystGraphics::fadeToBlack() { + // TODO: Implement +} + +void MystGraphics::fadeFromBlack() { + // TODO: Implement +} + #endif // ENABLE_MYST #ifdef ENABLE_RIVEN diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h index d7057f48cf..c5ce016f0a 100644 --- a/engines/mohawk/graphics.h +++ b/engines/mohawk/graphics.h @@ -129,6 +129,8 @@ public: void drawRect(Common::Rect rect, RectState state); void drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color); void enableDrawingTimeSimulation(bool enable); + void fadeToBlack(); + void fadeFromBlack(); protected: MohawkSurface *decodeImage(uint16 id); diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index 9510d371d7..e9bff08cb4 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -40,8 +40,8 @@ public: Myst(MohawkEngine_Myst *vm); ~Myst(); - void disablePersistentScripts(); - void runPersistentScripts(); + virtual void disablePersistentScripts(); + virtual void runPersistentScripts(); private: void setupOpcodes(); diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp index 07e4fa6e57..0e720c6112 100644 --- a/engines/mohawk/myst_stacks/preview.cpp +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -60,13 +60,24 @@ void Preview::setupOpcodes() { OVERRIDE_OPCODE(199, opcode_199); // "Init" Opcodes - OPCODE(298, opcode_298); - OPCODE(299, opcode_299); + OPCODE(298, o_speech_init); + OPCODE(299, o_library_init); } #undef OPCODE #undef OVERRIDE_OPCODE +void Preview::disablePersistentScripts() { + Myst::disablePersistentScripts(); +} + +void Preview::runPersistentScripts() { + Myst::runPersistentScripts(); + + if (_speechRunning) + speech_run(); +} + void Preview::opcode_196(uint16 op, uint16 var, uint16 argc, uint16 *argv) { varUnusedCheck(op, var); @@ -103,37 +114,138 @@ void Preview::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) { // Voice Over and Card Advance? } -void Preview::opcode_298(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void Preview::speechUpdateCue() { + // This is a callback in the original, handling audio events. + if (!_vm->_sound->isPlaying(3001)) { + return; + } - // Used for Card 3000 (Closed Myst Book) - // TODO: Fill in logic. - // Start Voice Over... which controls book opening - _vm->_sound->replaceSoundMyst(3001); - - // then link to Myst - Trigger of Hotspot? then opcode 199/196/197 for voice over continue? - // TODO: Sync Voice and Actions to Original - // TODO: Flash Library Red - // TODO: Move to run process based delay to prevent - // blocking... - _vm->_system->updateScreen(); - _vm->_system->delayMillis(20 * 1000); - - for (uint16 imageId = 3001; imageId <= 3012; imageId++) { - _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); - _vm->_system->updateScreen(); - _vm->_system->delayMillis(5 * 1000); + uint samples = _vm->_sound->getNumSamplesPlayed(3001); + for (int16 i = 0; i < _cueList.pointCount; i++) { + if (_cueList.points[i].sampleFrame > samples) + return; + if (i > _currentCue - 1) { + _currentCue++; + debugC(kDebugScript, "Sneak speech advanced to cue %d", _currentCue); + } } } -void Preview::opcode_299(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void Preview::speech_run() { + uint32 time = _vm->_system->getMillis(); + + // Update current speech sound cue + speechUpdateCue(); + + switch (_speechStep) { + case 0: // Start Voice Over... which controls book opening + _currentCue = 0; + _vm->_sound->playSound(3001, Audio::Mixer::kMaxChannelVolume, false, &_cueList); + + _speechStep++; + break; + case 1: // Open book + if (_currentCue >= 1) { + _vm->changeToCard(3001, true); + + _speechStep++; + } + break; + case 2: // Go to Myst + if (_currentCue >= 2) { + _vm->_gfx->fadeToBlack(); + _vm->changeToCard(3002, true); + _vm->_gfx->fadeFromBlack(); + + _speechStep++; + } + break; + case 3: // Start blinking the library + if (_currentCue >= 3) { + _libraryState = 1; + _speechNextTime = 0; + _speechStep++; + } + break; + case 4: // Library blinking, zoom in library + if (_currentCue >= 4) { + _library->drawConditionalDataToScreen(0); + + _vm->changeToCard(3003, true); + + _speechNextTime = time + 2000; + _speechStep++; + } else { + if (time < _speechNextTime) + break; + + _library->drawConditionalDataToScreen(_libraryState); + _libraryState = (_libraryState + 1) % 2; + _speechNextTime = time + 500; + } + break; + case 5: // Go to library near view + if (time < _speechNextTime) + break; + + _vm->changeToCard(3004, true); + _speechNextTime = time + 2000; + _speechStep++; + break; + case 6: // Fade to courtyard + if (time < _speechNextTime) + break; + + _vm->_gfx->fadeToBlack(); + _vm->changeToCard(3005, true); + _vm->_gfx->fadeFromBlack(); + _speechNextTime = time + 1000; + _speechStep++; + break; + case 7: // Walk to library + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + if (time < _speechNextTime) + break; + + _vm->changeToCard(3006 + _speechStep - 7, true); + _speechNextTime = time + 2000; + _speechStep++; + break; + case 14: // Go to playable library card + if (time < _speechNextTime) + break; + + _vm->changeToCard(4329, true); + + _speechRunning = false; + _globals.currentAge = 2; + + _vm->_cursor->showCursor(); + break; + default: + warning("Unknown speech step"); + break; + } +} + +void Preview::o_speech_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Speech init", op); + + // Used for Card 3000 (Closed Myst Book) + _speechStep = 0; + _speechRunning = true; +} + +void Preview::o_library_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Library init", op); // Used for Card 3002 (Myst Island Overview) - // TODO: Fill in logic. - // Zoom into Island? - // On this card is a Type 8 controlled by Var 0, which - // can change the Myst Library to Red.. + _library = static_cast(_invokingResource); } } // End of namespace MystStacks diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h index 7e4e418eef..a884be8d4d 100644 --- a/engines/mohawk/myst_stacks/preview.h +++ b/engines/mohawk/myst_stacks/preview.h @@ -40,6 +40,9 @@ public: Preview(MohawkEngine_Myst *vm); ~Preview(); + void disablePersistentScripts(); + void runPersistentScripts(); + private: void setupOpcodes(); @@ -48,8 +51,20 @@ private: DECLARE_OPCODE(opcode_198); DECLARE_OPCODE(opcode_199); - DECLARE_OPCODE(opcode_298); - DECLARE_OPCODE(opcode_299); + DECLARE_OPCODE(o_speech_init); + DECLARE_OPCODE(o_library_init); + + uint16 _libraryState; // 4 + MystResourceType8 *_library; // 32 + + bool _speechRunning; + uint _speechStep; + CueList _cueList; + int16 _currentCue; + uint32 _speechNextTime; // 6 + + void speech_run(); + void speechUpdateCue(); }; } // End of namespace MystStacks diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index 68b60515be..f92bebf10e 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -85,7 +85,7 @@ Audio::AudioStream *Sound::makeAudioStream(uint16 id, CueList *cueList) { if (_vm->getFeatures() & GF_ME) audStream = Audio::makeWAVStream(_vm->getResource(ID_MSND, convertMystID(id)), DisposeAfterUse::YES); else - audStream = makeMohawkWaveStream(_vm->getResource(ID_MSND, id)); + audStream = makeMohawkWaveStream(_vm->getResource(ID_MSND, id), cueList); break; case GType_ZOOMBINI: audStream = makeMohawkWaveStream(_vm->getResource(ID_SND, id)); -- cgit v1.2.3 From c3339c15fad1f729dd55d5f4780c5d483643b59c Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sat, 13 Aug 2011 22:06:52 +0200 Subject: COMPOSER: Tweak button z-ordering slightly. This fixes agreeing to make ice cream sundaes in Gregory. --- engines/composer/composer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp index 41afc13184..d3252d43b9 100644 --- a/engines/composer/composer.cpp +++ b/engines/composer/composer.cpp @@ -321,7 +321,7 @@ void ComposerEngine::loadLibrary(uint id) { bool inserted = false; for (Common::List