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

844 lines
21 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/section9/room904.h"
#include "m4/core/errors.h"
#include "m4/burger/vars.h"
#include "m4/m4.h"
namespace M4 {
namespace Burger {
namespace Rooms {
static const char *const CREDITS_ENG[] = {
"Design",
"Game Designer: Robert Aitken",
" ",
"Writer: Robert Aitken",
" ",
"Additional Dialog: Mark Solomon",
" ",
"Original Concept:",
" Robert Aitken",
" Matthew Powell",
nullptr,
"Art",
"Art Director: Andrew Pratt",
" ",
"Character Design:",
" Glen Lovett",
" Sean Newton",
" ",
"Background Layout: Glen Lovett",
" ",
"Background Art:",
" Bob Parr",
" Andrew Pratt",
" ",
"Art Technician: Garth Buzzard",
" ",
"Additional Art:",
" Darren Brereton",
" Shelley Burke",
" Garth Buzzard",
" Karl Johanson",
" Calvin Jones",
" Dwight Lockhart",
" Bob Parr",
" Andrew Pratt",
" ",
"GUI and Detail Art: Andrew Pratt",
nullptr,
"Animation",
"Lead Animator: Sean Newton",
" ",
"Animators:",
" Jim Bridle",
" Hilary Denny",
" Nelson Dewey",
" Richelle Grist",
" Glen Lovett",
" Kay Lovett",
" Tim Maltby",
" Stephen McCallum",
" Shelley McIntosh",
" Jean Paynter",
" Gary Scott",
" Nigel Tully",
" Adrie Van Viersen",
" ",
"Animation Design: Robert Aitken",
" ",
"3D Modeling/Animation:",
" Nelson Dewey",
" David Henry",
" ",
"Animation Technician: Robert McMurtry",
nullptr,
"Coloring",
"Colorists:",
" Allan Cameron",
" Scott Douglas",
" Cindy Johnson",
" ",
"Additional Coloring:",
" Brent Arnst",
" Rob Barrett",
" Garth Buzzard",
" Chris Capell",
" Jacob Dewey",
" Bruce Elder",
" Andrew James",
" Darren Keetley",
" Cal Jones",
" Jeff Kuipers",
" Dwight Lockhart",
" Kimberlie Manuel",
" Connie McCann",
" Stephen Rowe",
" Peter Taylor",
nullptr,
"Audio",
"Original Score: Darren McGrath",
" ",
"Sound Design: Darren McGrath",
" ",
"Audio Producer: Darren McGrath",
" ",
"Casting:",
" Robert Aitken",
" Darren McGrath",
" Kris Zimmerman",
" ",
"Dialog Cutting:",
" Darren McGrath",
" Allan Cameron",
nullptr,
"Programming",
"Game Lead: Matthew Powell",
" ",
"Game:",
" Robert McMurtry",
" Paul Lahaise",
" Chris Petkau",
" Jason Bevins",
" David Thomas",
" ",
"Systems Lead: Nick Porcino",
" ",
"Systems:",
" Andras Kovacs",
" Michael Ellis",
" Xi Huang",
" Tinman",
" Paul Lahaise",
" Matthew Powell",
" Cody Jones",
" ",
"Windows '95: Chris Blackwell",
" ",
"Macintosh:",
" Nick Porcino",
" Michael Ellis",
" ",
"Conversations: Robert Aitken",
nullptr,
"Production",
"Producer: Fran\xe7""ois Robillard",
" ",
"Assistant Producer: Danielle Cooper",
nullptr,
"Quality Assurance",
"Michael Beninger",
"Kimberlie Manuel",
"Chris Capell",
"Bruce Elder",
"Darren Keetley",
nullptr,
"Documentation",
"User's Guide Writer: Hope Hickli",
" ",
"Art and Layout:",
" Calvin Jones",
" Bob Parr",
nullptr,
"Audio Cast",
"Wilbur - Rob Paulsen",
"Zlarg - Jim Cummings",
"Flumix - Dee Bradley Baker",
"Astral - E.G. Daily",
"Harry - Michael Bell",
"Aunt Polly - Candi Milo",
"Burl - Phil Hayes",
"Elmo Perkins - Nick Jameson",
"Sheriff - Phil Hayes",
"Gus/Angus/Elgus - Mike Donovan",
"Odie - Rob Paulsen",
"Vipe - Mike Donovan",
"Roxy - Candi Milo",
"Vera - Pat Lentz",
"Eugene - Phil Hayes",
"Stolie - Mike Donovan",
"Borks - Dee Bradley Baker",
"VP of Protein Procurement - Jim Cummings",
"Truffles - Dee Bradley Baker",
"Junkyard Dog - Rob Paulsen",
"Ship's Computer - Candi Milo",
"Mutant Gerbils - Dee Bradley Baker",
nullptr,
"Special Thanks",
"Thanks to Lynda Gran for our paychecks,",
"Laura McCallum for keeping us organized",
"and Carol Schieck for always smiling.",
" ",
"Thanks to Vancouver Island Brewing for",
"keeping us happy every weekend.",
" ",
"Very Special Thanks to Significant Others",
"and Offspring who often made do without",
"their loved ones so that this product could",
"be made.",
nullptr,
" ",
" ",
nullptr,
"Back To Main Menu",
" ",
nullptr,
nullptr
};
static const char *const CREDITS_DEU[] = {
"Entwurf",
"Spielentwurf: Robert Aitken",
" ",
"Spieltext: Robert Aitken",
" ",
"Zus\xe4""tzliche Dialoge: Mark Solomon",
" ",
"Originalidee:",
" Robert Aitken",
" Matthew Powell",
nullptr,
"Graphik",
"K\xfc""nstlerische Leitung: Andrew Pratt",
" ",
"Entwurf der Charaktere:",
" Glen Lovett",
" Sean Newton",
" ",
"Hintergrund-Layout: Glen Lovett",
" ",
"Landschaftsgestaltung:",
" Bob Parr",
" Andrew Pratt",
" ",
"Graphische Technik: Garth Buzzard",
" ",
"Zus\xe4""tzliche Grafik:",
" Darren Brereton",
" Shelley Burke",
" Garth Buzzard",
" Karl Johanson",
" Calvin Jones",
" Dwight Lockhart",
" Bob Parr",
" Andrew Pratt",
" ",
"Benutzeroberfl\xe4""che, Grafikdetails: Andrew Pratt",
nullptr,
"Animationen",
"Animationsleitung: Sean Newton",
" ",
"Animationen:",
" Jim Bridle",
" Hilary Denny",
" Nelson Dewey",
" Richelle Grist",
" Glen Lovett",
" Kay Lovett",
" Tim Maltby",
" Stephen McCallum",
" Shelley McIntosh",
" Jean Paynter",
" Gary Scott",
" Nigel Tully",
" Adrie Van Viersen",
" ",
"Animationsdesign: Robert Aitken",
" ",
"3D-Modellierung, Animationen:",
" Nelson Dewey",
" David Henry",
" ",
"Animationstechnik: Robert McMurtry",
nullptr,
"Kolorierung",
"Kolorierung:",
" Allan Cameron",
" Scott Douglas",
" Cindy Johnson",
" ",
"Zus\xe4""tzliche Kolorierung:",
" Brent Arnst",
" Rob Barrett",
" Garth Buzzard",
" Chris Capell",
" Jacob Dewey",
" Bruce Elder",
" Andrew James",
" Darren Keetley",
" Cal Jones",
" Jeff Kuipers",
" Dwight Lockhart",
" Kimberlie Manuel",
" Connie McCann",
" Stephen Rowe",
" Peter Taylor",
nullptr,
"Audio",
"Originalmusik: Darren McGrath",
" ",
"Soundgestaltung: Darren McGrath",
" ",
"Audio-Produktion:",
" Darren McGrath",
" Ton Synchron",
" ",
"Casting:",
" Robert Aitken",
" Darren McGrath",
" Kris Zimmerman",
" ",
"Dialogschnitt:",
" Darren McGrath",
" Allan Cameron",
" Ton Synchron",
nullptr,
"Programmierung",
"Leitung Spielprogrammierung: Matthew Powell",
" ",
"Programmierung:",
" Robert McMurtry",
" Paul Lahaise",
" Chris Petkau",
" Jason Bevins",
" David Thomas",
" ",
"Leitung Systemprogrammierung: Nick Porcino",
" ",
"Systemprogrammierung:",
" Andras Kovacs",
" Michael Ellis",
" Xi Huang",
" Tinman",
" Paul Lahaise",
" Matthew Powell",
" Cody Jones",
" ",
"International: Mojo Systems",
" ",
"Konversation: Robert Aitken",
nullptr,
"Produktion",
"Produktionsleitung:",
" Fran\xe7""ois Robillard,",
" Eidos Deutschland",
" ",
"Produktionsassistenz: Danielle Cooper",
" ",
"Deutsche Produktion:",
" Alp Altun",
" Eva Hoogh",
" Anskje Kirschner",
" Christian Zoch",
" ",
"International:",
" Kimberlie Manuel, Mojo Systems",
" Katrin van der Leeden",
nullptr,
"Qualit\xe4""tssicherung",
"Michael Beninger",
"Kimberlie Manuel",
"Chris Capell",
"Bruce Elder",
"Darren Keetley",
" ",
"International: Mojo Systems",
nullptr,
"Handbuch",
"Handbuch: Hope Hickli",
" ",
"Grafik und Layout des Handbuchs:",
" Calvin Jones",
" Bob Parr",
nullptr,
"Die Charaktere",
"(in alphabetischer Reihenfolge)",
"Angus - Peter Bieringer",
"Astral - Susanne Sternberg",
"Bauarbeiter - Alp Altun",
"Bork - Dee Bradley Baker",
"Burl - Nico K\xf6""nig",
"Computer - Ulrike Herm",
"Elgus - Peter Bieringer",
"Erz\xe4""hler - Ingo Abel",
"Eugene - Franz-Josef Steffens",
"Fernsehstimmen - Ulrike Herm, Robert Missler,",
" Olaf Ritter, Thomas Stein, Angela Stresemann",
"Flumix - Wolfgang J\xfc""rgen",
"Harry - Hans Sievers",
"Gus - Peter Bieringer",
"Odie - Dagmar 'The Kid'",
"Perkins - Michael Quiatkowski",
"Roxy - Susanne Sternberg",
"Sheriff - Hans Sievers",
"Stolie - Hans Sievers",
"Tante Polly - Verena Wiet",
"Vera - Angela Stresemann",
"Vipe - Alexander Draeger",
"VP - Franz-Josef Steffens",
"Wilbur - Robert Missler",
"Zlarg - Wolfgang Draeger",
nullptr,
"Vielen Dank",
"Unseren Dank an Lynda Gran f\xfc""r unsere Gehaltsschecks,",
"an Laura McCallum f\xfc""r ihr Organisationsgenie",
"und an Carol Schieck f\xfc""r ihr immer geduldiges L\xe4""cheln.",
" ",
"Vielen Dank an Vancouver Island Brewing. Jungs,",
"ihr habt uns Wochenende um Wochenende gerettet!",
" ",
"Besonderen Dank an bedeutsame andere ",
"samt Nachwuchs, die so oft auf ihre Lieben ",
"verzichten mu\xdf""ten, damit dieses Spiel ",
"entstehen konnte.",
" ",
"Ganz besonderen Dank an Anskje Kirschner!",
nullptr,
" "
" ",
nullptr,
"Hauptmen\xfc",
" ",
nullptr,
nullptr
};
static const char *const CREDITS_FRA[] = {
"Design",
"Concepteur: Robert Aitken",
" ",
"Auteur: Robert Aitken",
" ",
"Dialogues additionnels: Mark Solomon",
" ",
"Concepteur original:",
" Robert Aitken",
" Matthew Powell",
nullptr,
"Art",
"Direction artistique: Andrew Pratt",
" ",
"Character Design :",
" Glen Lovett",
" Sean Newton",
" ",
"Graphisme d\xE9""cors: Glen Lovett",
" ",
"Graphisme arri\xE8""re-plan:",
" Bob Parr",
" Andrew Pratt",
" ",
"Techniciens artistique: Garth Buzzard",
" ",
"Graphismes additionnels:",
" Darren Brereton",
" Shelley Burke",
" Garth Buzzard",
" Karl Johanson",
" Calvin Jones",
" Dwight Lockhart",
" Bob Parr",
" Andrew Pratt",
" ",
"Interface et d\xE9""tails graphiques: Andrew Pratt",
nullptr,
"Animation",
"Producteur animation: Sean Newton",
" ",
"Animateurs:",
" Jim Bridle",
" Hilary Denny",
" Nelson Dewey",
" Richelle Grist",
" Glen Lovett",
" Kay Lovett",
" Tim Maltby",
" Stephen McCallum",
" Shelley McIntosh",
" Jean Paynter",
" Gary Scott",
" Nigel Tully",
" Adrie Van Viersen",
" ",
"Concepteurs animation: Robert Aitken",
" ",
"3D Maquette/Animation:",
" Nelson Dewey",
" David Henry",
" ",
"Techniciens animation: Robert McMurtry",
nullptr,
"Coloring",
"Coloristes:",
" Allan Cameron",
" Scott Douglas",
" Cindy Johnson",
" ",
"Coloristes additionnels:",
" Brent Arnst",
" Rob Barrett",
" Garth Buzzard",
" Chris Capell",
" Jacob Dewey",
" Bruce Elder",
" Andrew James",
" Darren Keetley",
" Cal Jones",
" Jeff Kuipers",
" Dwight Lockhart",
" Kimberlie Manuel",
" Connie McCann",
" Stephen Rowe",
" Peter Taylor",
nullptr,
"Audio",
"Bande son originale: Darren McGrath",
" ",
"Ing\xE9""nieur du son: Darren McGrath",
" ",
"Producteur son: Darren McGrath",
" ",
"Casting:",
" Robert Aitken",
" Darren McGrath",
" Kris Zimmerman",
" ",
"Monteur dialogues:",
" Darren McGrath",
" Allan Cameron",
nullptr,
"Programming",
"Programmeur jeu: Matthew Powell",
" ",
"Programmeurs:",
" Robert McMurtry",
" Paul Lahaise",
" Chris Petkau",
" Jason Bevins",
" David Thomas",
" ",
"Producteur syst\xEA""me: Nick Porcino",
" ",
"Programmeur syst\xEA""me:",
" Andras Kovacs",
" Michael Ellis",
" Xi Huang",
" Tinman",
" Paul Lahaise",
" Matthew Powell",
" Cody Jones",
" ",
"Conversations: Robert Aitken",
nullptr,
"Production",
"Producteur: Fran\xE7""ois Robillard",
" ",
"Producteur d\xE9""l\xE9""gu\xE9"": Danielle Cooper",
" ",
"Localisation - version fran\xE7""aise:",
" Groupe SRC",
nullptr,
"Assurance qualit\xE9",
"Michael Beninger",
"Kimberlie Manuel",
"Chris Capell",
"Bruce Elder",
"Darren Keetley",
nullptr,
"Documentation",
"Auteur mode d'emploi: Hope Hickli",
" ",
"Graphisme mode d'emploi:",
" Calvin Jones",
" Bob Parr",
nullptr,
"Casting audio",
"Wilbur - J\xE9""rome Berthoud",
"Zlarg - Fernand Centanni",
"Flumix - Joanna Michel",
"Astral - Sheila O'Connor",
"Harry - Patrick Martinez",
"Tante Polly - Sheila O'Connor",
"Burl - Patrick Martinez",
"Elmo Perkins - Salvatore Ingoglia",
"Sheriff - Gilles Blumenfeld",
"Gus/Angus/Elgus - Patrick Martinez",
"Odie - Marion Lasserre",
"Vipe - Salvatore Ingoglia",
"Roxy - Marion Lasserre",
"Vera - Estelle Burgel",
"Eug\xE8""ne - Patrick Massiah",
"Stolie - Philippe Barrier",
"Borks - Dee Bradley Baker",
"Chef de l'approvisionnement - Fernand Centanni",
"Truffles - Bradley Baker",
"Junkyard Dog - Sheila O'Connor",
"Ordinateur de bord - Rob Paulsen",
"Mutant Gerbils - Dee Bradley Baker",
nullptr,
" ",
" ",
nullptr,
"Menu Principal",
" ",
nullptr,
nullptr
};
#define CREDITS (g_engine->getLanguage() == Common::DE_DEU ? CREDITS_DEU : (g_engine->getLanguage() == Common::FR_FRA ? CREDITS_FRA : CREDITS_ENG))
void Room904::preload() {
_G(player).walker_in_this_scene = false;
}
void Room904::init() {
digi_preload("902music");
digi_preload("904pop1");
digi_preload("904pop2");
digi_preload("904pop3");
digi_preload("904pop4");
digi_preload("904pop5");
_G(kernel).suppress_fadeup = true;
pal_fade_set_start(_G(master_palette), 0);
pal_fade_init(_G(master_palette), 0, 255, 100, 60, 1);
player_set_commands_allowed(false);
}
void Room904::shutdown() {
if (_screen1)
TextScrn_Destroy(_screen1);
if (_screen2)
TextScrn_Destroy(_screen2);
_G(player).command_ready = true;
}
void Room904::daemon() {
switch (_G(kernel).trigger) {
case 1:
player_set_commands_allowed(true);
creditsSetup();
break;
case 2:
if (_currentSection < _numSections) {
playRandomSound(2, 1);
TextScrn_Add_TextItem(_screen1, 10, (_currentSection - 1) * _fontHeight + 10,
_currentSection, TS_CENTRE, getCreditsSectionString(_currentSection),
(M4CALLBACK)creditsCallback);
TextScrn_Activate(_screen1);
}
break;
case 3:
playRandomSound(-1, 2);
break;
case 4:
digi_play_loop("902music", 3, 155, -1);
break;
case 5:
player_set_commands_allowed(false);
pal_fade_init(_G(master_palette), 0, 255, 0, 30, 6);
break;
case 6:
_G(game).setRoom(_G(executing) == WHOLE_GAME ? 903 : 901);
break;
default:
break;
}
}
void Room904::parser() {
if (player_said("go back"))
kernel_trigger_dispatch_now(5);
}
void Room904::creditsSetup() {
_numSections = getCreditsSectionsCount();
gr_font_set(_G(font_inter));
_fontHeight = gr_font_get_height();
_totalWidth = getMaxCreditsHeaderWidth() + 20;
_totalHeight = _fontHeight * _numSections + 20;
_x1 = 30;
_x2 = 30 + _totalWidth;
_y1 = (480 - _totalHeight) / 2;
_y2 = _y1 + _totalHeight;
_screen1 = TextScrn_Create(_x1, _y1, _x2, _y2, 100, 422, 3, 22, 1, 10, 2, 14);
for (_currentSection = 1; _currentSection <= _numSections; ++_currentSection) {
TextScrn_Add_TextItem(_screen1, 10, (_currentSection - 1) * _fontHeight + 10,
_currentSection, TS_CENTRE, getCreditsSectionString(_currentSection),
(M4CALLBACK)creditsCallback);
}
TextScrn_Activate(_screen1);
}
size_t Room904::getCreditsSectionsCount() const {
size_t numSections = 0;
for (auto line = CREDITS; *line; ++line) {
while (*line)
++line;
++numSections;
}
return numSections;
}
int Room904::getCreditsSectionLine(int sectionNum) const {
if (sectionNum < 1 || sectionNum > _numSections)
error_show(FL, 'Burg', "Bad index to credits");
int lineNum;
for (lineNum = 0; sectionNum > 1; --sectionNum, ++lineNum) {
while (CREDITS[lineNum])
++lineNum;
}
return lineNum;
}
const char *Room904::getCreditsSectionString(int sectionNum) const {
return CREDITS[getCreditsSectionLine(sectionNum)];
}
int Room904::getCreditsSectionLines(int sectionNum) const {
const int sectionStart = getCreditsSectionLine(sectionNum);
int lineNum = sectionStart;
while (CREDITS[lineNum])
++lineNum;
return lineNum - sectionStart;
}
size_t Room904::getMaxCreditsHeaderWidth() const {
int32 maxWidth = 0;
for (int sectionNum = 1; sectionNum <= _numSections; ++sectionNum) {
maxWidth = MAX(maxWidth, gr_font_string_width(getCreditsSectionString(sectionNum)));
}
return maxWidth;
}
size_t Room904::getCreditsSectionWidth(int sectionNum) const {
int32 maxWidth = 0;
for (int lineNum = getCreditsSectionLine(sectionNum); CREDITS[lineNum]; ++lineNum) {
maxWidth = MAX(maxWidth, gr_font_string_width(CREDITS[lineNum]));
}
return maxWidth;
}
const char *Room904::getLineInCreditsSection(int sectionNum, int lineNum) const {
if (lineNum < 1 || lineNum > getCreditsSectionLines(sectionNum))
error_show(FL, 'Burg', "Bad index to names");
return CREDITS[getCreditsSectionLine(sectionNum) + lineNum];
}
void Room904::creditsCallback(TextItem *textItem, TextScrn *textScrn) {
Room904 *room = dynamic_cast<Room904 *>(g_engine->_activeRoom);
assert(room);
room->updateCredits(textItem, textScrn);
}
void Room904::updateCredits(TextItem *textItem, TextScrn *textScrn) {
const char *credit = textItem->prompt;
const int sectionNum = textItem->tag;
const int linesCount = getCreditsSectionLines(sectionNum);
term_message("credit: %s index: %d names: %d", credit, sectionNum, linesCount);
playRandomSound(-1, 2);
if (strncmp(credit, "Haupt", 5) && strncmp(credit, "Back ", 5) && strncmp(credit, "Menu ", 5)) {
mouse_set_sprite(kArrowCursor);
gr_font_set(_G(font_conv));
_fontHeight = gr_font_get_height();
const int sectionWidth = getCreditsSectionWidth(sectionNum) + 20;
const int sectionHeight = linesCount * _fontHeight + 20;
const int x1 = (640 - _x2 - sectionWidth) / 2 + _x2;
const int y1 = (480 - sectionHeight) / 2;
const int x2 = x1 + sectionWidth;
const int y2 = y1 + sectionHeight;
if (_screen2)
TextScrn_Destroy(_screen2);
_screen2 = TextScrn_Create(x1, y1, x2, y2, 100, 422, 3, 22, 1, 10, 2, 14);
for (int lineNum = 1; lineNum <= linesCount; ++lineNum) {
const char *line = getLineInCreditsSection(sectionNum, lineNum);
TextScrn_Add_Message(_screen2, 10, (lineNum - 1) * _fontHeight + 10,
lineNum, TS_GIVEN, line);
}
TextScrn_Activate(_screen2);
TextScrn_Activate(_screen1);
} else {
kernel_trigger_dispatch_now(5);
}
}
void Room904::playRandomSound(int trigger, int channel) {
const Common::String name = Common::String::format("904pop%d", g_engine->getRandomNumber(4) + 1);
digi_play(name.c_str(), channel, 255, trigger);
}
} // namespace Rooms
} // namespace Burger
} // namespace M4