Files
2026-02-02 04:50:13 +01:00

210 lines
4.9 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "chewy/cursor.h"
#include "chewy/defines.h"
#include "chewy/events.h"
#include "chewy/globals.h"
#include "chewy/room.h"
#include "chewy/rooms/room46.h"
#include "chewy/sound.h"
#include "chewy/video/video_player.h"
namespace Chewy {
namespace Rooms {
void Room46::entry(int16 eib_nr) {
if (_G(gameState)._personRoomNr[P_HOWARD] == 45) {
_G(gameState)._personRoomNr[P_HOWARD] = 46;
_G(SetUpScreenFunc) = setup_func;
if (eib_nr == 79) {
setPersonPos(140, 90, P_HOWARD, P_LEFT);
autoMove(3, P_CHEWY);
setPersonSpr(P_LEFT, P_CHEWY);
}
}
if (_G(gameState)._personRoomNr[P_HOWARD] == 46) {
_G(spieler_mi)[P_HOWARD].Mode = true;
_G(SetUpScreenFunc) = setup_func;
if (_G(gameState).flags33_8) {
_G(mouseLeftClick) = false;
hideCur();
setPersonPos(175, 73, P_HOWARD, P_LEFT);
setPersonPos(147, 109, P_CHEWY, P_LEFT);
_G(gameState).flags33_8 = false;
_G(gameState).SVal1 = 46;
waitShowScreen(10);
start_spz_wait(64, 1, false, P_CHEWY);
start_spz(65, 255, false, P_CHEWY);
startAadWait(494);
_G(gameState).SVal2 = 504;
switchRoom(92);
start_spz(65, 255, false, P_CHEWY);
startAadWait(495);
_G(gameState).room_e_obj[78].Exit = 90;
showCur();
}
}
if (_G(gameState).R47SchlossOk && !_G(gameState).R46GetLeder)
bodo();
}
void Room46::xit() {
if (_G(gameState)._personRoomNr[P_HOWARD] == 46) {
_G(spieler_mi)[P_HOWARD].Mode = false;
}
}
void Room46::setup_func() {
calc_person_look();
int16 y = 64;
const int16 ch_x = _G(moveState)[P_CHEWY].Xypos[0];
int16 x;
if (ch_x > 160) {
x = 260;
} else {
x = 120;
}
if (_G(HowardMov) && _G(flags).ExitMov) {
x = 160;
y = 200;
}
goAutoXy(x, y, P_HOWARD, ANI_GO);
}
void Room46::bodo() {
hideCur();
_G(det)->showStaticSpr(0);
_G(person_end_phase)[P_CHEWY] = P_RIGHT;
startAadWait(240);
_G(spieler_mi)[P_CHEWY].Mode = true;
goAutoXy(42, 76, P_CHEWY, ANI_WAIT);
startAadWait(250);
autoMove(1, P_CHEWY);
setPersonSpr(P_RIGHT, P_CHEWY);
startAadWait(251);
autoMove(2, P_CHEWY);
_G(spieler_mi)[P_CHEWY].Mode = false;
startSetAILWait(0, 1, ANI_FRONT);
_G(det)->startDetail(5, 255, ANI_FRONT);
startAadWait(241);
_G(det)->stopDetail(5);
_G(det)->showStaticSpr(5);
startAadWait(609);
_G(det)->hideStaticSpr(5);
startSetAILWait(2, 1, ANI_FRONT);
startSetAILWait(3, 1, ANI_FRONT);
_G(det)->startDetail(4, 255, ANI_FRONT);
startAadWait(242);
_G(det)->stopDetail(4);
_G(det)->showStaticSpr(6);
startAadWait(610);
_G(det)->hideStaticSpr(6);
startSetAILWait(6, 1, ANI_FRONT);
_G(det)->showStaticSpr(3);
_G(gameState)._personHide[P_CHEWY] = true;
startSetAILWait(1, 1, ANI_FRONT);
flic_cut(FCUT_065);
_G(out)->setPointer(nullptr);
_G(out)->cls();
register_cutscene(16);
_G(gameState)._personHide[P_CHEWY] = false;
_G(det)->hideStaticSpr(0);
_G(det)->hideStaticSpr(3);
load_chewy_taf(CHEWY_ROCKER);
_G(gameState).R28ChewyPump = false;
setPersonPos(213, 118, P_CHEWY, P_RIGHT);
startAadWait(243);
invent_2_slot(UHR_INV);
invent_2_slot(RING_INV);
_G(gameState).R46GetLeder = true;
showCur();
}
void Room46::kloppe() {
//_G(sndPlayer)->setLoopMode(1);
for (int16 i = 0; i < 4; i++) {
g_engine->_video->playVideo(FCUT_065);
_G(out)->setPointer(nullptr);
_G(out)->cls();
start_aad(244 + i, -1);
int16 delay = _G(gameState).DelaySpeed * 50;
_G(atds)->print_aad(0, 0);
_G(disableScreen) = true;
if (g_engine->_sound->speechEnabled()) {
g_engine->_sound->waitForSpeechToFinish();
} else {
while (g_events->getSwitchCode() == Common::KEYCODE_INVALID && delay) {
--delay;
EVENTS_UPDATE;
SHOULD_QUIT_RETURN;
}
}
_G(disableScreen) = false;
}
g_engine->_video->playVideo(FCUT_066);
// TODO: Reimplement
//_G(sndPlayer)->fadeOut(0);
_G(out)->cls();
//while (_G(sndPlayer)->musicPlaying() && !SHOULD_QUIT) {
// EVENTS_UPDATE;
//}
}
int16 Room46::use_schloss() {
int16 action_ret = false;
if (!_G(cur)->usingInventoryCursor()) {
action_ret = true;
if (!_G(gameState).R46GetLeder) {
autoMove(1, P_CHEWY);
switchRoom(47);
} else {
startAadWait(252);
}
}
return action_ret;
}
} // namespace Rooms
} // namespace Chewy