scummvm/engines/dragons/minigame3.cpp

780 lines
25 KiB
C++

/* 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/scummsys.h"
#include "common/rect.h"
#include "dragons/actor.h"
#include "dragons/font.h"
#include "dragons/minigame3.h"
#include "dragons/dragonini.h"
#include "dragons/inventory.h"
#include "dragons/scene.h"
#include "dragons/screen.h"
#include "dragons/sound.h"
#include "dragons/talk.h"
#include "dragons/dragons.h"
namespace Dragons {
struct BunnyStruct {
uint32 positionIdx;
uint32 x;
uint32 y;
uint32 field_0xc;
uint32 field_0x10;
};
struct TearInfo {
uint16 x;
uint16 y;
uint16 unk;
uint16 yRelated;
};
struct UnkStruct {
uint16 position1;
uint16 position2;
uint32 unk4;
uint32 unk8;
uint32 unk12;
uint32 unk16;
uint32 field_0x14;
};
Minigame3::Minigame3(DragonsEngine *vm) : _vm(vm) {}
void Minigame3::run() {
bool bVar1;
Actor *handActorId;
//uint16 actorId;
int16 sVar2;
//int iVar3;
uint tmpValue;
int iVar4;
DragonINI *flicker;
uint16 origSceneId;
//byte auStack1584_palette[512]; //[126];
//uint16 local_5b2;
//byte auStack1072_palette[512];
Actor *bunnyActorTbl[4];
uint16 local_228 = 0;
//uint16 local_226;
int16 local_224;
Actor *tearActorTbl[8];
uint16 local_210;
int16 local_208[16];
uint local_1e8;
uint oldEngineFlags;
uint16 local_1e0;
uint16 local_1de;
Actor *tearBlinkActorTbl2[4];
Actor *tearBlinkActorTbl[4];
int16 local_1c8 = 0;
int16 local_1c6 = 0;
uint16 local_1c2;
int16 local_1c0;
int16 local_1be;
int16 local_1bc;
int16 local_1ba;
uint16 local_1b8;
int16 eyeBgYOffsetTbl[21];
TearInfo tearInfo[30];
Common::Point bunnyPositionsTbl[4];
Common::Point handPositionsTbl[4];
uint16 goodRabbitPositionTbl[4];
uint16 bunnyPositionTbl[4];
int16 currentState;
uint16 flags;
int16 local_5c;
int16 local_5a;
int16 local_58;
int16 local_56;
int16 hopCounter;
uint16 local_50 = 0;
BunnyStruct bunnyInfo[2];
uint16 local_20 = 0;
uint16 local_1e = 0;
uint16 local_1c = 0;
uint16 local_1a = 0;
int16 local_16;
int16 local_14;
InventoryState origInventoryType;
int16 local_10;
int16 local_e;
UnkStruct UnkStruct_ARRAY_800931a0[4];
int16 unkXPosTbl[20];
Common::File *fd = new Common::File();
if (!fd->open("arc3.bin")) {
error("Failed to open arc3.bin");
}
for (int i = 0; i < 21; i++) {
eyeBgYOffsetTbl[i] = fd->readUint16LE();
}
fd->seek(0x2c);
for (int i = 0; i < 30; i++) {
tearInfo[i].x = fd->readUint16LE();
tearInfo[i].y = fd->readUint16LE();
tearInfo[i].unk = fd->readUint16LE();
tearInfo[i].yRelated = fd->readUint16LE();
}
for (int i = 0; i < 4; i++) {
bunnyPositionsTbl[i].x = fd->readUint16LE();
bunnyPositionsTbl[i].y = fd->readUint16LE();
}
for (int i = 0; i < 4; i++) {
handPositionsTbl[i].x = fd->readUint16LE();
handPositionsTbl[i].y = fd->readUint16LE();
}
fd->seek(0x4914);
for (int i = 0; i < 4; i++) {
UnkStruct_ARRAY_800931a0[i].position1 = fd->readUint16LE();
UnkStruct_ARRAY_800931a0[i].position2 = fd->readUint16LE();
UnkStruct_ARRAY_800931a0[i].unk4 = fd->readUint32LE();
UnkStruct_ARRAY_800931a0[i].unk8 = fd->readUint32LE();
UnkStruct_ARRAY_800931a0[i].unk12 = fd->readUint32LE();
UnkStruct_ARRAY_800931a0[i].unk16 = fd->readUint32LE();
UnkStruct_ARRAY_800931a0[i].field_0x14 = fd->readUint32LE();
}
for (int i = 0; i < 20; i++) {
unkXPosTbl[i] = fd->readSint16LE();
}
fd->close();
delete fd;
origInventoryType = _vm->_inventory->getState();
_vm->fadeToBlack();
_vm->_inventory->setState(Closed);
_vm->reset_screen_maybe();
flicker = _vm->_dragonINIResource->getFlickerRecord();
flicker->sceneId = 0;
_vm->_dragonINIResource->setFlickerRecord(nullptr);
origSceneId = _vm->getCurrentSceneId();
_vm->_scene->setSceneId(6);
_vm->_scene->loadScene(6 | 0x8000, 0);
_vm->_scene->setFgLayerPriority(4);
// TODO
_vm->_screen->loadPalette(1, _vm->_scene->getPalette());
_vm->_screen->loadPalette(4, _vm->_scene->getPalette());
_vm->_screen->updatePaletteTransparency(4, 1, 0xff, true);
fun_80017ef0();
oldEngineFlags = _vm->getAllFlags();
_vm->clearFlags(ENGINE_FLAG_80);
_vm->clearFlags(ENGINE_FLAG_20);
_vm->clearFlags(ENGINE_FLAG_10);
_vm->clearFlags(ENGINE_FLAG_8);
_vm->clearFlags(ENGINE_FLAG_1);
_vm->setFlags(ENGINE_FLAG_100);
_vm->setFlags(ENGINE_FLAG_1000_SUBTITLES_DISABLED);
// TODO
// memcpy2(auStack1584_palette, scrFileData_maybe, 0x200);
// memcpy2(auStack1072_palette, scrFileData_maybe, 0x200);
// local_5b2 = 0x7fff;
// DisableVSyncEvent();
int i = 0;
while ((int16)i < 4) {
bunnyActorTbl[(int16)i] = _vm->_actorManager->loadActor(0x15, 4, 0, 0);
if (bunnyActorTbl[(int16)i] == nullptr) {
error("Couldn't_alloc_bunny");
}
bunnyActorTbl[(int16)i]->setFlag(ACTOR_FLAG_80);
bunnyActorTbl[(int16)i]->setFlag(ACTOR_FLAG_100);
bunnyActorTbl[(int16)i]->setFlag(ACTOR_FLAG_200);
bunnyActorTbl[(int16)i]->setFlag(ACTOR_FLAG_4000);
bunnyActorTbl[(int16)i]->_priorityLayer = 0;
bunnyActorTbl[(int16)i]->_x_pos = bunnyPositionsTbl[(int16)i].x;
bunnyActorTbl[(int16)i]->_y_pos = bunnyPositionsTbl[(int16)i].y;
i = i + 1;
}
i = 0;
while ((int16)i < 8) {
tearActorTbl[(int16)i] = _vm->_actorManager->loadActor(0x15, 0x13, 0, 0);
if (tearActorTbl[(int16)i] == nullptr) {
error("Couldn't alloc tear");
}
tearActorTbl[(int16)i]->_flags = tearActorTbl[(int16)i]->_flags | 0x380;
tearActorTbl[(int16)i]->_scale = DRAGONS_ENGINE_SPRITE_100_PERCENT_SCALE;
tearActorTbl[(int16)i]->_priorityLayer = 0;
local_208[(int16)i] = -1;
local_208[(int)(int16)i + 8] = 0;
i = i + 1;
}
local_1e0 = 0;
local_1e8 = 0;
handActorId = _vm->_actorManager->loadActor(0x19, 0, 0, 0);
if (handActorId == nullptr) {
error("Couldn't alloc hand");
}
handActorId->setFlag(ACTOR_FLAG_80);
handActorId->setFlag(ACTOR_FLAG_100);
handActorId->setFlag(ACTOR_FLAG_200);
handActorId->setFlag(ACTOR_FLAG_800);
handActorId->setFlag(ACTOR_FLAG_2000);
handActorId->setFlag(ACTOR_FLAG_4000);
handActorId->_scale = DRAGONS_ENGINE_SPRITE_100_PERCENT_SCALE;
handActorId->_priorityLayer = 0;
handActorId->_walkSpeed = 0x40000;
i = 0;
while ((int16)i < 2) {
tearBlinkActorTbl[(int16)i] = _vm->_actorManager->loadActor(0x34, (uint)i, 0, 0);
if (tearBlinkActorTbl[(int16)i] == nullptr) {
error("Couldn't alloc tear blink");
}
tearBlinkActorTbl[(int16)i]->_flags = tearBlinkActorTbl[(int16)i]->_flags | 0x4384;
tearBlinkActorTbl[(int16)i]->_scale = DRAGONS_ENGINE_SPRITE_100_PERCENT_SCALE;
tearBlinkActorTbl[(int16)i]->_priorityLayer = 0;
i = i + 1;
}
i = 0;
while ((int16)i < 2) {
tearBlinkActorTbl2[(int16)i] = _vm->_actorManager->loadActor(0x16, (uint)i, 0, 0);
if (tearBlinkActorTbl2[(int16)i] == nullptr) {
error("Couldn't alloc tear blink");
}
tearBlinkActorTbl2[(int16)i]->setFlag(ACTOR_FLAG_100);
tearBlinkActorTbl2[(int16)i]->setFlag(ACTOR_FLAG_800);
tearBlinkActorTbl2[(int16)i]->_scale = DRAGONS_ENGINE_SPRITE_100_PERCENT_SCALE;
tearBlinkActorTbl2[(int16)i]->_priorityLayer = 0;
i = i + 1;
}
tearBlinkActorTbl2[0]->_x_pos = 0x56;
tearBlinkActorTbl2[0]->_y_pos = 0x8c;
tearBlinkActorTbl2[1]->_x_pos = 0xf0;
tearBlinkActorTbl2[1]->_y_pos = 0x8c;
tearBlinkActorTbl[0]->_x_pos = 0x23; //DAT_80093228_23;
tearBlinkActorTbl[1]->_x_pos = 0xbf; //DAT_8009322a_bf;
tearBlinkActorTbl[0]->_y_pos = 0xcc;
tearBlinkActorTbl[1]->_y_pos = 0xcc;
// EnableVSyncEvent();
i = 0;
while ((int16)i < 4) {
goodRabbitPositionTbl[(int16)i] = 0;
i = i + 1;
}
local_16 = _vm->getRand(4);
goodRabbitPositionTbl[(int16)local_16] = 1;
i = 0;
while ((int16)i < 4) {
bunnyPositionTbl[(int16)i] = i;
bunnyActorTbl[(int16)i]->_priorityLayer = 2;
bunnyActorTbl[(int16)i]->updateSequence(4);
i = i + 1;
}
_vm->waitForFrames(1);
updateBackgroundLayerOffset(2, 0x280, 0);
updateBackgroundLayerOffset(1, 0, 0);
updateBackgroundLayerOffset(0, 0, 0);
_vm->fadeFromBlack();
_vm->waitForFrames(0xf);
_vm->_talk->loadAndDisplayDialogAroundPoint(0x479A, 0x14, 3, 0x1e01, 0);
_vm->waitForFrames(0x1e);
// TODO clearTextDialog((uint)DAT_8008e7e8, (uint)DAT_8008e844, (uint)DAT_8008e848, (uint)DAT_8008e874);
i = 0;
while ((int16)i < 4) {
if (goodRabbitPositionTbl[(int16)i] == 0) {
bunnyActorTbl[(int16)i]->updateSequence(1);
} else {
local_16 = i;
}
i = i + 1;
}
//TODO why doesn't this work?
// do {
// iVar3 = (int)(int16)local_16 + 1;
// iVar4 = iVar3;
// if (iVar3 < 0) {
// iVar4 = (int)(int16)local_16 + 4;
// }
// } while (!bunnyActorTbl[iVar3 + (iVar4 >> 2) * -4]->isFlagSet(ACTOR_FLAG_4));
bunnyActorTbl[local_16]->waitUntilFlag4IsSet();
bunnyActorTbl[(int16)local_16]->updateSequence(0);
bunnyActorTbl[(int16)local_16]->waitUntilFlag4IsSet();
i = 0;
while ((int16)i < 4) {
bunnyActorTbl[(int16)i]->updateSequence(4);
i = i + 1;
}
_vm->waitForFrames(0x1e);
_vm->waitForFrames(0x1e);
// TODO clearTextDialog((uint)DAT_8008e7e8, (uint)DAT_8008e844, (uint)DAT_8008e848, (uint)DAT_8008e874);
local_56 = 0;
local_1c0 = 0;
currentState = 2;
flags = 0;
local_58 = 0x1e;
hopCounter = 0;
local_210 = 0;
local_1de = 0;
local_5a = 0;
local_5c = _vm->getRand(2);
local_5c = local_5c + 5;
local_1be = 1;
local_1bc = _vm->getRand(3);
local_1bc = local_1bc + 3;
local_1ba = 10;
local_1b8 = 0;
local_10 = 0;
local_e = 0;
tearBlinkActorTbl[0]->_priorityLayer = 3;
tearBlinkActorTbl[1]->_priorityLayer = 3;
tearBlinkActorTbl[0]->updateSequence(0);
tearBlinkActorTbl[1]->updateSequence(1);
local_1c2 = 0;
while (true) {
_vm->waitForFrames(1);
switch (currentState) {
case 1:
if ((bunnyActorTbl[local_1a]->_sequenceID != 5) || ((bunnyActorTbl[local_1a]->_flags & 4) != 0)) {
if ((local_56 < 1) ||
(((int)bunnyInfo[local_20].x >> 9 <= (int)(uint)(uint16)bunnyPositionsTbl[bunnyInfo[local_1e].positionIdx].x ||
((int)(uint)(uint16)bunnyPositionsTbl[bunnyInfo[local_20].positionIdx].x <= (int)bunnyInfo[local_1e].x >> 9)))) {
bunnyActorTbl[local_1c]->_x_pos = bunnyPositionsTbl[bunnyInfo[local_1e].positionIdx].x;
bunnyActorTbl[local_1a]->_x_pos = bunnyPositionsTbl[bunnyInfo[local_20].positionIdx].x;
bunnyActorTbl[local_1c]->_y_pos = bunnyPositionsTbl[bunnyInfo[local_1e].positionIdx].y;
bunnyActorTbl[local_1a]->_y_pos = bunnyPositionsTbl[bunnyInfo[local_20].positionIdx].y;
currentState = 5;
} else {
if (bunnyActorTbl[local_1a]->_sequenceID == 5) {
bunnyActorTbl[local_1a]->updateSequence(6);
bunnyActorTbl[local_1c]->updateSequence(0xd);
} else {
local_56 = local_56 - *(int16 *)&UnkStruct_ARRAY_800931a0[local_50].field_0x14;
bunnyInfo[local_20].x = bunnyInfo[local_20].x + UnkStruct_ARRAY_800931a0[local_50].field_0x14 * -0x200;
bunnyInfo[local_20].y = bunnyInfo[local_20].y - bunnyInfo[local_20].field_0xc;
bunnyInfo[local_20].field_0xc = bunnyInfo[local_20].field_0xc + bunnyInfo[local_20].field_0x10;
bunnyActorTbl[local_1c]->_x_pos = (int16)((int)bunnyInfo[local_20].x >> 9);
bunnyActorTbl[local_1c]->_y_pos = (int16)((int)bunnyInfo[local_20].y >> 9);
bunnyInfo[local_1e].x = bunnyInfo[local_1e].x + UnkStruct_ARRAY_800931a0[local_50].field_0x14 * 0x200;
bunnyInfo[local_1e].y = bunnyInfo[local_1e].y - bunnyInfo[local_1e].field_0xc;
bunnyInfo[local_1e].field_0xc = bunnyInfo[local_1e].field_0xc + bunnyInfo[local_1e].field_0x10;
bunnyActorTbl[local_1a]->_x_pos = (int16)((int)bunnyInfo[local_1e].x >> 9);
bunnyActorTbl[local_1a]->_y_pos = (int16)((int)bunnyInfo[local_1e].y >> 9);
if ((local_228 < 4) && unkXPosTbl[local_50 * 4 + local_228] < bunnyActorTbl[local_1a]->_x_pos) {
local_228 = local_228 + 1;
bunnyActorTbl[local_1a]->updateSequence(((uint)local_228 + 6) & 0xffff);
bunnyActorTbl[local_1c]->updateSequence(((uint)local_228 + 0xd) & 0xffff);
}
}
}
}
break;
case 2:
if (local_58 == 0) {
currentState = 4;
}
break;
case 3:
if (local_58 == 0) {
currentState = 4;
}
break;
case 4:
local_50 = _vm->getRand(4);
if (local_50 < 2) {
i = _vm->getRand(2);
} else {
i = 0;
}
bunnyInfo[(int16)i].positionIdx = (uint)UnkStruct_ARRAY_800931a0[local_50].position1;
bunnyInfo[(int16)i].x = (uint)(uint16)bunnyPositionsTbl[bunnyInfo[(int16)i].positionIdx].x << 9;
bunnyInfo[(int16)i].y = (uint)(uint16)bunnyPositionsTbl[bunnyInfo[(int16)i].positionIdx].y << 9;
bunnyInfo[(int16)i].field_0xc = UnkStruct_ARRAY_800931a0[local_50].unk4;
bunnyInfo[(int16)i].field_0x10 = UnkStruct_ARRAY_800931a0[local_50].unk8;
i = i ^ 1;
bunnyInfo[(int16)i].positionIdx = (uint)UnkStruct_ARRAY_800931a0[local_50].position2;
bunnyInfo[(int16)i].x = (uint)(uint16)bunnyPositionsTbl[bunnyInfo[(int16)i].positionIdx].x << 9;
bunnyInfo[(int16)i].y = (uint)(uint16)bunnyPositionsTbl[bunnyInfo[(int16)i].positionIdx].y << 9;
bunnyInfo[(int16)i].field_0xc = UnkStruct_ARRAY_800931a0[local_50].unk12;
bunnyInfo[(int16)i].field_0x10 = UnkStruct_ARRAY_800931a0[local_50].unk16;
local_56 = bunnyPositionsTbl[UnkStruct_ARRAY_800931a0[local_50].position2].x - bunnyPositionsTbl[UnkStruct_ARRAY_800931a0[local_50].position1].x;
local_1e = (uint16)((int)bunnyInfo[1].x <= (int)bunnyInfo[0].x);
local_20 = (int16)((uint)local_1e + 1) + (int16)((int)((uint)local_1e + 1) / 2) * -2;
local_1a = bunnyPositionTbl[bunnyInfo[local_1e].positionIdx];
local_1c = bunnyPositionTbl[bunnyInfo[local_20].positionIdx];
bunnyActorTbl[local_1a]->updateSequence(5);
bunnyActorTbl[local_1c]->updateSequence(0xc);
if (hopCounter == 0x1d) {
_vm->playOrStopSound(2);
} else {
_vm->playOrStopSound((uint)local_1c2);
local_1c2 = 1 - local_1c2;
}
local_228 = 0;
i = goodRabbitPositionTbl[bunnyInfo[local_1e].positionIdx];
goodRabbitPositionTbl[bunnyInfo[local_1e].positionIdx] = goodRabbitPositionTbl[bunnyInfo[local_20].positionIdx];
goodRabbitPositionTbl[bunnyInfo[local_20].positionIdx] = i;
i = bunnyPositionTbl[bunnyInfo[local_1e].positionIdx];
bunnyPositionTbl[bunnyInfo[local_1e].positionIdx] = bunnyPositionTbl[bunnyInfo[local_20].positionIdx];
bunnyPositionTbl[bunnyInfo[local_20].positionIdx] = i;
currentState = 1;
break;
case 5:
hopCounter = hopCounter + 1;
local_5a = local_5a + 1;
bunnyActorTbl[local_1a]->updateSequence(0xb);
bunnyActorTbl[local_1c]->updateSequence(0x12);
if (local_5a == local_5c) {
local_5a = 0;
local_5c = _vm->getRand(2);
local_5c = local_5c + 5;
currentState = 3;
local_58 = 0x3c;
} else {
currentState = 2;
local_58 = 2;
}
break;
case 6:
local_10 = 0;
if (local_1e8 == 0) {
flags = flags | 8;
}
break;
default:
error("Unknown state");
}
i = 0;
while ((int16)i < 8) {
if (local_208[(int16)i] != -1) {
tearActorTbl[(int16)i]->_y_pos = tearActorTbl[(int16)i]->_y_pos + ((uint16)local_208[(int)(int16)i + 8] >> 6);
if (tearActorTbl[(int16)i]->_y_pos < (int16)tearInfo[local_208[(int16)i]].yRelated) {
local_208[(int)(int16)i + 8] = local_208[(int)(int16)i + 8] + 8;
} else {
tearActorTbl[(int16)i]->_priorityLayer = 0;
local_1e8 = local_1e8 & ~(1 << ((int)local_208[(int16)i] & 0x1fU));
local_208[(int16)i] = -1;
local_1e0 = local_1e0 - 1;
}
}
i = i + 1;
}
if (((local_1e0 < local_1de) && (currentState != 6)) && (sVar2 = _vm->getRand(2), sVar2 == 0)) {
if ((local_1e8 & 0x7fff) < local_1e8 >> 0xf) {
local_14 = 0;
} else {
local_14 = 0xf;
}
do {
sVar2 = _vm->getRand(0xf);
sVar2 = sVar2 + local_14;
} while ((1 << ((int)sVar2 & 0x1fU) & local_1e8) != 0);
local_1e8 = local_1e8 | 1 << ((int)sVar2 & 0x1fU);
local_14 = 0;
while ((local_14 < 8 && (local_208[local_14] != -1))) {
local_14 = local_14 + 1;
}
local_208[local_14] = sVar2;
tearActorTbl[local_14]->_x_pos = tearInfo[sVar2].x;
tearActorTbl[local_14]->_y_pos = tearInfo[sVar2].y;
local_208[(int)local_14 + 8] = 0x20;
tearActorTbl[local_14]->updateSequence(0x13);
tearActorTbl[local_14]->_priorityLayer = 3;
local_1e0 = local_1e0 + 1;
}
if ((flags & 1) == 0) {
if ((flags & 2) == 0) {
if ((flags & 4) == 0) {
if (_vm->isActionButtonPressed()) {
local_1c8 = 1;
flags = flags | 1;
local_1c6 = 3;
updateBackgroundLayerOffset(2, 0x640, 0);
if (((currentState != 3) && (currentState != 6)) && (local_e == 0)) {
local_10 = 0x5a;
local_e = 1;
}
}
} else {
if (local_1c6 == 0) {
if (local_1c8 == 2) {
local_1c6 = 3;
local_1c8 = 1;
updateBackgroundLayerOffset(2, 0x640, 0);
} else {
if (local_1c8 == 1) {
local_1c8 = 0;
local_1ba = 0;
flags = flags & 0xfffb;
tearBlinkActorTbl2[0]->_priorityLayer = 0;
tearBlinkActorTbl2[1]->_priorityLayer = 0;
tearBlinkActorTbl2[0]->updateSequence(0);
tearBlinkActorTbl2[1]->updateSequence(1);
}
}
} else {
local_1c6 = local_1c6 + -1;
}
}
} else {
if (local_1c6 == 0) {
i = 0;
while ((int16)i < 8) {
tearActorTbl[(int16)i]->_priorityLayer = 0;
local_208[(int16)i] = -1;
i = i + 1;
}
local_210 = 0;
local_1e0 = 0;
local_1de = 0;
local_1e8 = 0;
fun_80017f70_paletteRelated(0);
local_1b8 = 0;
flags = (flags & 0xfffd) | 4;
local_1c8 = 2;
local_1c6 = 3;
updateBackgroundLayerOffset(2, 0x780, 0);
tearBlinkActorTbl[0]->_y_pos = 0xcc;
tearBlinkActorTbl[1]->_y_pos = 0xcc;
} else {
local_1c6 = local_1c6 + -1;
}
}
} else {
if (local_1c6 == 0) {
if (local_1c8 == 1) {
local_1c6 = 3;
local_1c8 = 2;
updateBackgroundLayerOffset(2, 0x780, 0);
tearBlinkActorTbl2[0]->updateSequence(0);
tearBlinkActorTbl2[1]->updateSequence(1);
tearBlinkActorTbl2[0]->_priorityLayer = 4;
tearBlinkActorTbl2[1]->_priorityLayer = 4;
} else {
if (local_1c8 == 2) {
local_1c6 = 0x14;
local_1c8 = 3;
updateBackgroundLayerOffset(2, 0x8c0, 0);
tearBlinkActorTbl2[0]->updateSequence(2);
tearBlinkActorTbl2[1]->updateSequence(3);
flags = (flags & 0xfffe) | 2;
}
}
} else {
local_1c6 = local_1c6 + -1;
}
}
if ((local_e != 0) && (local_10 == 0)) {
//TODO implement this. clearTextDialog((uint)DAT_8008e7e8, (uint)DAT_8008e844, (uint)DAT_8008e848, (uint)DAT_8008e874);
local_e = 0;
}
if ((local_e != 0) && (local_10 != 0)) {
local_10 = local_10 + -1;
}
if (local_58 != 0) {
local_58 = local_58 + -1;
}
local_210 = local_210 + 1;
if (((uint)local_210 % 0x14 == 0) && (local_1de < 8)) {
local_1de = local_1de + 1;
}
if (((uint)local_210 % 10 == 0) && (0x1d < local_210)) {
if ((int16)local_1b8 < 0x1e) {
local_1b8 = local_1b8 + 1;
fun_80017f70_paletteRelated((uint)local_1b8);
}
if (100 < tearBlinkActorTbl[0]->_y_pos) {
tearBlinkActorTbl[0]->_y_pos = tearBlinkActorTbl[0]->_y_pos + -3;
tearBlinkActorTbl[1]->_y_pos = tearBlinkActorTbl[1]->_y_pos + -3;
}
}
if (hopCounter == 0x1e) {
currentState = 6;
}
if ((flags & 8) != 0) break;
if (local_1c8 == 0) {
if (local_1ba == 0) {
if (local_1bc == 0) {
tmpValue = _vm->getRand(2);
if ((tmpValue & 0xffff) == 0) {
local_1be = 1;
} else {
local_1be = -1;
}
local_1bc = _vm->getRand(3);
local_1bc = local_1bc + 3;
local_1ba = _vm->getRand(10);
local_1ba = local_1ba + 10;
} else {
if (((local_1be < 0) && (-10 < local_1c0)) || ((0 < local_1be && (local_1c0 < 10)))) {
local_1c0 = local_1c0 + local_1be;
}
local_1ba = 2;
local_1bc = local_1bc + -1;
iVar4 = (int)local_1c0 + 10;
if (iVar4 < 0) {
iVar4 = (int)local_1c0 + 0xd;
}
local_14 = (int16)(iVar4 >> 2);
if (local_14 == 5) {
local_14 = 4;
}
updateBackgroundLayerOffset(2, (int) local_14 * 0x140, 0);
updateBackgroundLayerOffset(1, (int) -local_1c0, (int) eyeBgYOffsetTbl[local_1c0 + 10]);
updateBackgroundLayerOffset(0, (int) -local_1c0, (int) eyeBgYOffsetTbl[local_1c0 + 10]);
}
} else {
local_1ba = local_1ba + -1;
}
}
}
_vm->waitForFrames(1);
i = 0;
while ((int16)i < 3) {
local_16 = 0;
while ((int16)local_16 < 3) {
updateBackgroundLayerOffset(2, ((int) (int16) local_16 * 0x140 + 0x640) * 0x10000 >> 0x10, 0);
_vm->waitForFrames(5);
local_16 = local_16 + 1;
}
local_1b8 = local_1b8 - 0xb;
if ((int16)local_1b8 < 0) {
local_1b8 = 0;
}
fun_80017f70_paletteRelated((uint)local_1b8);
tearBlinkActorTbl[0]->_y_pos = tearBlinkActorTbl[0]->_y_pos + 0x1e;
if (199 < tearBlinkActorTbl[0]->_y_pos) {
tearBlinkActorTbl[0]->_y_pos = 199;
}
tearBlinkActorTbl[1]->_y_pos = tearBlinkActorTbl[1]->_y_pos + 0x1e;
if (199 < tearBlinkActorTbl[1]->_y_pos) {
tearBlinkActorTbl[1]->_y_pos = 199;
}
_vm->waitForFrames(0xf);
local_16 = 1;
while (-1 < (int16)local_16) {
updateBackgroundLayerOffset(2, ((int) (int16) local_16 * 0x140 + 0x640) * 0x10000 >> 0x10, 0);
_vm->waitForFrames(5);
local_16 = local_16 + -1;
}
i = i + 1;
}
tearBlinkActorTbl[0]->_flags = tearBlinkActorTbl[0]->_flags | 4;
tearBlinkActorTbl[1]->_flags = tearBlinkActorTbl[1]->_flags | 4;
updateBackgroundLayerOffset(2, 0x280, 0);
updateBackgroundLayerOffset(1, 0, 0);
updateBackgroundLayerOffset(0, 0, 0);
local_224 = _vm->getRand(2);
handActorId->updateSequence(0);
handActorId->_x_pos = handPositionsTbl[local_224].x;
handActorId->_y_pos = handPositionsTbl[local_224].y;
handActorId->_priorityLayer = 2;
bVar1 = false;
_vm->_talk->loadAndDisplayDialogAroundPoint(0x2958A, 0x14, 3, 0x1e01, 0);
while (_vm->isFlagSet(ENGINE_FLAG_8000)) {
_vm->waitForFrames(1);
}
while (_vm->waitForFrames(1), handActorId->isFlagSet(ACTOR_FLAG_10) || !_vm->isActionButtonPressed()) {
if (_vm->isLeftKeyPressed() && ((local_224 == 1 || (local_224 == 3)))) {
local_224 = local_224 + -1;
bVar1 = true;
}
if (_vm->isRightKeyPressed() && ((local_224 == 0 || (local_224 == 2)))) {
local_224 = local_224 + 1;
bVar1 = true;
}
if (_vm->isUpKeyPressed() && ((local_224 == 2 || (local_224 == 3)))) {
local_224 = local_224 + -2;
bVar1 = true;
}
if (_vm->isDownKeyPressed() && ((local_224 == 0 || (local_224 == 1)))) {
local_224 = local_224 + 2;
bVar1 = true;
}
if (bVar1) {
handActorId->startWalk((int)handPositionsTbl[local_224].x, (int)handPositionsTbl[local_224].y, 2);
bVar1 = false;
}
}
handActorId->updateSequence(1);
handActorId->waitUntilFlag4IsSet();
_vm->_dragonINIResource->getRecord(0x178)->objectState = local_224 + 1;
if (goodRabbitPositionTbl[local_224] == 1) {
bunnyActorTbl[bunnyPositionTbl[local_224]]->updateSequence(2);
_vm->_dragonINIResource->getRecord(0x178)->objectState2 = 1;
} else {
bunnyActorTbl[bunnyPositionTbl[local_224]]->updateSequence(3);
i = 0;
while (((int16)i < 4 && (goodRabbitPositionTbl[(int16)i] != 1))) {
i = i + 1;
}
_vm->waitForFrames(0x1e);
bunnyActorTbl[bunnyPositionTbl[i]]->updateSequence(2);
_vm->_dragonINIResource->getRecord(0x178)->objectState2 = 0;
}
_vm->waitForFrames(0x3c * 2);
_vm->_sound->resumeMusic();
_vm->fadeToBlack();
// fun_80017f28_noop();
// DAT_80093234 = DAT_80093234 + 1;
_vm->_dragonINIResource->setFlickerRecord(flicker);
flicker->sceneId = 1;
_vm->setAllFlags(oldEngineFlags);
_vm->setFlags(ENGINE_FLAG_40);
// _vm->_screen->loadPalette(1, (uint)*(uint16 *)(*(int *)(&DAT_80071c30 + (uint)actors[0].actorFileDictionaryIndex * 8) + 10) +
// *(int *)(&DAT_80071c30 + (uint)actors[0].actorFileDictionaryIndex * 8));
_vm->setupPalette1();
// _vm->_screen->loadPalette(4, (uint)*(uint16 *)(*(int *)(&DAT_80071c30 + (uint)actors[0].actorFileDictionaryIndex * 8) + 10) +
// *(int *)(&DAT_80071c30 + (uint)actors[0].actorFileDictionaryIndex * 8));
_vm->_screen->updatePaletteTransparency(4, 1, 0xff, true);
_vm->_inventory->setState(origInventoryType);
_vm->_scene->setSceneId(origSceneId);
_vm->_scene->loadScene(origSceneId, 0);
}
void Minigame3::updateBackgroundLayerOffset(uint32 layerNumber, int16 xOffset, int16 yOffset) {
_vm->_scene->setLayerOffset(layerNumber, Common::Point(xOffset, yOffset));
}
void Minigame3::fun_80017f70_paletteRelated(uint16 param_1) {
if (param_1 > 0x1f) {
param_1 = 0x1f;
}
// uVar1 = IsVSyncEventEnabled & 1;
// DisableVSyncEvent();
_vm->_screen->loadPalette(0, _vm->_scene->getPalette());
_vm->_screen->setPaletteRecord(0, 0x3f, param_1 * 0x421);
// load_palette_into_frame_buffer(0, abStack528);
_vm->_screen->updatePaletteTransparency(0, 0x3f, 0x3f, param_1 == 0x1e ? false : true);
// if (uVar1 != 0) {
// EnableVSyncEvent();
// }
}
void Minigame3::fun_80017ef0() {
//TODO BgLayerGsSprite[2].attribute = BgLayerGsSprite[2].attribute | 0x50000000;
// this sets the FG layer to additive colour blending (100% x Back + 100% x Sprite)
fun_80017f70_paletteRelated(0);
}
} // End of namespace Dragons