Files
scummvm-cursorfix/engines/m4/burger/rooms/section1/room106.cpp
2026-02-02 04:50:13 +01:00

428 lines
11 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 "m4/burger/rooms/section1/room106.h"
#include "m4/burger/rooms/section1/section1.h"
#include "m4/burger/vars.h"
#include "m4/graphics/gr_series.h"
namespace M4 {
namespace Burger {
namespace Rooms {
enum {
kWILBUR_SPEECH = 2,
kCHANGE_DOG_ANIMATION = 3,
kWILBUR_ARRESTED1 = 4,
kWILBUR_ARRESTED2 = 5
};
static const char *SAID[][4] = {
{ "GARBAGE CANS", "106w002", "106w003", nullptr },
{ "POLICE STATION", "106w004", "106w004z", "106w004z" },
{ "JAIL CELL", "106w005", "106w004z", "106w004z" },
{ "BARRED WINDOW", "106w006", "106w004z", nullptr },
{ "FENCE ", "106w008", "106w004z", "106w009" },
{ "RAZOR WIRE", "106w010", "106w011", "106w011" },
{ "GATE", "106w012", "106w004z", "106w013" },
{ "SIGN", "106w015", nullptr, nullptr },
{ "TIRE", "106w016", "106w017", "106w018" },
{ "TOW TRUCK", "106w019", "106w004z", "106w020" },
{ "PEGLEG", "106w021", "106w022", "106w022" },
{ "PEGLEG ", "106w021", "106w022", "106w022" },
{ "TIRE ", "106w023", "106w020", "106w020" },
{ "MAIN STREET", nullptr, "106w004z", nullptr },
{ "DOG COLLAR ", "106w900", nullptr, "106w901" },
{ "DOG COLLAR ", "106w900", nullptr, "106w901" },
{ "HOOK ", "106w903", "106w904", "106w004z" },
{ "WINCH", "106w902", "106w004z", "106w904" },
{ nullptr, nullptr, nullptr, nullptr }
};
const WilburMatch Room106::MATCH[] = {
{ "JAWZ O' LIFE", "GATE", 2, nullptr, 0, &_speechNum, 2 },
{ "JAWZ O' LIFE", "CHAIN", 2, nullptr, 0, &_speechNum, 2 },
{ "JAWZ O' LIFE", "LOCK", 2, nullptr, 0, &_speechNum, 2 },
WILBUR_MATCH_END
};
const seriesPlayBreak Room106::PLAY1[] = {
{ 0, -1, "106d003a", 2, 255, -1, 0, 0, &_dogState, 1 },
{ 0, -1, "106d003b", 2, 255, -1, 0, 0, &_dogState, 2 },
{ 0, -1, "106d003c", 2, 255, -1, 0, 0, &_dogState, 3 },
{ 0, -1, "106d003d", 2, 255, -1, 0, 0, &_dogState, 4 },
{ 0, -1, "106d003e", 2, 255, -1, 0, 0, &_dogState, 5 },
{ 0, -1, "106d003f", 2, 255, -1, 0, 0, &_dogState, 6 },
{ 0, -1, "106d003g", 2, 255, -1, 0, 0, &_dogState, 7 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY2[] = {
{ 0, -1, nullptr, 0, 0, -1, 0, 0, nullptr, 0 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY3[] = {
{ 0, -1, "106d001a", 2, 255, -1, 0, -1, &_dogState, 1 },
{ 0, -1, "106d001b", 2, 255, -1, 0, -1, &_dogState, 2 },
{ 0, -1, "106d001c", 2, 255, -1, 0, -1, &_dogState, 3 },
{ 0, -1, "106d001d", 2, 255, -1, 0, -1, &_dogState, 4 },
{ 0, -1, "106d001e", 2, 255, -1, 0, -1, &_dogState, 5 },
{ 0, -1, "106d001f", 2, 255, -1, 0, -1, &_dogState, 6 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY4[] = {
{ 0, -1, "106d002a", 2, 255, -1, 0, -1, &_dogState, 1 },
{ 0, -1, "106d002b", 2, 255, -1, 0, -1, &_dogState, 2 },
{ 0, -1, "106d002c", 2, 255, -1, 0, -1, &_dogState, 3 },
{ 0, -1, "106d002d", 2, 255, -1, 0, -1, &_dogState, 4 },
{ 0, -1, "106d002e", 2, 255, -1, 0, -1, &_dogState, 5 },
{ 0, -1, "106d002f", 2, 255, -1, 0, -1, &_dogState, 6 },
{ 0, -1, "106d002g", 2, 255, -1, 0, -1, &_dogState, 7 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY5[] = {
{ 0, 4, "106d006a", 2, 255, -1, 0, 0, &_dogState, 1 },
{ 0, 4, "106d006b", 2, 255, -1, 0, 0, &_dogState, 2 },
{ 0, 4, "106d006c", 2, 255, -1, 0, 0, &_dogState, 3 },
{ 5, -1, "106_005", 2, 255, -1, 0, 0, nullptr, 0 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY6[] = {
{ 0, 4, "106_005", 2, 255, -1, 0, 0, nullptr, 0 },
{ 5, -1, "106d007a", 2, 255, -1, 0, 0, &_dogState, 1 },
{ 5, -1, "106d007b", 2, 255, -1, 0, 0, &_dogState, 2 },
{ 5, -1, "106d007c", 2, 255, -1, 0, 0, &_dogState, 3 },
PLAY_BREAK_END
};
const seriesPlayBreak Room106::PLAY7[] = {
{ 0, -1, "106d005", 2, 255, -1, 0, 0, &_dogState, 1 },
{ 0, -1, "106d005b", 2, 255, -1, 0, 0, &_dogState, 2 },
{ 0, -1, "106d005c", 2, 255, -1, 0, 0, &_dogState, 3 },
{ 0, -1, "106d005d", 2, 255, -1, 0, 0, &_dogState, 4 },
{ 0, -1, "106d005e", 2, 255, -1, 0, 0, &_dogState, 5 },
{ 0, -1, "106d005f", 2, 255, -1, 0, 0, &_dogState, 6 },
PLAY_BREAK_END
};
int32 Room106::_speechNum;
int32 Room106::_dogState;
void Room106::preload() {
_G(player).walker_in_this_scene = _G(game).room_id != 137 &&
_G(game).room_id != 138;
}
void Room106::init() {
_dogState = 0;
digi_preload("100_001");
digi_preload("106_101");
_digi1 = "100_001";
kernel_trigger_dispatch_now(1);
player_set_commands_allowed(false);
_speechNum = 0;
setHotspots();
loadSeries();
if (_G(game).previous_room == -1) {
_dogShould = _G(flags)[V172] == 10023 ? 9 : 15;
} else {
_dogShould = imath_ranged_rand(1, 2) == 1 ? 5 : 6;
}
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
series_show("106gate", 0x4fd);
series_show("106gates", 0x4fe);
series_show("106tt", 0x600);
series_show("106tire", 0x600);
switch (_G(game).previous_room) {
case 101:
ws_demand_location(-40, 317, 3);
ws_walk(62, 340, nullptr, 0);
break;
case 137:
case 138:
// Wilbur was arrested
digi_play("106_102", 1, 255, kWILBUR_ARRESTED1);
break;
case KERNEL_RESTORING_GAME:
player_set_commands_allowed(true);
break;
default:
ws_demand_location(169, 336, 5);
break;
}
}
void Room106::daemon() {
switch (_G(kernel).trigger) {
case 1:
_digi1 = !strcmp(_digi1, "106_101") ? "100_001" : "106_101";
digi_play(_digi1, 3, 255, 1);
break;
case 2:
switch (_speechNum) {
case 1:
player_set_commands_allowed(true);
_G(walker).wilbur_speech_random("106w001a", "106w001b", "106w001c");
break;
case 2:
wilbur_speech("106w014");
break;
case 3:
wilbur_speech("106w501", kWILBUR_ARRESTED2);
break;
case 4:
wilbur_speech("106w500", kAbduction);
break;
default:
break;
}
break;
case kCHANGE_DOG_ANIMATION:
switch (_dogShould) {
case 5:
_dogState = imath_ranged_rand(1, 7);
_dogShould = 7;
series_play_with_breaks(PLAY1, "106dg01", 0x501, kCHANGE_DOG_ANIMATION, 3);
break;
case 6:
_dogShould = 7;
series_play_with_breaks(PLAY2, "106dg02", 0x501, kCHANGE_DOG_ANIMATION, 3);
break;
case 7:
_dogState = imath_ranged_rand(1, 6);
_dogShould = _G(game).previous_room == 137 || _G(game).previous_room == 138 ? 9 : 8;
series_play_with_breaks(PLAY3, "106dg04", 0x501, kCHANGE_DOG_ANIMATION, 3);
break;
case 8:
_speechNum = 1;
ws_turn_to_face(calc_facing(415, 234), 2);
_dogShould = 9;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
break;
case 9:
_G(flags)[V172] = 10023;
switch (imath_ranged_rand(1, 6)) {
case 1:
_dogShould = 10;
break;
case 2:
_dogShould = 11;
break;
case 3:
_dogShould = 12;
break;
default:
_dogShould = 9;
break;
}
series_show("106dg07", 0x501, 0, kCHANGE_DOG_ANIMATION, 120);
series_show("106dg07s", 0x502, 0, -1, 120);
break;
case 10:
if (digi_play_state(1)) {
_dogShould = 9;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
} else {
_dogState = imath_ranged_rand(1, 7);
_dogShould = 9;
series_play_with_breaks(PLAY4, "106dg05", 0x501, kCHANGE_DOG_ANIMATION, 3);
}
break;
case 11:
if (digi_play_state(1)) {
_dogShould = 9;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
} else {
_dogState = imath_ranged_rand(1, 3);
_dogShould = 15;
series_play_with_breaks(PLAY5, "106dg07", 0x501, kCHANGE_DOG_ANIMATION, 3);
}
break;
case 12:
if (digi_play_state(1)) {
_dogShould = 9;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
} else {
_dogState = imath_ranged_rand(1, 6);
_dogShould = 9;
series_play_with_breaks(PLAY3, "106dg04", 0x501, kCHANGE_DOG_ANIMATION, 3);
}
break;
case 13:
if (digi_play_state(1)) {
_dogShould = 15;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
} else {
_dogState = imath_ranged_rand(1, 6);
_dogShould = 15;
series_play_with_breaks(PLAY3, "106dg09", 0x501, kCHANGE_DOG_ANIMATION, 3);
}
break;
case 14:
if (digi_play_state(1)) {
_dogShould = 15;
kernel_trigger_dispatch_now(kCHANGE_DOG_ANIMATION);
} else {
_dogState = imath_ranged_rand(1, 3);
_dogShould = 9;
series_play_with_breaks(PLAY6, "106dg11", 0x501, kCHANGE_DOG_ANIMATION, 3);
}
break;
case 15:
_G(flags)[V172] = 10024;
switch (imath_ranged_rand(1, 4)) {
case 1:
_dogShould = 13;
break;
case 2:
_dogShould = 14;
break;
default:
_dogShould = 15;
break;
}
series_show("106dg07", 0x501, 0, kCHANGE_DOG_ANIMATION, 120, 8);
series_show("106dg07s", 0x502, 0, -1, 120, 8);
break;
case 16:
_dogState = imath_ranged_rand(1, 6);
_dogShould = 11;
series_play_with_breaks(PLAY7, "106dg06", 0x501, kCHANGE_DOG_ANIMATION, 3);
break;
case 17:
_dogState = imath_ranged_rand(1, 6);
_dogShould = 13;
series_play_with_breaks(PLAY7, "106dg10", 0x501, kCHANGE_DOG_ANIMATION, 3);
break;
default:
break;
}
break;
case kWILBUR_ARRESTED1:
_speechNum = 3;
digi_play("106s001", 1, 255, kWILBUR_SPEECH);
break;
case kWILBUR_ARRESTED2:
_speechNum = 4;
digi_play("106_103", 1, 255, kWILBUR_SPEECH);
break;
case 10008:
_dogShould = _G(flags)[V172] == 10023 ? 16 : 17;
break;
default:
_G(kernel).continue_handling_trigger = true;
break;
}
}
void Room106::pre_parser() {
if (player_said("SKY"))
player_set_facing_hotspot();
if (player_said("MAIN STREET") && !player_said_any("GEAR", "LOOK AT")) {
player_set_facing_at(-40, 317);
}
}
void Room106::parser() {
_G(kernel).trigger_mode = KT_DAEMON;
if (_G(walker).wilbur_said(SAID)) {
// Already handled
} else if (player_said_any("GEAR", "LOOK AT") && player_said("MAIN STREET")) {
disable_player_commands_and_fade_init(1001);
_G(player).command_ready = false;
} else if (!_G(walker).wilbur_match(MATCH)) {
return;
}
_G(player).command_ready = false;
}
void Room106::setHotspots() {
hotspot_set_active("PEGLEG", false);
hotspot_set_active("PEGLEG ", false);
hotspot_set_active("DOG COLLAR ", false);
hotspot_set_active("DOG COLLAR ", false);
switch (_G(flags)[V172]) {
case 10023:
hotspot_set_active("PEGLEG", true);
hotspot_set_active("DOG COLLAR ", true);
break;
case 10024:
hotspot_set_active("PEGLEG ", true);
hotspot_set_active("DOG COLLAR ", true);
break;
default:
break;
}
}
void Room106::loadSeries() {
series_load("106dg04");
series_load("106dg04s");
series_load("106dg07");
series_load("106dg07s");
}
} // namespace Rooms
} // namespace Burger
} // namespace M4