[Scummvm-git-logs] scummvm master -> 93b9eb4e374b360e9d874ed1e65234ea2f80a312

dreammaster dreammaster at scummvm.org
Sat Dec 16 16:04:25 CET 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
93b9eb4e37 XEEN: Added remainder of Arena location


Commit: 93b9eb4e374b360e9d874ed1e65234ea2f80a312
    https://github.com/scummvm/scummvm/commit/93b9eb4e374b360e9d874ed1e65234ea2f80a312
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-12-16T10:04:15-05:00

Commit Message:
XEEN: Added remainder of Arena location

Changed paths:
    engines/xeen/locations.cpp
    engines/xeen/map.cpp
    engines/xeen/map.h
    engines/xeen/resources.cpp
    engines/xeen/resources.h


diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp
index 0ba0d9c..e11f3da 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 f24f99f..8e7b06f 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 19d7cc5..3defc58 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 c85523d..1f3c241 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 0cb9dab..1ad6cff 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





More information about the Scummvm-git-logs mailing list