mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-13 05:00:59 +00:00
898 lines
28 KiB
C++
898 lines
28 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 "dragons/minigame2.h"
|
|
#include "dragons/actor.h"
|
|
#include "dragons/actorresource.h"
|
|
#include "dragons/dragons.h"
|
|
#include "dragons/dragonini.h"
|
|
#include "dragons/font.h"
|
|
#include "dragons/talk.h"
|
|
#include "dragons/inventory.h"
|
|
#include "dragons/scene.h"
|
|
#include "dragons/screen.h"
|
|
#include "dragons/cursor.h"
|
|
#include "dragons/sound.h"
|
|
|
|
namespace Dragons {
|
|
|
|
Minigame2::Minigame2(DragonsEngine *vm) : _vm(vm), _dat_80093c70(false), _dat_80093c72(false), _dat_80093c74(0), _dat_80093ca8(false) {}
|
|
|
|
static const uint16 unkArray[5] = {
|
|
0xC, 0xA, 0x8, 0x6, 0x4
|
|
};
|
|
|
|
void Minigame2::run(int16 param_1, uint16 param_2, int16 param_3) {
|
|
short sVar2;
|
|
short sVar3;
|
|
bool shouldExit;
|
|
bool bVar4;
|
|
DragonINI *flicker;
|
|
uint32 origEngineFlags;
|
|
Actor *loungealotBigPunchActor;
|
|
Actor *loungealotHeadActor;
|
|
Actor *loungealotLeftUpperArm;
|
|
Actor *loungealotLegActor;
|
|
Actor *loungealotRightArm;
|
|
Actor *flickerArm;
|
|
Actor *loungealotThumb;
|
|
Actor *uVar12;
|
|
Actor *uVar13;
|
|
Actor *flickerPortrait;
|
|
Actor *loungealotPortrait;
|
|
uint uVar18;
|
|
//uint uVar19;
|
|
//int iVar20;
|
|
bool shouldShakeScreen;
|
|
uint16 local_2e6;
|
|
int16 actorSequenceIdTbl [15];
|
|
uint32 textIdTbl [4];
|
|
uint16 local_2b0 [8];
|
|
uint16 local_288;
|
|
uint16 local_286;
|
|
uint16 local_284;
|
|
uint16 local_282;
|
|
uint16 local_27a;
|
|
uint16 local_278;
|
|
short local_272;
|
|
short local_26c;
|
|
uint16 local_268;
|
|
uint16 local_264;
|
|
uint16 local_262;
|
|
short local_260;
|
|
short local_258;
|
|
short local_256;
|
|
int16 screenShakeTbl [10];
|
|
uint16 screenShakeCounter;
|
|
uint8 paletteData [0x200];
|
|
uint16 local_28;
|
|
InventoryState originalInventoryType;
|
|
|
|
origEngineFlags = _vm->getAllFlags();
|
|
originalInventoryType = _vm->_inventory->getState();
|
|
flicker = _vm->_dragonINIResource->getFlickerRecord();
|
|
|
|
Common::File *fd = new Common::File();
|
|
if (!fd->open("arc2.bin")) {
|
|
error("Failed to open arc2.bin");
|
|
}
|
|
|
|
for (int i = 0; i < 15; i++) {
|
|
actorSequenceIdTbl[i] = fd->readSint16LE();
|
|
}
|
|
|
|
fd->skip(2);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
local_2b0[i] = fd->readSint16LE();
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
screenShakeTbl[i] = fd->readSint16LE();
|
|
}
|
|
|
|
fd->close();
|
|
|
|
textIdTbl[0] = 0x4500;
|
|
textIdTbl[1] = 0x454A;
|
|
textIdTbl[2] = 0x4576;
|
|
|
|
bVar4 = false;
|
|
shouldExit = false;
|
|
local_27a = 0;
|
|
local_278 = 0;
|
|
local_272 = 0;
|
|
local_26c = 0x1e;
|
|
shouldShakeScreen = false;
|
|
local_264 = 0;
|
|
local_262 = 0;
|
|
local_260 = 300;
|
|
local_258 = 0;
|
|
local_256 = 0;
|
|
screenShakeCounter = 0;
|
|
local_2e6 = param_2;
|
|
if (param_2 > 4) {
|
|
local_2e6 = 4;
|
|
}
|
|
_dat_80093ca4 = unkArray[local_2e6];
|
|
_dat_80093c90 = unkArray[local_2e6];
|
|
_dat_80093c94 = 0;
|
|
_vm->_inventory->setState(Closed);
|
|
_dat_80093cb4 = 2;
|
|
_dat_80093cbc = 0;
|
|
_dat_80093cb8 = 2;
|
|
_dat_80093cc0 = 0;
|
|
_dat_80093cac = 0;
|
|
_dat_80093cb0 = false;
|
|
_dat_80093c9c = 0;
|
|
_vm->_talk->_dat_8008e874_dialogBox_y2 = 0;
|
|
_vm->_talk->_dat_8008e844_dialogBox_y1 = 0;
|
|
_vm->_talk->_dat_8008e848_dialogBox_x2 = 0;
|
|
_vm->_talk->_dat_8008e7e8_dialogBox_x1 = 0;
|
|
_dat_80093c98 = _dat_80093c90;
|
|
_dat_80093ca0 = param_1;
|
|
_dat_80093cc4 = _dat_80093ca4;
|
|
_dat_80093cc8 = _dat_80093ca4;
|
|
_vm->fadeToBlack();
|
|
_vm->reset_screen_maybe();
|
|
_vm->_inventory->setState(Closed);
|
|
flicker->sceneId = 0;
|
|
_vm->_dragonINIResource->setFlickerRecord(nullptr);
|
|
_vm->setFlags(ENGINE_FLAG_800);
|
|
_vm->_scene->setSceneId(5);
|
|
_vm->_scene->loadSceneData(5 | 0x8000, 0);
|
|
//DisableVSyncEvent();
|
|
_vm->clearFlags(ENGINE_FLAG_8);
|
|
_vm->clearFlags(ENGINE_FLAG_10);
|
|
_vm->clearFlags(ENGINE_FLAG_20);
|
|
_vm->clearFlags(ENGINE_FLAG_80);
|
|
|
|
memcpy(paletteData, _vm->_scene->getPalette() + 0x180, 0x80);
|
|
memcpy(paletteData + 0x80, _vm->_scene->getPalette() + 0x180, 0x80);
|
|
_vm->_screen->loadPalette(1, paletteData);
|
|
_vm->_screen->updatePaletteTransparency(1, 0x40, 0x7f, true);
|
|
|
|
loungealotBigPunchActor = _vm->_actorManager->loadActor(0x11, 0, 0, 0, 6);
|
|
loungealotHeadActor = _vm->_actorManager->loadActor(0xd, 0, 0x7d, 199, 4);
|
|
loungealotLeftUpperArm = _vm->_actorManager->loadActor(0xb, 2, 0x7d, 199, 4);
|
|
loungealotLegActor = _vm->_actorManager->loadActor(0xf, 0, 0x7d, 199, 4);
|
|
loungealotRightArm = _vm->_actorManager->loadActor(0x10, 0, 0x7d, 199, 4);
|
|
flickerArm = _vm->_actorManager->loadActor(9, (uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc],
|
|
loungealotLeftUpperArm->_x_pos,
|
|
loungealotLeftUpperArm->_y_pos, 4);
|
|
loungealotThumb = _vm->_actorManager->loadActor(0x12, (uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc],
|
|
loungealotLeftUpperArm->_x_pos,
|
|
loungealotLeftUpperArm->_y_pos, 4);
|
|
uVar12 = _vm->_actorManager->loadActor(10, (uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0],
|
|
flickerArm->_x_pos,
|
|
flickerArm->_y_pos, 4);
|
|
uVar13 = _vm->_actorManager->loadActor(0x13, (uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0],
|
|
flickerArm->_x_pos,
|
|
flickerArm->_y_pos, 4);
|
|
flickerPortrait = _vm->_actorManager->loadActor(0x27, 0, 0x10, 0xac, 4);
|
|
loungealotPortrait = _vm->_actorManager->loadActor(0x27, 1, 0x10, 0x8c, 4);
|
|
loungealotBigPunchActor->setFlag(ACTOR_FLAG_100);
|
|
loungealotHeadActor->setFlag(ACTOR_FLAG_100);
|
|
loungealotLeftUpperArm->setFlag(ACTOR_FLAG_100);
|
|
loungealotLegActor->setFlag(ACTOR_FLAG_100);
|
|
loungealotRightArm->setFlag(ACTOR_FLAG_100);
|
|
flickerArm->setFlag(ACTOR_FLAG_100);
|
|
loungealotThumb->setFlag(ACTOR_FLAG_100);
|
|
uVar12->setFlag(ACTOR_FLAG_100);
|
|
uVar13->setFlag(ACTOR_FLAG_100);
|
|
flickerPortrait->setFlag(ACTOR_FLAG_100);
|
|
loungealotPortrait->setFlag(ACTOR_FLAG_100);
|
|
|
|
loungealotBigPunchActor->_priorityLayer = 6;
|
|
flickerArm->_priorityLayer = 5;
|
|
uVar12->_priorityLayer = 5;
|
|
loungealotThumb->_priorityLayer = 4;
|
|
uVar13->_priorityLayer = 3;
|
|
loungealotRightArm->_priorityLayer = 3;
|
|
loungealotLeftUpperArm->_priorityLayer = 2;
|
|
loungealotHeadActor->_priorityLayer = 2;
|
|
loungealotLegActor->_priorityLayer = 1;
|
|
flickerPortrait->_priorityLayer = 0;
|
|
loungealotPortrait->_priorityLayer = 0;
|
|
FlatQuad *flickerPowerMeter = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0x28, 0xa8, 0x67, 0xa8, 0x67, 0xaf, 0x28, 0xaf, 0x1f, 7, 0));
|
|
FlatQuad *loungealotPowerMeter = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0x28, 0x88, 0x67, 0x88, 0x67, 0x8f, 0x28, 0x8f, 0x3e0, 7, 0));
|
|
flickerPowerMeter->flags &= ~1u;
|
|
loungealotPowerMeter->flags &= ~1u;
|
|
|
|
// EnableVSyncEvent();
|
|
loungealotHeadActor->setFlag(ACTOR_FLAG_1);
|
|
loungealotLeftUpperArm->setFlag(ACTOR_FLAG_1);
|
|
loungealotLegActor->setFlag(ACTOR_FLAG_1);
|
|
loungealotRightArm->setFlag(ACTOR_FLAG_1);
|
|
flickerArm->setFlag(ACTOR_FLAG_1);
|
|
loungealotThumb->setFlag(ACTOR_FLAG_1);
|
|
uVar12->setFlag(ACTOR_FLAG_1);
|
|
uVar13->setFlag(ACTOR_FLAG_1);
|
|
flickerArm->waitUntilFlag8And4AreSet();
|
|
uVar12->waitUntilFlag8And4AreSet();
|
|
loungealotThumb->waitUntilFlag8And4AreSet();
|
|
uVar13->waitUntilFlag8And4AreSet();
|
|
loungealotLeftUpperArm->waitUntilFlag8And4AreSet();
|
|
loungealotRightArm->waitUntilFlag8And4AreSet();
|
|
loungealotHeadActor->waitUntilFlag8And4AreSet();
|
|
loungealotLegActor->waitUntilFlag8And4AreSet();
|
|
|
|
loungealotBigPunchActor->setFlag(ACTOR_FLAG_400);
|
|
flickerArm->_x_pos = loungealotLeftUpperArm->_x_pos - loungealotLeftUpperArm->_frame->field_e;
|
|
flickerArm->_y_pos = loungealotLeftUpperArm->_y_pos - loungealotLeftUpperArm->_frame->field_10;
|
|
loungealotThumb->_x_pos = loungealotLeftUpperArm->_x_pos - loungealotLeftUpperArm->_frame->field_e;
|
|
loungealotThumb->_y_pos = loungealotLeftUpperArm->_y_pos - loungealotLeftUpperArm->_frame->field_10;
|
|
uVar12->_x_pos = loungealotLeftUpperArm->_x_pos - flickerArm->_frame->field_e;
|
|
uVar12->_y_pos = loungealotLeftUpperArm->_y_pos - flickerArm->_frame->field_10;
|
|
uVar13->_x_pos = loungealotLeftUpperArm->_x_pos - flickerArm->_frame->field_e;
|
|
uVar13->_y_pos = loungealotLeftUpperArm->_y_pos - flickerArm->_frame->field_10;
|
|
_vm->waitForFrames(2);
|
|
_vm->fadeFromBlack();
|
|
|
|
do {
|
|
_vm->waitForFrames(1);
|
|
|
|
if ((_dat_80093c9c != 0) && !_vm->isFlagSet(ENGINE_FLAG_8000)) {
|
|
loungealotHeadActor->updateSequence(0);
|
|
_vm->_talk->FUN_8001a7c4_clearDialogBoxMaybe();
|
|
_dat_80093c9c = 0;
|
|
}
|
|
if (_dat_80093c94 != 0) {
|
|
local_264 = 0;
|
|
}
|
|
if (loungealotLegActor->_field_7a == 1) {
|
|
shouldShakeScreen = true;
|
|
loungealotLegActor->_field_7a = 0;
|
|
screenShakeCounter = 0;
|
|
}
|
|
if (shouldShakeScreen) {
|
|
_vm->_screen->setScreenShakeOffset(0, screenShakeTbl[screenShakeCounter]);
|
|
if (screenShakeTbl[screenShakeCounter] == 0) {
|
|
shouldShakeScreen = false;
|
|
}
|
|
screenShakeCounter = screenShakeCounter + 1;
|
|
}
|
|
if (_dat_80093ca4 == 0) {
|
|
_dat_80093ca4 = _dat_80093cc8;
|
|
} else {
|
|
_dat_80093ca4 = _dat_80093ca4 - 1;
|
|
}
|
|
if (_dat_80093c90 == 0) {
|
|
_dat_80093c90 = _dat_80093c98;
|
|
} else {
|
|
_dat_80093c90 = _dat_80093c90 - 1;
|
|
}
|
|
if (_dat_80093cc4 == 0) {
|
|
_dat_80093cc4 = _dat_80093cc8;
|
|
} else {
|
|
_dat_80093cc4 = _dat_80093cc4 - 1;
|
|
}
|
|
|
|
if (local_27a == 0) {
|
|
flickerPowerMeter->flags &= ~1u;
|
|
} else {
|
|
flickerPowerMeter->points[1].x = local_27a + 0x27;
|
|
flickerPowerMeter->points[3].x = local_27a + 0x27;
|
|
flickerPowerMeter->colour = (uint16)(((int)((uint)local_27a - 1) >> 1) << 5) |
|
|
(uint16)(((int)(0x40 - (uint)local_27a) >> 1) << 10);
|
|
flickerPowerMeter->flags |= 1;
|
|
}
|
|
if (local_278 == 0) {
|
|
loungealotPowerMeter->flags &= ~1u;
|
|
if ((local_27a != 0) || (local_258 != 0)) goto LAB_800907c4;
|
|
} else {
|
|
loungealotPowerMeter->points[1].x = local_278 + 0x27;
|
|
loungealotPowerMeter->points[3].x = local_278 + 0x27;
|
|
loungealotPowerMeter->colour = (uint16)(((int)((uint)local_278 - 1) >> 1) << 5) |
|
|
(uint16)(((int)(0x40 - (uint)local_278) >> 1) << 10);
|
|
loungealotPowerMeter->flags |= 1;
|
|
|
|
LAB_800907c4:
|
|
if (!bVar4) {
|
|
_vm->_fontManager->drawTextDialogBox(4, 0x14, 0xd, 0x16);
|
|
_vm->_fontManager->drawTextDialogBox(4, 0x10, 0xd, 0x12);
|
|
flickerPortrait->_priorityLayer = 6;
|
|
loungealotPortrait->_priorityLayer = 6;
|
|
bVar4 = true;
|
|
}
|
|
}
|
|
if ((((local_278 == 0) && (local_27a == 0)) && (local_258 == 0)) && (bVar4)) {
|
|
_vm->_fontManager->clearTextDialog(4, 0x14, 0xd, 0x16);
|
|
_vm->_fontManager->clearTextDialog(4, 0x10, 0xd, 0x12);
|
|
flickerPortrait->_priorityLayer = 0;
|
|
loungealotPortrait->_priorityLayer = 0;
|
|
bVar4 = false;
|
|
}
|
|
|
|
//DisableVSyncEvent();
|
|
loungealotThumb->_x_pos = loungealotLeftUpperArm->_x_pos - loungealotLeftUpperArm->_frame->field_e;
|
|
flickerArm->_x_pos = loungealotThumb->_x_pos;
|
|
sVar2 = flickerArm->_x_pos;
|
|
loungealotThumb->_y_pos = loungealotLeftUpperArm->_y_pos - loungealotLeftUpperArm->_frame->field_10;
|
|
flickerArm->_y_pos = loungealotThumb->_y_pos;
|
|
sVar3 = flickerArm->_y_pos;
|
|
uVar13->_x_pos = sVar2 - flickerArm->_frame->field_e;
|
|
uVar12->_x_pos = uVar13->_x_pos;
|
|
uVar13->_y_pos = sVar3 - flickerArm->_frame->field_10;
|
|
uVar12->_y_pos = uVar13->_y_pos;
|
|
// EnableVSyncEvent();
|
|
local_282 = _dat_80093cc0;
|
|
local_286 = _dat_80093cbc;
|
|
local_284 = _dat_80093cb8;
|
|
local_288 = _dat_80093cb4;
|
|
if (_dat_80093c94 != 1) {
|
|
if (_dat_80093c94 < 2) {
|
|
if (_dat_80093c94 == 0) {
|
|
if (((local_264 < 300) || (_dat_80093ca0 != 0)) || (_dat_80093cbc == 2)) {
|
|
if ((local_260 != 0) && (local_260 = local_260 + -1, local_260 == 0)) {
|
|
if (local_262 != 0) {
|
|
local_262 = local_262 - 1;
|
|
}
|
|
local_260 = 300;
|
|
}
|
|
} else {
|
|
local_264 = 0;
|
|
local_260 = 300;
|
|
// playSoundFromTxtIndex(textIdTbl[local_262]);
|
|
loungealotHeadActor->updateSequence((uint)local_2b0[(uint)local_262 * 2]);
|
|
uVar18 = (uint)local_262;
|
|
local_262 = local_262 + 1;
|
|
fun_80093aec_dialog(textIdTbl[uVar18], 0x14, 1);
|
|
if (local_262 == 3) {
|
|
while (((_dat_80093cb4 != 2 || (_dat_80093cbc != 0)) ||
|
|
((_dat_80093cb8 != 2 || (_dat_80093cc0 != 0))))) {
|
|
_vm->waitForFrames(1);
|
|
if (flickerArm->isFlagSet(ACTOR_FLAG_4)) {
|
|
if (_dat_80093cbc != 0) {
|
|
_dat_80093cbc = _dat_80093cbc - 1;
|
|
}
|
|
if (2 < _dat_80093cb4) {
|
|
_dat_80093cb4 = _dat_80093cb4 - 1;
|
|
}
|
|
if (_dat_80093cb4 < 2) {
|
|
_dat_80093cb4 = _dat_80093cb4 + 1;
|
|
}
|
|
}
|
|
if ((uVar12->_flags & 4) != 0) {
|
|
if (_dat_80093cc0 != 0) {
|
|
_dat_80093cc0 = _dat_80093cc0 - 1;
|
|
}
|
|
if (2 < _dat_80093cb8) {
|
|
_dat_80093cb8 = _dat_80093cb8 - 1;
|
|
}
|
|
if (_dat_80093cb8 < 2) {
|
|
_dat_80093cb8 = _dat_80093cb8 + 1;
|
|
}
|
|
}
|
|
if (flickerArm->_sequenceID != actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]) {
|
|
flickerArm->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]);
|
|
loungealotThumb->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]);
|
|
}
|
|
if (uVar12->_sequenceID !=
|
|
actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]) {
|
|
uVar12->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]);
|
|
uVar13->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]);
|
|
}
|
|
}
|
|
_vm->waitForFrames(2 * 0x3c);
|
|
// DisableVSyncEvent();
|
|
memset(paletteData, 0, 0x200);
|
|
loungealotBigPunchActor->_flags = loungealotBigPunchActor->_flags & 0xfbff;
|
|
loungealotHeadActor->setFlag(ACTOR_FLAG_400);
|
|
loungealotLeftUpperArm->setFlag(ACTOR_FLAG_400);
|
|
loungealotRightArm->setFlag(ACTOR_FLAG_400);
|
|
loungealotLegActor->_flags = loungealotLegActor->_flags | 0x400;
|
|
flickerArm->setFlag(ACTOR_FLAG_400);
|
|
loungealotThumb->setFlag(ACTOR_FLAG_400);
|
|
uVar12->setFlag(ACTOR_FLAG_400);
|
|
uVar13->setFlag(ACTOR_FLAG_400);
|
|
// EnableVSyncEvent();
|
|
_vm->waitForFrames(6);
|
|
loungealotBigPunchActor->updateSequence(1);
|
|
loungealotBigPunchActor->waitUntilFlag4IsSet();
|
|
_vm->waitForFrames(1);
|
|
_vm->_screen->loadPalette(0, paletteData);
|
|
_vm->_screen->loadPalette(1, paletteData);
|
|
_vm->_talk->FUN_8001a7c4_clearDialogBoxMaybe();
|
|
//punched in the face.
|
|
break;
|
|
}
|
|
}
|
|
if (local_26c != 0) {
|
|
local_26c = local_26c + -1;
|
|
}
|
|
if (local_278 != 0) {
|
|
local_278 = local_278 - 1;
|
|
}
|
|
if (local_27a != 0) {
|
|
local_27a = local_27a - 1;
|
|
}
|
|
local_268 = 2;
|
|
if (_vm->isLeftKeyPressed()) {
|
|
local_268 = 1;
|
|
}
|
|
if (fun_80093520()) {
|
|
local_268 = local_268 - 1;
|
|
}
|
|
if (_vm->isRightKeyPressed()) {
|
|
local_268 = local_268 + 1;
|
|
}
|
|
if (fun_80093248()) {
|
|
local_268 = local_268 + 1;
|
|
}
|
|
if (loungealotLeftUpperArm->_sequenceID != local_268) {
|
|
loungealotLeftUpperArm->updateSequence(local_268);
|
|
}
|
|
if ((flickerArm->_flags & 4) != 0) {
|
|
if (_vm->isRightKeyPressed() && (local_288 != 0)) {
|
|
local_288 = local_288 - 1;
|
|
}
|
|
if (_vm->isLeftKeyPressed() && (local_288 < 4)) {
|
|
local_288 = local_288 + 1;
|
|
}
|
|
if ((!_vm->isLeftKeyPressed() && !_vm->isRightKeyPressed()) && (local_288 != 2)) {
|
|
if (local_288 < 2) {
|
|
local_288 = local_288 + 1;
|
|
} else {
|
|
local_288 = local_288 - 1;
|
|
}
|
|
}
|
|
if (!_vm->isActionButtonPressed() || (local_26c != 0)) {
|
|
if (local_286 != 0) {
|
|
local_286 = local_286 - 1;
|
|
}
|
|
} else {
|
|
if (local_286 < 2) {
|
|
local_286 = local_286 + 1;
|
|
}
|
|
}
|
|
}
|
|
if (local_286 == 2) {
|
|
if (local_256 < 0x14) {
|
|
local_256 = local_256 + 1;
|
|
} else {
|
|
local_256 = 0;
|
|
}
|
|
}
|
|
if (local_256 < 0x14) {
|
|
local_264 = local_264 + 1;
|
|
} else {
|
|
local_264 = 0;
|
|
}
|
|
if ((uVar12->_flags & 4) != 0) {
|
|
if (fun_80093248() && (local_284 != 0)) {
|
|
local_284 = local_284 - 1;
|
|
}
|
|
if (fun_80093520() && (local_284 < 4)) {
|
|
local_284 = local_284 + 1;
|
|
}
|
|
if ((!fun_80093520() && !fun_80093248()) && (local_284 != 2)) {
|
|
if (local_284 < 2) {
|
|
local_284 = local_284 + 1;
|
|
} else {
|
|
local_284 = local_284 - 1;
|
|
}
|
|
}
|
|
if (!fun_80093800() || (local_26c != 0)) {
|
|
if (local_282 != 0) {
|
|
local_282 = local_282 - 1;
|
|
}
|
|
} else {
|
|
if (local_282 < 2) {
|
|
local_282 = local_282 + 1;
|
|
}
|
|
}
|
|
}
|
|
if (((local_286 == 2) && (local_282 == 2)) && (local_288 == local_284)) {
|
|
if ((_dat_80093cbc == 2) && (_dat_80093cc0 != 2)) {
|
|
local_258 = 2;
|
|
} else {
|
|
if ((_dat_80093cbc == 2) || (_dat_80093cc0 != 2)) {
|
|
local_288 = _dat_80093cb4;
|
|
local_286 = _dat_80093cbc;
|
|
local_284 = _dat_80093cb8;
|
|
local_282 = _dat_80093cc0;
|
|
} else {
|
|
local_258 = 1;
|
|
}
|
|
}
|
|
}
|
|
if (local_258 == 0) {
|
|
if ((local_286 != _dat_80093cbc) || (local_288 != _dat_80093cb4)) {
|
|
_dat_80093cb4 = local_288;
|
|
_dat_80093cbc = local_286;
|
|
flickerArm->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)local_288 * 3 + (uint)local_286]);
|
|
loungealotThumb->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]);
|
|
}
|
|
if ((local_282 != _dat_80093cc0) || (local_284 != _dat_80093cb8)) {
|
|
_dat_80093cb8 = local_284;
|
|
_dat_80093cc0 = local_282;
|
|
uVar12->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)local_284 * 3 + (uint)local_282]);
|
|
uVar13->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]);
|
|
}
|
|
} else {
|
|
if (local_258 == 1) {
|
|
loungealotHeadActor->updateSequence(1);
|
|
loungealotLegActor->updateSequence(1);
|
|
if (local_288 == 2) {
|
|
local_28 = 1;
|
|
} else {
|
|
if (local_288 < 3) {
|
|
if (local_288 == 0) {
|
|
local_28 = 0;
|
|
} else {
|
|
LAB_800926a4:
|
|
local_28 = 2;
|
|
}
|
|
} else {
|
|
if (local_288 != 4) goto LAB_800926a4;
|
|
local_28 = 2;
|
|
}
|
|
}
|
|
} else {
|
|
loungealotHeadActor->updateSequence(3);
|
|
loungealotRightArm->updateSequence(1);
|
|
if (local_284 == 2) {
|
|
local_28 = 4;
|
|
} else {
|
|
if (local_284 < 3) {
|
|
if (local_284 == 0) {
|
|
local_28 = 3;
|
|
} else {
|
|
LAB_80092754:
|
|
local_28 = 4;
|
|
}
|
|
} else {
|
|
if (local_284 != 4) goto LAB_80092754;
|
|
local_28 = 5;
|
|
}
|
|
}
|
|
}
|
|
uVar12->_flags = uVar12->_flags | 0x400;
|
|
uVar13->_flags = uVar13->_flags | 0x400;
|
|
flickerArm->updateSequence((uint)local_28 + 0xf);
|
|
loungealotThumb->updateSequence((uint)local_28 + 0xf);
|
|
_dat_80093c94 = 1;
|
|
_dat_80093c90 = 0x1e;
|
|
}
|
|
}
|
|
} else {
|
|
if (_dat_80093c94 == 2) { // Flicker loses by being pinned
|
|
uVar12->_flags = uVar12->_flags | 0x1000;
|
|
uVar13->_flags = uVar13->_flags | 0x1000;
|
|
flickerArm->_flags = flickerArm->_flags | 0x1000;
|
|
loungealotThumb->_flags = loungealotThumb->_flags | 0x1000;
|
|
_vm->_screen->setScreenShakeOffset(0, 0);
|
|
if (local_258 == 1) {
|
|
// playSoundFromTxtIndex(DAT_80063ad0);
|
|
loungealotHeadActor->updateSequence(9);
|
|
fun_80093aec_dialog(0x46BC, 0x14, 1);
|
|
do {
|
|
_vm->waitForFrames(1);
|
|
} while (_vm->isFlagSet(ENGINE_FLAG_8000));
|
|
loungealotHeadActor->updateSequence(2);
|
|
loungealotRightArm->updateSequence(3);
|
|
} else {
|
|
// playSoundFromTxtIndex(DAT_80063ad4);
|
|
loungealotHeadActor->updateSequence(10);
|
|
fun_80093aec_dialog(0x4718, 0x14, 1);
|
|
loungealotRightArm->updateSequence(2);
|
|
do {
|
|
_vm->waitForFrames(1);
|
|
} while (_vm->isFlagSet(ENGINE_FLAG_8000));
|
|
loungealotHeadActor->updateSequence(4);
|
|
}
|
|
_vm->waitForFrames(2 * 0x3c);
|
|
break;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
if (local_272 == 0) {
|
|
local_272 = 1;
|
|
if (local_27a != 0) {
|
|
local_27a = local_27a - 1;
|
|
}
|
|
if (local_278 != 0) {
|
|
local_278 = local_278 - 1;
|
|
}
|
|
} else {
|
|
local_272 = local_272 + -1;
|
|
}
|
|
|
|
if (_vm->isR1ButtonPressed()) { //TODO || _vm->isR2ButtonPressed()) {
|
|
local_27a = local_27a + 4;
|
|
}
|
|
if (_vm->isL1ButtonPressed()) { //TODO || _vm->isL2ButtonPressed()) {
|
|
local_27a = local_27a + 4;
|
|
}
|
|
if (fun_80093990()) {
|
|
if (param_1 == 1) {
|
|
local_278 = local_278 + 4;
|
|
} else {
|
|
local_278 = local_278 + 6;
|
|
}
|
|
}
|
|
if (fun_80093a30()) {
|
|
if (param_1 == 1) {
|
|
local_278 = local_278 + 4;
|
|
} else {
|
|
local_278 = local_278 + 6;
|
|
}
|
|
}
|
|
if ((0x3f < local_278) || (0x3f < local_27a)) {
|
|
loungealotHeadActor->setFlag(ACTOR_FLAG_1000);
|
|
loungealotLegActor->setFlag(ACTOR_FLAG_1000);
|
|
loungealotRightArm->setFlag(ACTOR_FLAG_1000);
|
|
if (0x40 < local_27a) {
|
|
local_27a = 0x40;
|
|
}
|
|
if (0x40 < local_278) {
|
|
local_278 = 0x40;
|
|
}
|
|
if (((local_278 == local_27a) || ((local_258 == 2 && (local_278 < local_27a)))) ||
|
|
((local_258 == 1 && (local_27a < local_278)))) {
|
|
if (local_258 == 1) {
|
|
// playSoundFromTxtIndex(DAT_80063ad8);
|
|
loungealotHeadActor->updateSequence(0xb);
|
|
fun_80093aec_dialog(0x475E, 0x14, 1);
|
|
} else {
|
|
// playSoundFromTxtIndex(DAT_80063adc);
|
|
loungealotHeadActor->updateSequence(0xc);
|
|
fun_80093aec_dialog(0x4774, 0x14, 1);
|
|
}
|
|
local_258 = 0;
|
|
_dat_80093cb4 = 2;
|
|
_dat_80093cbc = 1;
|
|
_dat_80093cb8 = 0;
|
|
_dat_80093cc0 = 1;
|
|
uVar12->_flags = uVar12->_flags & 0xfbff;
|
|
uVar13->_flags = uVar13->_flags & 0xfbff;
|
|
flickerArm->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]);
|
|
loungealotThumb->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb4 * 3 + (uint)_dat_80093cbc]);
|
|
uVar12->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]);
|
|
uVar13->updateSequence((uint)(uint16)actorSequenceIdTbl[(uint)_dat_80093cb8 * 3 + (uint)_dat_80093cc0]);
|
|
_dat_80093c94 = 0;
|
|
local_26c = 0x1e;
|
|
} else {
|
|
_dat_80093c94 = 2;
|
|
}
|
|
}
|
|
} while (true);
|
|
|
|
_vm->fadeToBlack();
|
|
_vm->_fontManager->clearText();
|
|
_vm->_sound->PauseCDMusic();
|
|
// DisableVSyncEvent();
|
|
_vm->_dragonINIResource->getRecord(0)->x = 0x91;
|
|
_vm->_dragonINIResource->getRecord(0)->y = 0x9b;
|
|
_vm->_dragonINIResource->getRecord(0x123)->x = 0xc3;
|
|
_vm->_dragonINIResource->getRecord(0x123)->y = 0x9b;
|
|
_vm->_screen->loadPalette(1, _vm->_cursor->getPalette());
|
|
_vm->setupPalette1();
|
|
_vm->_screen->clearAllFlatQuads();
|
|
_vm->_dragonINIResource->setFlickerRecord(flicker);
|
|
_vm->_inventory->setState(originalInventoryType);
|
|
flicker->objectState = local_258 + -1;
|
|
if (flicker->objectState == 0) {
|
|
_vm->setVar(0xb, 1);
|
|
flicker->actorResourceId = 0xd2; //TODO is this correct?
|
|
_vm->_actorManager->loadActor(0xd2, flicker->actor->_actorID);
|
|
_vm->_dragonINIResource->getRecord(0x120)->sceneId = 0x17;
|
|
}
|
|
loungealotHeadActor->clearFlag(ACTOR_FLAG_40);
|
|
loungealotLeftUpperArm->clearFlag(ACTOR_FLAG_40);
|
|
loungealotLegActor->clearFlag(ACTOR_FLAG_40);
|
|
loungealotRightArm->clearFlag(ACTOR_FLAG_40);
|
|
flickerArm->clearFlag(ACTOR_FLAG_40);
|
|
loungealotThumb->clearFlag(ACTOR_FLAG_40);
|
|
uVar12->clearFlag(ACTOR_FLAG_40);
|
|
uVar13->clearFlag(ACTOR_FLAG_40);
|
|
// EnableVSyncEvent();
|
|
if (param_3 == 0) {
|
|
_vm->fadeToBlack();
|
|
_vm->_screen->clearAllFlatQuads();
|
|
flickerPortrait->clearFlag(ACTOR_FLAG_40);
|
|
loungealotPortrait->clearFlag(ACTOR_FLAG_40);
|
|
_vm->reset_screen_maybe();
|
|
} else {
|
|
_vm->reset_screen_maybe();
|
|
_vm->_scene->setSceneId(0x17);
|
|
flicker->sceneId = 0x17;
|
|
_vm->_scene->loadSceneData((uint)(0x17 | 0x8000), 0);
|
|
_vm->setAllFlags((origEngineFlags & 0xfefdffff) | (_vm->getAllFlags() & 0x1000000) | 0x40);
|
|
_vm->fadeFromBlack();
|
|
}
|
|
}
|
|
|
|
void Minigame2::fun_80093aec_dialog(uint32 textId, int16 x, int16 y) {
|
|
uint16 auStack4024 [2000];
|
|
_vm->_talk->FUN_8001a7c4_clearDialogBoxMaybe();
|
|
_vm->_talk->loadText(textId, auStack4024, 2000);
|
|
_vm->_talk->displayDialogAroundPoint(auStack4024, x, y, 0, 0, textId);
|
|
_dat_80093c9c = 1;
|
|
}
|
|
|
|
bool Minigame2::fun_80093520() {
|
|
bool uVar2;
|
|
|
|
if (_dat_80093ca0 == 0) {
|
|
if (!_dat_80093c70) {
|
|
if (!_dat_80093c72 || (3 < _dat_80093cb8)) {
|
|
_dat_80093c72 = false;
|
|
_dat_80093c74 = _dat_80093c74 + 1;
|
|
if (_dat_80093c74 < 2) {
|
|
_dat_80093c70 = true;
|
|
_dat_80093cac = 0;
|
|
uVar2 = false;
|
|
} else {
|
|
if (_dat_80093ca4 == 0) {
|
|
_dat_80093cac = 0;
|
|
if (_dat_80093cb8 == _dat_80093cb4) {
|
|
if (_dat_80093cbc < _dat_80093cc0) {
|
|
_dat_80093cac = (uint16)(_dat_80093cb8 < 4);
|
|
} else {
|
|
if (!_dat_80093cb0 && _vm->getRand(8) < 3) {
|
|
if (_vm->getRand(8) < 3) {
|
|
_dat_80093c72 = 1;
|
|
_dat_80093c74 = 0;
|
|
_dat_80093cac = 1;
|
|
} else {
|
|
_dat_80093ca4 = _dat_80093cc8 + _vm->getRand(10);
|
|
_dat_80093cac = 1;
|
|
}
|
|
return true;
|
|
}
|
|
if (_dat_80093cb4 == 4) {
|
|
_dat_80093cac = 1;
|
|
}
|
|
}
|
|
} else {
|
|
if ((_dat_80093cb8 < _dat_80093cb4) && (_dat_80093cb4 != 2)) {
|
|
_dat_80093cac = 1;
|
|
}
|
|
}
|
|
}
|
|
uVar2 = (uint)_dat_80093cac;
|
|
}
|
|
} else {
|
|
_dat_80093cac = 1;
|
|
uVar2 = true;
|
|
}
|
|
} else {
|
|
_dat_80093cac = 0;
|
|
uVar2 = false;
|
|
}
|
|
} else {
|
|
uVar2 = _vm->isLeftKeyPressed();
|
|
}
|
|
return uVar2;
|
|
}
|
|
|
|
bool Minigame2::fun_80093248() {
|
|
bool uVar2;
|
|
|
|
if (_dat_80093ca0 == 0) {
|
|
if (!_dat_80093c72) {
|
|
if (!_dat_80093c70 || (_dat_80093cb8 == 0)) {
|
|
_dat_80093c70 = false;
|
|
_dat_80093c74 = _dat_80093c74 + 1;
|
|
if (_dat_80093c74 < 2) {
|
|
_dat_80093c72 = true;
|
|
_dat_80093cb0 = false;
|
|
uVar2 = false;
|
|
} else {
|
|
if (_dat_80093ca4 == 0) {
|
|
_dat_80093cb0 = false;
|
|
if (_dat_80093cb8 == _dat_80093cb4) {
|
|
if (_dat_80093cbc < _dat_80093cc0) {
|
|
_dat_80093cb0 = (bool)(_dat_80093cb8 != 0);
|
|
} else {
|
|
if ((_dat_80093cac == 0) && _vm->getRand(8) < 3) {
|
|
if (_vm->getRand(8) < 3) {
|
|
_dat_80093c70 = true;
|
|
_dat_80093c74 = 0;
|
|
_dat_80093cb0 = true;
|
|
} else {
|
|
_dat_80093ca4 = _dat_80093cc8 + _vm->getRand(10);
|
|
_dat_80093cb0 = true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
if (_dat_80093cb4 == 0) {
|
|
_dat_80093cb0 = true;
|
|
}
|
|
}
|
|
} else {
|
|
if ((_dat_80093cb4 < _dat_80093cb8) && (_dat_80093cb4 != 2)) {
|
|
_dat_80093cb0 = true;
|
|
}
|
|
}
|
|
}
|
|
uVar2 = _dat_80093cb0;
|
|
}
|
|
} else {
|
|
_dat_80093cb0 = true;
|
|
uVar2 = true;
|
|
}
|
|
} else {
|
|
_dat_80093cb0 = false;
|
|
uVar2 = false;
|
|
}
|
|
} else {
|
|
uVar2 = _vm->isRightKeyPressed();
|
|
}
|
|
return uVar2;
|
|
}
|
|
|
|
bool Minigame2::fun_80093800() {
|
|
bool uVar2;
|
|
|
|
if (_dat_80093ca0 == 0) {
|
|
if (_dat_80093ca4 == 0) {
|
|
_dat_80093ca8 = false;
|
|
if ((_dat_80093cb8 == _dat_80093cb4) && (_dat_80093cc0 < _dat_80093cbc)) {
|
|
_dat_80093ca8 = true;
|
|
} else {
|
|
if (_vm->getRand(8) < 3) {
|
|
_dat_80093ca4 = _vm->getRand(10);
|
|
_dat_80093ca4 = _dat_80093cc8 + _dat_80093ca4;
|
|
_dat_80093ca8 = true;
|
|
}
|
|
}
|
|
}
|
|
uVar2 = _dat_80093ca8;
|
|
} else {
|
|
uVar2 = false;
|
|
if (_vm->isSquareButtonPressed() || _vm->isCrossButtonPressed() ||
|
|
_vm->isCircleButtonPressed() ||
|
|
_vm->isTriangleButtonPressed()) {
|
|
uVar2 = true;
|
|
}
|
|
}
|
|
return uVar2;
|
|
}
|
|
|
|
bool Minigame2::fun_80093a30() {
|
|
bool uVar1;
|
|
|
|
if (_dat_80093ca0 == 0) {
|
|
uVar1 = (uint) _dat_80093c90 == (uint) _dat_80093cc8 / 3;
|
|
} else {
|
|
uVar1 = _vm->isL1ButtonPressed(); // TODO || _vm->isL2ButtonPressed();
|
|
}
|
|
return uVar1;
|
|
}
|
|
|
|
bool Minigame2::fun_80093990() {
|
|
bool uVar1;
|
|
|
|
if (_dat_80093ca0 == 0) {
|
|
uVar1 = _dat_80093c90 == 0;
|
|
} else {
|
|
uVar1 = _vm->isR1ButtonPressed(); // TODO || _vm->isR2ButtonPressed();
|
|
}
|
|
return uVar1;
|
|
}
|
|
|
|
} // End of namespace Dragons
|