aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/m4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/m4/m4.cpp')
-rw-r--r--engines/m4/m4.cpp606
1 files changed, 0 insertions, 606 deletions
diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp
deleted file mode 100644
index efc7943114..0000000000
--- a/engines/m4/m4.cpp
+++ /dev/null
@@ -1,606 +0,0 @@
-/* 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.
- *
- */
-
-//#define SCRIPT_TEST
-//#define INTRO_TEST
-
-#include "m4/globals.h"
-#include "m4/burger_data.h"
-#include "m4/m4.h"
-#include "m4/resource.h"
-#include "m4/hotspot.h"
-#include "m4/font.h"
-#include "m4/rails.h"
-#include "m4/midi.h"
-#include "m4/events.h"
-#include "m4/graphics.h"
-#include "m4/viewmgr.h"
-#include "m4/gui.h"
-#include "m4/woodscript.h"
-#include "m4/actor.h"
-#include "m4/sound.h"
-#include "m4/script.h"
-#include "m4/compression.h"
-#include "m4/animation.h"
-#include "m4/m4_menus.h"
-#include "m4/m4_views.h"
-#include "m4/mads_anim.h"
-#include "m4/mads_menus.h"
-
-#include "common/error.h"
-#include "common/file.h"
-#include "common/fs.h"
-#include "common/system.h"
-#include "common/config-manager.h"
-#include "common/debug-channels.h"
-#include "common/textconsole.h"
-#include "engines/util.h"
-
-namespace M4 {
-
-// FIXME: remove global
-MadsM4Engine *_vm;
-MadsEngine *_madsVm;
-M4Engine *_m4Vm;
-
-void escapeHotkeyHandler(MadsM4Engine *vm, View *view, uint32 key) {
- // For now, simply exit the game
- vm->_events->quitFlag = true;
-}
-
-// Temporary hotkey handler for use in testing the TextviewView class
-
-void textviewHotkeyHandler(MadsM4Engine *vm, View *view, uint32 key) {
- // Deactivate the scene if it's currently active
- View *sceneView = vm->_viewManager->getView(VIEWID_SCENE);
- if (sceneView != NULL)
- vm->_viewManager->deleteView(sceneView);
-
- // Activate the textview view
- vm->_font->setFont(FONT_CONVERSATION_MADS);
- TextviewView *textView = new TextviewView(vm);
- vm->_viewManager->addView(textView);
- textView->setScript("quotes", NULL);
-}
-
-void saveGameHotkeyHandler(MadsM4Engine *vm, View *view, uint32 key) {
- // TODO: See CreateF2SaveMenu - save menu should only be activated when
- // certain conditions are met, such as player_commands_allowed, and isInterfaceVisible
- vm->loadMenu(SAVE_MENU, true);
-}
-
-void loadGameHotkeyHandler(MadsM4Engine *vm, View *view, uint32 key) {
- // TODO: See CreateF3LoadMenu - save menu should only be activated when
- // certain conditions are met, such as player_commands_allowed, and isInterfaceVisible
- vm->loadMenu(LOAD_MENU, true);
-}
-
-void gameMenuHotkeyHandler(MadsM4Engine *vm, View *view, uint32 key) {
- vm->loadMenu(GAME_MENU);
-}
-
-MadsM4Engine::MadsM4Engine(OSystem *syst, const M4GameDescription *gameDesc) :
- Engine(syst), _gameDescription(gameDesc) {
- // Setup mixer
- syncSoundSettings();
-
- // FIXME
- _vm = this;
- _madsVm = NULL;
-
- const Common::FSNode gameDataDir(ConfMan.get("path"));
-
- SearchMan.addSubDirectoryMatching(gameDataDir, "goodstuf");
- SearchMan.addSubDirectoryMatching(gameDataDir, "resource");
- SearchMan.addSubDirectoryMatching(gameDataDir, "option1");
-
- DebugMan.addDebugChannel(kDebugScript, "script", "Script debug level");
- DebugMan.addDebugChannel(kDebugGraphics, "graphics", "Graphics debug level");
- DebugMan.addDebugChannel(kDebugConversations, "conversations", "Conversations debugging");
- DebugMan.addDebugChannel(kDebugSound, "sound", "Sounds debug level");
- DebugMan.addDebugChannel(kDebugCore, "core", "Core debug level");
-
- _resourceManager = NULL;
- _globals = NULL;
-}
-
-
-MadsM4Engine::~MadsM4Engine() {
- delete _midi;
- delete _saveLoad;
- delete _kernel;
- delete _player;
- delete _mouse;
- delete _events;
- delete _font;
- delete _actor;
-// delete _scene; // deleted by the viewmanager
- delete _dialogs;
- delete _screen;
- delete _inventory;
- delete _viewManager;
- delete _rails;
- delete _script;
- delete _ws;
- delete _random;
- delete _palette;
- delete _globals;
- delete _sound;
- delete _resourceManager;
-}
-
-Common::Error MadsM4Engine::run() {
- // Initialize backend
- _screen = new M4Surface(true); // Special form for creating screen reference
-
- _midi = new MidiPlayer(this);
- _midi->setGM(true); // FIXME: Really? Always?
-
- _saveLoad = new SaveLoad(this);
- _palette = new Palette(this);
- _mouse = new Mouse(this);
- _events = new Events(this);
- _kernel = new Kernel(this);
- _player = new Player(this);
- _font = new FontManager(this);
- if (getGameType() == GType_Burger) {
- _actor = new Actor(this);
- _conversationView = new ConversationView(this);
- } else {
- _actor = NULL;
- }
- _rails = new Rails(); // needs to be initialized before _scene
- _dialogs = new Dialogs();
- _viewManager = new ViewManager(this);
- _inventory = new Inventory(this);
- _sound = new Sound(this, _mixer, 255);
- _script = new ScriptInterpreter(this);
- _ws = new WoodScript(this);
- //_callbacks = new Callbacks(this);
- _random = new Common::RandomSource("m4");
-
- return Common::kNoError;
-}
-
-void MadsM4Engine::eventHandler() {
- M4EventType event;
- uint32 keycode = 0;
-
- if ((event = _events->handleEvents()) != MEVENT_NO_EVENT) {
- if (_viewManager->containsViews())
- _viewManager->handleMouseEvents(event);
- }
-
- if (_events->kbdCheck(keycode))
- _viewManager->handleKeyboardEvents(keycode);
-}
-
-bool MadsM4Engine::delay(int duration, bool keyAborts, bool clickAborts) {
- uint32 endTime = g_system->getMillis() + duration;
- M4EventType event;
- uint32 keycode = 0;
-
- while (!_events->quitFlag && (g_system->getMillis() < endTime)) {
- event = _events->handleEvents();
- if (clickAborts && ((event == MEVENT_LEFT_RELEASE) || (event == MEVENT_RIGHT_RELEASE)))
- return true;
-
- if (_events->kbdCheck(keycode)) {
- if (keyAborts)
- return true;
- }
-
- g_system->delayMillis(10);
- }
-
- return false;
-}
-
-void MadsM4Engine::loadMenu(MenuType menuType, bool loadSaveFromHotkey, bool calledFromMainMenu) {
- if (isM4() && (menuType != MAIN_MENU)) {
- bool menuActive = _viewManager->getView(VIEWID_MENU) != NULL;
-
- if (!menuActive)
- _palette->fadeToGreen(M4_DIALOG_FADE_STEPS, M4_DIALOG_FADE_DELAY);
- }
-
- View *view;
-
- switch (menuType) {
- case MAIN_MENU:
- if (getGameType() == GType_RexNebular)
- view = new RexMainMenuView(this);
- else if (getGameType() == GType_DragonSphere)
- view = new DragonMainMenuView(this);
- else
- view = new MadsMainMenuView(this);
- break;
- case GAME_MENU:
- view = new OrionMenuView(this, 200, 100, GAME_MENU, calledFromMainMenu, loadSaveFromHotkey);
- break;
- case OPTIONS_MENU:
- view = new OrionMenuView(this, 172, 160, OPTIONS_MENU, calledFromMainMenu, loadSaveFromHotkey);
- break;
- case LOAD_MENU:
- case SAVE_MENU:
- view = new OrionMenuView(this, 145, 10, menuType, calledFromMainMenu, loadSaveFromHotkey);
- break;
- default:
- error("Unknown menu type");
- break;
- }
-
- _viewManager->addView(view);
- _viewManager->moveToFront(view);
-}
-
-#define DUMP_BUFFER_SIZE 1024
-
-void MadsM4Engine::dumpFile(const char *filename, bool uncompress) {
- Common::DumpFile f;
- byte buffer[DUMP_BUFFER_SIZE];
- Common::SeekableReadStream *fileS = res()->get(filename);
-
- if (!f.open(filename))
- error("Could not open '%s' for writing", filename);
-
- int bytesRead = 0;
- warning("Dumping %s, size: %i\n", filename, fileS->size());
-
- if (!uncompress) {
- while (!fileS->eos()) {
- bytesRead = fileS->read(buffer, DUMP_BUFFER_SIZE);
- f.write(buffer, bytesRead);
- }
- } else {
- MadsPack packData(fileS);
- Common::SeekableReadStream *sourceUnc;
- for (int i = 0; i < packData.getCount(); i++) {
- sourceUnc = packData.getItemStream(i);
- debugCN(kDebugCore, "Dumping compressed chunk %i of %i, size is %i\n", i + 1, packData.getCount(), sourceUnc->size());
- while (!sourceUnc->eos()) {
- bytesRead = sourceUnc->read(buffer, DUMP_BUFFER_SIZE);
- f.write(buffer, bytesRead);
- }
- delete sourceUnc;
- }
- }
-
- f.close();
- res()->toss(filename);
- res()->purge();
-}
-
-/*--------------------------------------------------------------------------*/
-
-M4Engine::M4Engine(OSystem *syst, const M4GameDescription *gameDesc): MadsM4Engine(syst, gameDesc) {
- // FIXME
- _m4Vm = this;
-
- _globals = new M4Globals(this);
-}
-
-M4Engine::~M4Engine() {
- delete _converse;
-}
-
-Common::Error M4Engine::run() {
- // Set up the graphics mode
- initGraphics(640, 480, true);
-
- // Necessary pre-initialisation
- _resourceManager = new M4ResourceManager(this);
-
- // Set up needed common functionality
- MadsM4Engine::run();
-
- // M4 specific initialisation
- _converse = new Converse(this);
-
- _scene = new M4Scene(this);
- _script->open("m4.dat");
-
-#ifdef SCRIPT_TEST
-
-#if 0
- ScriptFunction *func = _script->loadFunction("room_parser_142");
- _script->runFunction(func);
-#endif
-
-#if 1
- ScriptFunction *func = _script->loadFunction("room_daemon_951");
- for (int i = 1; i < 58; i++) {
- _vm->_kernel->trigger = i;
- _script->runFunction(func);
- debugCN(kDebugCore, "=================================\n");
- }
-#endif
-
- return Common::kNoError;
-#endif
-
- // Set up the inventory
-
- // Set up the game interface view
- //_interfaceView->inventoryAdd("Money", "", 55); // Sample item
-
- if (getGameType() == GType_Burger) {
- for (int i = 0; i < ARRAYSIZE(burger_inventory); i++) {
- char* itemName = strdup(burger_inventory[i].name);
- _inventory->registerObject(itemName, burger_inventory[i].scene,
- burger_inventory[i].icon);
- _inventory->addToBackpack(i); // debug: this adds ALL objects to the player's backpack
- }
- }
-
- // Show intro
-
- if (getGameType() == GType_Burger) {
- _kernel->newRoom = TITLE_SCENE_BURGER;
- } else {
- _scene->getBackgroundSurface()->loadBackgroundRiddle("main menu");
- _ws->setBackgroundSurface(_scene->getBackgroundSurface());
- }
-
- _viewManager->addView(_scene);
-
- // Setup game wide hotkeys. Note that Orion Burger used F2/F3 for Save/Restore,
- // but for standardisation with most other games, F5/F7 are also mapped
-
- _viewManager->systemHotkeys().add(Common::KEYCODE_ESCAPE, &escapeHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_F2, &saveGameHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_F3, &loadGameHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_F5, &saveGameHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_F7, &loadGameHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_F9, &gameMenuHotkeyHandler);
-
- // Start playing Orion Burger intro music
- //_midi->playMusic("999intro", 255, false, -1, -1);
-
- // TODO: start playing intro animations
-
- // TODO: Master Lu
-
- // Test for mouse
- _mouse->init("cursor", NULL);
- _mouse->setCursorNum(0);
- _mouse->cursorOn();
-
- _ws->assets()->loadAsset("SHOW SCRIPT", NULL);
- _ws->assets()->loadAsset("STREAM SCRIPT", NULL);
-
-#ifdef INTRO_TEST
- int curPart = 0;
- Machine *mach = NULL;
-#endif
-
- _ws->setSurfaceView(_scene);
-
- uint32 nextFrame = g_system->getMillis();
- while (!_events->quitFlag) {
-
- // This should probably be moved to either Scene or Kernel
- if (_kernel->currentRoom != _kernel->newRoom) {
-
- _ws->clear();
-
- _kernel->currentSection = _kernel->newRoom / 100;
- _kernel->currentRoom = _kernel->newRoom;
-
- _scene->loadScene(_kernel->currentRoom);
-
- _ws->setBackgroundSurface(_scene->getBackgroundSurface());
- _ws->setInverseColorTable(scene()->getInverseColorTable());
-
- _kernel->loadSectionScriptFunctions();
- _kernel->loadRoomScriptFunctions();
-
- _kernel->roomInit();
-
- _scene->show();
-
-#ifdef INTRO_TEST
- if (_kernel->currentRoom == 951) {
- curPart = 0;
- mach = _ws->streamSeries("PLANET X HILLTOP A", 1, 0x1000, 0);
- }
-#endif
-
- }
-
- eventHandler();
-
- // Call the updateState method of all views
- _viewManager->updateState();
-
- // Handle frame updates
- if (g_system->getMillis() >= nextFrame) {
-#ifdef INTRO_TEST
- // Orion Burger intro test (scene 951)
- // This is ugly and bad, machine is not deleted so there's a huge memory
- // leak too. But hey, we can see some of the intro!
- if (mach && mach->getState() == -1) {
- if (curPart == 0)
- mach = _ws->streamSeries("Planet X Low Ground Shot", 1, 0x1000, 0);
- else if (curPart == 1)
- mach = _ws->streamSeries("Planet X Hilltop B", 1, 0x1000, 0);
- else if (curPart == 2)
- mach = _ws->streamSeries("Space Station Panorama A", 1, 0x1000, 0);
- else if (curPart == 3)
- mach = _ws->streamSeries("Cargo Transfer Area A", 1, 0x1000, 0);
- else if (curPart == 4)
- mach = _ws->streamSeries("VP's Office A", 1, 0x1000, 0);
- else if (curPart == 5)
- mach = _ws->streamSeries("Hologram", 1, 0x1000, 0);
- else if (curPart == 6)
- mach = _ws->streamSeries("VP's Office B", 1, 0x1000, 0);
- else if (curPart == 7)
- mach = _ws->streamSeries("Cargo Transfer Area B", 1, 0x1000, 0);
- else if (curPart == 8)
- mach = _ws->streamSeries("Cargo Transfer Controls", 1, 0x1000, 0);
- else if (curPart == 9)
- mach = _ws->streamSeries("Space Station Panorama B", 1, 0x1000, 0);
- // This last scene is from the rolling demo
- //else if (curPart == 10)
- // mach = _ws->streamSeries("Call To Action", 1, 0x1000, 0);
- curPart++;
- }
-#endif
- _ws->update();
- _viewManager->refreshAll();
- nextFrame = g_system->getMillis();// + GAME_FRAME_DELAY;
-
- // TEST STUFF ONLY
- if (_player->commandReady) {
- _kernel->roomParser();
- _player->commandReady = false;
- }
-
- }
-
- g_system->delayMillis(10);
- }
-
- return Common::kNoError;
-}
-
-/*--------------------------------------------------------------------------*/
-
-MadsEngine::MadsEngine(OSystem *syst, const M4GameDescription *gameDesc): MadsM4Engine(syst, gameDesc) {
- // FIXME
- _madsVm = this;
-
- _globals = new MadsGlobals(this);
- _currentTimer = 0;
-}
-
-MadsEngine::~MadsEngine() {
-}
-
-Common::Error MadsEngine::run() {
- // Set up the graphics mode
- initGraphics(320, 200, false);
-
- // Necessary pre-initialisation
- _resourceManager = new MADSResourceManager(this);
-
- // Set up needed common functionality
- MadsM4Engine::run();
-
- _palette->setMadsSystemPalette();
-
- _mouse->init("cursor.ss", NULL);
- _mouse->setCursorNum(0);
-
- // Load MADS data files
- MadsGlobals *globs = (MadsGlobals *)_globals;
- globs->loadMadsVocab(); // vocab.dat
- globs->loadQuotes(); // quotes.dat
- globs->loadMadsMessagesInfo(); // messages.dat
- globs->loadMadsObjects();
-
- // Setup globals
- globs->_config.easyMouse = true;
- globs->_config.invObjectsStill = false;
- globs->_config.textWindowStill = false;
- globs->_config.storyMode = 1; // Naughty
- globs->_config.screenFades = 0;
-
- // Test code to dump all messages to the console
- //for (int i = 0; i < _globals->getMessagesSize(); i++)
- //debugCN(kDebugCore, "%s\n----------\n", _globals->loadMessage(i));
-
- if (getGameType() == GType_RexNebular) {
- MadsGameLogic::initializeGlobals();
-
- _scene = NULL;
- loadMenu(MAIN_MENU);
- } else {
- // Test code
- _scene = new MadsScene(this);
-
- startScene(FIRST_SCENE);
- RGBList *_bgPalData;
- _scene->loadBackground(FIRST_SCENE, &_bgPalData);
- _palette->addRange(_bgPalData);
- _scene->translate(_bgPalData);
-
- _scene->show();
-
- _font->setFont(FONT_MAIN_MADS);
- _font->current()->setColors(2, 1, 3);
- _font->current()->writeString(_scene->getBackgroundSurface(), "Testing the M4/MADS ScummVM engine", 5, 160, 310, 2);
- _font->current()->writeString(_scene->getBackgroundSurface(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 5, 180, 310, 2);
-
- if (getGameType() == GType_DragonSphere) {
- //_scene->showMADSV2TextBox("Test", 10, 10, NULL);
- }
-
- _mouse->cursorOn();
- }
-
- _viewManager->systemHotkeys().add(Common::KEYCODE_ESCAPE, &escapeHotkeyHandler);
- _viewManager->systemHotkeys().add(Common::KEYCODE_KP_MULTIPLY, &textviewHotkeyHandler);
-
- uint32 nextFrame = g_system->getMillis();
- while (!_events->quitFlag) {
- eventHandler();
-
- if (g_system->getMillis() >= nextFrame) {
- nextFrame = g_system->getMillis() + GAME_FRAME_DELAY;
- ++_currentTimer;
-
- // Call the updateState method of all views
- _viewManager->updateState();
-
- // Refresh the display
- _viewManager->refreshAll();
- }
-
- g_system->delayMillis(10);
-
- if (globals()->dialogType != DIALOG_NONE)
- showDialog();
- }
-
- return Common::kNoError;
-}
-
-void MadsEngine::showDialog() {
- // Switch to showing the given dialog
- RexDialogView *dlg = NULL;
- switch (globals()->dialogType) {
- case DIALOG_GAME_MENU:
- dlg = new RexGameMenuDialog();
- break;
- case DIALOG_OPTIONS:
- dlg = new RexOptionsDialog();
- break;
- default:
- error("Unknown dialog type");
- };
-
- globals()->dialogType = DIALOG_NONE;
- _viewManager->addView(dlg);
-}
-
-} // End of namespace M4