aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2015-02-15 14:10:37 -0500
committerPaul Gilbert2015-02-15 14:10:37 -0500
commit74b4d91f4a5b68b2aa0ec2a46f76131ccf897535 (patch)
tree45ff0ae5a8c8e49ca56b46cfafe4b0032f6bbdb2
parenta90ad5b4c18ad067b0839f22a24a09db69570ac8 (diff)
downloadscummvm-rg350-74b4d91f4a5b68b2aa0ec2a46f76131ccf897535.tar.gz
scummvm-rg350-74b4d91f4a5b68b2aa0ec2a46f76131ccf897535.tar.bz2
scummvm-rg350-74b4d91f4a5b68b2aa0ec2a46f76131ccf897535.zip
XEEN: Implemented startFalling
-rw-r--r--engines/xeen/combat.cpp4
-rw-r--r--engines/xeen/combat.h2
-rw-r--r--engines/xeen/interface.cpp247
-rw-r--r--engines/xeen/interface.h3
-rw-r--r--engines/xeen/map.cpp3
-rw-r--r--engines/xeen/party.cpp1
-rw-r--r--engines/xeen/party.h1
-rw-r--r--engines/xeen/scripts.cpp2
-rw-r--r--engines/xeen/scripts.h2
9 files changed, 249 insertions, 16 deletions
diff --git a/engines/xeen/combat.cpp b/engines/xeen/combat.cpp
index 4d0add115a..582444d5e5 100644
--- a/engines/xeen/combat.cpp
+++ b/engines/xeen/combat.cpp
@@ -47,5 +47,9 @@ void Combat::doCombat() {
error("TODO: doCombat");
}
+void Combat::giveCharDamage(int damage, int v2, int v3) {
+ error("TODO: giveCharDamage");
+}
+
} // End of namespace Xeen
diff --git a/engines/xeen/combat.h b/engines/xeen/combat.h
index c5c7f0817b..505874264c 100644
--- a/engines/xeen/combat.h
+++ b/engines/xeen/combat.h
@@ -67,6 +67,8 @@ public:
void clear();
void doCombat();
+
+ void giveCharDamage(int damage, int v2, int v3);
};
} // End of namespace Xeen
diff --git a/engines/xeen/interface.cpp b/engines/xeen/interface.cpp
index f81e5186c7..8a35563ba1 100644
--- a/engines/xeen/interface.cpp
+++ b/engines/xeen/interface.cpp
@@ -569,7 +569,7 @@ void Interface::doStepCode() {
// We can fly, we can.. oh wait, we can't!
damage = 100;
party._damageType = DT_PHYSICAL;
- party._falling = true;
+ _falling = true;
break;
case SURFTYPE_DESERT:
// Without navigation skills, simulate getting lost by adding extra time
@@ -579,7 +579,7 @@ void Interface::doStepCode() {
case SURFTYPE_CLOUD:
if (!party._levitateActive) {
party._damageType = DT_PHYSICAL;
- party._falling = true;
+ _falling = true;
damage = 100;
}
break;
@@ -588,10 +588,10 @@ void Interface::doStepCode() {
}
if (_vm->_files->_isDarkCc && party._gameFlags[374]) {
- party._falling = false;
+ _falling = false;
} else {
- if (party._falling)
- doFalling();
+ if (_falling)
+ startFalling(false);
if ((party._mazePosition.x & 16) || (party._mazePosition.y & 16)) {
if (map._isOutdoors)
@@ -611,17 +611,233 @@ void Interface::doStepCode() {
}
}
-void Interface::doFalling() {
- // TODO
+/**
+ * Start the party falling
+ */
+void Interface::startFalling(bool flag) {
+ Combat &combat = *_vm->_combat;
+ Map &map = *_vm->_map;
+ Party &party = *_vm->_party;
+ Scripts &scripts = *_vm->_scripts;
+ bool isDarkCc = _vm->_files->_isDarkCc;
+
+ if (isDarkCc && party._gameFlags[374]) {
+ _falling = 0;
+ return;
+ }
+
+ _falling = false;
+ draw3d(true);
+ _falling = 2;
+ draw3d(false);
+
+ if (flag) {
+ if (!isDarkCc || party._fallMaze != 0) {
+ party._mazeId = party._fallMaze;
+ party._mazePosition = party._fallPosition;
+ }
+ }
+
+ _falling = true;
+ map.load(party._mazeId);
+ if (flag) {
+ if (((party._mazePosition.x & 16) || (party._mazePosition.y & 16)) &&
+ map._isOutdoors) {
+ map.getNewMaze();
+ }
+ }
+
+ if (isDarkCc) {
+ switch (party._mazeId - 25) {
+ case 0:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ party._mazeId = 24;
+ party._mazePosition = Common::Point(11, 9);
+ break;
+ case 1:
+ case 30:
+ case 31:
+ case 32:
+ case 33:
+ party._mazeId = 12;
+ party._mazePosition = Common::Point(6, 15);
+ break;
+ case 2:
+ case 34:
+ case 35:
+ case 36:
+ case 37:
+ case 51:
+ case 52:
+ case 53:
+ party._mazeId = 15;
+ party._mazePosition = Common::Point(4, 12);
+ party._mazeDirection = DIR_SOUTH;
+ break;
+ case 40:
+ case 41:
+ party._mazeId = 14;
+ party._mazePosition = Common::Point(8, 3);
+ break;
+ case 44:
+ case 45:
+ party._mazeId = 1;
+ party._mazePosition = Common::Point(8, 7);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ case 49:
+ party._mazeId = 12;
+ party._mazePosition = Common::Point(11, 13);
+ party._mazeDirection = DIR_SOUTH;
+ break;
+ case 57:
+ case 58:
+ case 59:
+ party._mazeId = 5;
+ party._mazePosition = Common::Point(12, 7);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ case 60:
+ party._mazeId = 6;
+ party._mazePosition = Common::Point(12, 3);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ default:
+ party._mazeId = 23;
+ party._mazePosition = Common::Point(12, 10);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ }
+ } else {
+ if (party._mazeId > 89 && party._mazeId < 113) {
+ party._mazeId += 168;
+ } else {
+ switch (party._mazeId - 25) {
+ case 0:
+ party._mazeId = 89;
+ party._mazePosition = Common::Point(2, 14);
+ break;
+ case 1:
+ party._mazeId = 109;
+ party._mazePosition = Common::Point(13, 14);
+ break;
+ case 2:
+ party._mazeId = 112;
+ party._mazePosition = Common::Point(13, 3);
+ break;
+ case 3:
+ party._mazeId = 92;
+ party._mazePosition = Common::Point(2, 3);
+ break;
+ case 12:
+ case 13:
+ party._mazeId = 14;
+ party._mazePosition = Common::Point(10, 2);
+ break;
+ case 16:
+ case 17:
+ case 18:
+ party._mazeId = 4;
+ party._mazePosition = Common::Point(5, 14);
+ break;
+ case 20:
+ case 21:
+ case 22:
+ party._mazeId = 21;
+ party._mazePosition = Common::Point(9, 11);
+ break;
+ case 24:
+ case 25:
+ case 26:
+ party._mazeId = 1;
+ party._mazePosition = Common::Point(10, 4);
+ break;
+ case 28:
+ case 29:
+ case 30:
+ case 31:
+ party._mazeId = 26;
+ party._mazePosition = Common::Point(12, 10);
+ break;
+ case 32:
+ case 33:
+ case 34:
+ case 35:
+ party._mazeId = 3;
+ party._mazePosition = Common::Point(4, 9);
+ break;
+ case 36:
+ case 37:
+ case 38:
+ case 39:
+ party._mazeId = 16;
+ party._mazePosition = Common::Point(2, 7);
+ break;
+ case 40:
+ case 41:
+ case 42:
+ case 43:
+ party._mazeId = 23;
+ party._mazePosition = Common::Point(10, 9);
+ break;
+ case 44:
+ case 45:
+ case 46:
+ case 47:
+ party._mazeId = 13;
+ party._mazePosition = Common::Point(2, 10);
+ break;
+ case 103:
+ case 104:
+ map._loadDarkSide = false;
+ party._mazeId = 8;
+ party._mazePosition = Common::Point(11, 15);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ case 105:
+ party._mazeId = 24;
+ party._mazePosition = Common::Point(11, 9);
+ break;
+ case 106:
+ party._mazeId = 12;
+ party._mazePosition = Common::Point(6, 15);
+ break;
+ case 107:
+ party._mazeId = 15;
+ party._mazePosition = Common::Point(4, 12);
+ break;
+ default:
+ party._mazeId = 29;
+ party._mazePosition = Common::Point(25, 21);
+ party._mazeDirection = DIR_NORTH;
+ break;
+ }
+ }
+ }
+
+ _flipGround ^= 1;
+ draw3d(true);
+ int tempVal = scripts._v2;
+ scripts._v2 = 0;
+ combat.giveCharDamage(party._fallDamage, 0, 0);
+ scripts._v2 = tempVal;
+
+ _flipGround ^= 1;
}
+/**
+ * Check movement in the given direction
+ */
bool Interface::checkMoveDirection(int key) {
Map &map = *_vm->_map;
Party &party = *_vm->_party;
SoundManager &sound = *_vm->_sound;
Direction dir = party._mazeDirection;
- switch (_buttonValue) {
+ switch (key) {
case (Common::KBD_CTRL << 16) | Common::KEYCODE_LEFT:
party._mazeDirection = (party._mazeDirection == DIR_NORTH) ? DIR_WEST :
(Direction)(party._mazeDirection - 1);
@@ -948,10 +1164,10 @@ void Interface::draw3d(bool updateFlag) {
// Draw the minimap
drawMiniMap();
- if (party._falling == 1)
+ if (_falling == 1)
handleFalling();
- if (party._falling == 2) {
+ if (_falling == 2) {
screen.saveBackground(1);
}
@@ -991,6 +1207,9 @@ void Interface::draw3d(bool updateFlag) {
events.wait(2);
}
+/**
+ * Handle doing the falling
+ */
void Interface::handleFalling() {
Party &party = *_vm->_party;
Screen &screen = *_vm->_screen;
@@ -1043,17 +1262,23 @@ void Interface::handleFalling() {
}
void Interface::saveFall() {
-
+ // TODO
}
void Interface::fall(int v) {
}
+/**
+ * Shake the screen
+ */
void Interface::shake(int time) {
}
+/**
+ * Draw the minimap
+ */
void Interface::drawMiniMap() {
Map &map = *_vm->_map;
Party &party = *_vm->_party;
diff --git a/engines/xeen/interface.h b/engines/xeen/interface.h
index 4435310233..e4278459af 100644
--- a/engines/xeen/interface.h
+++ b/engines/xeen/interface.h
@@ -98,6 +98,7 @@ private:
public:
int _intrIndex1;
Common::String _interfaceText;
+ int _falling;
public:
Interface(XeenEngine *vm);
@@ -111,7 +112,7 @@ public:
void mainIconsPrint();
- void doFalling();
+ void startFalling(bool v);
void perform();
diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp
index dc58c2db6d..1c7cbd8a39 100644
--- a/engines/xeen/map.cpp
+++ b/engines/xeen/map.cpp
@@ -886,11 +886,12 @@ Map::Map(XeenEngine *vm) : _vm(vm), _mobData(vm) {
}
void Map::load(int mapId) {
+ Interface &intf = *_vm->_interface;
Screen &screen = *_vm->_screen;
IndoorDrawList &indoorList = _vm->_interface->_indoorList;
OutdoorDrawList &outdoorList = _vm->_interface->_outdoorList;
- if (_vm->_party->_falling) {
+ if (intf._falling) {
Window &w = screen._windows[9];
w.open();
w.writeString(OOPS);
diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp
index cd1dc21264..2eb4cc2027 100644
--- a/engines/xeen/party.cpp
+++ b/engines/xeen/party.cpp
@@ -111,7 +111,6 @@ Party::Party(XeenEngine *vm) {
_isNight = false;
_stepped = false;
_damageType = DT_PHYSICAL;
- _falling = false;
_fallMaze = 0;
_fallDamage = 0;
_dead = false;
diff --git a/engines/xeen/party.h b/engines/xeen/party.h
index 58bfbd2c39..4f32cca243 100644
--- a/engines/xeen/party.h
+++ b/engines/xeen/party.h
@@ -121,7 +121,6 @@ public:
bool _newDay;
bool _isNight;
bool _stepped;
- int _falling;
Common::Point _fallPosition;
int _fallMaze;
int _fallDamage;
diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 6ab4c1fe13..086c0d436a 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -804,10 +804,12 @@ void Scripts::cmdExchObj(Common::Array<byte> &params) {
}
void Scripts::cmdFallToMap(Common::Array<byte> &params) {
+ Interface &intf = *_vm->_interface;
Party &party = *_vm->_party;
party._fallMaze = params[0];
party._fallPosition = Common::Point(params[1], params[2]);
party._fallDamage = params[3];
+ intf.startFalling(true);
_lineNum = -1;
}
diff --git a/engines/xeen/scripts.h b/engines/xeen/scripts.h
index d353581497..cc32a9667f 100644
--- a/engines/xeen/scripts.h
+++ b/engines/xeen/scripts.h
@@ -148,7 +148,6 @@ private:
int _mirrorId;
int _refreshIcons;
int _scriptResult;
- int _v2;
bool _scriptExecuted;
bool _var50;
MazeEvent *_event;
@@ -229,6 +228,7 @@ public:
int _whoWill;
int _nEdamageType;
int _itemType;
+ int _v2;
Common::Array<MirrorEntry> _mirror;
public:
Scripts(XeenEngine *vm);