aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/locations.cpp87
-rw-r--r--engines/xeen/map.cpp37
-rw-r--r--engines/xeen/map.h13
-rw-r--r--engines/xeen/resources.cpp2
-rw-r--r--engines/xeen/resources.h1
5 files changed, 119 insertions, 21 deletions
diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp
index 0ba0d9c035..e11f3daa6d 100644
--- a/engines/xeen/locations.cpp
+++ b/engines/xeen/locations.cpp
@@ -1106,25 +1106,25 @@ ArenaLocation::ArenaLocation() : BaseLocation(ARENA) {
int ArenaLocation::show() {
Map &map = *g_vm->_map;
Party &party = *g_vm->_party;
- Resources &res = *g_vm->_resources;
Windows &windows = *g_vm->_windows;
+ int level, howMany;
+ bool check;
const char *SUFFIXES[10] = { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" };
- if (map._mobData._monsters.size() > 0) {
- for (uint idx = 0; idx < map._mobData._monsters.size(); ++idx) {
- MazeMonster &monster = map._mobData._monsters[idx];
+ Common::Array<MazeMonster> &monsters = map._mobData._monsters;
+
+ if (monsters.size() > 0) {
+ for (uint idx = 0; idx < monsters.size(); ++idx) {
+ MazeMonster &monster = monsters[idx];
if (monster._position.x != 0x80 && monster._position.y != 0x80) {
LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER,
map._events._text[4], 300);
- party._mazeDirection = DIR_EAST;
- party.moveToRunLocation();
- windows.closeAll();
- return 0;
+ goto exit;
}
}
// Give each character the award
- for (int idx = 0; idx < party._activeParty.size(); ++idx) {
+ for (uint idx = 0; idx < party._activeParty.size(); ++idx) {
party._activeParty[idx]._awards[9]++;
}
@@ -1136,24 +1136,18 @@ int ArenaLocation::show() {
LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, msg, 1);
map.load(28);
- party._mazeDirection = DIR_EAST;
- party.moveToRunLocation();
- windows.closeAll();
- return 0;
+ goto exit;
}
for (uint idx = 0; idx < party._activeParty.size(); ++idx) {
if (party._activeParty[idx]._awards[idx] >= 99) {
LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, Res.WARZONE_MAXED, 1);
map.load(28);
- party._mazeDirection = DIR_EAST;
- party.moveToRunLocation();
- windows.closeAll();
- return 0;
+ goto exit;
}
}
- bool check = LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER,
+ check = LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER,
map._events._text[0].c_str(), 300);
if (!check) {
LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER,
@@ -1165,9 +1159,60 @@ int ArenaLocation::show() {
return 0;
}
- LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, Res.WARZONE_LEVEL, 2);
-
- // TODO
+ do {
+ LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, Res.WARZONE_LEVEL, 2);
+ level = NumericInput::show(g_vm, 11, 2, 200);
+ } while (!g_vm->shouldQuit() && level > 10);
+ if (level == 0)
+ goto exit;
+
+ do {
+ LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, Res.WARZONE_HOW_MANY, 2);
+ howMany = NumericInput::show(g_vm, 11, 2, 200);
+ } while (!g_vm->shouldQuit() && howMany > 20);
+ if (howMany == 0)
+ goto exit;
+
+ LocationMessage::show(27, Res.WARZONE_BATTLE_MASTER, map._events._text[2], 300);
+
+ // Clear monsters array
+ party._mazeDirection = DIR_EAST;
+ map._mobData.clearMonsterSprites();
+ monsters.clear();
+ monsters.resize(howMany);
+
+ for (uint idx = 0; idx < monsters.size(); ++idx) {
+ MazeMonster &mon = monsters[idx];
+ mon._spriteId = g_vm->getRandomNumber(1, 7) + (level - 1) * 7;
+ if (mon._spriteId > 67)
+ mon._spriteId -= 3;
+ if (mon._spriteId == 59)
+ mon._spriteId = 60;
+ if (mon._spriteId == 28)
+ mon._spriteId = 29;
+
+ // Set up normal and attack sprites
+ map._mobData.addMonsterSprites(mon);
+
+ mon._position.x = g_vm->getRandomNumber(3, 11);
+ mon._position.y = g_vm->getRandomNumber(2, 10);
+ if ((mon._position.x == 5 || mon._position.x == 10) &&
+ (mon._position.y == 8 || mon._position.y == 4))
+ mon._position.y = 5;
+
+ mon._id = g_vm->getRandomNumber(4);
+ const MonsterStruct &data = map._monsterData[mon._spriteId];
+ mon._hp = data._hp;
+ mon._frame = g_vm->getRandomNumber(7);
+ mon._effect1 = mon._effect2 = data._animationEffect;
+ if (data._animationEffect)
+ mon._effect3 = g_vm->getRandomNumber(7);
+ mon._isAttacking = true;
+ }
+exit:
+ party._mazeDirection = DIR_EAST;
+ party.moveToRunLocation();
+ windows.closeAll();
return 0;
}
diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp
index f24f99f18d..8e7b06f4ce 100644
--- a/engines/xeen/map.cpp
+++ b/engines/xeen/map.cpp
@@ -837,6 +837,43 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
}
}
+void MonsterObjectData::clearMonsterSprites() {
+ _monsterSprites.clear();
+ _monsterAttackSprites.clear();
+}
+
+void MonsterObjectData::addMonsterSprites(MazeMonster &monster) {
+ Map &map = *g_vm->_map;
+ int imgNumber = map._monsterData[monster._spriteId]._imageNumber;
+ uint idx;
+
+ // Find the sprites for the monster, loading them in if necessary
+ for (idx = 0; idx < _monsterSprites.size(); ++idx) {
+ if (_monsterSprites[idx]._spriteId == monster._spriteId) {
+ monster._sprites = &_monsterSprites[idx]._sprites;
+ break;
+ }
+ }
+ if (idx == _monsterSprites.size()) {
+ _monsterSprites.push_back(SpriteResourceEntry(monster._spriteId));
+ _monsterSprites.back()._sprites.load(Common::String::format("%03u.mon", imgNumber));
+ monster._sprites = &_monsterSprites.back()._sprites;
+ }
+
+ // Find the attack sprites for the monster, loading them in if necessary
+ for (idx = 0; idx < _monsterAttackSprites.size(); ++idx) {
+ if (_monsterAttackSprites[idx]._spriteId == monster._spriteId) {
+ monster._attackSprites = &_monsterAttackSprites[idx]._sprites;
+ break;
+ }
+ }
+ if (idx == _monsterAttackSprites.size()) {
+ _monsterAttackSprites.push_back(SpriteResourceEntry(monster._spriteId));
+ _monsterAttackSprites.back()._sprites.load(Common::String::format("%03u.att", imgNumber));
+ monster._attackSprites = &_monsterAttackSprites.back()._sprites;
+ }
+}
+
/*------------------------------------------------------------------------*/
HeadData::HeadData() {
diff --git a/engines/xeen/map.h b/engines/xeen/map.h
index 19d7cc56f5..3defc589bf 100644
--- a/engines/xeen/map.h
+++ b/engines/xeen/map.h
@@ -314,7 +314,20 @@ public:
public:
MonsterObjectData(XeenEngine *vm);
+ /**
+ * Synchronizes the data
+ */
void synchronize(XeenSerializer &s, MonsterData &monsterData);
+
+ /**
+ * Clears the current list of monster sprites
+ */
+ void clearMonsterSprites();
+
+ /**
+ * Load the normal and attack sprites for a given monster
+ */
+ void addMonsterSprites(MazeMonster &monster);
};
class HeadData {
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index c85523dd62..1f3c241341 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -1624,4 +1624,6 @@ const char *const Resources::WARZONE_MAXED = "What! You again? Go pick on some
const char *const Resources::WARZONE_LEVEL = "What level of monsters? (1-10)\n";
+const char *const Resources::WARZONE_HOW_MANY = "How many monsters? (1-20)\n";
+
} // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index 0cb9dab3c0..1ad6cfff61 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -350,6 +350,7 @@ public:
static const char *const WARZONE_BATTLE_MASTER;
static const char *const WARZONE_MAXED;
static const char *const WARZONE_LEVEL;
+ static const char *const WARZONE_HOW_MANY;
public:
/**
* Initializes an instnace of the resources