aboutsummaryrefslogtreecommitdiff
path: root/engines/made/scriptfuncs_mhne.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/made/scriptfuncs_mhne.cpp')
-rw-r--r--engines/made/scriptfuncs_mhne.cpp494
1 files changed, 494 insertions, 0 deletions
diff --git a/engines/made/scriptfuncs_mhne.cpp b/engines/made/scriptfuncs_mhne.cpp
new file mode 100644
index 0000000000..65e9c6e070
--- /dev/null
+++ b/engines/made/scriptfuncs_mhne.cpp
@@ -0,0 +1,494 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/endian.h"
+#include "common/util.h"
+#include "common/events.h"
+
+#include "graphics/cursorman.h"
+
+#include "made/made.h"
+#include "made/resource.h"
+#include "made/database.h"
+#include "made/screen.h"
+#include "made/script.h"
+#include "made/pmvplayer.h"
+#include "made/scriptfuncs.h"
+#include "made/music.h"
+
+namespace Made {
+
+/* ScriptFunctionsMhne */
+
+typedef Common::Functor2Mem<int16, int16*, int16, ScriptFunctionsMhne> ExternalFuncMhne;
+#define External(x) ExternalFuncMhne(this, &ScriptFunctionsMhne::x)
+void ScriptFunctionsMhne::setupExternalsTable() {
+ static const ExternalFuncMhne externalsTable[] = {
+ External(o1_SYSTEM),
+ External(o1_INITGRAF),
+ External(o1_RESTOREGRAF),
+ External(o1_DRAWPIC),
+ External(o1_CLS),
+ External(o1_SHOWPAGE),
+ External(o1_EVENT),
+ External(o1_EVENTX),
+ External(o1_EVENTY),
+ External(o1_EVENTKEY),
+ External(o1_VISUALFX),
+ External(o1_PLAYSND),
+ External(o1_PLAYMUS),
+ External(o1_STOPMUS),
+ External(o1_ISMUS),
+ External(o1_TEXTPOS),
+ External(o1_FLASH),
+ External(o1_PLAYNOTE),
+ External(o1_STOPNOTE),
+ External(o1_PLAYTELE),
+ External(o1_STOPTELE),
+ External(o1_HIDECURS),
+ External(o1_SHOWCURS),
+ External(o1_MUSICBEAT),
+ External(o1_SCREENLOCK),
+ External(o1_ADDSPRITE),
+ External(o1_FREEANIM),
+ External(o1_DRAWSPRITE),
+ External(o1_ERASESPRITES),
+ External(o1_UPDATESPRITES),
+ External(o1_GETTIMER),
+ External(o1_SETTIMER),
+ External(o1_RESETTIMER),
+ External(o1_ALLOCTIMER),
+ External(o1_FREETIMER),
+ External(o1_PALETTELOCK),
+ External(o1_FONT),
+ External(o1_DRAWTEXT),
+ External(o1_HOMETEXT),
+ External(o1_TEXTRECT),
+ External(o1_TEXTXY),
+ External(o1_DROPSHADOW),
+ External(o1_TEXTCOLOR),
+ External(o1_OUTLINE),
+ External(o1_LOADCURSOR),
+ External(o1_SETGROUND),
+ External(o1_RESTEXT),
+ External(o1_ADDMASK),
+ External(o1_SETMASK),
+ External(o1_ISSND),
+ External(o1_STOPSND),
+ External(o1_PLAYVOICE),
+ External(o1_CDPLAY),
+ External(o1_STOPCD),
+ External(o1_CDSTATUS),
+ External(o1_CDTIME),
+ External(o1_CDPLAYSEG),
+ };
+
+ for (int i = 0; i < ARRAYSIZE(externalsTable); ++i)
+ _externalFuncs.push_back(&externalsTable[i]);
+
+}
+#undef External
+
+int16 ScriptFunctionsMhne::o1_SYSTEM(int16 argc, int16 *argv) {
+ // This opcode is empty.
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_INITGRAF(int16 argc, int16 *argv) {
+ // This opcode is empty.
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_RESTOREGRAF(int16 argc, int16 *argv) {
+ // This opcode is empty.
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_DRAWPIC(int16 argc, int16 *argv) {
+ return _vm->_screen->drawPic(argv[4], argv[3], argv[2], argv[1], argv[0]);
+}
+
+int16 ScriptFunctionsMhne::o1_CLS(int16 argc, int16 *argv) {
+ _vm->_screen->clearScreen();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_SHOWPAGE(int16 argc, int16 *argv) {
+ _vm->_screen->show();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_EVENT(int16 argc, int16 *argv) {
+
+ Common::Event event;
+ Common::EventManager *eventMan = g_system->getEventManager();
+
+ int16 eventNum = 0;
+
+ if (eventMan->pollEvent(event)) {
+ switch (event.type) {
+
+ case Common::EVENT_MOUSEMOVE:
+ _vm->_eventMouseX = event.mouse.x;
+ _vm->_eventMouseY = event.mouse.y;
+ break;
+
+ case Common::EVENT_LBUTTONDOWN:
+ eventNum = 1;
+ break;
+
+ /*
+ case Common::EVENT_LBUTTONUP:
+ eventNum = 2; // TODO: Is this correct?
+ break;
+ */
+
+ case Common::EVENT_RBUTTONDOWN:
+ eventNum = 3;
+ break;
+
+ /*
+ case Common::EVENT_RBUTTONUP:
+ eventNum = 4; // TODO: Is this correct?
+ break;
+ */
+
+ case Common::EVENT_KEYDOWN:
+ _vm->_eventKey = event.kbd.ascii;
+ eventNum = 5;
+ break;
+
+ case Common::EVENT_QUIT:
+ // TODO: Exit more gracefully.
+ g_system->quit();
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ _vm->_system->updateScreen();
+
+ return eventNum;
+}
+
+int16 ScriptFunctionsMhne::o1_EVENTX(int16 argc, int16 *argv) {
+ return _vm->_eventMouseX;
+}
+
+int16 ScriptFunctionsMhne::o1_EVENTY(int16 argc, int16 *argv) {
+ return _vm->_eventMouseY;
+}
+
+int16 ScriptFunctionsMhne::o1_EVENTKEY(int16 argc, int16 *argv) {
+ return _vm->_eventKey;
+}
+
+int16 ScriptFunctionsMhne::o1_VISUALFX(int16 argc, int16 *argv) {
+ _vm->_screen->setVisualEffectNum(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PLAYSND(int16 argc, int16 *argv) {
+ int soundNum = argv[0];
+ bool loop = false;
+
+ if (argc > 1) {
+ soundNum = argv[1];
+ loop = (argv[0] == 1);
+ }
+
+ if (soundNum > 0) {
+ if (!_vm->_mixer->isSoundHandleActive(_audioStreamHandle)) {
+ _vm->_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle,
+ _vm->_res->getSound(soundNum)->getAudioStream(_vm->_soundRate, loop));
+ }
+ }
+
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PLAYMUS(int16 argc, int16 *argv) {
+ int16 musicNum = argv[0];
+ if (musicNum > 0) {
+ GenericResource *xmidi = _vm->_res->getXmidi(musicNum);
+ _vm->_music->playXMIDI(xmidi);
+ _vm->_res->freeResource(xmidi);
+ }
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_STOPMUS(int16 argc, int16 *argv) {
+ _vm->_music->stop();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_ISMUS(int16 argc, int16 *argv) {
+ if (_vm->_music->isPlaying())
+ return 1;
+ else
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_TEXTPOS(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_TEXTPOS");
+ // This seems to be some kind of low-level opcode.
+ // The original engine calls int 10h to set the VGA cursor position.
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_FLASH(int16 argc, int16 *argv) {
+ _vm->_screen->flash(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PLAYNOTE(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_PLAYNOTE");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_STOPNOTE(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_STOPNOTE");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PLAYTELE(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_PLAYTELE");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_STOPTELE(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_STOPTELE");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_HIDECURS(int16 argc, int16 *argv) {
+ _vm->_system->showMouse(false);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_SHOWCURS(int16 argc, int16 *argv) {
+ _vm->_system->showMouse(true);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_MUSICBEAT(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_MUSICBEAT");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_SCREENLOCK(int16 argc, int16 *argv) {
+ _vm->_screen->setScreenLock(argv[0] != 0);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_ADDSPRITE(int16 argc, int16 *argv) {
+ //_vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
+ return argv[2];
+}
+
+int16 ScriptFunctionsMhne::o1_FREEANIM(int16 argc, int16 *argv) {
+ _vm->_screen->clearChannels();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_DRAWSPRITE(int16 argc, int16 *argv) {
+ return _vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
+}
+
+int16 ScriptFunctionsMhne::o1_ERASESPRITES(int16 argc, int16 *argv) {
+ _vm->_screen->clearChannels();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_UPDATESPRITES(int16 argc, int16 *argv) {
+ _vm->_screen->updateSprites();
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_GETTIMER(int16 argc, int16 *argv) {
+ return _vm->getTimer(argv[0]);
+}
+
+int16 ScriptFunctionsMhne::o1_SETTIMER(int16 argc, int16 *argv) {
+ _vm->setTimer(argv[1], argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_RESETTIMER(int16 argc, int16 *argv) {
+ _vm->resetTimer(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_ALLOCTIMER(int16 argc, int16 *argv) {
+ int16 timerNum = _vm->allocTimer();
+ return timerNum;
+}
+
+int16 ScriptFunctionsMhne::o1_FREETIMER(int16 argc, int16 *argv) {
+ _vm->freeTimer(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PALETTELOCK(int16 argc, int16 *argv) {
+ _vm->_screen->setPaletteLock(argv[0] != 0);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_FONT(int16 argc, int16 *argv) {
+ _vm->_screen->setFont(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_DRAWTEXT(int16 argc, int16 *argv) {
+ Object *obj = _vm->_dat->getObject(argv[argc - 1]);
+ const char *text = obj->getString();
+ _vm->_screen->printText(text);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_HOMETEXT(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_HOMETEXT");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_TEXTRECT(int16 argc, int16 *argv) {
+ int16 x1 = CLIP<int16>(argv[4], 1, 318);
+ int16 y1 = CLIP<int16>(argv[3], 1, 198);
+ int16 x2 = CLIP<int16>(argv[2], 1, 318);
+ int16 y2 = CLIP<int16>(argv[1], 1, 198);
+ //int16 textValue = argv[0];
+ // TODO: textValue
+ _vm->_screen->setTextRect(Common::Rect(x1, y1, x2, y2));
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_TEXTXY(int16 argc, int16 *argv) {
+ int16 x = CLIP<int16>(argv[1], 1, 318);
+ int16 y = CLIP<int16>(argv[0], 1, 198);
+ _vm->_screen->setTextXY(x, y);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_DROPSHADOW(int16 argc, int16 *argv) {
+ // if the drop shadow color is -1, then text drop shadow is disabled
+ // when font drop shadow is enabled, outline is disabled
+ _vm->_screen->setDropShadowColor(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_TEXTCOLOR(int16 argc, int16 *argv) {
+ _vm->_screen->setTextColor(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_OUTLINE(int16 argc, int16 *argv) {
+ // if the outline color is -1, then text outline is disabled
+ // when font outline is enabled, drop shadow is disabled
+ _vm->_screen->setOutlineColor(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_LOADCURSOR(int16 argc, int16 *argv) {
+ PictureResource *flex = _vm->_res->getPicture(argv[2]);
+ Graphics::Surface *surf = flex->getPicture();
+ CursorMan.replaceCursor((const byte *)surf->pixels, surf->w, surf->h, argv[1], argv[0], 0);
+ CursorMan.showMouse(true);
+ _vm->_res->freeResource(flex);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_SETGROUND(int16 argc, int16 *argv) {
+ _vm->_screen->setGround(argv[0]);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_RESTEXT(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_RESTEXT");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_ADDMASK(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_ADDMASK");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_SETMASK(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_SETMASK");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_ISSND(int16 argc, int16 *argv) {
+ if (_vm->_mixer->isSoundHandleActive(_audioStreamHandle))
+ return 1;
+ else
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_STOPSND(int16 argc, int16 *argv) {
+ _vm->_mixer->stopHandle(_audioStreamHandle);
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_PLAYVOICE(int16 argc, int16 *argv) {
+ if (argv[0] > 0) {
+ _vm->_mixer->stopHandle(_audioStreamHandle);
+ _vm->_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle,
+ _vm->_res->getSound(argv[0])->getAudioStream(_vm->_soundRate, false));
+ }
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_CDPLAY(int16 argc, int16 *argv) {
+ // This one is called loads of times, so it has been commented out to reduce spam
+ //warning("Unimplemented opcode: o1_CDPLAY");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_STOPCD(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_STOPCD");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_CDSTATUS(int16 argc, int16 *argv) {
+ // This one is called loads of times, so it has been commented out to reduce spam
+ //warning("Unimplemented opcode: o1_CDSTATUS");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_CDTIME(int16 argc, int16 *argv) {
+ // This one is called loads of times, so it has been commented out to reduce spam
+ //warning("Unimplemented opcode: o1_CDTIME");
+ return 0;
+}
+
+int16 ScriptFunctionsMhne::o1_CDPLAYSEG(int16 argc, int16 *argv) {
+ warning("Unimplemented opcode: o1_CDPLAYSEG");
+ return 0;
+}
+
+} // End of namespace Made