diff options
author | Eugene Sandulenko | 2019-09-02 23:46:00 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2019-11-13 22:07:08 +0100 |
commit | 8b62fa8947bf3cac3a9d87d1521265f6edc59d05 (patch) | |
tree | 95cce9b0d9b0fa76d4f681199a42810d420c03dd | |
parent | 3660f483b53648a8c91533f36ba26d452fbbb190 (diff) | |
download | scummvm-rg350-8b62fa8947bf3cac3a9d87d1521265f6edc59d05.tar.gz scummvm-rg350-8b62fa8947bf3cac3a9d87d1521265f6edc59d05.tar.bz2 scummvm-rg350-8b62fa8947bf3cac3a9d87d1521265f6edc59d05.zip |
GRIFFON: Added input.cpp
-rw-r--r-- | engines/griffon/engine.cpp | 645 | ||||
-rw-r--r-- | engines/griffon/griffon.h | 10 | ||||
-rw-r--r-- | engines/griffon/input.cpp | 690 | ||||
-rw-r--r-- | engines/griffon/module.mk | 1 |
4 files changed, 697 insertions, 649 deletions
diff --git a/engines/griffon/engine.cpp b/engines/griffon/engine.cpp index b916f8677b..1c7cac9fff 100644 --- a/engines/griffon/engine.cpp +++ b/engines/griffon/engine.cpp @@ -123,320 +123,6 @@ void GriffonEngine::addFloatText(const char *stri, float xloc, float yloc, int c } } -void GriffonEngine::checkInputs() { - int ntickdelay = 175; - - g_system->getEventManager()->pollEvent(_event); - - nposts = 0; - - for (int i = 0; i <= 20; i++) { - postinfo[i][0] = 0; - postinfo[i][1] = 0; - } - - for (int x = 0; x <= 19; x++) { - for (int y = 0; y <= 14; y++) { - int o = _objectMap[x][y]; - if (_objectInfo[o][4] == 3) { - postinfo[nposts][0] = x * 16; - postinfo[nposts][1] = y * 16; - nposts = nposts + 1; - } - } - } - - if (attacking || (_forcepause && _itemselon == 0)) - return; - - if (_event.type == Common::EVENT_QUIT) { - _shouldQuit = true; - return; - } - - if (_event.type == Common::EVENT_KEYDOWN) { - if (_event.kbd.keycode == Common::KEYCODE_ESCAPE) { - if (_itemticks < _ticks) - title(1); - } else if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) { - _console->attach(); - _event.type = Common::EVENT_INVALID; - } else if (_event.kbd.hasFlags(Common::KBD_CTRL)) { - if (_itemselon == 0 && _itemticks < _ticks) - attack(); - - if (_itemselon == 1 && _itemticks < _ticks) { - if (_curitem == 0 && _player.inventory[kInvFlask] > 0) { - _itemticks = _ticks + ntickdelay; - - int heal = 50; - int maxh = _player.maxhp - _player.hp; - - if (heal > maxh) - heal = maxh; - - _player.hp = _player.hp + heal; - - char text[256]; - sprintf(text, "+%i", heal); - addFloatText(text, _player.px + 16 - 4 * strlen(text), _player.py + 16, 5); - - _player.inventory[kInvFlask]--; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - - _itemselon = 0; - _forcepause = false; - } - - if (_curitem == 1 && _player.inventory[kInvDoubleFlask] > 0) { - _itemticks = _ticks + ntickdelay; - - int heal = 200; - int maxh = _player.maxhp - _player.hp; - - if (heal > maxh) - heal = maxh; - - _player.hp = _player.hp + heal; - - char text[256]; - sprintf(text, "+%i", heal); - addFloatText(text, _player.px + 16 - 4 * strlen(text), _player.py + 16, 5); - - _player.inventory[kInvDoubleFlask]--; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - - _itemselon = 0; - _forcepause = false; - } - - if (_curitem == 2 && _player.inventory[kInvShock] > 0) { - castSpell(8, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); - - _forcepause = true; - - _player.inventory[kInvShock]--; - - _itemticks = _ticks + ntickdelay; - _selenemyon = 0; - _itemselon = 0; - - } - - if (_curitem == 3 && _player.inventory[kInvNormalKey] > 0 && _canUseKey && _lockType == 1) { - _roomLocks[_roomToUnlock] = 0; - eventText("UnLocked!"); - - _player.inventory[kInvNormalKey]--; - - _itemticks = _ticks + ntickdelay; - _selenemyon = 0; - _itemselon = 0; - return; - } - - if (_curitem == 4 && _player.inventory[kInvMasterKey] > 0 && _canUseKey && _lockType == 2) { - _roomLocks[_roomToUnlock] = 0; - eventText("UnLocked!"); - - _player.inventory[kInvMasterKey]--; - - _itemticks = _ticks + ntickdelay; - _selenemyon = 0; - _itemselon = 0; - return; - } - - if (_curitem == 5 && _player.spellcharge[0] == 100) { - castSpell(5, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); - - _player.spellcharge[0] = 0; - - _forcepause = true; - - _itemticks = _ticks + ntickdelay; - _selenemyon = 0; - _itemselon = 0; - } - - if (_curitem > 5 && _selenemyon == 1) { - if (_curenemy <= _lastnpc) { - castSpell(_curitem - 6, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); - } else { - int pst = _curenemy - _lastnpc - 1; - castSpell(_curitem - 6, _player.px, _player.py, postinfo[pst][0], postinfo[pst][1], 0); - } - - _player.spellcharge[_curitem - 5] = 0; - - _player.spellstrength = 0; - - _itemticks = _ticks + ntickdelay; - _selenemyon = 0; - _itemselon = 0; - _forcepause = false; - } - - if (_curitem > 5 && _selenemyon == 0 && _itemselon == 1) { - if (ABS(_player.spellcharge[_curitem - 5] - 100) < kEpsilon) { - _itemticks = _ticks + ntickdelay; - - _selenemyon = 1; - - int i = 0; - do { - if (_npcinfo[i].hp > 0) { - _curenemy = i; - goto __exit_do; - } - i = i + 1; - if (i == _lastnpc + 1) { - _selenemyon = 0; - goto __exit_do; - } - } while (1); -__exit_do: - - if (nposts > 0 && _selenemyon == 0) { - _selenemyon = 1; - _curenemy = _lastnpc + 1; - } - } - - } - } - } else if (_event.kbd.hasFlags(Common::KBD_ALT)) { - if (_itemticks < _ticks) { - _selenemyon = 0; - if (_itemselon == 1) { - _itemselon = 0; - _itemticks = _ticks + 220; - _forcepause = false; - } else { - _itemselon = 1; - _itemticks = _ticks + 220; - _forcepause = true; - _player.itemselshade = 0; - } - } - } - } - - if (_itemselon == 0) { - movingup = false; - movingdown = false; - movingleft = false; - movingright = false; - if (_event.kbd.keycode == Common::KEYCODE_UP) - movingup = true; - if (_event.kbd.keycode == Common::KEYCODE_DOWN) - movingdown = true; - if (_event.kbd.keycode == Common::KEYCODE_LEFT) - movingleft = true; - if (_event.kbd.keycode == Common::KEYCODE_RIGHT) - movingright = true; - } else { - movingup = false; - movingdown = false; - movingleft = false; - movingright = false; - - if (_selenemyon == 1) { - if (_itemticks < _ticks) { - if (_event.kbd.keycode == Common::KEYCODE_LEFT) { - int origin = _curenemy; - do { - _curenemy = _curenemy - 1; - if (_curenemy < 1) - _curenemy = _lastnpc + nposts; - if (_curenemy == origin) - break; - if (_curenemy <= _lastnpc && _npcinfo[_curenemy].hp > 0) - break; - if (_curenemy > _lastnpc) - break; - } while (1); - _itemticks = _ticks + ntickdelay; - } - if (_event.kbd.keycode == Common::KEYCODE_RIGHT) { - int origin = _curenemy; - do { - _curenemy = _curenemy + 1; - if (_curenemy > _lastnpc + nposts) - _curenemy = 1; - if (_curenemy == origin) - break; - if (_curenemy <= _lastnpc && _npcinfo[_curenemy].hp > 0) - break; - if (_curenemy > _lastnpc) - break; - } while (1); - _itemticks = _ticks + ntickdelay; - } - - - if (_curenemy > _lastnpc + nposts) - _curenemy = 1; - if (_curenemy < 1) - _curenemy = _lastnpc + nposts; - } - } else { - if (_itemticks < _ticks) { - if (_event.kbd.keycode == Common::KEYCODE_UP) { - _curitem = _curitem - 1; - _itemticks = _ticks + ntickdelay; - if (_curitem == 4) - _curitem = 9; - if (_curitem == -1) - _curitem = 4; - } - if (_event.kbd.keycode == Common::KEYCODE_DOWN) { - _curitem = _curitem + 1; - _itemticks = _ticks + ntickdelay; - if (_curitem == 5) - _curitem = 0; - if (_curitem == 10) - _curitem = 5; - } - if (_event.kbd.keycode == Common::KEYCODE_LEFT) { - _curitem = _curitem - 5; - _itemticks = _ticks + ntickdelay; - } - if (_event.kbd.keycode == Common::KEYCODE_RIGHT) { - _curitem = _curitem + 5; - _itemticks = _ticks + ntickdelay; - } - - if (_curitem > 9) - _curitem = _curitem - 10; - if (_curitem < 0) - _curitem = _curitem + 10; - } - } - } -} - -void GriffonEngine::checkTrigger() { - int npx = _player.px + 12; - int npy = _player.py + 20; - - int lx = (int)npx / 16; - int ly = (int)npy / 16; - - _canUseKey = false; - - if (_triggerloc[lx][ly] > -1) - processTrigger(_triggerloc[lx][ly]); -} - void GriffonEngine::eventText(const char *stri) { _videobuffer2->fillRect(Common::Rect(0, 0, _videobuffer2->w, _videobuffer2->h), 0); _videobuffer3->fillRect(Common::Rect(0, 0, _videobuffer3->w, _videobuffer3->h), 0); @@ -498,271 +184,6 @@ void GriffonEngine::eventText(const char *stri) { } -void GriffonEngine::handleWalking() { - int xmax = 20 * 16 - 25; - int ymax = 15 * 16 - 25; - - float px = _player.px; - float py = _player.py; - float opx = px; - float opy = py; - - float spd = _player.walkspd * _fpsr; - - float nx = (px / 2 + 6); - float ny = (py / 2 + 10); - - float npx = px + 12; - float npy = py + 20; - int lx = (int)npx / 16; - int ly = (int)npy / 16; - - int ramp = _rampdata[lx][ly]; - if (ramp == 1 && movingup) - spd *= 2; - if (ramp == 1 && movingdown) - spd *= 2; - - if (ramp == 2 && movingleft) - movingup = true; - if (ramp == 2 && movingright) - movingdown = true; - - if (ramp == 3 && movingright) - movingup = true; - if (ramp == 3 && movingleft) - movingdown = true; - - unsigned int *temp/*, c*/, bgc; - - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - int sx = nx + x; - int sy = ny + y; - - _clipsurround[x + 1][y + 1] = 0; - if (sx > -1 && sx < 320 && sy > -1 && sy < 192) { - temp = (uint32 *)_clipbg->getBasePtr(sx, sy); - _clipsurround[x + 1][y + 1] = *temp; - } - } - } - - if (movingup) - _player.walkdir = 0; - if (movingdown) - _player.walkdir = 1; - if (movingleft) - _player.walkdir = 2; - if (movingright) - _player.walkdir = 3; - - if (movingup && _clipsurround[1][0] == 0) { - py -= spd; - _player.walkdir = 0; - } else if (movingup && _clipsurround[1][0] > 0) { - // move upleft - if (!movingright && _clipsurround[0][0] == 0) { - py -= spd; - px -= spd; - } - - // move upright - if (!movingleft && _clipsurround[2][0] == 0) { - py -= spd; - px += spd; - } - } - if (movingdown && _clipsurround[1][2] == 0) { - py += spd; - _player.walkdir = 1; - } else if (movingdown && _clipsurround[1][2] > 0) { - // move downleft - if (movingright == 0 && _clipsurround[0][2] == 0) { - py += spd; - px -= spd; - } - - // move downright - if (movingleft == 0 && _clipsurround[2][2] == 0) { - py += spd; - px += spd; - } - } - if (movingleft && _clipsurround[0][1] == 0) { - px -= spd; - _player.walkdir = 2; - } else if (movingleft && _clipsurround[0][1] > 0) { - // move leftup - if (!movingdown && _clipsurround[0][0] == 0) { - py -= spd; - px -= spd; - } - - // move leftdown - if (!movingup && _clipsurround[0][2] == 0) { - py += spd; - px -= spd; - } - } - if (movingright && _clipsurround[2][1] == 0) { - px += spd; - _player.walkdir = 3; - } else if (movingright && _clipsurround[2][1] > 0) { - // move rightup - if (!movingdown && _clipsurround[2][0] == 0) { - px += spd; - py -= spd; - } - - // move rightdown - if (!movingup && _clipsurround[2][2] == 0) { - py += spd; - px += spd; - } - } - - if (px < -8) - px = -8; - if (px > xmax) - px = xmax; - if (py < -8) - py = -8; - if (py > ymax) - py = ymax; - - int pass = 1; - - int sx = (px / 2 + 6); - int sy = (py / 2 + 10); - temp = (uint32 *)_clipbg->getBasePtr(sx, sy); - bgc = *temp; - if (bgc > 0 && bgc != 1000) { - px = opx; - py = opy; - pass = 0; - } - - // push npc - if (pass == 1) { - for (int i = 1; i <= _lastnpc; i++) { - if (_npcinfo[i].hp > 0) { - npx = _npcinfo[i].x; - npy = _npcinfo[i].y; - - opx = npx; - opy = npy; - - int xdif = _player.px - npx; - int ydif = _player.py - npy; - - if (_player.walkdir == 0) { - if (abs(xdif) <= 8 && ydif > 0 && ydif < 8) - _npcinfo[i].y -= spd; - } else if (_player.walkdir == 1) { - if (abs(xdif) <= 8 && ydif < 0 && ydif > -8) - _npcinfo[i].y += spd; - } else if (_player.walkdir == 2) { - if (abs(ydif) <= 8 && xdif > 0 && xdif < 8) - _npcinfo[i].x -= spd; - } else if (_player.walkdir == 3) { - if (abs(ydif) <= 8 && xdif < 0 && xdif > -8) - _npcinfo[i].x += spd; - } - - npx = _npcinfo[i].x; - npy = _npcinfo[i].y; - - sx = (int)(npx / 2 + 6); - sy = (int)(npy / 2 + 10); - temp = (uint32 *)_clipbg->getBasePtr(sx, sy); - bgc = *temp; - - if (bgc > 0) { - _npcinfo[i].x = opx; - _npcinfo[i].y = opy; - } - } - } - } - - _player.opx = _player.px; - _player.opy = _player.py; - _player.px = px; - _player.py = py; - - if (_player.px != _player.opx || _player.py != _player.opy) - _player.walkframe += _animspd * _fpsr; - if (_player.walkframe >= 16) - _player.walkframe -= 16; - - // walking over items to pickup ::: - int o = _objectMap[lx][ly]; - - if (o > -1) { - // fsk - if (_objectInfo[o][4] == 2 && _player.inventory[kInvFlask] < 9) { - _objectMap[lx][ly] = -1; - - _player.inventory[kInvFlask]++; - addFloatIcon(6, lx * 16, ly * 16); - - _objmapf[_curmap][lx][ly] = 1; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - } - - if (_objectInfo[o][5] == 7 && _player.inventory[kInvDoubleFlask] < 9) { - _objectMap[lx][ly] = -1; - - _player.inventory[kInvDoubleFlask]++; - addFloatIcon(12, lx * 16, ly * 16); - - _objmapf[_curmap][lx][ly] = 1; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - } - - if (_objectInfo[o][5] == 9 && _player.inventory[kInvShock] < 9 && (_curmap == 41 && _scriptflag[kScriptLightningBomb][1] == 0)) { - _objectMap[lx][ly] = -1; - - _player.inventory[kInvShock]++; - addFloatIcon(17, lx * 16, ly * 16); - - _objmapf[_curmap][lx][ly] = 1; - if (_curmap == 41) - _scriptflag[kScriptLightningBomb][1] = 1; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - - } - - if (_objectInfo[o][5] == 9 && _player.inventory[kInvShock] < 9) { - _objectMap[lx][ly] = -1; - - _player.inventory[kInvShock]++; - addFloatIcon(17, lx * 16, ly * 16); - - _objmapf[_curmap][lx][ly] = 1; - - if (config.effects) { - int snd = playSound(_sfx[kSndPowerUp]); - setChannelVolume(snd, config.effectsvol); - } - - } - } -} - void GriffonEngine::newGame() { intro(); @@ -872,72 +293,6 @@ void GriffonEngine::mainLoop() { } while (!_shouldQuit); } -void GriffonEngine::processTrigger(int trignum) { - int trigtype = _triggers[trignum][0]; - - if (_roomlock) - return; - - // map jump------------------------------ - if (trigtype == 0) { - int tx = _triggers[trignum][1]; - int ty = _triggers[trignum][2]; - int tmap = _triggers[trignum][3]; - int tjumpstyle = _triggers[trignum][4]; - - if (_roomLocks[tmap] > 0) { - if (!_saidLocked) - eventText("Locked"); - _saidLocked = true; - _canUseKey = true; - _lockType = _roomLocks[tmap]; - _roomToUnlock = tmap; - return; - } - - if (tmap == 1) { - if (!_saidJammed) - eventText("Door Jammed!"); - _saidJammed = true; - return; - } - - _saidLocked = false; - _saidJammed = false; - - // loc-sxy+oldmaploc - if (tjumpstyle == 0) { - - int tsx = _triggers[trignum][5]; - int tsy = _triggers[trignum][6]; - - _player.px += (tx - tsx) * 16; - _player.py += (ty - tsy) * 16; - - // HACKFIX - if (_player.px < 0) - _player.px = 0; - if (_player.py < 0) - _player.py = 0; - - if (tmap > 0) { - if (config.effects) { - int snd = playSound(_sfx[kSndDoor]); - setChannelVolume(snd, config.effectsvol); - } - - loadMap(tmap); - swash(); - } - } - } - - for (int i = 0; i < kMaxFloat; i++) { - _floattext[i][0] = 0; - _floaticon[i][0] = 0; - } -} - void GriffonEngine::updateAnims() { for (int i = 0; i <= _lastObj; i++) { int nframes = _objectInfo[i][0]; diff --git a/engines/griffon/griffon.h b/engines/griffon/griffon.h index 3296b91755..26fe9b684f 100644 --- a/engines/griffon/griffon.h +++ b/engines/griffon/griffon.h @@ -306,6 +306,12 @@ private: void drawView(); void swash(); + // input.cpp + void checkInputs(); + void handleWalking(); + void checkTrigger(); + void processTrigger(int trignum); + // resources.cpp void initialize(); Graphics::TransparentSurface *loadImage(const char *name, bool colorkey = false); @@ -338,13 +344,9 @@ private: void addFloatIcon(int ico, float xloc, float yloc); void addFloatText(const char *stri, float xloc, float yloc, int col); - void checkInputs(); - void checkTrigger(); void eventText(const char *stri); - void handleWalking(); void newGame(); void mainLoop(); - void processTrigger(int trignum); void updateAnims(); void updateY(); void updateNPCs(); diff --git a/engines/griffon/input.cpp b/engines/griffon/input.cpp new file mode 100644 index 0000000000..f7ebb15b19 --- /dev/null +++ b/engines/griffon/input.cpp @@ -0,0 +1,690 @@ +/* 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. + * + * + * Originally written by Syn9 in FreeBASIC with SDL + * http://syn9.thehideoutgames.com/index_backup.php + * + * Ported to plain C for GCW-Zero handheld by Dmitry Smagin + * http://github.com/dmitrysmagin/griffon_legend + * + * + * Programming/Graphics: Daniel "Syn9" Kennedy + * Music/Sound effects: David Turner + * + * Beta testing and gameplay design help: + * Deleter, Cha0s, Aether Fox, and Kiz + * + */ + +#include "common/system.h" + +#include "griffon/griffon.h" +#include "griffon/config.h" +#include "griffon/console.h" + +namespace Griffon { + +void GriffonEngine::checkInputs() { + int ntickdelay = 175; + + g_system->getEventManager()->pollEvent(_event); + + nposts = 0; + + for (int i = 0; i <= 20; i++) { + postinfo[i][0] = 0; + postinfo[i][1] = 0; + } + + for (int x = 0; x <= 19; x++) { + for (int y = 0; y <= 14; y++) { + int o = _objectMap[x][y]; + if (_objectInfo[o][4] == 3) { + postinfo[nposts][0] = x * 16; + postinfo[nposts][1] = y * 16; + nposts = nposts + 1; + } + } + } + + if (attacking || (_forcepause && _itemselon == 0)) + return; + + if (_event.type == Common::EVENT_QUIT) { + _shouldQuit = true; + return; + } + + if (_event.type == Common::EVENT_KEYDOWN) { + if (_event.kbd.keycode == Common::KEYCODE_ESCAPE) { + if (_itemticks < _ticks) + title(1); + } else if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) { + _console->attach(); + _event.type = Common::EVENT_INVALID; + } else if (_event.kbd.hasFlags(Common::KBD_CTRL)) { + if (_itemselon == 0 && _itemticks < _ticks) + attack(); + + if (_itemselon == 1 && _itemticks < _ticks) { + if (_curitem == 0 && _player.inventory[kInvFlask] > 0) { + _itemticks = _ticks + ntickdelay; + + int heal = 50; + int maxh = _player.maxhp - _player.hp; + + if (heal > maxh) + heal = maxh; + + _player.hp = _player.hp + heal; + + char text[256]; + sprintf(text, "+%i", heal); + addFloatText(text, _player.px + 16 - 4 * strlen(text), _player.py + 16, 5); + + _player.inventory[kInvFlask]--; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + + _itemselon = 0; + _forcepause = false; + } + + if (_curitem == 1 && _player.inventory[kInvDoubleFlask] > 0) { + _itemticks = _ticks + ntickdelay; + + int heal = 200; + int maxh = _player.maxhp - _player.hp; + + if (heal > maxh) + heal = maxh; + + _player.hp = _player.hp + heal; + + char text[256]; + sprintf(text, "+%i", heal); + addFloatText(text, _player.px + 16 - 4 * strlen(text), _player.py + 16, 5); + + _player.inventory[kInvDoubleFlask]--; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + + _itemselon = 0; + _forcepause = false; + } + + if (_curitem == 2 && _player.inventory[kInvShock] > 0) { + castSpell(8, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); + + _forcepause = true; + + _player.inventory[kInvShock]--; + + _itemticks = _ticks + ntickdelay; + _selenemyon = 0; + _itemselon = 0; + + } + + if (_curitem == 3 && _player.inventory[kInvNormalKey] > 0 && _canUseKey && _lockType == 1) { + _roomLocks[_roomToUnlock] = 0; + eventText("UnLocked!"); + + _player.inventory[kInvNormalKey]--; + + _itemticks = _ticks + ntickdelay; + _selenemyon = 0; + _itemselon = 0; + return; + } + + if (_curitem == 4 && _player.inventory[kInvMasterKey] > 0 && _canUseKey && _lockType == 2) { + _roomLocks[_roomToUnlock] = 0; + eventText("UnLocked!"); + + _player.inventory[kInvMasterKey]--; + + _itemticks = _ticks + ntickdelay; + _selenemyon = 0; + _itemselon = 0; + return; + } + + if (_curitem == 5 && _player.spellcharge[0] == 100) { + castSpell(5, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); + + _player.spellcharge[0] = 0; + + _forcepause = true; + + _itemticks = _ticks + ntickdelay; + _selenemyon = 0; + _itemselon = 0; + } + + if (_curitem > 5 && _selenemyon == 1) { + if (_curenemy <= _lastnpc) { + castSpell(_curitem - 6, _player.px, _player.py, _npcinfo[_curenemy].x, _npcinfo[_curenemy].y, 0); + } else { + int pst = _curenemy - _lastnpc - 1; + castSpell(_curitem - 6, _player.px, _player.py, postinfo[pst][0], postinfo[pst][1], 0); + } + + _player.spellcharge[_curitem - 5] = 0; + + _player.spellstrength = 0; + + _itemticks = _ticks + ntickdelay; + _selenemyon = 0; + _itemselon = 0; + _forcepause = false; + } + + if (_curitem > 5 && _selenemyon == 0 && _itemselon == 1) { + if (ABS(_player.spellcharge[_curitem - 5] - 100) < kEpsilon) { + _itemticks = _ticks + ntickdelay; + + _selenemyon = 1; + + int i = 0; + do { + if (_npcinfo[i].hp > 0) { + _curenemy = i; + goto __exit_do; + } + i = i + 1; + if (i == _lastnpc + 1) { + _selenemyon = 0; + goto __exit_do; + } + } while (1); +__exit_do: + + if (nposts > 0 && _selenemyon == 0) { + _selenemyon = 1; + _curenemy = _lastnpc + 1; + } + } + + } + } + } else if (_event.kbd.hasFlags(Common::KBD_ALT)) { + if (_itemticks < _ticks) { + _selenemyon = 0; + if (_itemselon == 1) { + _itemselon = 0; + _itemticks = _ticks + 220; + _forcepause = false; + } else { + _itemselon = 1; + _itemticks = _ticks + 220; + _forcepause = true; + _player.itemselshade = 0; + } + } + } + } + + if (_itemselon == 0) { + movingup = false; + movingdown = false; + movingleft = false; + movingright = false; + if (_event.kbd.keycode == Common::KEYCODE_UP) + movingup = true; + if (_event.kbd.keycode == Common::KEYCODE_DOWN) + movingdown = true; + if (_event.kbd.keycode == Common::KEYCODE_LEFT) + movingleft = true; + if (_event.kbd.keycode == Common::KEYCODE_RIGHT) + movingright = true; + } else { + movingup = false; + movingdown = false; + movingleft = false; + movingright = false; + + if (_selenemyon == 1) { + if (_itemticks < _ticks) { + if (_event.kbd.keycode == Common::KEYCODE_LEFT) { + int origin = _curenemy; + do { + _curenemy = _curenemy - 1; + if (_curenemy < 1) + _curenemy = _lastnpc + nposts; + if (_curenemy == origin) + break; + if (_curenemy <= _lastnpc && _npcinfo[_curenemy].hp > 0) + break; + if (_curenemy > _lastnpc) + break; + } while (1); + _itemticks = _ticks + ntickdelay; + } + if (_event.kbd.keycode == Common::KEYCODE_RIGHT) { + int origin = _curenemy; + do { + _curenemy = _curenemy + 1; + if (_curenemy > _lastnpc + nposts) + _curenemy = 1; + if (_curenemy == origin) + break; + if (_curenemy <= _lastnpc && _npcinfo[_curenemy].hp > 0) + break; + if (_curenemy > _lastnpc) + break; + } while (1); + _itemticks = _ticks + ntickdelay; + } + + + if (_curenemy > _lastnpc + nposts) + _curenemy = 1; + if (_curenemy < 1) + _curenemy = _lastnpc + nposts; + } + } else { + if (_itemticks < _ticks) { + if (_event.kbd.keycode == Common::KEYCODE_UP) { + _curitem = _curitem - 1; + _itemticks = _ticks + ntickdelay; + if (_curitem == 4) + _curitem = 9; + if (_curitem == -1) + _curitem = 4; + } + if (_event.kbd.keycode == Common::KEYCODE_DOWN) { + _curitem = _curitem + 1; + _itemticks = _ticks + ntickdelay; + if (_curitem == 5) + _curitem = 0; + if (_curitem == 10) + _curitem = 5; + } + if (_event.kbd.keycode == Common::KEYCODE_LEFT) { + _curitem = _curitem - 5; + _itemticks = _ticks + ntickdelay; + } + if (_event.kbd.keycode == Common::KEYCODE_RIGHT) { + _curitem = _curitem + 5; + _itemticks = _ticks + ntickdelay; + } + + if (_curitem > 9) + _curitem = _curitem - 10; + if (_curitem < 0) + _curitem = _curitem + 10; + } + } + } +} + +void GriffonEngine::handleWalking() { + int xmax = 20 * 16 - 25; + int ymax = 15 * 16 - 25; + + float px = _player.px; + float py = _player.py; + float opx = px; + float opy = py; + + float spd = _player.walkspd * _fpsr; + + float nx = (px / 2 + 6); + float ny = (py / 2 + 10); + + float npx = px + 12; + float npy = py + 20; + int lx = (int)npx / 16; + int ly = (int)npy / 16; + + int ramp = _rampdata[lx][ly]; + if (ramp == 1 && movingup) + spd *= 2; + if (ramp == 1 && movingdown) + spd *= 2; + + if (ramp == 2 && movingleft) + movingup = true; + if (ramp == 2 && movingright) + movingdown = true; + + if (ramp == 3 && movingright) + movingup = true; + if (ramp == 3 && movingleft) + movingdown = true; + + unsigned int *temp/*, c*/, bgc; + + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + int sx = nx + x; + int sy = ny + y; + + _clipsurround[x + 1][y + 1] = 0; + if (sx > -1 && sx < 320 && sy > -1 && sy < 192) { + temp = (uint32 *)_clipbg->getBasePtr(sx, sy); + _clipsurround[x + 1][y + 1] = *temp; + } + } + } + + if (movingup) + _player.walkdir = 0; + if (movingdown) + _player.walkdir = 1; + if (movingleft) + _player.walkdir = 2; + if (movingright) + _player.walkdir = 3; + + if (movingup && _clipsurround[1][0] == 0) { + py -= spd; + _player.walkdir = 0; + } else if (movingup && _clipsurround[1][0] > 0) { + // move upleft + if (!movingright && _clipsurround[0][0] == 0) { + py -= spd; + px -= spd; + } + + // move upright + if (!movingleft && _clipsurround[2][0] == 0) { + py -= spd; + px += spd; + } + } + if (movingdown && _clipsurround[1][2] == 0) { + py += spd; + _player.walkdir = 1; + } else if (movingdown && _clipsurround[1][2] > 0) { + // move downleft + if (movingright == 0 && _clipsurround[0][2] == 0) { + py += spd; + px -= spd; + } + + // move downright + if (movingleft == 0 && _clipsurround[2][2] == 0) { + py += spd; + px += spd; + } + } + if (movingleft && _clipsurround[0][1] == 0) { + px -= spd; + _player.walkdir = 2; + } else if (movingleft && _clipsurround[0][1] > 0) { + // move leftup + if (!movingdown && _clipsurround[0][0] == 0) { + py -= spd; + px -= spd; + } + + // move leftdown + if (!movingup && _clipsurround[0][2] == 0) { + py += spd; + px -= spd; + } + } + if (movingright && _clipsurround[2][1] == 0) { + px += spd; + _player.walkdir = 3; + } else if (movingright && _clipsurround[2][1] > 0) { + // move rightup + if (!movingdown && _clipsurround[2][0] == 0) { + px += spd; + py -= spd; + } + + // move rightdown + if (!movingup && _clipsurround[2][2] == 0) { + py += spd; + px += spd; + } + } + + if (px < -8) + px = -8; + if (px > xmax) + px = xmax; + if (py < -8) + py = -8; + if (py > ymax) + py = ymax; + + int pass = 1; + + int sx = (px / 2 + 6); + int sy = (py / 2 + 10); + temp = (uint32 *)_clipbg->getBasePtr(sx, sy); + bgc = *temp; + if (bgc > 0 && bgc != 1000) { + px = opx; + py = opy; + pass = 0; + } + + // push npc + if (pass == 1) { + for (int i = 1; i <= _lastnpc; i++) { + if (_npcinfo[i].hp > 0) { + npx = _npcinfo[i].x; + npy = _npcinfo[i].y; + + opx = npx; + opy = npy; + + int xdif = _player.px - npx; + int ydif = _player.py - npy; + + if (_player.walkdir == 0) { + if (abs(xdif) <= 8 && ydif > 0 && ydif < 8) + _npcinfo[i].y -= spd; + } else if (_player.walkdir == 1) { + if (abs(xdif) <= 8 && ydif < 0 && ydif > -8) + _npcinfo[i].y += spd; + } else if (_player.walkdir == 2) { + if (abs(ydif) <= 8 && xdif > 0 && xdif < 8) + _npcinfo[i].x -= spd; + } else if (_player.walkdir == 3) { + if (abs(ydif) <= 8 && xdif < 0 && xdif > -8) + _npcinfo[i].x += spd; + } + + npx = _npcinfo[i].x; + npy = _npcinfo[i].y; + + sx = (int)(npx / 2 + 6); + sy = (int)(npy / 2 + 10); + temp = (uint32 *)_clipbg->getBasePtr(sx, sy); + bgc = *temp; + + if (bgc > 0) { + _npcinfo[i].x = opx; + _npcinfo[i].y = opy; + } + } + } + } + + _player.opx = _player.px; + _player.opy = _player.py; + _player.px = px; + _player.py = py; + + if (_player.px != _player.opx || _player.py != _player.opy) + _player.walkframe += _animspd * _fpsr; + if (_player.walkframe >= 16) + _player.walkframe -= 16; + + // walking over items to pickup ::: + int o = _objectMap[lx][ly]; + + if (o > -1) { + // fsk + if (_objectInfo[o][4] == 2 && _player.inventory[kInvFlask] < 9) { + _objectMap[lx][ly] = -1; + + _player.inventory[kInvFlask]++; + addFloatIcon(6, lx * 16, ly * 16); + + _objmapf[_curmap][lx][ly] = 1; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + } + + if (_objectInfo[o][5] == 7 && _player.inventory[kInvDoubleFlask] < 9) { + _objectMap[lx][ly] = -1; + + _player.inventory[kInvDoubleFlask]++; + addFloatIcon(12, lx * 16, ly * 16); + + _objmapf[_curmap][lx][ly] = 1; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + } + + if (_objectInfo[o][5] == 9 && _player.inventory[kInvShock] < 9 && (_curmap == 41 && _scriptflag[kScriptLightningBomb][1] == 0)) { + _objectMap[lx][ly] = -1; + + _player.inventory[kInvShock]++; + addFloatIcon(17, lx * 16, ly * 16); + + _objmapf[_curmap][lx][ly] = 1; + if (_curmap == 41) + _scriptflag[kScriptLightningBomb][1] = 1; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + + } + + if (_objectInfo[o][5] == 9 && _player.inventory[kInvShock] < 9) { + _objectMap[lx][ly] = -1; + + _player.inventory[kInvShock]++; + addFloatIcon(17, lx * 16, ly * 16); + + _objmapf[_curmap][lx][ly] = 1; + + if (config.effects) { + int snd = playSound(_sfx[kSndPowerUp]); + setChannelVolume(snd, config.effectsvol); + } + + } + } +} + +void GriffonEngine::checkTrigger() { + int npx = _player.px + 12; + int npy = _player.py + 20; + + int lx = (int)npx / 16; + int ly = (int)npy / 16; + + _canUseKey = false; + + if (_triggerloc[lx][ly] > -1) + processTrigger(_triggerloc[lx][ly]); +} + +void GriffonEngine::processTrigger(int trignum) { + int trigtype = _triggers[trignum][0]; + + if (_roomlock) + return; + + // map jump------------------------------ + if (trigtype == 0) { + int tx = _triggers[trignum][1]; + int ty = _triggers[trignum][2]; + int tmap = _triggers[trignum][3]; + int tjumpstyle = _triggers[trignum][4]; + + if (_roomLocks[tmap] > 0) { + if (!_saidLocked) + eventText("Locked"); + _saidLocked = true; + _canUseKey = true; + _lockType = _roomLocks[tmap]; + _roomToUnlock = tmap; + return; + } + + if (tmap == 1) { + if (!_saidJammed) + eventText("Door Jammed!"); + _saidJammed = true; + return; + } + + _saidLocked = false; + _saidJammed = false; + + // loc-sxy+oldmaploc + if (tjumpstyle == 0) { + + int tsx = _triggers[trignum][5]; + int tsy = _triggers[trignum][6]; + + _player.px += (tx - tsx) * 16; + _player.py += (ty - tsy) * 16; + + // HACKFIX + if (_player.px < 0) + _player.px = 0; + if (_player.py < 0) + _player.py = 0; + + if (tmap > 0) { + if (config.effects) { + int snd = playSound(_sfx[kSndDoor]); + setChannelVolume(snd, config.effectsvol); + } + + loadMap(tmap); + swash(); + } + } + } + + for (int i = 0; i < kMaxFloat; i++) { + _floattext[i][0] = 0; + _floaticon[i][0] = 0; + } +} + +} // end of namespace Griffon diff --git a/engines/griffon/module.mk b/engines/griffon/module.mk index 697e0b97f6..4eecec679d 100644 --- a/engines/griffon/module.mk +++ b/engines/griffon/module.mk @@ -10,6 +10,7 @@ MODULE_OBJS := \ draw.o \ engine.o \ griffon.o \ + input.o \ resources.o \ saveload.o \ sound.o |