aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/griffon/combat.cpp1032
-rw-r--r--engines/griffon/engine.cpp1010
-rw-r--r--engines/griffon/griffon.h36
-rw-r--r--engines/griffon/module.mk1
4 files changed, 1064 insertions, 1015 deletions
diff --git a/engines/griffon/combat.cpp b/engines/griffon/combat.cpp
new file mode 100644
index 0000000000..1374ea5185
--- /dev/null
+++ b/engines/griffon/combat.cpp
@@ -0,0 +1,1032 @@
+/* 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 "griffon/griffon.h"
+#include "griffon/config.h"
+#include "griffon/console.h"
+
+namespace Griffon {
+
+void GriffonEngine::attack() {
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ // if facing up
+ if (_player.walkdir == 0) {
+ if (ly > 0) {
+ int o2 = 0; // ??
+ int o = _objectMap[lx][ly - 1];
+ if (ly > 1 && _curmap == 58)
+ o2 = _objectMap[lx][ly - 2];
+ if (ly > 1 && _curmap == 54)
+ o2 = _objectMap[lx][ly - 2];
+
+ // cst
+ if ((_objectInfo[o][4] == 1 && (o == 0 || o > 4)) || (_objectInfo[o2][4] == 0 && o2 == 10)) {
+ if (o2 == 10)
+ o = 10;
+
+ int oscript = _objectInfo[o][5];
+ if (oscript == 0 && _player.inventory[kInvFlask] < 9) {
+ _player.inventory[kInvFlask]++;
+ addFloatIcon(6, lx * 16, (ly - 1) * 16);
+
+ _objmapf[_curmap][lx][ly - 1] = 1;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found Flask!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == 0 && _player.inventory[kInvFlask] == 9) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndChest]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("Cannot Carry any more Flasks!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptMasterKey) {
+ _player.inventory[kInvMasterKey]++;
+
+ addFloatIcon(14, lx * 16, (ly - 1) * 16);
+
+ _itemticks = _ticks + 215;
+
+ if (_curmap == 34)
+ _scriptflag[kScriptMasterKey][0] = 2;
+ if (_curmap == 62)
+ _scriptflag[kScriptGardenMasterKey][0] = 2;
+ if (_curmap == 81)
+ _scriptflag[kScriptCitadelMasterKey][0] = 2;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+ eventText("Found the Temple Key!");
+ return;
+ }
+
+ if (oscript == kScriptFindCtystal) {
+ _player.foundspell[0] = 1;
+ _player.spellcharge[0] = 0;
+
+ addFloatIcon(7, lx * 16, (ly - 1) * 16);
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found the Infinite Crystal!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptFindShield && _player.shield == 1) {
+ _player.shield = 2;
+
+ addFloatIcon(4, lx * 16, (ly - 1) * 16);
+
+ _itemticks = _ticks + 215;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found the Obsidian Shield!");
+ _objmapf[4][1][2] = 1;
+ return;
+ }
+
+ if (oscript == kScriptFindSword && _player.sword == 1) {
+ _player.sword = 2;
+
+ addFloatIcon(3, lx * 16, (ly - 1) * 16);
+
+ _itemticks = _ticks + 215;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+ eventText("Found the Fidelis Sword!");
+ return;
+ }
+
+ if (oscript == kScriptKeyChest) {
+ if (_player.inventory[kInvNormalKey] < 9) {
+ _player.inventory[kInvNormalKey]++;
+
+ for (int s = 20; s <= 23; s++) {
+ if (_scriptflag[s][0] == 1) {
+ _scriptflag[s][0] = 2;
+ }
+ }
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ _objmapf[_curmap][lx][ly - 1] = 1;
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found Key");
+ addFloatIcon(16, lx * 16, (ly - 1) * 16);
+ } else {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndChest]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("Cannot Carry Any More Keys");
+ }
+ }
+
+ if (oscript == kScriptBlueFlask && _player.inventory[kInvDoubleFlask] < 9) {
+ _player.inventory[kInvDoubleFlask]++;
+ addFloatIcon(12, lx * 16, (ly - 1) * 16);
+
+ _objmapf[_curmap][lx][ly - 1] = 1;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found Mega Flask!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptBlueFlask && _player.inventory[kInvDoubleFlask] == 9) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndChest]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("Cannot Carry any more Mega Flasks!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptBlueFlaskChest && _player.inventory[kInvDoubleFlask] < 9) {
+ _player.inventory[kInvDoubleFlask]++;
+ addFloatIcon(12, lx * 16, (ly - 1) * 16);
+
+ _objmapf[_curmap][lx][ly - 1] = 1;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found Mega Flask!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptBlueFlaskChest && _player.inventory[kInvDoubleFlask] == 9) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndChest]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("Cannot Carry any more Mega Flasks!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptLightningChest && _player.inventory[kInvShock] < 9) {
+ _player.inventory[kInvShock]++;
+ addFloatIcon(17, lx * 16, (ly - 1) * 16);
+
+ _objmapf[_curmap][lx][ly - 1] = 1;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found Lightning Bomb!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptLightningChest && _player.inventory[kInvShock] == 9) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndChest]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("Cannot Carry any more Lightning Bombs!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptArmourChest && _player.armour == 1) {
+ _player.armour = 2;
+
+ addFloatIcon(5, lx * 16, (ly - 1) * 16);
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+
+ eventText("Found the Fidelis Mail!");
+ _itemticks = _ticks + 215;
+ return;
+ }
+
+ if (oscript == kScriptLever) {
+ if (_curmap == 58 && _scriptflag[kScriptLever][0] == 0) {
+ _scriptflag[kScriptLever][0] = 1;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndLever]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ } else if (_curmap == 58 && _scriptflag[kScriptLever][0] > 0) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndDoor]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("It's stuck!");
+ }
+
+ if (_curmap == 54 && _scriptflag[kScriptLever][0] == 1) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndLever]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ _scriptflag[kScriptLever][0] = 2;
+ } else if (_curmap == 54 && _scriptflag[kScriptLever][0] > 1) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndDoor]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ eventText("It's stuck!");
+ }
+
+ }
+
+ if (oscript == kScriptGetSword3 && _player.sword < 3) {
+ _player.sword = 3;
+
+ addFloatIcon(18, lx * 16, (ly - 1) * 16);
+
+ _itemticks = _ticks + 215;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+ eventText("Found the Blood Sword!");
+ _objmapf[4][1][2] = 1;
+ return;
+ }
+
+ if (oscript == kScriptShield3 && _player.shield < 3) {
+ _player.shield = 3;
+ addFloatIcon(19, lx * 16, (ly - 1) * 16);
+ _itemticks = _ticks + 215;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+ eventText("Found the Entropy Shield!");
+ _objmapf[4][1][2] = 1;
+ return;
+ }
+
+ if (oscript == kScriptArmour3 && _player.armour < 3) {
+ _player.armour = 3;
+ addFloatIcon(20, lx * 16, (ly - 1) * 16);
+ _itemticks = _ticks + 215;
+
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndPowerUp]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ if (_objectInfo[o][4] == 1)
+ _objectMap[lx][ly - 1] = 3;
+ eventText("Found the Rubyscale Armour!");
+ _objmapf[4][1][2] = 1;
+ return;
+ }
+
+ }
+ }
+ }
+
+ attacking = true;
+ _player.attackframe = 0;
+ movingup = false;
+ movingdown = false;
+ movingleft = false;
+ movingright = false;
+
+ for (int i = 0; i <= 15; i++) {
+ for (int a = 0; a <= 3; a++) {
+ _playerattackofs[a][i][2] = 0;
+ }
+ }
+}
+
+void GriffonEngine::castSpell(int spellnum, float homex, float homey, float enemyx, float enemyy, int damagewho) {
+ // spellnum 7 = sprite 6 spitfire
+
+ for (int i = 0; i < kMaxSpell; i++) {
+ if (ABS(spellinfo[i].frame) < kEpsilon) {
+ spellinfo[i].homex = homex;
+ spellinfo[i].homey = homey;
+ spellinfo[i].enemyx = enemyx;
+ spellinfo[i].enemyy = enemyy;
+ spellinfo[i].spellnum = spellnum;
+ int dw = 0;
+ int npc = 0;
+ if (damagewho > 0) {
+ dw = 1;
+ npc = damagewho;
+ }
+
+ spellinfo[i].damagewho = dw;
+ spellinfo[i].npc = npc;
+
+ spellinfo[i].frame = 32.0f;
+ if (damagewho == 0) {
+ spellinfo[i].strength = _player.spellstrength / 100;
+ if (ABS(_player.spellstrength - 100) < kEpsilon)
+ spellinfo[i].strength = 1.5f;
+ }
+
+ // set earthslide vars
+ if (spellnum == 2) {
+ for (int f = 0; f <= 8; f++) {
+ spellinfo[i].rocky[f] = 0;
+ spellinfo[i].rockimg[f] = (int)(RND() * 4);
+ spellinfo[i].rockdeflect[f] = ((int)(RND() * 128) - 64) * 1.5;
+ }
+ }
+
+ // set fire vars
+ if (spellnum == 3) {
+ for (int f = 0; f <= 4; f++) {
+ spellinfo[i].legalive[f] = 32;
+ }
+ }
+
+
+ // room fireball vars
+ if (spellnum == 6) {
+ int nballs = 0;
+ for (int x = 0; x <= 19; x++) {
+ for (int y = 0; y <= 14; y++) {
+ if ((_objectMap[x][y] == 1 || _objectMap[x][y] == 2) && nballs < 5 && (int)(RND() * 4) == 0) {
+ int ax = x * 16;
+ int ay = y * 16;
+
+ spellinfo[i].fireballs[nballs][0] = ax;
+ spellinfo[i].fireballs[nballs][1] = ay;
+ spellinfo[i].fireballs[nballs][2] = 0;
+ spellinfo[i].fireballs[nballs][3] = 0;
+
+ spellinfo[i].ballon[nballs] = 1;
+ nballs = nballs + 1;
+ }
+ }
+ }
+ spellinfo[i].nfballs = nballs;
+ }
+
+ if (config.effects) {
+ if (spellnum == 1) {
+ int snd = playSound(_sfx[kSndThrow]);
+ setChannelVolume(snd, config.effectsvol);
+ } else if (spellnum == 5) {
+ int snd = playSound(_sfx[kSndCrystal]);
+ setChannelVolume(snd, config.effectsvol);
+ } else if (spellnum == 8 || spellnum == 9) {
+ int snd = playSound(_sfx[kSndLightning]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+ }
+
+ return;
+ }
+ }
+}
+
+void GriffonEngine::checkHit() {
+ if (attacking) {
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0 && _npcinfo[i].pause < _ticks && (int)(RND() * 2) == 0) {
+ float npx = _npcinfo[i].x;
+ float npy = _npcinfo[i].y;
+
+ float xdif = _player.px - npx;
+ float ydif = _player.py - npy;
+
+ float ps = _player.sword;
+ if (ps > 1)
+ ps = ps * 0.75;
+ float damage = (float)_player.sworddamage * (1.0 + RND() * 1.0) * _player.attackstrength / 100.0 * ps;
+
+ if (_console->_godMode)
+ damage = 1000;
+
+ if (ABS(_player.attackstrength - 100) < kEpsilon)
+ damage *= 1.5;
+
+ bool hit = false;
+ if (_player.walkdir == 0) {
+ if (abs(xdif) <= 8 && ydif >= 0 && ydif < 8)
+ hit = true;
+ } else if (_player.walkdir == 1) {
+ if (abs(xdif) <= 8 && ydif <= 0 && ydif > -8)
+ hit = true;
+ } else if (_player.walkdir == 2) {
+ if (abs(ydif) <= 8 && xdif >= -8 && xdif < 8)
+ hit = true;
+ } else if (_player.walkdir == 3) {
+ if (abs(ydif) <= 8 && xdif <= 8 && xdif > -8)
+ hit = true;
+ }
+
+ if (hit) {
+ if (config.effects) {
+ int snd = playSound(_sfx[kSndSwordHit]);
+ setChannelVolume(snd, config.effectsvol);
+ }
+
+ damageNPC(i, damage, 0);
+ }
+ }
+ }
+ }
+}
+
+void GriffonEngine::damageNPC(int npcnum, int damage, int spell) {
+ char line[256];
+ int fcol;
+
+ if (damage == 0) {
+ strcpy(line, "miss!");
+ fcol = 2;
+ } else {
+ int ratio = 0;
+ int heal = 0;
+ if (damage < 0)
+ heal = 1;
+ damage = abs(damage);
+
+ if (heal == 0) {
+ if (damage > _npcinfo[npcnum].hp) {
+ ratio = (damage - _npcinfo[npcnum].hp) * 100 / damage;
+ damage = _npcinfo[npcnum].hp;
+ }
+
+ _npcinfo[npcnum].hp -= damage;
+ if (_npcinfo[npcnum].hp < 0)
+ _npcinfo[npcnum].hp = 0;
+
+ sprintf(line, "-%i", damage);
+ fcol = 1;
+ } else {
+ _npcinfo[npcnum].hp += damage;
+ if (_npcinfo[npcnum].hp > _npcinfo[npcnum].maxhp)
+ _npcinfo[npcnum].hp = _npcinfo[npcnum].maxhp;
+
+ sprintf(line, "+%i", damage);
+ fcol = 5;
+ }
+
+ _npcinfo[npcnum].pause = _ticks + 900;
+
+ if (spell == 0)
+ _player.attackstrength = ratio;
+ }
+
+ addFloatText(line, _npcinfo[npcnum].x + 12 - 4 * strlen(line), _npcinfo[npcnum].y + 16, fcol);
+
+ if (_npcinfo[npcnum].spriteset == 12)
+ castSpell(9, _npcinfo[npcnum].x, _npcinfo[npcnum].y, _player.px, _player.py, npcnum);
+
+ // if enemy is killed
+ if (_npcinfo[npcnum].hp == 0) {
+ _player.exp = _player.exp + _npcinfo[npcnum].maxhp;
+
+ if (_npcinfo[npcnum].spriteset == 1 || _npcinfo[npcnum].spriteset == 7 || _npcinfo[npcnum].spriteset == 6) {
+ int ff = (int)(RND() * _player.level * 3);
+ if (ff == 0) {
+ float npx = _npcinfo[npcnum].x + 12;
+ float npy = _npcinfo[npcnum].y + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (_objectMap[lx][ly] == -1)
+ _objectMap[lx][ly] = 4;
+ }
+ }
+
+ if (_npcinfo[npcnum].spriteset == 2 || _npcinfo[npcnum].spriteset == 9 || _npcinfo[npcnum].spriteset == 4 || _npcinfo[npcnum].spriteset == 5) {
+ int ff = (int)(RND() * _player.level);
+ if (ff == 0) {
+ float npx = _npcinfo[npcnum].x + 12;
+ float npy = _npcinfo[npcnum].y + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (_objectMap[lx][ly] == -1)
+ _objectMap[lx][ly] = 12;
+ }
+ }
+
+ if (_npcinfo[npcnum].spriteset == 9 || _npcinfo[npcnum].spriteset == 10 || _npcinfo[npcnum].spriteset == 5) {
+ int ff = (int)(RND() * _player.level * 2);
+ if (ff == 0) {
+ float npx = _npcinfo[npcnum].x + 12;
+ float npy = _npcinfo[npcnum].y + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (_objectMap[lx][ly] == -1)
+ _objectMap[lx][ly] = 13;
+ }
+ }
+
+ // academy master key chest script
+ if (_npcinfo[npcnum].script == kScriptMasterKey) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 9;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 5;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ _scriptflag[kScriptMasterKey][0] = 1;
+ }
+ }
+
+ // academy crystal chest script
+ if (_npcinfo[npcnum].script == kScriptFindCtystal) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 9;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 6;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _scriptflag[kScriptFindCtystal][0] = 1;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ }
+ }
+
+ // tower shield chest script
+ if (_npcinfo[npcnum].script == kScriptFindShield && _scriptflag[kScriptFindShield][0] == 0) {
+ _triggerloc[9][7] = 5004;
+
+ int curtile = 40;
+ int curtilel = 0;
+ int curtilex = curtile % 20;
+ int curtiley = (curtile - curtilex) / 20;
+
+ int l = 0; // ?? not defined in original code
+ _tileinfo[l][9][7][0] = curtile + 1;
+ _tileinfo[l][9][7][1] = 0;
+
+ rcSrc.left = curtilex * 16;
+ rcSrc.top = curtiley * 16;
+ rcSrc.setWidth(16);
+ rcSrc.setHeight(16);
+
+ rcDest.left = 9 * 16;
+ rcDest.top = 7 * 16;
+ rcDest.setWidth(16);
+ rcDest.setHeight(16);
+
+ _tiles[curtilel]->blit(*_mapbg, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc);
+ }
+
+ // firehydra sword chest
+ if (_npcinfo[npcnum].script == kScriptFindSword) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 9;
+ int cy = 6;
+
+ _objectMap[cx][cy] = 9;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _scriptflag[kScriptFindSword][0] = 1;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ }
+
+ }
+
+ // gardens master key script
+ if (_npcinfo[npcnum].script == kScriptGardenMasterKey && _scriptflag[kScriptKeyChest][0] == 0) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 13;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 5;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ _scriptflag[kScriptGardenMasterKey][0] = 1;
+ }
+ }
+
+ // regular key chest 1
+ for (int s = 20; s <= 23; s++) {
+ if (_npcinfo[npcnum].script == s && _scriptflag[s][0] < 2) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 9;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 11;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _scriptflag[s][0] = 1;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ }
+ }
+ }
+
+ // pickup lightning bomb
+ if (_npcinfo[npcnum].script == kScriptLightningBomb && (_curmap == 41 && _scriptflag[kScriptLightningBomb][1] == 0)) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 9;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 13;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ }
+ }
+
+ // citadel armour chest
+ if (_npcinfo[npcnum].script == kScriptArmourChest) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 8;
+ int cy = 7;
+
+ _objectMap[cx][cy] = 16;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _scriptflag[kScriptArmourChest][0] = 1;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ }
+ }
+
+ // citadel master key script
+ if (_npcinfo[npcnum].script == kScriptCitadelMasterKey && _scriptflag[kScriptCitadelMasterKey][0] == 0) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 11;
+ int cy = 10;
+
+ _objectMap[cx][cy] = 5;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ _scriptflag[kScriptCitadelMasterKey][0] = 1;
+ }
+ }
+
+ // max ups
+ if (_npcinfo[npcnum].script == kScriptGetSword3 && _scriptflag[kScriptGetSword3][0] == 0) {
+ bool alive = false;
+ for (int i = 1; i <= _lastnpc; i++) {
+ if (_npcinfo[i].hp > 0)
+ alive = true;
+ }
+
+ if (!alive) {
+ int cx = 6;
+ int cy = 8;
+
+ _objectMap[cx][cy] = 18;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ float npx = _player.px + 12;
+ float npy = _player.py + 20;
+
+ int lx = (int)npx / 16;
+ int ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ _scriptflag[kScriptGetSword3][0] = 1;
+
+ cx = 9;
+ cy = 8;
+
+ _objectMap[cx][cy] = 19;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ npx = _player.px + 12;
+ npy = _player.py + 20;
+
+ lx = (int)npx / 16;
+ ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+
+ _scriptflag[kScriptShield3][0] = 1;
+
+ cx = 12;
+ cy = 8;
+
+ _objectMap[cx][cy] = 20;
+
+ rcDest.left = cx * 8;
+ rcDest.top = cy * 8;
+ rcDest.setWidth(8);
+ rcDest.setHeight(8);
+
+ npx = _player.px + 12;
+ npy = _player.py + 20;
+
+ lx = (int)npx / 16;
+ ly = (int)npy / 16;
+
+ if (lx == cx && ly == cy)
+ _player.py = _player.py + 16;
+ _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
+ _scriptflag[kScriptArmour3][0] = 1;
+ }
+ }
+
+ if (_npcinfo[npcnum].script == kScriptEndOfGame)
+ endOfGame();
+ }
+}
+
+void GriffonEngine::damagePlayer(int damage) {
+ char line[256];
+
+ if (!_console->_godMode)
+ _player.hp -= damage;
+
+ if (_player.hp < 0)
+ _player.hp = 0;
+
+ sprintf(line, "-%i", damage);
+ if (damage == 0)
+ strcpy(line, "miss!");
+
+ addFloatText(line, _player.px + 12 - 4 * strlen(line), _player.py + 16, 4);
+
+ _player.pause = _ticks + 1000;
+}
+
+
+} // end of namespace Griffon
diff --git a/engines/griffon/engine.cpp b/engines/griffon/engine.cpp
index 41adf35a49..b32f8907c5 100644
--- a/engines/griffon/engine.cpp
+++ b/engines/griffon/engine.cpp
@@ -45,28 +45,6 @@
namespace Griffon {
-// in game scripts
-enum {
- kScriptMasterKey = 2, // find master key
- kScriptFindCtystal = 3, // find crystal
- kScriptFindShield = 4, // find shield - obj 8
- kScriptFindSword = 5, // find sword - obj 9
- kScriptKeyChest = 6, // regular key chest
- kScriptBlueFlask = 7, // blue flask
- kScriptGardenMasterKey = 8, // garden's master key
- kScriptLightningBomb = 9, // lightning bomb
- kScriptBlueFlaskChest = 10, // blue flask chest
- kScriptLightningChest = 11, // lightning chest
- kScriptArmourChest = 12, // armour chest
- kScriptCitadelMasterKey = 13, // citadel master key
- kScriptEndOfGame = 14, // end of game
- kScriptGetSword3 = 15, // get sword3
- kScriptShield3 = 16, // shield3
- kScriptArmour3 = 17, // armour3
- kScriptKeyChest1 = 20, // key chest 1
- kScriptLever = 60 // lever
-};
-
// memo
/*
monsters
@@ -308,521 +286,6 @@ void GriffonEngine::addFloatText(const char *stri, float xloc, float yloc, int c
}
}
-void GriffonEngine::attack() {
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- // if facing up
- if (_player.walkdir == 0) {
- if (ly > 0) {
- int o2 = 0; // ??
- int o = _objectMap[lx][ly - 1];
- if (ly > 1 && _curmap == 58)
- o2 = _objectMap[lx][ly - 2];
- if (ly > 1 && _curmap == 54)
- o2 = _objectMap[lx][ly - 2];
-
- // cst
- if ((_objectInfo[o][4] == 1 && (o == 0 || o > 4)) || (_objectInfo[o2][4] == 0 && o2 == 10)) {
- if (o2 == 10)
- o = 10;
-
- int oscript = _objectInfo[o][5];
- if (oscript == 0 && _player.inventory[kInvFlask] < 9) {
- _player.inventory[kInvFlask]++;
- addFloatIcon(6, lx * 16, (ly - 1) * 16);
-
- _objmapf[_curmap][lx][ly - 1] = 1;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found Flask!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == 0 && _player.inventory[kInvFlask] == 9) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndChest]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("Cannot Carry any more Flasks!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptMasterKey) {
- _player.inventory[kInvMasterKey]++;
-
- addFloatIcon(14, lx * 16, (ly - 1) * 16);
-
- _itemticks = _ticks + 215;
-
- if (_curmap == 34)
- _scriptflag[kScriptMasterKey][0] = 2;
- if (_curmap == 62)
- _scriptflag[kScriptGardenMasterKey][0] = 2;
- if (_curmap == 81)
- _scriptflag[kScriptCitadelMasterKey][0] = 2;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
- eventText("Found the Temple Key!");
- return;
- }
-
- if (oscript == kScriptFindCtystal) {
- _player.foundspell[0] = 1;
- _player.spellcharge[0] = 0;
-
- addFloatIcon(7, lx * 16, (ly - 1) * 16);
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found the Infinite Crystal!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptFindShield && _player.shield == 1) {
- _player.shield = 2;
-
- addFloatIcon(4, lx * 16, (ly - 1) * 16);
-
- _itemticks = _ticks + 215;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found the Obsidian Shield!");
- _objmapf[4][1][2] = 1;
- return;
- }
-
- if (oscript == kScriptFindSword && _player.sword == 1) {
- _player.sword = 2;
-
- addFloatIcon(3, lx * 16, (ly - 1) * 16);
-
- _itemticks = _ticks + 215;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
- eventText("Found the Fidelis Sword!");
- return;
- }
-
- if (oscript == kScriptKeyChest) {
- if (_player.inventory[kInvNormalKey] < 9) {
- _player.inventory[kInvNormalKey]++;
-
- for (int s = 20; s <= 23; s++) {
- if (_scriptflag[s][0] == 1) {
- _scriptflag[s][0] = 2;
- }
- }
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- _objmapf[_curmap][lx][ly - 1] = 1;
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found Key");
- addFloatIcon(16, lx * 16, (ly - 1) * 16);
- } else {
- if (config.effects) {
- int snd = playSound(_sfx[kSndChest]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("Cannot Carry Any More Keys");
- }
- }
-
- if (oscript == kScriptBlueFlask && _player.inventory[kInvDoubleFlask] < 9) {
- _player.inventory[kInvDoubleFlask]++;
- addFloatIcon(12, lx * 16, (ly - 1) * 16);
-
- _objmapf[_curmap][lx][ly - 1] = 1;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found Mega Flask!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptBlueFlask && _player.inventory[kInvDoubleFlask] == 9) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndChest]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("Cannot Carry any more Mega Flasks!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptBlueFlaskChest && _player.inventory[kInvDoubleFlask] < 9) {
- _player.inventory[kInvDoubleFlask]++;
- addFloatIcon(12, lx * 16, (ly - 1) * 16);
-
- _objmapf[_curmap][lx][ly - 1] = 1;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found Mega Flask!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptBlueFlaskChest && _player.inventory[kInvDoubleFlask] == 9) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndChest]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("Cannot Carry any more Mega Flasks!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptLightningChest && _player.inventory[kInvShock] < 9) {
- _player.inventory[kInvShock]++;
- addFloatIcon(17, lx * 16, (ly - 1) * 16);
-
- _objmapf[_curmap][lx][ly - 1] = 1;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found Lightning Bomb!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptLightningChest && _player.inventory[kInvShock] == 9) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndChest]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("Cannot Carry any more Lightning Bombs!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptArmourChest && _player.armour == 1) {
- _player.armour = 2;
-
- addFloatIcon(5, lx * 16, (ly - 1) * 16);
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
-
- eventText("Found the Fidelis Mail!");
- _itemticks = _ticks + 215;
- return;
- }
-
- if (oscript == kScriptLever) {
- if (_curmap == 58 && _scriptflag[kScriptLever][0] == 0) {
- _scriptflag[kScriptLever][0] = 1;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndLever]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- } else if (_curmap == 58 && _scriptflag[kScriptLever][0] > 0) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndDoor]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("It's stuck!");
- }
-
- if (_curmap == 54 && _scriptflag[kScriptLever][0] == 1) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndLever]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- _scriptflag[kScriptLever][0] = 2;
- } else if (_curmap == 54 && _scriptflag[kScriptLever][0] > 1) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndDoor]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- eventText("It's stuck!");
- }
-
- }
-
- if (oscript == kScriptGetSword3 && _player.sword < 3) {
- _player.sword = 3;
-
- addFloatIcon(18, lx * 16, (ly - 1) * 16);
-
- _itemticks = _ticks + 215;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
- eventText("Found the Blood Sword!");
- _objmapf[4][1][2] = 1;
- return;
- }
-
- if (oscript == kScriptShield3 && _player.shield < 3) {
- _player.shield = 3;
- addFloatIcon(19, lx * 16, (ly - 1) * 16);
- _itemticks = _ticks + 215;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
- eventText("Found the Entropy Shield!");
- _objmapf[4][1][2] = 1;
- return;
- }
-
- if (oscript == kScriptArmour3 && _player.armour < 3) {
- _player.armour = 3;
- addFloatIcon(20, lx * 16, (ly - 1) * 16);
- _itemticks = _ticks + 215;
-
- if (config.effects) {
- int snd = playSound(_sfx[kSndPowerUp]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- if (_objectInfo[o][4] == 1)
- _objectMap[lx][ly - 1] = 3;
- eventText("Found the Rubyscale Armour!");
- _objmapf[4][1][2] = 1;
- return;
- }
-
- }
- }
- }
-
- attacking = true;
- _player.attackframe = 0;
- movingup = false;
- movingdown = false;
- movingleft = false;
- movingright = false;
-
- for (int i = 0; i <= 15; i++) {
- for (int a = 0; a <= 3; a++) {
- _playerattackofs[a][i][2] = 0;
- }
- }
-}
-
-void GriffonEngine::castSpell(int spellnum, float homex, float homey, float enemyx, float enemyy, int damagewho) {
- // spellnum 7 = sprite 6 spitfire
-
- for (int i = 0; i < kMaxSpell; i++) {
- if (ABS(spellinfo[i].frame) < kEpsilon) {
- spellinfo[i].homex = homex;
- spellinfo[i].homey = homey;
- spellinfo[i].enemyx = enemyx;
- spellinfo[i].enemyy = enemyy;
- spellinfo[i].spellnum = spellnum;
- int dw = 0;
- int npc = 0;
- if (damagewho > 0) {
- dw = 1;
- npc = damagewho;
- }
-
- spellinfo[i].damagewho = dw;
- spellinfo[i].npc = npc;
-
- spellinfo[i].frame = 32.0f;
- if (damagewho == 0) {
- spellinfo[i].strength = _player.spellstrength / 100;
- if (ABS(_player.spellstrength - 100) < kEpsilon)
- spellinfo[i].strength = 1.5f;
- }
-
- // set earthslide vars
- if (spellnum == 2) {
- for (int f = 0; f <= 8; f++) {
- spellinfo[i].rocky[f] = 0;
- spellinfo[i].rockimg[f] = (int)(RND() * 4);
- spellinfo[i].rockdeflect[f] = ((int)(RND() * 128) - 64) * 1.5;
- }
- }
-
- // set fire vars
- if (spellnum == 3) {
- for (int f = 0; f <= 4; f++) {
- spellinfo[i].legalive[f] = 32;
- }
- }
-
-
- // room fireball vars
- if (spellnum == 6) {
- int nballs = 0;
- for (int x = 0; x <= 19; x++) {
- for (int y = 0; y <= 14; y++) {
- if ((_objectMap[x][y] == 1 || _objectMap[x][y] == 2) && nballs < 5 && (int)(RND() * 4) == 0) {
- int ax = x * 16;
- int ay = y * 16;
-
- spellinfo[i].fireballs[nballs][0] = ax;
- spellinfo[i].fireballs[nballs][1] = ay;
- spellinfo[i].fireballs[nballs][2] = 0;
- spellinfo[i].fireballs[nballs][3] = 0;
-
- spellinfo[i].ballon[nballs] = 1;
- nballs = nballs + 1;
- }
- }
- }
- spellinfo[i].nfballs = nballs;
- }
-
- if (config.effects) {
- if (spellnum == 1) {
- int snd = playSound(_sfx[kSndThrow]);
- setChannelVolume(snd, config.effectsvol);
- } else if (spellnum == 5) {
- int snd = playSound(_sfx[kSndCrystal]);
- setChannelVolume(snd, config.effectsvol);
- } else if (spellnum == 8 || spellnum == 9) {
- int snd = playSound(_sfx[kSndLightning]);
- setChannelVolume(snd, config.effectsvol);
- }
- }
-
- return;
- }
- }
-}
-
-void GriffonEngine::checkHit() {
- if (attacking) {
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0 && _npcinfo[i].pause < _ticks && (int)(RND() * 2) == 0) {
- float npx = _npcinfo[i].x;
- float npy = _npcinfo[i].y;
-
- float xdif = _player.px - npx;
- float ydif = _player.py - npy;
-
- float ps = _player.sword;
- if (ps > 1)
- ps = ps * 0.75;
- float damage = (float)_player.sworddamage * (1.0 + RND() * 1.0) * _player.attackstrength / 100.0 * ps;
-
- if (_console->_godMode)
- damage = 1000;
-
- if (ABS(_player.attackstrength - 100) < kEpsilon)
- damage *= 1.5;
-
- bool hit = false;
- if (_player.walkdir == 0) {
- if (abs(xdif) <= 8 && ydif >= 0 && ydif < 8)
- hit = true;
- } else if (_player.walkdir == 1) {
- if (abs(xdif) <= 8 && ydif <= 0 && ydif > -8)
- hit = true;
- } else if (_player.walkdir == 2) {
- if (abs(ydif) <= 8 && xdif >= -8 && xdif < 8)
- hit = true;
- } else if (_player.walkdir == 3) {
- if (abs(ydif) <= 8 && xdif <= 8 && xdif > -8)
- hit = true;
- }
-
- if (hit) {
- if (config.effects) {
- int snd = playSound(_sfx[kSndSwordHit]);
- setChannelVolume(snd, config.effectsvol);
- }
-
- damageNPC(i, damage, 0);
- }
- }
- }
- }
-}
-
void GriffonEngine::checkInputs() {
int ntickdelay = 175;
@@ -1397,479 +860,6 @@ void GriffonEngine::configMenu() {
cloudimg->setAlpha(64, true);
}
-void GriffonEngine::damageNPC(int npcnum, int damage, int spell) {
- char line[256];
- int fcol;
-
- if (damage == 0) {
- strcpy(line, "miss!");
- fcol = 2;
- } else {
- int ratio = 0;
- int heal = 0;
- if (damage < 0)
- heal = 1;
- damage = abs(damage);
-
- if (heal == 0) {
- if (damage > _npcinfo[npcnum].hp) {
- ratio = (damage - _npcinfo[npcnum].hp) * 100 / damage;
- damage = _npcinfo[npcnum].hp;
- }
-
- _npcinfo[npcnum].hp -= damage;
- if (_npcinfo[npcnum].hp < 0)
- _npcinfo[npcnum].hp = 0;
-
- sprintf(line, "-%i", damage);
- fcol = 1;
- } else {
- _npcinfo[npcnum].hp += damage;
- if (_npcinfo[npcnum].hp > _npcinfo[npcnum].maxhp)
- _npcinfo[npcnum].hp = _npcinfo[npcnum].maxhp;
-
- sprintf(line, "+%i", damage);
- fcol = 5;
- }
-
- _npcinfo[npcnum].pause = _ticks + 900;
-
- if (spell == 0)
- _player.attackstrength = ratio;
- }
-
- addFloatText(line, _npcinfo[npcnum].x + 12 - 4 * strlen(line), _npcinfo[npcnum].y + 16, fcol);
-
- if (_npcinfo[npcnum].spriteset == 12)
- castSpell(9, _npcinfo[npcnum].x, _npcinfo[npcnum].y, _player.px, _player.py, npcnum);
-
- // if enemy is killed
- if (_npcinfo[npcnum].hp == 0) {
- _player.exp = _player.exp + _npcinfo[npcnum].maxhp;
-
- if (_npcinfo[npcnum].spriteset == 1 || _npcinfo[npcnum].spriteset == 7 || _npcinfo[npcnum].spriteset == 6) {
- int ff = (int)(RND() * _player.level * 3);
- if (ff == 0) {
- float npx = _npcinfo[npcnum].x + 12;
- float npy = _npcinfo[npcnum].y + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (_objectMap[lx][ly] == -1)
- _objectMap[lx][ly] = 4;
- }
- }
-
- if (_npcinfo[npcnum].spriteset == 2 || _npcinfo[npcnum].spriteset == 9 || _npcinfo[npcnum].spriteset == 4 || _npcinfo[npcnum].spriteset == 5) {
- int ff = (int)(RND() * _player.level);
- if (ff == 0) {
- float npx = _npcinfo[npcnum].x + 12;
- float npy = _npcinfo[npcnum].y + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (_objectMap[lx][ly] == -1)
- _objectMap[lx][ly] = 12;
- }
- }
-
- if (_npcinfo[npcnum].spriteset == 9 || _npcinfo[npcnum].spriteset == 10 || _npcinfo[npcnum].spriteset == 5) {
- int ff = (int)(RND() * _player.level * 2);
- if (ff == 0) {
- float npx = _npcinfo[npcnum].x + 12;
- float npy = _npcinfo[npcnum].y + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (_objectMap[lx][ly] == -1)
- _objectMap[lx][ly] = 13;
- }
- }
-
- // academy master key chest script
- if (_npcinfo[npcnum].script == kScriptMasterKey) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 9;
- int cy = 7;
-
- _objectMap[cx][cy] = 5;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- _scriptflag[kScriptMasterKey][0] = 1;
- }
- }
-
- // academy crystal chest script
- if (_npcinfo[npcnum].script == kScriptFindCtystal) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 9;
- int cy = 7;
-
- _objectMap[cx][cy] = 6;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _scriptflag[kScriptFindCtystal][0] = 1;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- }
- }
-
- // tower shield chest script
- if (_npcinfo[npcnum].script == kScriptFindShield && _scriptflag[kScriptFindShield][0] == 0) {
- _triggerloc[9][7] = 5004;
-
- int curtile = 40;
- int curtilel = 0;
- int curtilex = curtile % 20;
- int curtiley = (curtile - curtilex) / 20;
-
- int l = 0; // ?? not defined in original code
- _tileinfo[l][9][7][0] = curtile + 1;
- _tileinfo[l][9][7][1] = 0;
-
- rcSrc.left = curtilex * 16;
- rcSrc.top = curtiley * 16;
- rcSrc.setWidth(16);
- rcSrc.setHeight(16);
-
- rcDest.left = 9 * 16;
- rcDest.top = 7 * 16;
- rcDest.setWidth(16);
- rcDest.setHeight(16);
-
- _tiles[curtilel]->blit(*_mapbg, rcDest.left, rcDest.top, Graphics::FLIP_NONE, &rcSrc);
- }
-
- // firehydra sword chest
- if (_npcinfo[npcnum].script == kScriptFindSword) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 9;
- int cy = 6;
-
- _objectMap[cx][cy] = 9;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _scriptflag[kScriptFindSword][0] = 1;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- }
-
- }
-
- // gardens master key script
- if (_npcinfo[npcnum].script == kScriptGardenMasterKey && _scriptflag[kScriptKeyChest][0] == 0) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 13;
- int cy = 7;
-
- _objectMap[cx][cy] = 5;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- _scriptflag[kScriptGardenMasterKey][0] = 1;
- }
- }
-
- // regular key chest 1
- for (int s = 20; s <= 23; s++) {
- if (_npcinfo[npcnum].script == s && _scriptflag[s][0] < 2) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 9;
- int cy = 7;
-
- _objectMap[cx][cy] = 11;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _scriptflag[s][0] = 1;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- }
- }
- }
-
- // pickup lightning bomb
- if (_npcinfo[npcnum].script == kScriptLightningBomb && (_curmap == 41 && _scriptflag[kScriptLightningBomb][1] == 0)) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 9;
- int cy = 7;
-
- _objectMap[cx][cy] = 13;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- }
- }
-
- // citadel armour chest
- if (_npcinfo[npcnum].script == kScriptArmourChest) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 8;
- int cy = 7;
-
- _objectMap[cx][cy] = 16;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _scriptflag[kScriptArmourChest][0] = 1;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- }
- }
-
- // citadel master key script
- if (_npcinfo[npcnum].script == kScriptCitadelMasterKey && _scriptflag[kScriptCitadelMasterKey][0] == 0) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 11;
- int cy = 10;
-
- _objectMap[cx][cy] = 5;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- _scriptflag[kScriptCitadelMasterKey][0] = 1;
- }
- }
-
- // max ups
- if (_npcinfo[npcnum].script == kScriptGetSword3 && _scriptflag[kScriptGetSword3][0] == 0) {
- bool alive = false;
- for (int i = 1; i <= _lastnpc; i++) {
- if (_npcinfo[i].hp > 0)
- alive = true;
- }
-
- if (!alive) {
- int cx = 6;
- int cy = 8;
-
- _objectMap[cx][cy] = 18;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- float npx = _player.px + 12;
- float npy = _player.py + 20;
-
- int lx = (int)npx / 16;
- int ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- _scriptflag[kScriptGetSword3][0] = 1;
-
- cx = 9;
- cy = 8;
-
- _objectMap[cx][cy] = 19;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- npx = _player.px + 12;
- npy = _player.py + 20;
-
- lx = (int)npx / 16;
- ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
-
- _scriptflag[kScriptShield3][0] = 1;
-
- cx = 12;
- cy = 8;
-
- _objectMap[cx][cy] = 20;
-
- rcDest.left = cx * 8;
- rcDest.top = cy * 8;
- rcDest.setWidth(8);
- rcDest.setHeight(8);
-
- npx = _player.px + 12;
- npy = _player.py + 20;
-
- lx = (int)npx / 16;
- ly = (int)npy / 16;
-
- if (lx == cx && ly == cy)
- _player.py = _player.py + 16;
- _clipbg2->fillRect(rcDest, _clipbg->format.RGBToColor(255, 255, 255));
- _scriptflag[kScriptArmour3][0] = 1;
- }
- }
-
- if (_npcinfo[npcnum].script == kScriptEndOfGame)
- endOfGame();
- }
-}
-
-void GriffonEngine::damagePlayer(int damage) {
- char line[256];
-
- if (!_console->_godMode)
- _player.hp -= damage;
-
- if (_player.hp < 0)
- _player.hp = 0;
-
- sprintf(line, "-%i", damage);
- if (damage == 0)
- strcpy(line, "miss!");
-
- addFloatText(line, _player.px + 12 - 4 * strlen(line), _player.py + 16, 4);
-
- _player.pause = _ticks + 1000;
-}
-
void GriffonEngine::drawAnims(int Layer) {
for (int sx = 0; sx <= 19; sx++) {
for (int sy = 0; sy <= 14; sy++) {
diff --git a/engines/griffon/griffon.h b/engines/griffon/griffon.h
index 10e55852ca..d0e80656ec 100644
--- a/engines/griffon/griffon.h
+++ b/engines/griffon/griffon.h
@@ -90,6 +90,29 @@ enum {
kSndBeep
};
+// in game scripts
+enum {
+ kScriptMasterKey = 2, // find master key
+ kScriptFindCtystal = 3, // find crystal
+ kScriptFindShield = 4, // find shield - obj 8
+ kScriptFindSword = 5, // find sword - obj 9
+ kScriptKeyChest = 6, // regular key chest
+ kScriptBlueFlask = 7, // blue flask
+ kScriptGardenMasterKey = 8, // garden's master key
+ kScriptLightningBomb = 9, // lightning bomb
+ kScriptBlueFlaskChest = 10, // blue flask chest
+ kScriptLightningChest = 11, // lightning chest
+ kScriptArmourChest = 12, // armour chest
+ kScriptCitadelMasterKey = 13, // citadel master key
+ kScriptEndOfGame = 14, // end of game
+ kScriptGetSword3 = 15, // get sword3
+ kScriptShield3 = 16, // shield3
+ kScriptArmour3 = 17, // armour3
+ kScriptKeyChest1 = 20, // key chest 1
+ kScriptLever = 60 // lever
+};
+
+
#define kEpsilon 0.001
struct Player {
@@ -255,18 +278,21 @@ private:
Console *_console;
private:
- float RND();
- void addFloatIcon(int ico, float xloc, float yloc);
- void addFloatText(const char *stri, float xloc, float yloc, int col);
+ // combat.cpp
void attack();
void castSpell(int spellnum, float homex, float homey, float enemyx, float enemyy, int damagewho);
void checkHit();
+ void damageNPC(int npcnum, int damage, int spell);
+ void damagePlayer(int damage);
+
+ float RND();
+
+ void addFloatIcon(int ico, float xloc, float yloc);
+ void addFloatText(const char *stri, float xloc, float yloc, int col);
void checkInputs();
void checkTrigger();
void configMenu();
- void damageNPC(int npcnum, int damage, int spell);
- void damagePlayer(int damage);
void drawAnims(int Layer);
void drawHud();
void drawNPCs(int mode);
diff --git a/engines/griffon/module.mk b/engines/griffon/module.mk
index 5fa2a801ad..bd64e7375c 100644
--- a/engines/griffon/module.mk
+++ b/engines/griffon/module.mk
@@ -1,6 +1,7 @@
MODULE := engines/griffon
MODULE_OBJS := \
+ combat.o \
config.o \
console.o \
engine.o \