aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2018-02-20 18:50:17 -0500
committerPaul Gilbert2018-02-23 15:23:20 -0500
commit900ef91aca039dc23e4cf300070f7fa5f6f3a335 (patch)
tree3fb56a267ea2d8d3b36689eb302d44238645879e /engines
parent1b85d1dbc966b909f9ff9c9cc0eaac4b8ab872ae (diff)
downloadscummvm-rg350-900ef91aca039dc23e4cf300070f7fa5f6f3a335.tar.gz
scummvm-rg350-900ef91aca039dc23e4cf300070f7fa5f6f3a335.tar.bz2
scummvm-rg350-900ef91aca039dc23e4cf300070f7fa5f6f3a335.zip
XEEN: Creation of create_xeen tool
Diffstat (limited to 'engines')
-rw-r--r--engines/xeen/character.cpp24
-rw-r--r--engines/xeen/character.h4
-rw-r--r--engines/xeen/dialogs_char_info.cpp16
-rw-r--r--engines/xeen/dialogs_create_char.cpp2
-rw-r--r--engines/xeen/dialogs_items.cpp2
-rw-r--r--engines/xeen/dialogs_quests.cpp2
-rw-r--r--engines/xeen/dialogs_spells.cpp2
-rw-r--r--engines/xeen/files.cpp42
-rw-r--r--engines/xeen/files.h6
-rw-r--r--engines/xeen/locations.cpp2
-rw-r--r--engines/xeen/map.cpp42
-rw-r--r--engines/xeen/party.cpp6
-rw-r--r--engines/xeen/resources.cpp2039
-rw-r--r--engines/xeen/resources.h736
-rw-r--r--engines/xeen/scripts.cpp2
-rw-r--r--engines/xeen/worldofxeen/darkside_cutscenes.cpp10
-rw-r--r--engines/xeen/worldofxeen/darkside_cutscenes.h8
-rw-r--r--engines/xeen/xeen.cpp26
-rw-r--r--engines/xeen/xeen.h10
19 files changed, 865 insertions, 2116 deletions
diff --git a/engines/xeen/character.cpp b/engines/xeen/character.cpp
index 7fc17a5e84..d98142eacb 100644
--- a/engines/xeen/character.cpp
+++ b/engines/xeen/character.cpp
@@ -61,7 +61,7 @@ AttributeCategory XeenItem::getAttributeCategory() const {
return (AttributeCategory)idx;
}
-const char *XeenItem::getItemName(ItemCategory category, uint id) {
+const Common::String &XeenItem::getItemName(ItemCategory category, uint id) {
if (id < 82)
return Res.ITEM_NAMES[category][id];
@@ -294,7 +294,7 @@ Common::String WeaponItems::getFullDescription(int itemIndex, int displayNum) {
(i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN : "",
(i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED : "",
displayNum,
- Res.WEAPON_NAMES[i._id],
+ Res.WEAPON_NAMES[i._id].c_str(),
!i._bonusFlags ? "" : Res.BONUS_NAMES[i._bonusFlags & ITEMFLAG_BONUS_MASK],
(i._bonusFlags & (ITEMFLAG_BROKEN | ITEMFLAG_CURSED)) ||
!i._bonusFlags ? "\b " : ""
@@ -451,10 +451,10 @@ Common::String ArmorItems::getFullDescription(int itemIndex, int displayNum) {
return Common::String::format("\f%02u%s%s%s\f%02u%s%s", displayNum,
!i._bonusFlags ? "" : res._maeNames[i._material].c_str(),
- (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN : "",
- (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED : "",
+ (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN.c_str() : "",
+ (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED.c_str() : "",
displayNum,
- Res.ARMOR_NAMES[i._id],
+ Res.ARMOR_NAMES[i._id].c_str(),
(i._bonusFlags & (ITEMFLAG_BROKEN | ITEMFLAG_CURSED)) ||
!i._bonusFlags ? "\b " : ""
);
@@ -568,10 +568,10 @@ Common::String AccessoryItems::getFullDescription(int itemIndex, int displayNum)
return Common::String::format("\f%02u%s%s%s\f%02u%s%s", displayNum,
!i._bonusFlags ? "" : res._maeNames[i._material].c_str(),
- (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN : "",
- (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED : "",
+ (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN.c_str() : "",
+ (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED.c_str() : "",
displayNum,
- Res.ARMOR_NAMES[i._id],
+ Res.ARMOR_NAMES[i._id].c_str(),
(i._bonusFlags & (ITEMFLAG_BROKEN | ITEMFLAG_CURSED)) ||
!i._bonusFlags ? "\b " : ""
);
@@ -614,10 +614,10 @@ Common::String MiscItems::getFullDescription(int itemIndex, int displayNum) {
return Common::String::format("\f%02u%s%s%s\f%02u%s%s", displayNum,
!i._bonusFlags ? "" : res._maeNames[i._material].c_str(),
- (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN : "",
- (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED : "",
+ (i._bonusFlags & ITEMFLAG_BROKEN) ? Res.ITEM_BROKEN.c_str() : "",
+ (i._bonusFlags & ITEMFLAG_CURSED) ? Res.ITEM_CURSED.c_str() : "",
displayNum,
- Res.ARMOR_NAMES[i._id],
+ Res.ARMOR_NAMES[i._id].c_str(),
(i._bonusFlags & (ITEMFLAG_BROKEN | ITEMFLAG_CURSED)) ||
!i._id ? "\b " : ""
);
@@ -993,7 +993,7 @@ int Character::statColor(int amount, int threshold) {
int Character::statBonus(uint statValue) const {
int idx;
- for (idx = 0; Res.STAT_VALUES[idx] <= statValue; ++idx)
+ for (idx = 0; Res.STAT_VALUES[idx] <= (int)statValue; ++idx)
;
return Res.STAT_BONUSES[idx];
diff --git a/engines/xeen/character.h b/engines/xeen/character.h
index bf4966c348..480215aa67 100644
--- a/engines/xeen/character.h
+++ b/engines/xeen/character.h
@@ -106,7 +106,7 @@ public:
/**
* Return the name of the item
*/
- static const char *getItemName(ItemCategory category, uint id);
+ static const Common::String &getItemName(ItemCategory category, uint id);
public:
XeenItem();
@@ -140,7 +140,7 @@ class InventoryItems : public Common::Array<XeenItem> {
protected:
Character *_character;
ItemCategory _category;
- const char *const *_names;
+ const Common::String *_names;
XeenEngine *getVm();
void equipError(int itemIndex1, ItemCategory category1, int itemIndex2,
diff --git a/engines/xeen/dialogs_char_info.cpp b/engines/xeen/dialogs_char_info.cpp
index b7a7df8c85..132fbd5a4b 100644
--- a/engines/xeen/dialogs_char_info.cpp
+++ b/engines/xeen/dialogs_char_info.cpp
@@ -359,7 +359,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
stat1 = c.getStat((Attribute)attrib, false);
stat2 = c.getStat((Attribute)attrib, true);
idx = 0;
- while (Res.STAT_VALUES[idx] <= stat1)
+ while (Res.STAT_VALUES[idx] <= (int)stat1)
++idx;
msg = Common::String::format(Res.CURRENT_MAXIMUM_RATING_TEXT, Res.STAT_NAMES[attrib],
@@ -434,9 +434,9 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
if (c._skills[skill]) {
if (skill == THIEVERY) {
lines[0] = Common::String::format("\n\t020%s%u",
- Res.SKILL_NAMES[THIEVERY], c.getThievery());
+ Res.SKILL_NAMES[THIEVERY].c_str(), c.getThievery());
} else {
- lines[skill] = Common::String::format("\n\t020%s", Res.SKILL_NAMES[skill]);
+ lines[skill] = Common::String::format("\n\t020%s", Res.SKILL_NAMES[skill].c_str());
}
}
}
@@ -446,7 +446,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
}
msg = Common::String::format("\x2\x3""c%s\x3l%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
- Res.STAT_NAMES[attrib], lines[0].c_str(), lines[1].c_str(),
+ Res.STAT_NAMES[attrib].c_str(), lines[0].c_str(), lines[1].c_str(),
lines[2].c_str(), lines[3].c_str(), lines[4].c_str(), lines[5].c_str(),
lines[17].c_str(), lines[6].c_str(), lines[7].c_str(), lines[8].c_str(),
lines[9].c_str(), lines[10].c_str(), lines[11].c_str(), lines[12].c_str(),
@@ -505,10 +505,10 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
if (c._conditions[condition]) {
if (condition >= UNCONSCIOUS) {
lines[condition] = Common::String::format("\n\t020%s",
- Res.CONDITION_NAMES[condition]);
+ Res.CONDITION_NAMES[condition].c_str());
} else {
lines[condition] = Common::String::format("\n\t020%s\t095-%d",
- Res.CONDITION_NAMES[condition], c._conditions[condition]);
+ Res.CONDITION_NAMES[condition].c_str(), c._conditions[condition]);
}
++total;
@@ -517,7 +517,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
Condition condition = c.worstCondition();
if (condition == NO_CONDITION) {
- lines[0] = Common::String::format("\n\t020%s", Res.GOOD);
+ lines[0] = Common::String::format("\n\t020%s", Res.GOOD.c_str());
++total;
}
@@ -531,7 +531,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) {
lines[19] = Common::String::format(Res.HEROISM, party._heroism);
msg = Common::String::format("\x2\x3""c%s\x3l%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\x1",
- Res.CONSUMABLE_NAMES[3], lines[0].c_str(), lines[1].c_str(),
+ Res.CONSUMABLE_NAMES[3].c_str(), lines[0].c_str(), lines[1].c_str(),
lines[2].c_str(), lines[3].c_str(), lines[4].c_str(),
lines[5].c_str(), lines[6].c_str(), lines[7].c_str(),
lines[8].c_str(), lines[9].c_str(), lines[10].c_str(),
diff --git a/engines/xeen/dialogs_create_char.cpp b/engines/xeen/dialogs_create_char.cpp
index 73aa4b3f02..c1c6bc8c04 100644
--- a/engines/xeen/dialogs_create_char.cpp
+++ b/engines/xeen/dialogs_create_char.cpp
@@ -384,7 +384,7 @@ int CreateCharacterDialog::newCharDetails(Race race, Sex sex, int classId,
// If a class is provided, set the class name
if (classId != -1) {
- classStr = Common::String::format("\t062\v168%s", Res.CLASS_NAMES[classId]);
+ classStr = Common::String::format("\t062\v168%s", Res.CLASS_NAMES[classId].c_str());
}
// Set up default skill for the race, if any
diff --git a/engines/xeen/dialogs_items.cpp b/engines/xeen/dialogs_items.cpp
index c9249f3b74..bbf7fa4ab8 100644
--- a/engines/xeen/dialogs_items.cpp
+++ b/engines/xeen/dialogs_items.cpp
@@ -1052,7 +1052,7 @@ void ItemsDialog::itemToGold(Character &c, int itemIndex, ItemCategory category,
if (category == CATEGORY_WEAPON && item._id == 34) {
sound.playFX(21);
ErrorScroll::show(_vm, Common::String::format("\v012\t000\x03""c%s",
- Res.SPELL_FAILED));
+ Res.SPELL_FAILED.c_str()));
} else if (item._id != 0) {
// There is a valid item present
// Calculate cost of item and add it to the party's total
diff --git a/engines/xeen/dialogs_quests.cpp b/engines/xeen/dialogs_quests.cpp
index 5e5171ea87..73035b3bb9 100644
--- a/engines/xeen/dialogs_quests.cpp
+++ b/engines/xeen/dialogs_quests.cpp
@@ -91,7 +91,7 @@ void Quests::execute() {
case 83:
case 84:
lines[count++] = Common::String::format("%d %s%c",
- party._questItems[idx], Res.QUEST_ITEM_NAMES[idx],
+ party._questItems[idx], Res.QUEST_ITEM_NAMES[idx].c_str(),
party._questItems[idx] == 1 ? ' ' : 's');
break;
default:
diff --git a/engines/xeen/dialogs_spells.cpp b/engines/xeen/dialogs_spells.cpp
index cd31d5b3be..96917e225c 100644
--- a/engines/xeen/dialogs_spells.cpp
+++ b/engines/xeen/dialogs_spells.cpp
@@ -345,7 +345,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) {
if (party._mazeId == 49 || party._mazeId == 37) {
for (uint spellId = 0; spellId < 76; ++spellId) {
int idx = 0;
- while (idx < MAX_SPELLS_PER_CLASS && Res.SPELLS_ALLOWED[category][idx] != spellId)
+ while (idx < MAX_SPELLS_PER_CLASS && Res.SPELLS_ALLOWED[category][idx] != (int)spellId)
++idx;
// Handling if the spell is appropriate for the character's class
diff --git a/engines/xeen/files.cpp b/engines/xeen/files.cpp
index 3d536a4194..2ba3b6f993 100644
--- a/engines/xeen/files.cpp
+++ b/engines/xeen/files.cpp
@@ -218,16 +218,25 @@ Common::SeekableReadStream *CCArchive::createReadStreamForMember(const Common::S
/*------------------------------------------------------------------------*/
FileManager::FileManager(XeenEngine *vm) {
- Common::File f;
_isDarkCc = vm->getGameID() == GType_DarkSide;
-
- if (vm->getGameID() == GType_Swords) {
+ File::_xeenCc = File::_darkCc = nullptr;
+}
+
+FileManager::~FileManager() {
+ SearchMan.remove("intro");
+ SearchMan.remove("data");
+ delete File::_xeenCc;
+ delete File::_darkCc;
+}
+
+bool FileManager::setup() {
+ if (g_vm->getGameID() == GType_Swords) {
File::_xeenCc = nullptr;
File::_darkCc = new CCArchive("swrd.cc", "xeen", true);
} else {
- File::_xeenCc = (vm->getGameID() == GType_DarkSide) ? nullptr :
+ File::_xeenCc = (g_vm->getGameID() == GType_DarkSide) ? nullptr :
new CCArchive("xeen.cc", "xeen", true);
- File::_darkCc = (vm->getGameID() == GType_Clouds) ? nullptr :
+ File::_darkCc = (g_vm->getGameID() == GType_Clouds) ? nullptr :
new CCArchive("dark.cc", "dark", true);
}
@@ -236,15 +245,26 @@ FileManager::FileManager(XeenEngine *vm) {
SearchMan.add("intro", File::_introCc);
}
- File::_currentArchive = vm->getGameID() == GType_DarkSide || vm->getGameID() == GType_Swords ?
+ File::_currentArchive = g_vm->getGameID() == GType_DarkSide || g_vm->getGameID() == GType_Swords ?
File::_darkCc : File::_xeenCc;
assert(File::_currentArchive);
-}
-FileManager::~FileManager() {
- SearchMan.remove("intro");
- delete File::_xeenCc;
- delete File::_darkCc;
+ // Ensure the custom CC archive is present
+ File f;
+ if (!f.exists("xeen.ccs")) {
+ g_vm->GUIError("Could not find xeen.ccs data file");
+ return false;
+ }
+
+ // Verify the version of the CC is correct
+ CCArchive *dataCc = new CCArchive("xeen.ccs", "data", true);
+ if (!f.open("VERSION", *dataCc) || f.readUint32LE() != 1) {
+ g_vm->GUIError("xeen.ccs is out of date");
+ return false;
+ }
+ SearchMan.add("data", dataCc);
+
+ return true;
}
void FileManager::setGameCc(int ccMode) {
diff --git a/engines/xeen/files.h b/engines/xeen/files.h
index 3a4c4b1054..4ceadcd753 100644
--- a/engines/xeen/files.h
+++ b/engines/xeen/files.h
@@ -90,6 +90,12 @@ public:
~FileManager();
/**
+ * Sets up the CC files
+ * @returns Returns true if the setup was successful
+ */
+ bool setup();
+
+ /**
* Set which game side files to use
* @param ccMode 0=Clouds, 1=Dark Side
*/
diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp
index 7a8290504a..53a1c80c48 100644
--- a/engines/xeen/locations.cpp
+++ b/engines/xeen/locations.cpp
@@ -69,7 +69,7 @@ int BaseLocation::show() {
// Load the needed sprite sets for the location
for (uint idx = 0; idx < _townSprites.size(); ++idx) {
Common::String shapesName = Common::String::format("%s%d.twn",
- Res.TOWN_ACTION_SHAPES[_locationActionId], idx + 1);
+ Res.TOWN_ACTION_SHAPES[_locationActionId].c_str(), idx + 1);
_townSprites[idx].load(shapesName);
}
diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp
index 8bb04b1eeb..58a294c610 100644
--- a/engines/xeen/map.cpp
+++ b/engines/xeen/map.cpp
@@ -38,24 +38,6 @@ const int MAP_GRID_PRIOR_INDEX2[] = { 0, 0, 0, 0, 2, 3, 4, 1, 0 };
const int MAP_GRID_PRIOR_DIRECTION2[] = { 0, 1, 2, 3, 0, 1, 2, 3, 0 };
-const char *const MUSIC_FILES1[5] = {
- "outdoors.m", "town.m", "cavern.m", "dungeon.m", "castle.m"
-};
-
-const char *const MUSIC_FILES2[6][7] = {
- { "outday1.m", "outday2.m", "outday4.m", "outnght1.m",
- "outnght2.m", "outnght4.m", "daydesrt.m" },
- { "townday1.m", "twnwlk.m", "newbrigh.m", "twnnitea.m",
- "twnniteb.m", "twnwlk.m", "townday1.m" },
- { "cavern1.m", "cavern2.m", "cavern3a.m", "cavern1.m",
- "cavern2.m", "cavern3a.m", "cavern1.m" },
- { "dngon1.m", "dngon2.m", "dngon3.m", "dngon1.m",
- "dngon2.m", "dngon3.m", "dngon1.m" },
- { "cstl1rev.m", "cstl2rev.m", "cstl3rev.m", "cstl1rev.m",
- "cstl2rev.m", "cstl3rev.m", "cstl1rev.m" },
- { "sf05.m", "sf05.m", "sf05.m", "sf05.m", "sf05.m", "sf05.m", "sf05.m" }
-};
-
MonsterStruct::MonsterStruct() {
_experience = 0;
_hp = 0;
@@ -1194,7 +1176,7 @@ void Map::load(int mapId) {
if (_vm->_files->_isDarkCc) {
int randIndex = _vm->getRandomNumber(6);
- musName = MUSIC_FILES2[_mazeData->_wallKind][randIndex];
+ musName = Res.MUSIC_FILES2[_mazeData->_wallKind][randIndex];
} else {
musName = "outdoors.m";
}
@@ -1213,7 +1195,7 @@ void Map::load(int mapId) {
if (_mazeData[0]._wallTypes[i] != 0) {
_wallSprites._surfaces[i].load(Common::String::format("%s.wal",
- Res.OUTDOORS_WALL_TYPES[_mazeData[0]._wallTypes[i]]));
+ Res.OUTDOORS_WALL_TYPES[_mazeData[0]._wallTypes[i]].c_str()));
}
_surfaceSprites[i].clear();
@@ -1232,20 +1214,20 @@ void Map::load(int mapId) {
_sideMusic = isDarkCc;
if (isDarkCc) {
int randIndex = _vm->getRandomNumber(6);
- musName = MUSIC_FILES2[MUS_INDEXES[_mazeData->_wallKind]][randIndex];
+ musName = Res.MUSIC_FILES2[MUS_INDEXES[_mazeData->_wallKind]][randIndex];
} else {
- musName = MUSIC_FILES1[MUS_INDEXES[_mazeData->_wallKind]];
+ musName = Res.MUSIC_FILES1[MUS_INDEXES[_mazeData->_wallKind]];
}
if (musName != sound._currentMusic)
sound.playSong(musName, 207);
// Load sprite sets needed for scene rendering
_skySprites[1].load(Common::String::format("%s.sky",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_groundSprites.load(Common::String::format("%s.gnd",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_tileSprites.load(Common::String::format("%s.til",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
for (int i = 0; i < TOTAL_SURFACES; ++i) {
_surfaceSprites[i].clear();
@@ -1258,15 +1240,15 @@ void Map::load(int mapId) {
_wallSprites._surfaces[i].clear();
_wallSprites._fwl1.load(Common::String::format("f%s1.fwl",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_wallSprites._fwl2.load(Common::String::format("f%s2.fwl",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_wallSprites._fwl3.load(Common::String::format("f%s3.fwl",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_wallSprites._fwl4.load(Common::String::format("f%s4.fwl",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
_wallSprites._swl.load(Common::String::format("s%s.swl",
- Res.TERRAIN_TYPES[_mazeData[0]._wallKind]));
+ Res.TERRAIN_TYPES[_mazeData[0]._wallKind].c_str()));
// Set entries in the indoor draw list to the correct sprites
// for drawing various parts of the background
diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp
index dcbc7def44..68bc7685cb 100644
--- a/engines/xeen/party.cpp
+++ b/engines/xeen/party.cpp
@@ -720,7 +720,7 @@ void Party::giveTreasureToCharacter(Character &c, ItemCategory category, int ite
w.update();
events.ipause(5);
- const char *itemName = XeenItem::getItemName(category, treasureItem._id);
+ const char *itemName = XeenItem::getItemName(category, treasureItem._id).c_str();
w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), itemName));
w.update();
events.ipause(5);
@@ -817,7 +817,7 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
}
for (int idx = 0; idx < 39; ++idx) {
- if (Res.SPELLS_ALLOWED[idx2][idx] == takeVal) {
+ if (Res.SPELLS_ALLOWED[idx2][idx] == (int)takeVal) {
ps._spells[idx] = false;
break;
}
@@ -1086,7 +1086,7 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int
}
for (int idx = 0; idx < 39; ++idx) {
- if (Res.SPELLS_ALLOWED[idx2][idx] == giveVal) {
+ if (Res.SPELLS_ALLOWED[idx2][idx] == (int)giveVal) {
ps._spells[idx] = true;
intf.spellFX(&ps);
break;
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index 7048726fad..86dc4413f8 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -30,16 +30,6 @@ namespace Xeen {
Resources *g_resources;
-Resources *Resources::init(XeenEngine *vm) {
- if (vm->getGameID() == GType_Clouds || vm->getGameID() == GType_DarkSide
- || vm->getGameID() == GType_WorldOfXeen)
- g_resources = new WorldOfXeen::WorldOfXeenResources();
- else
- g_resources = new Resources();
-
- return g_resources;
-}
-
Resources::Resources() {
g_resources = this;
g_vm->_files->setGameCc(1);
@@ -50,1702 +40,343 @@ Resources::Resources() {
while (f.pos() < f.size())
_maeNames.push_back(f.readString());
f.close();
-}
-
-/*------------------------------------------------------------------------*/
-
-const char *const Resources::CREDITS =
- "\013""012\010""000\003""c\014""35Designed and Directed By:\n"
- "\014""17Jon Van Caneghem\003""l\n"
- "\n"
- "\t025\014""35Programming:\n"
- "\t035\014""17Mark Caldwell\n"
- "\t035Dave Hathaway\n"
- "\n"
- "\t025\014""35Sound System & FX:\n"
- "\t035\014""17Mike Heilemann\n"
- "\n"
- "\t025\014""35Music & Speech:\n"
- "\t035\014""17Tim Tully\n"
- "\n"
- "\t025\014""35Writing:\n"
- "\t035\014""17Paul Rattner\n"
- "\t035Debbie Van Caneghem\n"
- "\t035Jon Van Caneghem\013""012\n"
- "\n"
- "\n"
- "\t180\014""35Graphics:\n"
- "\t190\014""17Jonathan P. Gwyn\n"
- "\t190Bonita Long-Hemsath\n"
- "\t190Julia Ulano\n"
- "\t190Ricardo Barrera\n"
- "\n"
- "\t180\014""35Testing:\n"
- "\t190\014""17Benjamin Bent\n"
- "\t190Christian Dailey\n"
- "\t190Mario Escamilla\n"
- "\t190Marco Hunter\n"
- "\t190Robert J. Lupo\n"
- "\t190Clayton Retzer\n"
- "\t190David Vela\003""c";
-
-const char *const Resources::OPTIONS_TITLE =
- "\x0D\x01\003""c\014""dMight and Magic Options\n"
- "World of Xeen\x02\n"
- "\v117Copyright (c) 1993 NWC, Inc.\n"
- "All Rights Reserved\x01";
-
-const char *const Resources::THE_PARTY_NEEDS_REST = "\x0B""012The Party needs rest!";
-
-const char *const Resources::WHO_WILL = "\x03""c\x0B""000\x09""000%s\x0A\x0A"
- "Who will\x0A%s?\x0A\x0B""055F1 - F%d";
-
-const char *const Resources::HOW_MUCH = "\x3""cHow Much\n\n";
-
-const char *const Resources::WHATS_THE_PASSWORD = "What's the Password?";
-
-const char *const Resources::IN_NO_CONDITION = "\x0B""007%s is not in any condition to perform actions!";
-
-const char *const Resources::NOTHING_HERE = "\x03""c\x0B""010Nothing here.";
-
-const char *const Resources::TERRAIN_TYPES[6] = {
- "town", "cave", "towr", "cstl", "dung", "scfi"
-};
-
-const char *const Resources::OUTDOORS_WALL_TYPES[16] = {
- nullptr, "mount", "ltree", "dtree", "grass", "snotree", "dsnotree",
- "snomnt", "dedltree", "mount", "lavamnt", "palm", "dmount", "dedltree",
- "dedltree", "dedltree"
-};
-
-const char *const Resources::SURFACE_NAMES[16] = {
- "water.srf", "dirt.srf", "grass.srf", "snow.srf", "swamp.srf",
- "lava.srf", "desert.srf", "road.srf", "dwater.srf", "tflr.srf",
- "sky.srf", "croad.srf", "sewer.srf", "cloud.srf", "scortch.srf",
- "space.srf"
-};
-
-const char *const Resources::WHO_ACTIONS[32] = {
- "search", "open", "drink", "mine", "touch", "read", "learn", "take",
- "bang", "steal", "bribe", "pay", "sit", "try", "turn", "bathe",
- "destroy", "pull", "descend", "toss a coin", "pray", "join", "act",
- "play", "push", "rub", "pick", "eat", "sign", "close", "look", "try"
-};
-
-const char *const Resources::WHO_WILL_ACTIONS[4] = {
- "Open Grate", "Open Door", "Open Scroll", "Select Char"
-};
-
-const byte Resources::SYMBOLS[20][64] = {
- { // 0
- 0x00, 0x00, 0xA8, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x00, 0xA8, 0x9E, 0x9C, 0x9C, 0x9E, 0x9E, 0x9E,
- 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0x9A, 0x9A, 0x9A, 0xAC, 0x9E, 0xAC, 0xA8, 0xA8, 0xA6, 0x97, 0x98,
- 0xAC, 0xA0, 0xAC, 0xAC, 0xA4, 0xA6, 0x98, 0x99, 0x00, 0xAC, 0xA0, 0xA0, 0xA8, 0xAC, 0x9A, 0x9A,
- 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xA4, 0x9B, 0x9A, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0x9B,
- },
- { // 1
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
- 0x99, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97,
- 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
- 0x9A, 0x9B, 0x9B, 0x9C, 0x9B, 0x9A, 0x9C, 0x9A, 0x9B, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x9A, 0x9B,
- },
- { // 2
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
- 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x97, 0x98, 0x98,
- 0x99, 0x98, 0x98, 0x98, 0x99, 0x99, 0x98, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
- 0x9B, 0x9B, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9B, 0x99, 0x9A, 0x9B, 0x9B, 0x9A, 0x9A, 0x99, 0x9A,
- },
- { // 3
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
- 0x99, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x98, 0x98, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98,
- 0x99, 0x99, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
- 0x9B, 0x9C, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x9A,
- },
- { // 4
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E,
- 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x9A, 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98,
- 0x99, 0x99, 0x98, 0x99, 0x99, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A,
- 0x9A, 0x9C, 0x9B, 0x9B, 0x9C, 0x9B, 0x9B, 0x9B, 0x9A, 0x99, 0x9B, 0x9B, 0x9A, 0x99, 0x9A, 0x9A,
- },
- { // 5
- 0xA4, 0xA4, 0xA8, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x9E, 0x9E, 0xA0, 0xA8, 0xAC, 0x00, 0x00,
- 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9E, 0xAC, 0x00, 0x97, 0x97, 0x97, 0x98, 0x9C, 0x9C, 0xA0, 0xAC,
- 0x99, 0x98, 0x99, 0x99, 0x99, 0x9B, 0xA0, 0xAC, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0xA0, 0xAC,
- 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x9A, 0x9A, 0x9B, 0x9B, 0xA4, 0xAC, 0x00,
- },
- { // 6
- 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9B, 0x99,
- 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x98, 0x99, 0x99,
- 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A, 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x99, 0x99, 0x99,
- 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99,
- },
- { // 7
- 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x9C, 0x99, 0x99,
- 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99,
- 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0xA0, 0x9E, 0x9C, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9C, 0x99, 0x99,
- },
- { // 8
- 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9B, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9C, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9E, 0x9C, 0x99,
- },
- { // 9
- 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x9C, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A,
- 0xAC, 0xA4, 0x9C, 0x9A, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99,
- 0x00, 0xAC, 0xA4, 0x9C, 0x9A, 0x9C, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9A, 0x99, 0x99,
- },
- { // 10
- 0x99, 0x99, 0x99, 0x9A, 0xA0, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00,
- 0x99, 0x99, 0x9C, 0x9E, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9C, 0x99, 0x9C, 0xA4, 0xAC, 0x00,
- 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00,
- 0x99, 0x99, 0x99, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9A, 0x9B, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00,
- },
- { // 11
- 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9E, 0xAC,
- 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC,
- 0x9C, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x9E, 0x9E, 0x9C, 0x9C, 0xA0, 0xAC, 0x00,
- },
- { // 12
- 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9B, 0x9C, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC,
- 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00,
- 0x99, 0x99, 0x9C, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC,
- },
- { // 13
- 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00,
- 0x99, 0x9B, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9A, 0x99, 0x9C, 0xA0, 0xAC, 0x00,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC,
- 0x99, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x00,
- },
- { // 14
- 0x00, 0x00, 0xAC, 0x9E, 0x9C, 0x9C, 0x9C, 0x9B, 0x00, 0xAC, 0x9C, 0xA0, 0x9E, 0xA4, 0xA4, 0xA4,
- 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0xAC, 0x9C, 0x9E, 0xAC, 0xA0, 0xAC, 0xA8, 0x9E, 0xA8, 0xAC, 0x99,
- 0xAC, 0x9E, 0xAC, 0xA8, 0xAC, 0x9E, 0xA4, 0xAC, 0xAC, 0xA4, 0xA0, 0xAC, 0xAC, 0xA0, 0xA4, 0xAC,
- 0x00, 0xAC, 0xA4, 0xA0, 0xA0, 0xA4, 0xAC, 0xA4, 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
- },
- { // 15
- 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
- 0x9E, 0x9E, 0x9E, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x99, 0x98,
- 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E, 0x9E, 0xA0,
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
- },
- { // 16
- 0x9B, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0x9C, 0x9C, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
- 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x99,
- 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0x9E, 0xA0, 0x9E, 0x9E, 0xA0,
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
- },
- { // 17
- 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
- 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x9E, 0x98, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0x99, 0x98,
- 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9C, 0xA0, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E,
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
- },
- { // 18
- 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,
- 0x9E, 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x98, 0x99,
- 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0,
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,
- },
- { // 19
- 0x9C, 0x9B, 0x9C, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0x00,
- 0x9E, 0x9E, 0x9C, 0x9C, 0x9E, 0xA0, 0xAC, 0x00, 0x99, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0xA0, 0xAC,
- 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0xA0, 0xA0, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0xAC,
- 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0x00, 0x00,
- }
-};
-
-const byte Resources::TEXT_COLORS[40][4] = {
- { 0x00, 0x19, 0x19, 0x19 },
- { 0x00, 0x08, 0x08, 0x08 },
- { 0x00, 0x0F, 0x0F, 0x0F },
- { 0x00, 0x15, 0x15, 0x15 },
- { 0x00, 0x01, 0x01, 0x01 },
- { 0x00, 0x21, 0x21, 0x21 },
- { 0x00, 0x26, 0x26, 0x26 },
- { 0x00, 0x2B, 0x2B, 0x2B },
- { 0x00, 0x31, 0x31, 0x31 },
- { 0x00, 0x36, 0x36, 0x36 },
- { 0x00, 0x3D, 0x3D, 0x3D },
- { 0x00, 0x41, 0x41, 0x41 },
- { 0x00, 0x46, 0x46, 0x46 },
- { 0x00, 0x4C, 0x4C, 0x4C },
- { 0x00, 0x50, 0x50, 0x50 },
- { 0x00, 0x55, 0x55, 0x55 },
- { 0x00, 0x5D, 0x5D, 0x5D },
- { 0x00, 0x60, 0x60, 0x60 },
- { 0x00, 0x65, 0x65, 0x65 },
- { 0x00, 0x6C, 0x6C, 0x6C },
- { 0x00, 0x70, 0x70, 0x70 },
- { 0x00, 0x75, 0x75, 0x75 },
- { 0x00, 0x7B, 0x7B, 0x7B },
- { 0x00, 0x80, 0x80, 0x80 },
- { 0x00, 0x85, 0x85, 0x85 },
- { 0x00, 0x8D, 0x8D, 0x8D },
- { 0x00, 0x90, 0x90, 0x90 },
- { 0x00, 0x97, 0x97, 0x97 },
- { 0x00, 0x9D, 0x9D, 0x9D },
- { 0x00, 0xA4, 0xA4, 0xA4 },
- { 0x00, 0xAB, 0xAB, 0xAB },
- { 0x00, 0xB0, 0xB0, 0xB0 },
- { 0x00, 0xB6, 0xB6, 0xB6 },
- { 0x00, 0xBD, 0xBD, 0xBD },
- { 0x00, 0xC0, 0xC0, 0xC0 },
- { 0x00, 0xC6, 0xC6, 0xC6 },
- { 0x00, 0xCD, 0xCD, 0xCD },
- { 0x00, 0xD0, 0xD0, 0xD0 },
- { 0x00, 0xD6, 0xD6, 0xD6 },
- { 0x00, 0xDB, 0xDB, 0xDB },
-};
-
-const char *const Resources::DIRECTION_TEXT_UPPER[4] = { "NORTH", "EAST", "SOUTH", "WEST" };
-
-const char *const Resources::DIRECTION_TEXT[4] = { "North", "East", "South", "West" };
-
-const char *const Resources::RACE_NAMES[5] = { "Human", "Elf", "Dwarf", "Gnome", "H-Orc" };
-
-const int Resources::RACE_HP_BONUSES[5] = { 0, -2, 1, -1, 2 };
-
-const int Resources::RACE_SP_BONUSES[5][2] = {
- { 0, 0 }, { 2, 0 }, { -1, -1 }, { 1, 1 }, { -2, -2 }
-};
-
-const char *const Resources::ALIGNMENT_NAMES[3] = { "Good", "Neutral", "Evil" };
-
-const char *const Resources::SEX_NAMES[2] = { "Male", "Female" };
-
-const char *const Resources::SKILL_NAMES[18] = {
- "Thievery\t100", "Arms Master", "Astrologer", "Body Builder", "Cartographer",
- "Crusader", "Direction Sense", "Linguist", "Merchant", "Mountaineer",
- "Navigator", "Path Finder", "Prayer Master", "Prestidigitator",
- "Swimmer", "Tracker", "Spot Secret Door", "Danger Sense"
-};
-
-const char *const Resources::CLASS_NAMES[11] = {
- "Knight", "Paladin", "Archer", "Cleric", "Sorcerer", "Robber",
- "Ninja", "Barbarian", "Druid", "Ranger", nullptr
-};
-
-const uint Resources::CLASS_EXP_LEVELS[10] = {
- 1500, 2000, 2000, 1500, 2000, 1000, 1500, 1500, 1500, 2000
-};
-
-const char *const Resources::CONDITION_NAMES[17] = {
- "Cursed", "Heart Broken", "Weak", "Poisoned", "Diseased",
- "Insane", "In Love", "Drunk", "Asleep", "Depressed", "Confused",
- "Paralyzed", "Unconscious", "Dead", "Stone", "Eradicated", "Good"
-};
-
-const int Resources::CONDITION_COLORS[17] = {
- 9, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32, 32, 6, 6, 6, 6, 15
-};
-
-const char *const Resources::GOOD = "Good";
-
-const char *const Resources::BLESSED = "\n\t020Blessed\t095%+d";
-
-const char *const Resources::POWER_SHIELD = "\n\t020Power Shield\t095%+d";
-
-const char *const Resources::HOLY_BONUS = "\n\t020Holy Bonus\t095%+d";
-
-const char *const Resources::HEROISM = "\n\t020Heroism\t095%+d";
-
-const char *const Resources::IN_PARTY = "\014""15In Party\014""d";
-
-const char *const Resources::PARTY_DETAILS = "\015\003l\002\014""00"
- "\013""001""\011""035%s"
- "\013""009""\011""035%s"
- "\013""017""\011""035%s"
- "\013""025""\011""035%s"
- "\013""001""\011""136%s"
- "\013""009""\011""136%s"
- "\013""017""\011""136%s"
- "\013""025""\011""136%s"
- "\013""044""\011""035%s"
- "\013""052""\011""035%s"
- "\013""060""\011""035%s"
- "\013""068""\011""035%s"
- "\013""044""\011""136%s"
- "\013""052""\011""136%s"
- "\013""060""\011""136%s"
- "\013""068""\011""136%s";
-const char *const Resources::PARTY_DIALOG_TEXT =
- "%s\x2\x3""c\v106\t013Up\t048Down\t083\f37D\fdel\t118\f37R\fdem"
- "\t153\f37C\fdreate\t188E\f37x\fdit\x1";
-
-const int Resources::FACE_CONDITION_FRAMES[17] = {
- 2, 2, 2, 1, 1, 4, 4, 4, 3, 2, 4, 3, 3, 5, 6, 7, 0
-};
-
-const int Resources::CHAR_FACES_X[6] = { 10, 45, 81, 117, 153, 189 };
-
-const int Resources::HP_BARS_X[6] = { 13, 50, 86, 122, 158, 194 };
-
-const char *const Resources::NO_ONE_TO_ADVENTURE_WITH = "You have no one to adventure with";
-
-const char *const Resources::YOUR_ROSTER_IS_FULL = "Your Roster is full!";
-
-const byte Resources::DARKNESS_XLAT[3][256] = {
- {
- 0, 25, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 60, 61, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 92, 93, 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 108, 109, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 124, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 140, 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 168, 169, 170, 171, 172, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 188, 189, 190, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 204, 205, 206, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 220, 221, 222, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 252, 253, 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- }, {
- 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0,
- 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0,
- 88, 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, 0, 0, 0, 0, 0,
- 104, 105, 106, 107, 108, 109, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0,
- 120, 121, 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, 0, 0, 0, 0,
- 136, 137, 138, 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, 0,
- 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 184, 185, 186, 187, 188, 189, 190, 191, 0, 0, 0, 0, 0, 0, 0, 0,
- 200, 201, 202, 203, 204, 205, 206, 207, 0, 0, 0, 0, 0, 0, 0, 0,
- 216, 217, 218, 219, 220, 221, 222, 223, 0, 0, 0, 0, 0, 0, 0, 0,
- 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0,
- 248, 249, 250, 251, 252, 253, 254, 255, 0, 0, 0, 0, 0, 0, 0, 0
- }, {
- 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0,
- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0,
- 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, 0,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, 0, 0, 0,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 0, 0, 0, 0,
- 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 0, 0, 0, 0,
- 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 0, 0, 0, 0,
- 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 0, 0, 0, 0,
- 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 0, 0, 0, 0,
- 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0,
- 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 0, 0, 0, 0
- }
-};
-
-const char *const Resources::PLEASE_WAIT = "\014""d\003""c\011""000"
- "\013""002Please Wait...";
-
-const char *const Resources::OOPS = "\003""c\011""000\013""002Oops...";
-
-const int8 Resources::SCREEN_POSITIONING_X[4][48] = {
- {
- -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, -2, -1,
- -1, 0, 0, 0, 1, 1, 2, -4, -3, -3, -2, -2,
- -1, -1, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4,
- -3, -2, -1, 0, 0, 1, 2, 3, -4, 4, 0, 0
- }, {
- 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1
- }, {
- 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 2, 1,
- 1, 0, 0, 0, -1, -1, -2, 4, 3, 3, 2, 2,
- 1, 1, 0, 0, 0, -1, -1, -2, -2, -3, -3, -4,
- 3, 2, 1, 0, 0, -1, -2, -3, 4, -4, 0, 0
- }, {
- 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3,
- -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
- -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, -1
- }
-};
-
-const int8 Resources::SCREEN_POSITIONING_Y[4][48] = {
- {
- 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1
- }, {
- 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 2, 1,
- 1, 0, 0, 0, -1, -1, -2, 4, 3, 3, 2, 2,
- 1, 1, 0, 0, 0, -1, -1, -2, -2, -3, -3, -4,
- 3, 2, 1, 0, 0, -1, -2, -3, 4, -4, 0, 0
- }, {
- 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3,
- -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
- -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, -1
- }, {
- -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, -2, -1,
- -1, 0, 0, 0, 1, 1, 2, -4, -3, -3, -2, -2,
- -1, -1, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4,
- -3, -2, -1, 0, 0, 1, 2, 3, -4, 4, 0, 0
- }
-};
-
-const int Resources::MONSTER_GRID_BITMASK[12] = {
- 0xC, 8, 4, 0, 0xF, 0xF000, 0xF00, 0xF0, 0xF00, 0xF0, 0x0F, 0xF000
-};
-
-const int Resources::INDOOR_OBJECT_X[2][12] = {
- { 5, -7, -112, 98, -8, -65, 49, -9, -34, 16, -58, 40 },
- { -35, -35, -142, 68, -35, -95, 19, -35, -62, -14, -98, 16 }
-};
-
-const int Resources::MAP_OBJECT_Y[2][12] = {
- { 2, 25, 25, 25, 50, 50, 50, 58, 58, 58, 58, 58 },
- { -65, -6, -6, -6, 36, 36, 36, 54, 54, 54, 54, 54 }
-};
-
-const int Resources::INDOOR_MONSTERS_Y[4] = { 2, 34, 53, 59 };
-
-const int Resources::OUTDOOR_OBJECT_X[2][12] = {
- { -5, -7, -112, 98, -8, -77, 61, -9, -43, 25, -74, 56 },
- { -35, -35, -142, 68, -35, -95, 19, -35, -62, -24, -98, 16 }
-};
-
-const int Resources::OUTDOOR_MONSTER_INDEXES[26] = {
- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 69, 70,
- 71, 72, 73, 74, 75, 90, 91, 92, 93, 94, 112, 115, 118
-};
-
-const int Resources::OUTDOOR_MONSTERS_Y[26] = {
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 53, 53,
- 53, 53, 53, 53, 53, 34, 34, 34, 34, 34, 2, 2, 2
-};
-
-const int Resources::DIRECTION_ANIM_POSITIONS[4][4] = {
- { 0, 1, 2, 3 }, { 3, 0, 1, 2 }, { 2, 3, 0, 1 }, { 1, 2, 3, 0 }
-};
-
-const byte Resources::WALL_SHIFTS[4][48] = {
- {
- 12, 0, 12, 8, 12, 12, 0, 12, 8, 12, 12, 0,
- 12, 0, 12, 8, 12, 8, 12, 12, 0, 12, 0, 12,
- 0, 12, 0, 12, 8, 12, 8, 12, 8, 12, 8, 12,
- 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 4, 4
- }, {
- 8, 12, 8, 4, 8, 8, 12, 8, 4, 8, 8, 12,
- 8, 12, 8, 4, 8, 4, 8, 8, 12, 8, 12, 8,
- 12, 8, 12, 8, 4, 8, 4, 8, 4, 8, 4, 8,
- 12, 12, 12, 12, 4, 4, 4, 4, 0, 0, 0, 0
- }, {
- 4, 8, 4, 0, 4, 4, 8, 4, 0, 4, 4, 8,
- 4, 8, 4, 0, 4, 0, 4, 4, 8, 4, 8, 4,
- 8, 4, 8, 4, 0, 4, 0, 4, 0, 4, 0, 4,
- 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 12, 12
- }, {
- 0, 4, 0, 12, 0, 0, 4, 0, 12, 0, 0, 4,
- 0, 4, 0, 12, 0, 12, 0, 0, 4, 0, 4, 0,
- 4, 0, 4, 0, 12, 0, 12, 0, 12, 0, 12, 0,
- 4, 4, 4, 4, 12, 12, 12, 12, 0, 0, 8, 8
- }
-};
-
-const int Resources::DRAW_NUMBERS[25] = {
- 36, 37, 38, 43, 42, 41,
- 39, 20, 22, 24, 33, 31,
- 29, 26, 10, 11, 18, 16,
- 13, 5, 9, 6, 0, 4, 1
-};
-
-const int Resources::DRAW_FRAMES[25][2] = {
- { 18, 24 }, { 19, 23 }, { 20, 22 }, { 24, 18 }, { 23, 19 }, { 22, 20 },
- { 21, 21 }, { 11, 17 }, { 12, 16 }, { 13, 15 }, { 17, 11 }, { 16, 12 },
- { 15, 13 }, { 14, 14 }, { 6, 10 }, { 7, 9 }, { 10, 6 }, { 9, 7 },
- { 8, 8 }, { 3, 5 }, { 5, 3 }, { 4, 4 }, { 0, 2 }, { 2, 0 },
- { 1, 1 }
-};
-
-const int Resources::COMBAT_FLOAT_X[8] = { -2, -1, 0, 1, 2, 1, 0, -1 };
-
-const int Resources::COMBAT_FLOAT_Y[8] = { -2, 0, 2, 0, -1, 0, 2, 0 };
-
-const int Resources::MONSTER_EFFECT_FLAGS[15][8] = {
- { 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, 0x10B },
- { 0x10C, 0x10D, 0x10E, 0x10F, 0x0, 0x0, 0x0, 0x0 },
- { 0x110, 0x111, 0x112, 0x113, 0x0, 0x0, 0x0, 0x0 },
- { 0x114, 0x115, 0x116, 0x117, 0x0, 0x0, 0x0, 0x0 },
- { 0x200, 0x201, 0x202, 0x203, 0x0, 0x0, 0x0, 0x0 },
- { 0x300, 0x301, 0x302, 0x303, 0x400, 0x401, 0x402, 0x403 },
- { 0x500, 0x501, 0x502, 0x503, 0x0, 0x0, 0x0, 0x0 },
- { 0x600, 0x601, 0x602, 0x603, 0x0, 0x0, 0x0, 0x0 },
- { 0x604, 0x605, 0x606, 0x607, 0x608, 0x609, 0x60A, 0x60B },
- { 0x60C, 0x60D, 0x60E, 0x60F, 0x0, 0x0, 0x0, 0x0 },
- { 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100 },
- { 0x101, 0x101, 0x101, 0x101, 0x101, 0x101, 0x101, 0x101 },
- { 0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102 },
- { 0x103, 0x103, 0x103, 0x103, 0x103, 0x103, 0x103, 0x103 },
- { 0x108, 0x108, 0x108, 0x108, 0x108, 0x108, 0x108, 0x108 }
-};
-
-const uint Resources::SPELLS_ALLOWED[3][40] = {
- {
- 0, 1, 2, 3, 5, 6, 7, 8, 9, 10,
- 12, 14, 16, 23, 26, 27, 28, 30, 31, 32,
- 33, 42, 46, 48, 49, 50, 52, 55, 56, 58,
- 59, 62, 64, 65, 67, 68, 71, 73, 74, 76
- }, {
- 1, 4, 11, 13, 15, 17, 18, 19, 20, 21,
- 22, 24, 25, 29, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 47, 51, 53, 54,
- 57, 60, 61, 63, 66, 69, 70, 72, 75, 76
- }, {
- 0, 1, 2, 3, 4, 5, 7, 9, 10, 20,
- 25, 26, 27, 28, 30, 31, 34, 38, 40, 41,
- 42, 43, 44, 45, 49, 50, 52, 53, 55, 59,
- 60, 61, 62, 67, 68, 72, 73, 74, 75, 76
- }
-};
-
-const int Resources::BASE_HP_BY_CLASS[10] = { 10, 8, 7, 5, 4, 8, 7, 12, 6, 9 };
-
-const int Resources::AGE_RANGES[10] = { 1, 6, 11, 18, 36, 51, 76, 101, 201, 0xffff };
-
-const int Resources::AGE_RANGES_ADJUST[2][10] = {
- { -250, -50, -20, -10, 0, -2, -5, -10, -20, -50 },
- { -250, -50, -20, -10, 0, 2, 5, 10, 20, 50 }
-};
-
-const uint Resources::STAT_VALUES[24] = {
- 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 25, 30, 35, 40,
- 50, 75, 100, 125, 150, 175, 200, 225, 250,
-};
-
-const int Resources::STAT_BONUSES[24] = {
- -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20
-};
-
-const int Resources::ELEMENTAL_CATEGORIES[6] = { 8, 15, 20, 25, 33, 36 };
-
-const int Resources::ATTRIBUTE_CATEGORIES[10] = {
- 9, 17, 25, 33, 39, 45, 50, 56, 61, 72 };
-
-const int Resources::ATTRIBUTE_BONUSES[72] = {
- 2, 3, 5, 8, 12, 17, 23, 30, 38, 47, // Might bonus
- 2, 3, 5, 8, 12, 17, 23, 30, // INT bonus
- 2, 3, 5, 8, 12, 17, 23, 30, // PER bonus
- 2, 3, 5, 8, 12, 17, 23, 30, // SPD bonus
- 3, 5, 10, 15, 20, 30, // ACC bonus
- 5, 10, 15, 20, 25, 30, // LUC bonus
- 4, 6, 10, 20, 50, // HP bonus
- 4, 8, 12, 16, 20, 25, // SP bonus
- 2, 4, 6, 10, 16, // AC bonus
- 4, 6, 8, 10, 12, 14, 16, 18, 20, 25 // Thievery bonus
-};
-
-const int Resources::ELEMENTAL_RESISTENCES[37] = {
- 0, 5, 7, 9, 12, 15, 20, 25, 30, 5, 7, 9, 12, 15, 20, 25,
- 5, 10, 15, 20, 25, 10, 15, 20, 25, 40, 5, 7, 9, 11, 13, 15, 20, 25,
- 5, 10, 20
-};
-
-const int Resources::ELEMENTAL_DAMAGE[37] = {
- 0, 2, 3, 4, 5, 10, 15, 20, 30, 2, 3, 4, 5, 10, 15, 20, 2, 4, 5, 10, 20,
- 2, 4, 8, 16, 32, 2, 3, 4, 5, 10, 15, 20, 30, 5, 10, 25
-};
-
-const int Resources::WEAPON_DAMAGE_BASE[35] = {
- 0, 3, 2, 3, 2, 2, 4, 1, 2, 4, 2, 3,
- 2, 2, 1, 1, 1, 1, 4, 4, 3, 2, 4, 2,
- 2, 2, 5, 3, 3, 3, 3, 5, 4, 2, 6
-};
-
-const int Resources::WEAPON_DAMAGE_MULTIPLIER[35] = {
- 0, 3, 3, 4, 5, 4, 2, 3, 3, 3, 3, 3,
- 2, 4, 10, 6, 8, 9, 4, 3, 6, 8, 5, 6,
- 4, 5, 3, 5, 6, 7, 2, 2, 2, 2, 4
-};
-
-const int Resources::METAL_DAMAGE[22] = {
- -3, -6, -4, -2, 2, 4, 6, 8, 10, 0, 1,
- 1, 2, 2, 3, 4, 5, 12, 15, 20, 30, 50
-};
-
-const int Resources::METAL_DAMAGE_PERCENT[22] = {
- 253, 252, 3, 2, 1, 2, 3, 4, 6, 0, 1,
- 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10
-};
-
-const int Resources::METAL_LAC[9] = { -3, 0, -2, -1, 1, 2, 4, 6, 8 };
-
-const int Resources::ARMOR_STRENGTHS[14] = { 0, 2, 4, 5, 6, 7, 8, 10, 4, 2, 1, 1, 1, 1 };
-
-const int Resources::MAKE_ITEM_ARR1[6] = { 0, 8, 15, 20, 25, 33 };
-
-const int Resources::MAKE_ITEM_ARR2[6][7][2] = {
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } },
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 6, 7 }, { 7, 7 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 5 }, { 5, 5 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } },
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } },
- { { 0, 0 }, { 1, 1 }, { 1, 1 }, { 1, 2 }, { 2, 2 }, { 2, 3 }, { 3, 3 } }
-};
-
-const int Resources::MAKE_ITEM_ARR3[10][7][2] = {
- { { 0, 0 }, { 1, 4 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 6, 10 }, { 10, 10 } },
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } },
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } },
- { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 6 }, { 6, 6 } },
- { { 0, 0 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 5 }, { 5, 6 }, { 6, 6 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 6 }, { 6, 6 } },
- { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } },
- { { 0, 0 }, { 1, 2 }, { 1, 4 }, { 3, 6 }, { 5, 8 }, { 7, 10 }, { 10, 10 } }
-};
-
-const int Resources::MAKE_ITEM_ARR4[2][7][2] = {
- { { 0, 0 }, { 1, 4 }, { 3, 7 }, { 4, 8 }, { 5, 9 }, { 8, 9 }, { 9, 9 } },
- { { 0, 0 }, { 1, 4 }, { 2, 6 }, { 4, 7 }, { 6, 10 }, { 9, 13 }, { 13, 13 } }
-};
-
-
-const int Resources::MAKE_ITEM_ARR5[8][2] = {
- { 0, 0 }, { 1, 15 }, { 16, 30 }, { 31, 40 }, { 41, 50 },
- { 51, 60 }, { 61, 73 }, { 61, 73 }
-};
-
-const int Resources::OUTDOOR_DRAWSTRUCT_INDEXES[44] = {
- 37, 38, 39, 40, 41, 44, 42, 43, 47, 45, 46,
- 48, 49, 52, 50, 51, 66, 67, 68, 69, 70, 71,
- 72, 75, 73, 74, 87, 88, 89, 90, 91, 94, 92,
- 93, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
-};
-
-const int Resources::TOWN_MAXES[2][11] = {
- { 23, 13, 32, 16, 26, 16, 16, 16, 16, 16, 16 },
- { 26, 19, 48, 27, 26, 37, 16, 16, 16, 16, 16 }
-};
-
-const char *const Resources::TOWN_ACTION_MUSIC[2][7] = {
- { "bank.m", "smith.m", "guild.m", "tavern.m",
- "temple.m", "grounds.m", "endgame.m" },
- { "bank.m", "sf09.m", "guild.m", "tavern.m",
- "temple.m", "smith.m", "endgame.m" }
-};
-
-const char *const Resources::TOWN_ACTION_SHAPES[7] = {
- "bnkr", "blck", "gild", "tvrn", "tmpl", "trng", "eface08"
-};
-
-const int Resources::TOWN_ACTION_FILES[2][7] = {
- { 3, 2, 4, 2, 4, 2, 1 }, { 5, 3, 7, 5, 4, 6, 1 }
-};
-
-const char *const Resources::BANK_TEXT = "\xD\x2\x3""c\xB""122\t013"
- "\xC""37D\xC""dep\t040\xC""37W\xC""dith\t067ESC"
- "\x1\t000\xB""000Bank of Xeen\xB""015\n"
- "Bank\x3l\n"
- "Gold\x3r\t000%s\x3l\n"
- "Gems\x3r\t000%s\x3""c\n"
- "\n"
- "Party\x3l\n"
- "Gold\x3r\t000%s\x3l\n"
- "Gems\x3r\t000%s";
-
-const char *const Resources::BLACKSMITH_TEXT = "\x01\x0D\x03""c\x0B""000\x09""000"
- "Store Options for\x09""039\x0B""027%s\x03""l\x0B""046\n"
- "\x09""011\x0C""37B\x0C""drowse\n"
- "\x09""000\x0B""090Gold\x03r\x09""000%s"
- "\x02\x03""c\x0B""122\x09""040ESC\x01";
-
-const char *const Resources::GUILD_NOT_MEMBER_TEXT =
- "\n\nYou have to be a member to shop here.";
-
-const char *const Resources::GUILD_TEXT = "\x03""c\x0B""027\x09""039%s"
- "\x03l\x0B""046\n"
- "\x09""012\x0C""37B\x0C""duy Spells\n"
- "\x09""012\x0C""37S\x0C""dpell Info";
-
-const char *const Resources::TAVERN_TEXT =
- "\x0D\x03""c\x0B""000\x09""000Tavern Options for\x09""039"
- "\x0B""027%s%s\x03l\x09""000"
- "\x0B""090Gold\x03r\x09""000%s\x02\x03""c\x0B""122"
- "\x09""021\x0C""37S\x0C""dign in\x09""060ESC\x01";
-
-const char *const Resources::FOOD_AND_DRINK =
- "\x03l\x09""017\x0B""046\x0C""37D\x0C""drink\n"
- "\x09""017\x0C""37F\x0C""dood\n"
- "\x09""017\x0C""37T\x0C""dip\n"
- "\x09""017\x0C""37R\x0C""dumors";
-
-const char *const Resources::GOOD_STUFF = "\n"
- "\n"
- "Good Stuff\n"
- "\n"
- "Hit a key!";
-
-const char *const Resources::HAVE_A_DRINK = "\n\nHave a Drink\n\nHit a key!";
-
-const char *const Resources::YOURE_DRUNK = "\n\nYou're Drunk\n\nHit a key!";
-
-const int Resources::TAVERN_EXIT_LIST[2][6][5][2] = {
- {
- { { 21, 17 }, { 0, 0 }, { 20, 3 }, { 0, 0 }, { 0, 0 } },
- { { 13, 4 }, { 0, 0 }, { 19, 9 }, { 0, 0 }, { 0, 0 } },
- { { 20, 10 }, { 12, 8 }, { 5, 26 }, { 3, 4 }, { 7, 5 } },
- { { 18, 4 }, { 0, 0 }, { 19, 16 }, { 0, 0 }, { 11, 12 } },
- { { 15, 21 }, { 0, 0 }, { 13, 21 }, { 0, 0 }, { 0, 0 } },
- { { 10, 8 }, { 0, 0 }, { 15, 12 }, { 0, 0 }, { 0, 0 } },
- }, {
- { { 21, 17 }, { 0, 0 }, { 20, 3 }, { 0, 0 }, { 0, 0 } },
- { { 13, 4 }, { 0, 0 }, { 19, 9 }, { 0, 0 }, { 0, 0 } },
- { { 20, 10 }, { 12, 8 }, { 5, 26 }, { 3, 4 }, { 7, 5 } },
- { { 17, 24 }, { 14, 13 }, { 0, 0 }, { 0, 0 }, { 9, 4 } },
- { { 15, 21 }, { 0, 0 }, { 13, 21 }, { 0, 0 }, { 0, 0 } },
- { { 10, 8 }, { 0, 0 }, { 15, 12 }, { 0, 0 }, { 0, 0 } }
- }
-};
-
-const char *const Resources::TEMPLE_TEXT =
- "\x0D\x03""c\x0B""000\x09""000Temple Options for"
- "\x09""039\x0B""027%s\x03l\x09""000\x0B""046"
- "\x0C""37H\x0C""deal\x03r\x09""000%lu\x03l\n"
- "\x0C""37D\x0C""donation\x03r\x09""000%lu\x03l\n"
- "\x0C""37U\x0C""dnCurse\x03r\x09""000%s"
- "\x03l\x09""000\x0B""090Gold\x03r\x09""000%s"
- "\x02\x03""c\x0B""122\x09""040ESC\x01";
-
-const char *const Resources::EXPERIENCE_FOR_LEVEL =
- "%s needs %lu experience for level %u.";
-
-const char *const Resources::LEARNED_ALL = "%s has learned all we can teach!";
-
-const char *const Resources::ELIGIBLE_FOR_LEVEL = "%s is eligible for level %d.";
-
-const char *const Resources::TRAINING_TEXT =
- "\x0D\x03""cTraining Options\n"
- "\n"
- "%s\x03l\x0B""090\x09""000Gold\x03r\x09"
- "000%s\x02\x03""c\x0B""122\x09""021"
- "\x0C""37T\x0C""drain\x09""060ESC\x01";
-
-const char *const Resources::GOLD_GEMS =
- "\x03""c\x0B""000\x09""000%s\x03l\n"
- "\n"
- "Gold\x03r\x09""000%s\x03l\n"
- "Gems\x03r\x09""000%s\x02\x03""c\x0B""096\x09""013G"
- "\x0C""37o\x0C""dld\x09""040G\x0C\x03""7e"
- "\x0C""dms\x09""067ESC\x01";
-
-const char *const Resources::GOLD_GEMS_2 =
- "\x09""000\x0B""000\x03""c%s\x03l\n"
- "\n"
- "\x04""077Gold\x03r\x09""000%s\x03l\n"
- "\x04""077Gems\x03r\x09""000%s\x03l\x09""000\x0B""051\x04""077\n"
- "\x04""077";
-
-const char *const Resources::DEPOSIT_WITHDRAWL[2] = { "Deposit", "Withdrawl" };
-
-const char *const Resources::NOT_ENOUGH_X_IN_THE_Y =
- "\x03""c\x0B""012Not enough %s in the %s!\x03l";
-
-const char *const Resources::NO_X_IN_THE_Y = "\x03""c\x0B""012No %s in the %s!\x03l";
-
-const char *const Resources::STAT_NAMES[16] = {
- "Might", "Intellect", "Personality", "Endurance", "Speed",
- "Accuracy", "Luck", "Age", "Level", "Armor Class", "Hit Points",
- "Spell Points", "Resistances", "Skills", "Awards", "Experience"
-};
-
-const char *const Resources::CONSUMABLE_NAMES[4] = { "Gold", "Gems", "Food", "Condition" };
-
-const char *const Resources::WHERE_NAMES[2] = { "Party", "Bank" };
-
-const char *const Resources::AMOUNT = "\x03""c\x09""000\x0B""051Amount\x03l\n";
-
-const char *const Resources::FOOD_PACKS_FULL = "\v007Your food packs are already full!";
-
-const char *const Resources::BUY_SPELLS =
- "\x03""c\x0B""027\x09""039%s\x03l\x0B""046\n"
- "\x09""012\x0C""37B\x0C""duy Spells\n"
- "\x09""012\x0C""37S\x0C""dpell Info";
-
-const char *const Resources::GUILD_OPTIONS =
- "\x0D\x0C""00\x03""c\x0B""000\x09""000Guild Options for%s"
- "\x03l\x09""000\x0B""090Gold"
- "\x03r\x09""000%s\x02\x03""c\x0B""122\x09""040ESC\x01";
-
-const int Resources::MISC_SPELL_INDEX[74] = {
- NO_SPELL, MS_Light, MS_Awaken, MS_MagicArrow,
- MS_FirstAid, MS_FlyingFist, MS_EnergyBlast, MS_Sleep,
- MS_Revitalize, MS_CureWounds, MS_Sparks, MS_Shrapmetal,
- MS_InsectSpray, MS_ToxicCloud, MS_ProtFromElements, MS_Pain,
- MS_Jump, MS_BeastMaster, MS_Clairvoyance, MS_TurnUndead,
- MS_Levitate, MS_WizardEye, MS_Bless, MS_IdentifyMonster,
- MS_LightningBolt, MS_HolyBonus, MS_PowerCure, MS_NaturesCure,
- MS_LloydsBeacon, MS_PowerShield, MS_Heroism, MS_Hynotize,
- MS_WalkOnWater, MS_FrostBite, MS_DetectMonster, MS_Fireball,
- MS_ColdRay, MS_CurePoison, MS_AcidSpray, MS_TimeDistortion,
- MS_DragonSleep, MS_CureDisease, MS_Teleport, MS_FingerOfDeath,
- MS_CureParalysis, MS_GolemStopper, MS_PoisonVolley, MS_DeadlySwarm,
- MS_SuperShelter, MS_DayOfProtection, MS_DayOfSorcery, MS_CreateFood,
- MS_FieryFlail, MS_RechargeItem, MS_FantasticFreeze, MS_TownPortal,
- MS_StoneToFlesh, MS_RaiseDead, MS_Etheralize, MS_DancingSword,
- MS_MoonRay, MS_MassDistortion, MS_PrismaticLight, MS_EnchantItem,
- MS_Incinerate, MS_HolyWord, MS_Resurrection, MS_ElementalStorm,
- MS_MegaVolts, MS_Inferno, MS_SunRay, MS_Implosion,
- MS_StarBurst, MS_DivineIntervention
-};
-
-const int Resources::SPELL_COSTS[77] = {
- 8, 1, 5, -2, 5, -2, 20, 10, 12, 8, 3,
- - 3, 75, 40, 12, 6, 200, 10, 100, 30, -1, 30,
- 15, 25, 10, -2, 1, 2, 7, 20, -2, -2, 100,
- 15, 5, 100, 35, 75, 5, 20, 4, 5, 1, -2,
- 6, 2, 75, 40, 60, 6, 4, 25, -2, -2, 60,
- - 1, 50, 15, 125, 2, -1, 3, -1, 200, 35, 150,
- 15, 5, 4, 10, 8, 30, 4, 5, 7, 5, 0
-};
-
-const int Resources::DARK_SPELL_RANGES[12][2] = {
- { 0, 20 }, { 16, 35 }, { 27, 37 }, { 29, 39 },
- { 0, 17 }, { 14, 34 }, { 26, 37 }, { 29, 39 },
- { 0, 20 }, { 16, 35 }, { 27, 37 }, { 29, 39 }
-};
-
-const int Resources::CLOUDS_SPELL_OFFSETS[5][20] = {
- {
- 1, 10, 20, 26, 27, 38, 40, 42, 45, 50,
- 55, 59, 60, 61, 62, 68, 72, 75, 77, 77
- }, {
- 3, 4, 5, 14, 15, 25, 30, 31, 34, 41,
- 49, 51, 53, 67, 73, 75, -1, -1, -1, -1
- }, {
- 4, 8, 9, 12, 13, 22, 23, 24, 28, 34,
- 41, 44, 52, 70, 73, 74, -1, -1, -1, -1
- }, {
- 6, 7, 9, 11, 12, 13, 17, 21, 22, 24,
- 29, 36, 56, 58, 64, 71, -1, -1, -1, -1
- }, {
- 6, 7, 9, 11, 12, 13, 18, 21, 29, 32,
- 36, 37, 46, 51, 56, 58, 69, -1, -1, -1
- }
-};
-
-const uint Resources::DARK_SPELL_OFFSETS[3][39] = {
- {
- 42, 1, 26, 59, 27, 10, 50, 68, 55, 62, 67, 73, 2,
- 5, 3, 31, 30, 52, 49, 28, 74, 0, 9, 7, 14, 8,
- 33, 6, 23, 71, 64, 56, 48, 46, 12, 32, 58, 65, 16
- }, {
- 42, 1, 45, 61, 72, 40, 20, 60, 38, 41, 75, 34, 4,
- 43, 25, 53, 44, 15, 70, 17, 24, 69, 22, 66, 57, 11,
- 29, 39, 51, 21, 19, 36, 47, 13, 54, 37, 18, 35, 63
- }, {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38
- }
-};
-
-const int Resources::SPELL_GEM_COST[77] = {
- 0, 0, 2, 1, 2, 4, 5, 0, 0, 0, 0, 10, 10, 10, 0, 0, 20, 4, 10, 20, 1, 10,
- 5, 5, 4, 2, 0, 0, 0, 10, 3, 1, 20, 4, 0, 20, 10, 10, 1, 10, 0, 0, 0, 2,
- 2, 0, 10, 10, 10, 0, 0, 10, 3, 2, 10, 1, 10, 10, 20, 0, 0, 1, 1, 20, 5, 20,
- 5, 0, 0, 0, 0, 5, 1, 2, 0, 2, 0
-};
-
-const char *const Resources::NOT_A_SPELL_CASTER = "Not a spell caster...";
-
-const char *const Resources::SPELLS_FOR = "\xD\xC""d%s\x2\x3""c\x9""000\xB""002Spells for %s";
-
-const char *const Resources::SPELL_LINES_0_TO_9 =
- "\x2\x3l\xB""015\x9""0011\n2\n3\n4\n5\n6\n7\n8\n9\n0";
-
-const char *const Resources::SPELLS_DIALOG_SPELLS = "\x3l\xB""015"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l\n"
- "\x9""010\xC""%2u%s\xC""d\x3l"
- "\x9""004\xB""110%s - %lu\x1";
-
-const char *const Resources::SPELL_PTS = "Spell Pts";
-const char *const Resources::GOLD = "Gold";
+ // Set up items array to map to the names of items in each category
+ ITEM_NAMES[CATEGORY_WEAPON] = &WEAPON_NAMES[0];
+ ITEM_NAMES[CATEGORY_ARMOR] = &ARMOR_NAMES[0];
+ ITEM_NAMES[CATEGORY_ACCESSORY] = &ACCESSORY_NAMES[0];
+ ITEM_NAMES[CATEGORY_MISC] = &MISC_NAMES[0];
-const char *const Resources::SPELLS_PRESS_A_KEY =
- "\x3""c\xC""09%s\xC""d\x3l\n"
- "\n"
- "%s\x3""c\x9""000\xB""100Press a Key!";
-
-const char *const Resources::SPELLS_PURCHASE =
- "\x3l\xB""000\x9""000\xC""d%s Do you wish to purchase "
- "\xC""09%s\xC""d for %u?";
-
-const char *const Resources::MAP_TEXT =
- "\x3""c\xB""000\x9""000%s\x3l\xB""139"
- "\x9""000X = %d\x3r\x9""000Y = %d\x3""c\x9""000%s";
-
-const char *const Resources::LIGHT_COUNT_TEXT = "\x3l\n\n\t024Light\x3r\t124%d";
-
-const char *const Resources::FIRE_RESISTENCE_TEXT = "%c%sFire%s%u";
-
-const char *const Resources::ELECRICITY_RESISTENCE_TEXT = "%c%sElectricity%s%u";
-
-const char *const Resources::COLD_RESISTENCE_TEXT = "c%sCold%s%u";
-
-const char *const Resources::POISON_RESISTENCE_TEXT = "%c%sPoison/Acid%s%u";
-
-const char *const Resources::CLAIRVOYANCE_TEXT = "%c%sClairvoyance%s";
-
-const char *const Resources::LEVITATE_TEXT = "%c%sLevitate%s";
-
-const char *const Resources::WALK_ON_WATER_TEXT = "%c%sWalk on Water";
-
-const char *const Resources::GAME_INFORMATION =
- "\xD\x3""c\x9""000\xB""001\xC""37%s of Xeen\xC""d\n"
- "Game Information\n"
- "\n"
- "Today is \xC""37%ssday\xC""d\n"
- "\n"
- "\x9""032Time\x9""072Day\x9""112Year\n"
- "\x9""032\xC""37%d:%02d%c\x9""072%u\x9""112%u\xC""d%s";
-
-const char *const Resources::WORLD_GAME_TEXT = "World";
-const char *const Resources::DARKSIDE_GAME_TEXT = "Darkside";
-const char *const Resources::CLOUDS_GAME_TEXT = "Clouds";
-const char *const Resources::SWORDS_GAME_TEXT = "Swords";
-
-const char *const Resources::WEEK_DAY_STRINGS[10] = {
- "Ten", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"
-};
-
-const char *const Resources::CHARACTER_DETAILS =
- "\x3l\xB""041\x9""196%s\x9""000\xB""002%s : %s %s %s"
- "\x3r\x9""053\xB""028\xC%02u%u\xC""d\x9""103\xC""%02u%u\xC""d"
- "\x3l\x9""131\xC""%02u%d\xC""d\x9""196\xC""15%lu\xC""d\x3r"
- "\x9""053\xB""051\xC""%02u%u\xC""d\x9""103\xC""%02u%u\xC""d"
- "\x3l\x9""131\xC""%02u%u\xC""d\x9""196\xC""15%lu\xC""d"
- "\x3r\x9""053\xB""074\xC""%02u%u\xC""d\x9""103\xC""%02u%u\xC""d"
- "\x3l\x9""131\xC""15%u\xC""d\x9""196\xC""15%lu\xC""d"
- "\x3r\x9""053\xB""097\xC""%02u%u\xC""d\x9""103\xC""%02u%u\xC""d"
- "\x3l\x9""131\xC""15%u\xC""d\x9""196\xC""15%u day%c\xC""d"
- "\x3r\x9""053\xB""120\xC""%02u%u\xC""d\x9""103\xC""%02u%u\xC""d"
- "\x3l\x9""131\xC""15%u\xC""d\x9""196\xC""%02u%s\xC""d"
- "\x9""230%s%s%s%s\xC""d";
-
-const char *const Resources::PARTY_GOLD = "Party Gold";
-
-const char *const Resources::PLUS_14 = "14+";
-
-const char *const Resources::CHARACTER_TEMPLATE =
- "\x1\xC""00\xD\x3l\x9""029\xB""018Mgt\x9""080Acy\x9""131H.P.\x9""196Experience"
- "\x9""029\xB""041Int\x9""080Lck\x9""131S.P.\x9""029\xB""064Per\x9""080Age"
- "\x9""131Resis\x9""196Party Gems\x9""029\xB""087End\x9""080Lvl\x9""131Skills"
- "\x9""196Party Food\x9""029\xB""110Spd\x9""080AC\x9""131Awrds\x9""196Condition\x3""c"
- "\x9""290\xB""025\xC""37I\xC""dtem\x9""290\xB""057\xC""37Q"
- "\xC""duick\x9""290\xB""089\xC""37E\xC""dxch\x9""290\xB""121Exit\x3l%s";
-
-const char *const Resources::EXCHANGING_IN_COMBAT = "\x3""c\xB""007\x9""000Exchanging in combat is not allowed!";
-
-const char *const Resources::CURRENT_MAXIMUM_RATING_TEXT = "\x2\x3""c%s\n"
- "Current / Maximum\n"
- "\x3r\x9""054%lu\x3l\x9""058/ %lu\n"
- "\x3""cRating: %s";
-
-const char *const Resources::CURRENT_MAXIMUM_TEXT = "\x2\x3""c%s\n"
- "Current / Maximum\n"
- "\x3r\x9""054%u\x3l\x9""058/ %u";
-
-const char *const Resources::RATING_TEXT[24] = {
- "Nonexistant", "Very Poor", "Poor", "Very Low", "Low", "Averarage", "Good",
- "Very Good", "High", "Very High", "Great", "Super", "Amazing", "Incredible",
- "Gigantic", "Fantastic", "Astoundig", "Astonishing", "Monumental", "Tremendous",
- "Collosal", "Awesome", "AweInspiring", "aUltimate"
-};
-
-const char *const Resources::AGE_TEXT = "\x2\x3""c%s\n"
- "Current / Natural\n"
- "\x3r\x9""057%u\x3l\x9""061/ %u\n"
- "\x3""cBorn: %u / %u\x1";
-
-const char *const Resources::LEVEL_TEXT =
- "\x2\x3""c%s\n"
- "Current / Maximum\n"
- "\x3r\x9""054%u\x3l\x9""058/ %u\n"
- "\x3""c%u Attack%s/Round\x1";
-
-const char *const Resources::RESISTENCES_TEXT =
- "\x2\x3""c%s\x3l\n"
- "\x9""020Fire\x9""100%u\n"
- "\x9""020Cold\x9""100%u\n"
- "\x9""020Electricity\x9""100%u\n"
- "\x9""020Poison\x9""100%u\n"
- "\x9""020Energy\x9""100%u\n"
- "\x9""020Magic\x9""100%u";
-
-const char *const Resources::NONE = "\n\x9""020";
-
-const char *const Resources::EXPERIENCE_TEXT = "\x2\x3""c%s\x3l\n"
- "\x9""010Current:\x9""070%lu\n"
- "\x9""010Next Level:\x9""070%s\x1";
-
-const char *const Resources::ELIGIBLE = "\xC""12Eligible\xC""d";
-
-const char *const Resources::IN_PARTY_IN_BANK =
- "\x2\x3""cParty %s\n"
- "%lu on hand\n"
- "%lu in bank\x1\x3l";
-
-const char *const Resources::FOOD_TEXT =
- "\x2\x3""cParty %s\n"
- "%u on hand\n"
- "Enough for %u day%s\x3l";
-
-const char *const Resources::EXCHANGE_WITH_WHOM = "\t010\v005Exchange with whom?";
-
-const char *const Resources::QUICK_REF_LINE =
- "\xB%3d\x9""007%u)\x9""027%s\x9""110%c%c%c\x3r\x9""160\xC%02u%u\xC""d"
- "\x3l\x9""170\xC%02u%d\xC""d\x9""208\xC%02u%u\xC""d\x9""247\xC"
- "%02u%u\xC""d\x9""270\xC%02u%c%c%c%c\xC""d";
-
-const char *const Resources::QUICK_REFERENCE =
- "\xD\x3""cQuick Reference Chart\xB""012\x3l"
- "\x9""007#\x9""027Name\x9""110Cls\x9""140Lvl\x9""176H.P."
- "\x9""212S.P.\x9""241A.C.\x9""270Cond"
- "%s%s%s%s%s%s%s%s"
- "\xB""110\x9""064\x3""cGold\x9""144Gems\x9""224Food\xB""119"
- "\x9""064\xC""15%lu\x9""144%lu\x9""224%u day%s\xC""d";
-
-const uint Resources::BLACKSMITH_MAP_IDS[2][4] = { { 28, 30, 73, 49 }, { 29, 31, 37, 43 } };
-
-const char *const Resources::ITEMS_DIALOG_TEXT1 =
- "\r\x2\x3""c\v021\t017\f37W\fdeap\t051\f37A\fdrmor\t085A"
- "\f37c\fdces\t119\f37M\fdisc\t153%s\t187%s\t221%s"
- "\t255%s\t289Exit";
-const char *const Resources::ITEMS_DIALOG_TEXT2 =
- "\r\x2\x3""c\v021\t017\f37W\fdeap\t051\f37A\fdrmor\t085A"
- "\f37c\fdces\t119\f37M\fdisc\t153\f37%s\t289Exit";
-const char *const Resources::ITEMS_DIALOG_LINE1 = "\x3r\f%02u\f023%2d)\x3l\t028%s\n";
-const char *const Resources::ITEMS_DIALOG_LINE2 = "\x3r\f%02u\t023%2d)\x3l\t028%s\x3r\t000%lu\n";
-
-const char *const Resources::BTN_BUY = "\f37B\fduy";
-const char *const Resources::BTN_SELL = "\f37S\fdell";
-const char *const Resources::BTN_IDENTIFY = "\f37I\fddentify";
-const char *const Resources::BTN_FIX = "\f37F\fdix";
-const char *const Resources::BTN_USE = "\f37U\fdse";
-const char *const Resources::BTN_EQUIP = "\f37E\fdquip";
-const char *const Resources::BTN_REMOVE = "\f37R\fdem";
-const char *const Resources::BTN_DISCARD = "\f37D\fdisc";
-const char *const Resources::BTN_QUEST = "\f37Q\fduest";
-const char *const Resources::BTN_ENCHANT = "E\fdnchant";
-const char *const Resources::BTN_RECHARGE = "R\fdechrg";
-const char *const Resources::BTN_GOLD = "G\fdold";
-
-const char *const Resources::ITEM_BROKEN = "\f32broken ";
-const char *const Resources::ITEM_CURSED = "\f09cursed ";
-const char *const Resources::BONUS_NAMES[7] = {
- "", "Dragon Slayer", "Undead Eater", "Golem Smasher",
- "Bug Zapper", "Monster Masher", "Beast Bopper"
-};
-
-const char *const Resources::WEAPON_NAMES[35] = {
- nullptr, "long sword ", "short sword ", "broad sword ", "scimitar ",
- "cutlass ", "sabre ", "club ", "hand axe ", "katana ", "nunchakas ",
- "wakazashi ", "dagger ", "mace ", "flail ", "cudgel ", "maul ", "spear ",
- "bardiche ", "glaive ", "halberd ", "pike ", "flamberge ", "trident ",
- "staff ", "hammer ", "naginata ", "battle axe ", "grand axe ", "great axe ",
- "short bow ", "long bow ", "crossbow ", "sling ", "Xeen Slayer Sword"
-};
-
-const char *const Resources::ARMOR_NAMES[14] = {
- nullptr, "robes ", "sale armor ", "ring mail ", "chain mail ",
- "splint mail ", "plate mail ", "plate armor ", "shield ",
- "helm ", "boots ", "cloak ", "cape ", "gauntlets "
-};
-
-const char *const Resources::ACCESSORY_NAMES[11] = {
- nullptr, "ring ", "belt ", "broach ", "medal ", "charm ", "cameo ",
- "scarab ", "pendant ", "necklace ", "amulet "
-};
-
-const char *const Resources::MISC_NAMES[22] = {
- nullptr, "rod ", "jewel ", "gem ", "box ", "orb ", "horn ", "coin ",
- "wand ", "whistle ", "potion ", "scroll ", "RogueVM",
- "bogusg", "bogus", "bogus", "bogus", "bogus",
- "bogus", "bogus", "bogus", "bogus"
-};
-
-const char *const *Resources::ITEM_NAMES[4] = {
- &Resources::WEAPON_NAMES[0], &Resources::ARMOR_NAMES[0],
- &Resources::ACCESSORY_NAMES[0], &Resources::MISC_NAMES[0]
-};
-
-const char *const Resources::ELEMENTAL_NAMES[6] = {
- "Fire", "Elec", "Cold", "Acid/Poison", "Energy", "Magic"
-};
-
-const char *const Resources::ATTRIBUTE_NAMES[10] = {
- "might", "Intellect", "Personality", "Speed", "accuracy", "Luck",
- "Hit Points", "Spell Points", "Armor Class", "Thievery"
-};
-
-const char *const Resources::EFFECTIVENESS_NAMES[7] = {
- nullptr, "Dragons", "Undead", "Golems", "Bugs", "Monsters", "Beasts"
-};
-
-const char *const Resources::QUEST_ITEM_NAMES[85] = {
- "Deed to New Castle",
- "Crystal Key to Witch Tower",
- "Skeleton Key to Darzog's Tower",
- "Enchanted Key to Tower of High Magic",
- "Jeweled Amulet of the Northern Sphinx",
- "Stone of a Thousand Terrors",
- "Golem Stone of Admittance",
- "Yak Stone of Opening",
- "Xeen's Scepter of Temporal Distortion",
- "Alacorn of Falista",
- "Elixir of Restoration",
- "Wand of Faery Magic",
- "Princess Roxanne's Tiara",
- "Holy Book of Elvenkind",
- "Scarab of Imaging",
- "Crystals of Piezoelectricity",
- "Scroll of Insight",
- "Phirna Root",
- "Orothin's Bone Whistle",
- "Barok's Magic Pendant",
- "Ligono's Missing Skull",
- "Last Flower of Summer",
- "Last Raindrop of Spring",
- "Last Snowflake of Winter",
- "Last Leaf of Autumn",
- "Ever Hot Lava Rock",
- "King's Mega Credit",
- "Excavation Permit",
- "Cupie Doll",
- "Might Doll",
- "Speed Doll",
- "Endurance Doll",
- "Accuracy Doll",
- "Luck Doll",
- "Widget",
- "Pass to Castleview",
- "Pass to Sandcaster",
- "Pass to Lakeside",
- "Pass to Necropolis",
- "Pass to Olympus",
- "Key to Great Western Tower",
- "Key to Great Southern Tower",
- "Key to Great Eastern Tower",
- "Key to Great Northern Tower",
- "Key to Ellinger's Tower",
- "Key to Dragon Tower",
- "Key to Darkstone Tower",
- "Key to Temple of Bark",
- "Key to Dungeon of Lost Souls",
- "Key to Ancient Pyramid",
- "Key to Dungeon of Death",
- "Amulet of the Southern Sphinx",
- "Dragon Pharoah's Orb",
- "Cube of Power",
- "Chime of Opening",
- "Gold ID Card",
- "Silver ID Card",
- "Vulture Repellant",
- "Bridle",
- "Enchanted Bridle",
- "Treasure Map (Goto E1 x1, y11)",
- "",
- "Fake Map",
- "Onyx Necklace",
- "Dragon Egg",
- "Tribble",
- "Golden Pegasus Statuette",
- "Golden Dragon Statuette",
- "Golden Griffin Statuette",
- "Chalice of Protection",
- "Jewel of Ages",
- "Songbird of Serenity",
- "Sandro's Heart",
- "Ector's Ring",
- "Vespar's Emerald Handle",
- "Queen Kalindra's Crown",
- "Caleb's Magnifying Glass",
- "Soul Box",
- "Soul Box with Corak inside",
- "Ruby Rock",
- "Emerald Rock",
- "Sapphire Rock",
- "Diamond Rock",
- "Monga Melon",
- "Energy Disk"
-};
-
-const int Resources::WEAPON_BASE_COSTS[35] = {
- 0, 50, 15, 100, 80, 40, 60, 1, 10, 150, 30, 60, 8, 50,
- 100, 15, 30, 15, 200, 80, 250, 150, 400, 100, 40, 120,
- 300, 100, 200, 300, 25, 100, 50, 15, 0
-};
-const int Resources::ARMOR_BASE_COSTS[14] = {
- 0, 20, 100, 200, 400, 600, 1000, 2000, 100, 60, 40, 250, 200, 100
-};
-const int Resources::ACCESSORY_BASE_COSTS[11] = {
- 0, 100, 100, 250, 100, 50, 300, 200, 500, 1000, 2000
-};
-const int Resources::MISC_MATERIAL_COSTS[22] = {
- 0, 50, 1000, 500, 10, 100, 20, 10, 50, 10, 10, 100,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-};
-const int Resources::MISC_BASE_COSTS[76] = {
- 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 300, 300, 300, 300, 300,
- 300, 300, 300, 300, 300, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 500, 500, 500, 500, 500, 500, 500, 500, 500,
- 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600
-};
-const int Resources::METAL_BASE_MULTIPLIERS[22] = {
- 10, 25, 5, 75, 2, 5, 10, 20, 50, 2, 3, 5, 10, 20, 30, 40,
- 50, 60, 70, 80, 90, 100
-};
-const int Resources::ITEM_SKILL_DIVISORS[4] = { 1, 2, 100, 10 };
-
-const int Resources::RESTRICTION_OFFSETS[4] = { 0, 35, 49, 60 };
-
-const int Resources::ITEM_RESTRICTIONS[86] = {
- 0, 86, 86, 86, 86, 86, 86, 0, 6, 239, 239, 239, 2, 4, 4, 4, 4,
- 6, 70, 70, 70, 70, 94, 70, 0, 4, 239, 86, 86, 86, 70, 70, 70, 70,
- 0, 0, 0, 68, 100, 116, 125, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-const char *const Resources::NOT_PROFICIENT =
- "\t000\v007\x3""c%ss are not proficient with a %s!";
-
-const char *const Resources::NO_ITEMS_AVAILABLE = "\x3""c\n"
- "\t000No items available.";
-
-const char *const Resources::CATEGORY_NAMES[4] = { "Weapons", "Armor", "Accessories", "Miscellaneous" };
-
-const char *const Resources::X_FOR_THE_Y =
- "\x1\fd\r%s\v000\t000%s for %s the %s%s\v011\x2%s%s%s%s%s%s%s%s%s\x1\fd";
-
-const char *const Resources::X_FOR_Y =
- "\x1\xC""d\r\x3l\v000\t000%s for %s\x3r\t000%s\x3l\v011\x2%s%s%s%s%s%s%s%s%s\x1\xC""d";
-
-const char *const Resources::X_FOR_Y_GOLD =
- "\x1\fd\r\x3l\v000\t000%s for %s\t150Gold - %lu%s\x3l\v011"
- "\x2%s%s%s%s%s%s%s%s%s\x1\fd";
-
-const char *const Resources::FMT_CHARGES = "\x3rr\t000Charges\x3l";
-
-const char *const Resources::AVAILABLE_GOLD_COST =
- "\x1\fd\r\x3l\v000\t000Available %s\t150Gold - %lu\x3r\t000Cost"
- "\x3l\v011\x2%s%s%s%s%s%s%s%s%s\x1\xC""d";
-
-const char *const Resources::CHARGES = "Charges";
-
-const char *const Resources::COST = "Cost";
-
-const char *const Resources::ITEM_ACTIONS[7] = {
- "Equip", "Remove", "Use", "Discard", "Enchant", "Recharge", "Gold"
-};
-const char *const Resources::WHICH_ITEM = "\t010\v005%s which item?";
-
-const char *const Resources::WHATS_YOUR_HURRY = "\v007What's your hurry?\n"
- "Wait till you get out of here!";
-
-const char *const Resources::USE_ITEM_IN_COMBAT =
- "\v007To use an item in Combat, invoke the Use command on your turn!";
-
-const char *const Resources::NO_SPECIAL_ABILITIES = "\v005\x3""c%s\fdhas no special abilities!";
-
-const char *const Resources::CANT_CAST_WHILE_ENGAGED = "\x3""c\v007Can't cast %s while engaged!";
-
-const char *const Resources::EQUIPPED_ALL_YOU_CAN = "\x3""c\v007You have equipped all the %ss you can!";
-const char *const Resources::REMOVE_X_TO_EQUIP_Y = "\x3""c\v007You must remove %sto equip %s\x8!";
-const char *const Resources::RING = "ring";
-const char *const Resources::MEDAL = "medal";
-
-const char *const Resources::CANNOT_REMOVE_CURSED_ITEM = "\x3""You cannot remove a cursed item!";
-
-const char *const Resources::CANNOT_DISCARD_CURSED_ITEM = "\3x""cYou cannot discard a cursed item!";
-
-const char *const Resources::PERMANENTLY_DISCARD = "\v000\t000\x03lPermanently discard %s\fd?";
-
-const char *const Resources::BACKPACK_IS_FULL = "\v005\x3""c\fd%s's backpack is full.";
-
-const char *const Resources::CATEGORY_BACKPACK_IS_FULL[4] = {
- "\v010\t000\x3""c%s's weapons backpack is full.",
- "\v010\t000\x3""c%s's armor backpack is full.",
- "\v010\t000\x3""c%s's accessories backpack is full.",
- "\v010\t000\x3""c%s's miscellaneous backpack is full."
-};
-
-const char *const Resources::BUY_X_FOR_Y_GOLD = "\x3l\v000\t000\fdBuy %s\fd for %lu gold?";
-
-const char *const Resources::SELL_X_FOR_Y_GOLD = "\x3l\v000\t000\fdSell %s\fd for %lu gold?";
-
-const char *const Resources::NO_NEED_OF_THIS = "\v005\x3""c\fdWe have no need of this %s\f!";
-
-const char *const Resources::NOT_RECHARGABLE = "\v012\x3""c\fdNot Rechargeable. %s";
-
-const char *const Resources::NOT_ENCHANTABLE = "\v012\t000\x3""cNot Enchantable. %s";
-
-const char *const Resources::SPELL_FAILED = "Spell Failed!";
-
-const char *const Resources::ITEM_NOT_BROKEN = "\fdThat item is not broken!";
-
-const char *const Resources::FIX_IDENTIFY[2] = { "Fix", "Identify" };
-
-const char *const Resources::FIX_IDENTIFY_GOLD = "\x3l\v000\t000%s %s\fd for %lu gold?";
-
-const char *const Resources::IDENTIFY_ITEM_MSG = "\fd\v000\t000\x3""cIdentify Item\x3l\n"
- "\n"
- "\v012%s\fd\n"
- "\n"
- "%s";
-
-const char *const Resources::ITEM_DETAILS =
- "Proficient Classes\t132:\t140%s\n"
- "to Hit Modifier\t132:\t140%s\n"
- "Physical Damage\t132:\t140%s\n"
- "Elemental Damage\t132:\t140%s\n"
- "Elemental Resistance\t132:\t140%s\n"
- "Armor Class Bonus\t132:\t140%s\n"
- "Attribute Bonus\t132:\t140%s\n"
- "Special Power\t132:\t140%s";
-
-const char *const Resources::ALL = "All";
-const char *const Resources::FIELD_NONE = "None";
-const char *const Resources::DAMAGE_X_TO_Y = "%d to %d";
-const char *const Resources::ELEMENTAL_XY_DAMAGE = "%+d %s Damage";
-const char *const Resources::ATTR_XY_BONUS = "%+d %s";
-const char *const Resources::EFFECTIVE_AGAINST = "x3 vs %s";
-
-const char *const Resources::QUESTS_DIALOG_TEXT =
- "\r\x2\x3""c\v021\t017\f37I\fdtems\t085\f37Q\fduests\t153"
- "\f37A\fduto Notes 221\f37U\fdp\t255\f37D\fdown"
- "\t289Exit";
-const char *const Resources::CLOUDS_OF_XEEN_LINE = "\b \b*-- \f04Clouds of Xeen\fd --";
-const char *const Resources::DARKSIDE_OF_XEEN_LINE = "\b \b*-- \f04Darkside of Xeen\fd --";
-
-const char *const Resources::NO_QUEST_ITEMS =
- "\r\x3""c\v000 000Quest Items\x3l\x2\n"
- "\n"
- "\x3""cNo Quest Items";
-const char *const Resources::NO_CURRENT_QUESTS =
- "\x3""c\v000\t000\n"
- "\n"
- "No Current Quests";
-const char *const Resources::NO_AUTO_NOTES = "\x3""cNo Auto Notes";
-
-const char *const Resources::QUEST_ITEMS_DATA =
- "\r\x1\fd\x3""c\v000\t000Quest Items\x3l\x2\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s\n"
- "\f04 * \fd%s";
-const char *const Resources::CURRENT_QUESTS_DATA =
- "\r\x1\fd\x3""c\t000\v000Current Quests\x3l\x2\n"
- "%s\n"
- "\n"
- "%s\n"
- "\n"
- "%s";
-const char *const Resources::AUTO_NOTES_DATA =
- "\r\x1\fd\x3""c\t000\v000Auto Notes\x3l\x2\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l\n"
- "%s\x3l";
-
-const char *const Resources::REST_COMPLETE =
- "\v000\t0008 hours pass. Rest complete.\n"
- "%s\n"
- "%d food consumed.";
-const char *const Resources::PARTY_IS_STARVING = "\f07The Party is Starving!\fd";
-const char *const Resources::HIT_SPELL_POINTS_RESTORED = "Hit Pts and Spell Pts restored.";
-const char *const Resources::TOO_DANGEROUS_TO_REST = "Too dangerous to rest here!";
-const char *const Resources::SOME_CHARS_MAY_DIE = "Some Chars may die. Rest anyway?";
-
-const char *const Resources::CANT_DISMISS_LAST_CHAR = "You cannot dismiss your last character!";
-
-const char *const Resources::REMOVE_DELETE[2] = { "Remove", "Delete" };
-
-const char *const Resources::REMOVE_OR_DELETE_WHICH = "\x3l\t010\v005%s which character?";
-
-const char *const Resources::YOUR_PARTY_IS_FULL = "\v007Your party is full!";
-
-const char *const Resources::HAS_SLAYER_SWORD =
- "\v000\t000This character has the Xeen Slayer Sword and cannot be deleted!";
-const char *const Resources::SURE_TO_DELETE_CHAR =
- "Are you sure you want to delete %s the %s?";
-
-const char *const Resources::CREATE_CHAR_DETAILS =
- "\f04\x3""c\x2\t144\v119\f37R\f04oll\t144\v149\f37C\f04reate"
- "\t144\v179\f37ESC\f04\x3l\x1\t195\v021\f37M\f04gt"
- "\t195\v045\f37I\f04nt\t195\v069\f37P\f04er\t195\v093\f37E\f04nd"
- "\t195\v116\f37S\f04pd\t195\v140\f37A\f04cy\t195\v164\f37L\f04ck%s";
-
-const char *const Resources::NEW_CHAR_STATS =
- "\f04\x3l\t022\v148Race\t055: %s\n"
- "\t022Sex\t055: %s\n"
- "\t022Class\t055:\n"
- "\x3r\t215\v031%d\t215\v055%d\t215\v079%d\t215\v103%d\t215\v127%d"
- "\t215\v151%d\t215\v175%d\x3l\t242\v020\f%.2dKnight\t242\v031\f%.2d"
- "Paladin\t242\v042\f%.2dArcher\t242\v053\f%.2dCleric\t242\v064\f%.2d"
- "Sorcerer\t242\v075\f%.2dRobber\t242\v086\f%.2dNinja\t242\v097\f%.2d"
- "Barbarian\t242\v108\f%.2dDruid\t242\v119\f%.2dRanger\f04\x3""c"
- "\t265\v142Skills\x3l\t223\v155%s\t223\v170%s%s";
-
-const char *const Resources::NAME_FOR_NEW_CHARACTER =
- "\x3""cEnter a Name for this Character\n\n";
-const char *const Resources::SELECT_CLASS_BEFORE_SAVING =
- "\v006\x3""cSelect a Class before saving.\x3l";
-const char *const Resources::EXCHANGE_ATTR_WITH = "Exchange %s with...";
-
-const int Resources::NEW_CHAR_SKILLS[10] = { 1, 5, -1, -1, 4, 0, 0, -1, 6, 11 };
-const int Resources::NEW_CHAR_SKILLS_LEN[10] = { 11, 8, 0, 0, 12, 8, 8, 0, 9, 11 };
-const int Resources::NEW_CHAR_RACE_SKILLS[10] = { 14, -1, 17, 16, -1, 0, 0, 0, 0, 0 };
-
-const int Resources::RACE_MAGIC_RESISTENCES[5] = { 7, 5, 20, 0, 0 };
-const int Resources::RACE_FIRE_RESISTENCES[5] = { 7, 0, 2, 5, 10 };
-const int Resources::RACE_ELECTRIC_RESISTENCES[5] = { 7, 0, 2, 5, 10 };
-const int Resources::RACE_COLD_RESISTENCES[5] = { 7, 0, 2, 5, 10 };
-const int Resources::RACE_ENERGY_RESISTENCES[5] = { 7, 5, 2, 5, 0 };
-const int Resources::RACE_POISON_RESISTENCES[5] = { 7, 0, 2, 20, 0 };
-const int Resources::NEW_CHARACTER_SPELLS[10][4] = {
- { -1, -1, -1, -1 },
- { 21, -1, -1, -1 },
- { 22, -1, -1, -1 },
- { 21, 1, 14, -1 },
- { 22, 0, 25, -1 },
- { -1, -1, -1, -1 },
- { -1, -1, -1, -1 },
- { -1, -1, -1, -1 },
- { 20, 1, 11, 23 },
- { 20, 1, -1, -1 }
-};
-
-const char *const Resources::COMBAT_DETAILS = "\r\f00\x3""c\v000\t000\x2""Combat%s%s%s\x1";
-
-const char *Resources::NOT_ENOUGH_TO_CAST = "\x3""c\v010Not enough %s to Cast %s";
-const char *Resources::SPELL_CAST_COMPONENTS[2] = { "Spell Points", "Gems" };
-
-const char *const Resources::CAST_SPELL_DETAILS =
- "\r\x2\x3""c\v122\t013\f37C\fdast\t040\f37N\fdew"
- "\t067ESC\x1\t000\v000\x3""cCast Spell\n"
- "\n"
- "%s\x3l\n"
- "\n"
- "Spell Ready:\x3""c\n"
- "\n"
- "\f09%s\fd\x2\x3l\n"
- "\v082Cost\x3r\t000%u/%u\x3l\n"
- "Cur SP\x3r\t000%u\x1";
-
-const char *const Resources::PARTY_FOUND =
- "\x3""cThe Party Found:\n"
- "\n"
- "\x3r\t000%lu Gold\n"
- "%lu Gems";
-
-const char *const Resources::BACKPACKS_FULL_PRESS_KEY =
- "\v007\f12Warning! BackPacks Full!\fd\n"
- "Press a Key";
-
-const char *const Resources::HIT_A_KEY = "\x3l\v120\t000\x4""077\x3""c\f37Hit a key\xC""d";
-
-const char *const Resources::GIVE_TREASURE_FORMATTING =
- "\x3l\v060\t000\x4""077\n"
- "\x4""077\n"
- "\x4""077\n"
- "\x4""077\n"
- "\x4""077\n"
- "\x4""077";
-
-const char *const Resources::X_FOUND_Y = "\v060\t000\x3""c%s found: %s";
-
-const char *const Resources::ON_WHO = "\x3""c\v009On Who?";
-
-const char *const Resources::WHICH_ELEMENT1 =
- "\r\x3""c\x1Which Element?\x2\v034\t014\f15F\fdire\t044"
- "\f15E\fdlec\t074\f15C\fdold\t104\f15A\fdcid\x1";
-
-const char *const Resources::WHICH_ELEMENT2 =
- "\r\x3""cWhich Element?', 2, 0Bh, '034\t014\f15F\fdire\t044"
- "\f15E\fdlec\t074\f15C\fdold\t104\f15A\fdcid\x1";
-
-const char *const Resources::DETECT_MONSTERS = "\x3""cDetect Monsters";
-
-const char *const Resources::LLOYDS_BEACON =
- "\r\x3""c\v000\t000\x1Lloyd's Beacon\n"
- "\n"
- "Last Location\n"
- "\n"
- "%s\x3l\n"
- "x = %d\x3r\t000y = %d\x3""c\x2\v122\t021\f15S\fdet\t060\f15R\fdeturn\x1";
-
-const char *const Resources::HOW_MANY_SQUARES = "\x3""cTeleport\nHow many squares %s (1-9)";
-
-const char *const Resources::TOWN_PORTAL =
- "\x3""cTown Portal\x3l\n"
- "\n"
- "\t0101. %s\n"
- "\t0102. %s\n"
- "\t0103. %s\n"
- "\t0104. %s\n"
- "\t0105. %s\x3""c\n"
- "\n"
- "To which Town (1-5)\n"
- "\n";
-
-const int Resources::TOWN_MAP_NUMBERS[2][5] = {
- { 28, 29, 30, 31, 32 }, { 29, 31, 33, 35, 37 }
-};
-
-const char *const Resources::MONSTER_DETAILS =
- "\x3l\n"
- "%s\x3""c\t100%s\t140%u\t180%u\x3r\t000%s";
-
-const char *const Resources::MONSTER_SPECIAL_ATTACKS[23] = {
- "None", "Magic", "Fire", "Elec", "Cold", "Poison", "Energy", "Disease",
- "Insane", "Asleep", "CurseItm", "InLove", "DrnSPts", "Curse", "Paralys",
- "Uncons", "Confuse", "BrkWpn", "Weak", "Erad", "Age+5", "Dead", "Stone"
-};
-
-const char *const Resources::IDENTIFY_MONSTERS =
- "Name\x3""c\t100HP\t140AC\t177#Atks\x3r\t000Special%s%s%s";
-
-const char *const Resources::EVENT_SAMPLES[6] = {
- "ahh.voc", "whereto.voc", "gulp.voc", "null.voc", "scream.voc", "laff1.voc"
-};
-
-const char *const Resources::MOONS_NOT_ALIGNED =
-"\x3""c\xB""012\t000The moons are not aligned. Passage to the %s is unavailable";
-
-const char *const Resources::AWARDS_FOR =
- "\r\x1\fd\x3""c\v000\t000Awards for %s the %s\x3""l\x2\n"
- "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\x1";
-
-const char *const Resources::AWARDS_TEXT =
- "\r\x2\x3""c\xB""021\t221\xC""37U\xC""dp\t255\xC""37D\xC""down\t289Exit";
-
-const char *const Resources::NO_AWARDS = "\x3""cNo Awards";
-
-const char *const Resources::WARZONE_BATTLE_MASTER = "The Warzone\n\t125Battle Master";
-
-const char *const Resources::WARZONE_MAXED = "What! You again? Go pick on someone your own size!";
-
-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";
-
-const char *const Resources::PICKS_THE_LOCK = "\x3""c\xB""010%s picks the lock!\nPress any key.";
-
-const char *const Resources::UNABLE_TO_PICK_LOCK = "\x3""c\v010%s was unable to pick the lock!\nPress any key.";
-
-const char *const Resources::CONTROL_PANEL_TEXT =
- "\x1\xC""00\x3""c\xB""000\t000Control Panel\x3r"
- "\xB""022\t045\xC""06L\xC""doad:\t124\xC""06E\xC""dfx:"
- "\xB""041\t045\xC""06S\xC""dave:\t124\xC""06M\xC""dusic:"
- "\xB""060\t045\xC""06Q\xC""duit:"
- "\xB""080\t084Mr \xC""06W\xC""dizard:%s\t000\x1";
-const char *const Resources::CONTROL_PANEL_BUTTONS =
- "\x3""c\f11"
- "\xB""022\t062load\t141%s"
- "\xB""041\t062save\t141%s"
- "\xB""060\t062exit"
- "\xB""079\t102Help\xC""d";
-const char *const Resources::ON = "\f15on\f11";
-const char *const Resources::OFF = "\f32off\f11";
-const char *const Resources::CONFIRM_QUIT = "Are you sure you want to quit?";
-const char *const Resources::MR_WIZARD =
- "Are you sure you want Mr.Wizard's Help ?";
-const char *const Resources::NO_LOADING_IN_COMBAT =
- "No Loading Allowed in Combat!";
-const char *const Resources::NO_SAVING_IN_COMBAT =
- "No Saving Allowed in Combat!";
-const char *const Resources::QUICK_FIGHT_TEXT = "\r\fd\x3""c\v000\t000QuickFight Options\n\n"
- "%s\x3l\n\n"
- "Current\x3r\n"
- "\t000%s\x2\x3""c\v122\t021\f37N\f04ext\t060Exit\x1";
-const char *const Resources::QUICK_FIGHT_OPTIONS[4] = { "Attack", "Cast", "Block", "Run" };
-
-const char *const Resources::WORLD_END_TEXT[9] = {
- "\n\n\n\n\n\n\n"
- "Congratulations Adventurers!\n\n"
- "Let the unification ceremony begin!",
- "And so the call went out to the people throughout the lands of Xeen"
- " that the prophecy was nearing completion.",
- "They came in great numbers to witness the momentous occasion.",
- "\xB""026The Dragon Pharoah presided over the ceremony.",
- "\xB""026Queen Kalindra presented the Cube of Power.",
- "\xB""026Prince Roland presented the Xeen Sceptre.",
- "\xB""026Together, they placed the Cube of Power...",
- "\xB""026and the Sceptre, onto the Altar of Joining.",
- "With the prophecy complete, the two sides of Xeen were united as one",
-};
+ // Load the data from the resource
+ loadData();
+}
-const char *const Resources::WORLD_CONGRATULATIONS =
- "\x3""cCongratulations\n\n"
- "Your Final Score is:\n\n"
- "%010lu\n"
- "\x3l\n"
- "Please send this score to the Ancient's Headquarters where "
- "you'll be added to the Hall of Legends!\n\n"
- "Ancient's Headquarters\n"
- "New World Computing, Inc.\n"
- "P.O. Box 4302\n"
- "Hollywood, CA 90078";
-const char *const Resources::WORLD_CONGRATULATIONS2 =
- "\n\n\n\n\n\n"
- "But wait... there's more!\n"
- "\n\n"
- "Include the message\n"
- "\"%s\"\n"
- "with your final score and receive a special bonus.";
-const char *const Resources::CLOUDS_CONGRATULATIONS1 =
- "\xC""23\x3l"
- "\xB""000\t000Please send this score to the Ancient's Headquarters "
- "where you'll be added to the Hall of Legends!\xC""33\x3""c"
- "\xB""070\t000Press a Key";
-const char *const Resources::CLOUDS_CONGRATULATIONS2 =
- "\xC""23\x3l"
- "\xB""000\t000Ancient's Headquarters\n"
- "New World Computing, Inc.\n"
- "P.O. Box 4302\n"
- "Hollywood, CA 90078-4302\xC""33\x3""c"
- "\xB""070\t000Press a Key";
-const char *const Resources::GOOBER[3] = {
- "", "I am a Goober!", "I am a Super Goober!"
-};
+void Resources::loadData() {
+ ResFile file;
+ file.syncString(CREDITS);
+ file.syncString(OPTIONS_TITLE);
+ file.syncString(THE_PARTY_NEEDS_REST);
+ file.syncString(WHO_WILL);
+ file.syncString(HOW_MUCH);
+ file.syncString(WHATS_THE_PASSWORD);
+ file.syncString(IN_NO_CONDITION);
+ file.syncString(NOTHING_HERE);
+ file.syncStrings(TERRAIN_TYPES, 6);
+ file.syncStrings(OUTDOORS_WALL_TYPES, 16);
+ file.syncStrings(SURFACE_NAMES, 16);
+ file.syncStrings(WHO_ACTIONS, 32);
+ file.syncStrings(WHO_WILL_ACTIONS, 4);
+ file.syncBytes2D((byte *)SYMBOLS, 20, 64);
+ file.syncBytes2D((byte *)TEXT_COLORS, 40, 4);
+ file.syncStrings(DIRECTION_TEXT_UPPER, 4);
+ file.syncStrings(DIRECTION_TEXT, 4);
+ file.syncStrings(RACE_NAMES, 5);
+ file.syncNumbers(RACE_HP_BONUSES, 5);
+ file.syncNumbers2D((int *)RACE_SP_BONUSES, 5, 2);
+ file.syncStrings(CLASS_NAMES, 11);
+ file.syncNumbers(CLASS_EXP_LEVELS, 10);
+ file.syncStrings(ALIGNMENT_NAMES, 3);
+ file.syncStrings(SEX_NAMES, 2);
+ file.syncStrings(SKILL_NAMES, 18);
+ file.syncStrings(CONDITION_NAMES, 17);
+ file.syncNumbers(CONDITION_COLORS, 17);
+ file.syncString(GOOD);
+ file.syncString(BLESSED);
+ file.syncString(POWER_SHIELD);
+ file.syncString(HOLY_BONUS);
+ file.syncString(HEROISM);
+ file.syncString(IN_PARTY);
+ file.syncString(PARTY_DETAILS);
+ file.syncString(PARTY_DIALOG_TEXT);
+ file.syncNumbers(FACE_CONDITION_FRAMES, 17);
+ file.syncNumbers(CHAR_FACES_X, 6);
+ file.syncNumbers(HP_BARS_X, 6);
+ file.syncString(NO_ONE_TO_ADVENTURE_WITH);
+ file.syncBytes2D((byte *)DARKNESS_XLAT, 3, 256);
+ file.syncString(YOUR_ROSTER_IS_FULL);
+ file.syncString(PLEASE_WAIT);
+ file.syncString(OOPS);
+ file.syncNumbers2D((int *)SCREEN_POSITIONING_X, 4, 48);
+ file.syncNumbers2D((int *)SCREEN_POSITIONING_Y, 4, 48);
+ file.syncNumbers(MONSTER_GRID_BITMASK, 12);
+ file.syncNumbers2D((int *)INDOOR_OBJECT_X, 2, 12);
+ file.syncNumbers2D((int *)MAP_OBJECT_Y, 2, 12);
+ file.syncNumbers(INDOOR_MONSTERS_Y, 4);
+ file.syncNumbers2D((int *)OUTDOOR_OBJECT_X, 2, 12);
+ file.syncNumbers(OUTDOOR_MONSTER_INDEXES, 26);
+ file.syncNumbers(OUTDOOR_MONSTERS_Y, 26);
+ file.syncNumbers2D((int *)DIRECTION_ANIM_POSITIONS, 4, 4);
+ file.syncBytes2D((byte *)WALL_SHIFTS, 4, 48);
+ file.syncNumbers(DRAW_NUMBERS, 25);
+ file.syncNumbers2D((int *)DRAW_FRAMES, 25, 2);
+ file.syncNumbers(COMBAT_FLOAT_X, 8);
+ file.syncNumbers(COMBAT_FLOAT_Y, 8);
+ file.syncNumbers2D((int *)MONSTER_EFFECT_FLAGS, 15, 8);
+ file.syncNumbers2D((int *)SPELLS_ALLOWED, 3, 40);
+ file.syncNumbers(BASE_HP_BY_CLASS, 10);
+ file.syncNumbers(AGE_RANGES, 10);
+ file.syncNumbers2D((int *)AGE_RANGES_ADJUST, 2, 10);
+ file.syncNumbers(STAT_VALUES, 24);
+ file.syncNumbers(STAT_BONUSES, 24);
+ file.syncNumbers(ELEMENTAL_CATEGORIES, 6);
+ file.syncNumbers(ATTRIBUTE_CATEGORIES, 10);
+ file.syncNumbers(ATTRIBUTE_BONUSES, 72);
+ file.syncNumbers(ELEMENTAL_RESISTENCES, 37);
+ file.syncNumbers(ELEMENTAL_DAMAGE, 37);
+ file.syncNumbers(WEAPON_DAMAGE_BASE, 35);
+ file.syncNumbers(WEAPON_DAMAGE_MULTIPLIER, 35);
+ file.syncNumbers(METAL_DAMAGE, 22);
+ file.syncNumbers(METAL_DAMAGE_PERCENT, 22);
+ file.syncNumbers(METAL_LAC, 9);
+ file.syncNumbers(ARMOR_STRENGTHS, 14);
+ file.syncNumbers(MAKE_ITEM_ARR1, 6);
+ file.syncNumbers3D((int *)MAKE_ITEM_ARR2, 6, 7, 2);
+ file.syncNumbers3D((int *)MAKE_ITEM_ARR3, 10, 7, 2);
+ file.syncNumbers3D((int *)MAKE_ITEM_ARR4, 2, 7, 2);
+ file.syncNumbers2D((int *)MAKE_ITEM_ARR5, 8, 2);
+ file.syncNumbers(OUTDOOR_DRAWSTRUCT_INDEXES, 44);
+ file.syncNumbers2D((int *)TOWN_MAXES, 2, 11);
+ file.syncStrings2D((String *)TOWN_ACTION_MUSIC, 2, 7);
+ file.syncStrings(TOWN_ACTION_SHAPES, 7);
+ file.syncNumbers2D((int *)TOWN_ACTION_FILES, 2, 7);
+ file.syncString(BANK_TEXT);
+ file.syncString(BLACKSMITH_TEXT);
+ file.syncString(GUILD_NOT_MEMBER_TEXT);
+ file.syncString(GUILD_TEXT);
+ file.syncString(TAVERN_TEXT);
+ file.syncString(GOOD_STUFF);
+ file.syncString(HAVE_A_DRINK);
+ file.syncString(YOURE_DRUNK);
+ file.syncNumbers4D((int *)TAVERN_EXIT_LIST, 2, 6, 5, 2);
+ file.syncString(FOOD_AND_DRINK);
+ file.syncString(TEMPLE_TEXT);
+ file.syncString(EXPERIENCE_FOR_LEVEL);
+ file.syncString(LEARNED_ALL);
+ file.syncString(ELIGIBLE_FOR_LEVEL);
+ file.syncString(TRAINING_TEXT);
+ file.syncString(GOLD_GEMS);
+ file.syncString(GOLD_GEMS_2);
+ file.syncString(DEPOSIT_WITHDRAWL[2]);
+ file.syncString(NOT_ENOUGH_X_IN_THE_Y);
+ file.syncString(NO_X_IN_THE_Y);
+ file.syncString(STAT_NAMES[16]);
+ file.syncString(CONSUMABLE_NAMES[4]);
+ file.syncString(WHERE_NAMES[2]);
+ file.syncString(AMOUNT);
+ file.syncString(FOOD_PACKS_FULL);
+ file.syncString(BUY_SPELLS);
+ file.syncString(GUILD_OPTIONS);
+ file.syncNumbers((int *)MISC_SPELL_INDEX, 74);
+ file.syncNumbers((int *)SPELL_COSTS, 77);
+ file.syncNumbers2D((int *)CLOUDS_SPELL_OFFSETS, 5, 20);
+ file.syncNumbers2D((int *)DARK_SPELL_OFFSETS, 3, 39);
+ file.syncNumbers2D((int *)DARK_SPELL_RANGES, 12, 2);
+ file.syncNumbers((int *)SPELL_GEM_COST, 77);
+ file.syncString(NOT_A_SPELL_CASTER);
+ file.syncString(SPELLS_FOR);
+ file.syncString(SPELL_LINES_0_TO_9);
+ file.syncString(SPELLS_DIALOG_SPELLS);
+ file.syncString(SPELL_PTS);
+ file.syncString(GOLD);
+ file.syncString(SPELLS_PRESS_A_KEY);
+ file.syncString(SPELLS_PURCHASE);
+ file.syncString(MAP_TEXT);
+ file.syncString(LIGHT_COUNT_TEXT);
+ file.syncString(FIRE_RESISTENCE_TEXT);
+ file.syncString(ELECRICITY_RESISTENCE_TEXT);
+ file.syncString(COLD_RESISTENCE_TEXT);
+ file.syncString(POISON_RESISTENCE_TEXT);
+ file.syncString(CLAIRVOYANCE_TEXT);
+ file.syncString(LEVITATE_TEXT);
+ file.syncString(WALK_ON_WATER_TEXT);
+ file.syncString(GAME_INFORMATION);
+ file.syncString(WORLD_GAME_TEXT);
+ file.syncString(DARKSIDE_GAME_TEXT);
+ file.syncString(CLOUDS_GAME_TEXT);
+ file.syncString(SWORDS_GAME_TEXT);
+ file.syncStrings(WEEK_DAY_STRINGS, 10);
+ file.syncString(CHARACTER_DETAILS);
+ file.syncString(PARTY_GOLD);
+ file.syncString(PLUS_14);
+ file.syncString(CHARACTER_TEMPLATE);
+ file.syncString(EXCHANGING_IN_COMBAT);
+ file.syncString(CURRENT_MAXIMUM_RATING_TEXT);
+ file.syncString(CURRENT_MAXIMUM_TEXT);
+ file.syncStrings(RATING_TEXT, 24);
+ file.syncString(AGE_TEXT);
+ file.syncString(LEVEL_TEXT);
+ file.syncString(RESISTENCES_TEXT);
+ file.syncString(NONE);
+ file.syncString(EXPERIENCE_TEXT);
+ file.syncString(ELIGIBLE);
+ file.syncString(IN_PARTY_IN_BANK);
+ file.syncString(FOOD_TEXT);
+ file.syncString(EXCHANGE_WITH_WHOM);
+ file.syncString(QUICK_REF_LINE);
+ file.syncString(QUICK_REFERENCE);
+ file.syncNumbers2D((int *)BLACKSMITH_MAP_IDS, 2, 4);
+ file.syncString(ITEMS_DIALOG_TEXT1);
+ file.syncString(ITEMS_DIALOG_TEXT2);
+ file.syncString(ITEMS_DIALOG_LINE1);
+ file.syncString(ITEMS_DIALOG_LINE2);
+ file.syncString(BTN_BUY);
+ file.syncString(BTN_SELL);
+ file.syncString(BTN_IDENTIFY);
+ file.syncString(BTN_FIX);
+ file.syncString(BTN_USE);
+ file.syncString(BTN_EQUIP);
+ file.syncString(BTN_REMOVE);
+ file.syncString(BTN_DISCARD);
+ file.syncString(BTN_QUEST);
+ file.syncString(BTN_ENCHANT);
+ file.syncString(BTN_RECHARGE);
+ file.syncString(BTN_GOLD);
+ file.syncString(ITEM_BROKEN);
+ file.syncString(ITEM_CURSED);
+ file.syncStrings(BONUS_NAMES, 7);
+ file.syncStrings(WEAPON_NAMES, 35);
+ file.syncStrings(ARMOR_NAMES, 14);
+ file.syncStrings(ACCESSORY_NAMES, 11);
+ file.syncStrings(MISC_NAMES, 22);
+ file.syncStrings(ELEMENTAL_NAMES, 6);
+ file.syncStrings(ATTRIBUTE_NAMES, 10);
+ file.syncStrings(EFFECTIVENESS_NAMES, 7);
+ file.syncStrings(QUEST_ITEM_NAMES, 85);
+ file.syncNumbers((int *)WEAPON_BASE_COSTS, 35);
+ file.syncNumbers((int *)ARMOR_BASE_COSTS, 14);
+ file.syncNumbers((int *)ACCESSORY_BASE_COSTS, 11);
+ file.syncNumbers((int *)MISC_MATERIAL_COSTS, 22);
+ file.syncNumbers((int *)MISC_BASE_COSTS, 76);
+ file.syncNumbers((int *)METAL_BASE_MULTIPLIERS, 22);
+ file.syncNumbers((int *)ITEM_SKILL_DIVISORS, 4);
+ file.syncNumbers((int *)RESTRICTION_OFFSETS, 4);
+ file.syncNumbers((int *)ITEM_RESTRICTIONS, 86);
+ file.syncString(NOT_PROFICIENT);
+ file.syncString(NO_ITEMS_AVAILABLE);
+ file.syncStrings(CATEGORY_NAMES, 4);
+ file.syncString(X_FOR_THE_Y);
+ file.syncString(X_FOR_Y);
+ file.syncString(X_FOR_Y_GOLD);
+ file.syncString(FMT_CHARGES);
+ file.syncString(AVAILABLE_GOLD_COST);
+ file.syncString(CHARGES);
+ file.syncString(COST);
+ file.syncStrings(ITEM_ACTIONS, 7);
+ file.syncString(WHICH_ITEM);
+ file.syncString(WHATS_YOUR_HURRY);
+ file.syncString(USE_ITEM_IN_COMBAT);
+ file.syncString(NO_SPECIAL_ABILITIES);
+ file.syncString(CANT_CAST_WHILE_ENGAGED);
+ file.syncString(EQUIPPED_ALL_YOU_CAN);
+ file.syncString(REMOVE_X_TO_EQUIP_Y);
+ file.syncString(RING);
+ file.syncString(MEDAL);
+ file.syncString(CANNOT_REMOVE_CURSED_ITEM);
+ file.syncString(CANNOT_DISCARD_CURSED_ITEM);
+ file.syncString(PERMANENTLY_DISCARD);
+ file.syncString(BACKPACK_IS_FULL);
+ file.syncStrings(CATEGORY_BACKPACK_IS_FULL, 4);
+ file.syncString(BUY_X_FOR_Y_GOLD);
+ file.syncString(SELL_X_FOR_Y_GOLD);
+ file.syncString(NO_NEED_OF_THIS);
+ file.syncString(NOT_RECHARGABLE);
+ file.syncString(SPELL_FAILED);
+ file.syncString(NOT_ENCHANTABLE);
+ file.syncString(ITEM_NOT_BROKEN);
+ file.syncStrings(FIX_IDENTIFY, 2);
+ file.syncString(FIX_IDENTIFY_GOLD);
+ file.syncString(IDENTIFY_ITEM_MSG);
+ file.syncString(ITEM_DETAILS);
+ file.syncString(ALL);
+ file.syncString(FIELD_NONE);
+ file.syncString(DAMAGE_X_TO_Y);
+ file.syncString(ELEMENTAL_XY_DAMAGE);
+ file.syncString(ATTR_XY_BONUS);
+ file.syncString(EFFECTIVE_AGAINST);
+ file.syncString(QUESTS_DIALOG_TEXT);
+ file.syncString(CLOUDS_OF_XEEN_LINE);
+ file.syncString(DARKSIDE_OF_XEEN_LINE);
+ file.syncString(NO_QUEST_ITEMS);
+ file.syncString(NO_CURRENT_QUESTS);
+ file.syncString(NO_AUTO_NOTES);
+ file.syncString(QUEST_ITEMS_DATA);
+ file.syncString(CURRENT_QUESTS_DATA);
+ file.syncString(AUTO_NOTES_DATA);
+ file.syncString(REST_COMPLETE);
+ file.syncString(PARTY_IS_STARVING);
+ file.syncString(HIT_SPELL_POINTS_RESTORED);
+ file.syncString(TOO_DANGEROUS_TO_REST);
+ file.syncString(SOME_CHARS_MAY_DIE);
+ file.syncString(CANT_DISMISS_LAST_CHAR);
+ file.syncStrings(REMOVE_DELETE, 2);
+ file.syncString(REMOVE_OR_DELETE_WHICH);
+ file.syncString(YOUR_PARTY_IS_FULL);
+ file.syncString(HAS_SLAYER_SWORD);
+ file.syncString(SURE_TO_DELETE_CHAR);
+ file.syncString(CREATE_CHAR_DETAILS);
+ file.syncString(NEW_CHAR_STATS);
+ file.syncString(NAME_FOR_NEW_CHARACTER);
+ file.syncString(SELECT_CLASS_BEFORE_SAVING);
+ file.syncString(EXCHANGE_ATTR_WITH);
+ file.syncNumbers((int *)NEW_CHAR_SKILLS, 10);
+ file.syncNumbers((int *)NEW_CHAR_SKILLS_LEN, 10);
+ file.syncNumbers((int *)NEW_CHAR_RACE_SKILLS, 10);
+ file.syncNumbers((int *)RACE_MAGIC_RESISTENCES, 5);
+ file.syncNumbers((int *)RACE_FIRE_RESISTENCES, 5);
+ file.syncNumbers((int *)RACE_ELECTRIC_RESISTENCES, 5);
+ file.syncNumbers((int *)RACE_COLD_RESISTENCES, 5);
+ file.syncNumbers((int *)RACE_ENERGY_RESISTENCES, 5);
+ file.syncNumbers((int *)RACE_POISON_RESISTENCES, 5);
+ file.syncNumbers2D((int *)NEW_CHARACTER_SPELLS, 10, 4);
+ file.syncString(COMBAT_DETAILS);
+ file.syncString(NOT_ENOUGH_TO_CAST);
+ file.syncStrings(SPELL_CAST_COMPONENTS, 2);
+ file.syncString(CAST_SPELL_DETAILS);
+ file.syncString(PARTY_FOUND);
+ file.syncString(BACKPACKS_FULL_PRESS_KEY);
+ file.syncString(HIT_A_KEY);
+ file.syncString(GIVE_TREASURE_FORMATTING);
+ file.syncString(X_FOUND_Y);
+ file.syncString(ON_WHO);
+ file.syncString(WHICH_ELEMENT1);
+ file.syncString(WHICH_ELEMENT2);
+ file.syncString(DETECT_MONSTERS);
+ file.syncString(LLOYDS_BEACON);
+ file.syncString(HOW_MANY_SQUARES);
+ file.syncString(TOWN_PORTAL);
+ file.syncNumbers2D((int *)TOWN_MAP_NUMBERS, 2, 5);
+ file.syncString(MONSTER_DETAILS);
+ file.syncStrings(MONSTER_SPECIAL_ATTACKS, 23);
+ file.syncString(IDENTIFY_MONSTERS);
+ file.syncStrings(EVENT_SAMPLES, 6);
+ file.syncString(MOONS_NOT_ALIGNED);
+ file.syncString(AWARDS_FOR);
+ file.syncString(AWARDS_TEXT);
+ file.syncString(NO_AWARDS);
+ file.syncString(WARZONE_BATTLE_MASTER);
+ file.syncString(WARZONE_MAXED);
+ file.syncString(WARZONE_LEVEL);
+ file.syncString(WARZONE_HOW_MANY);
+ file.syncString(PICKS_THE_LOCK);
+ file.syncString(UNABLE_TO_PICK_LOCK);
+ file.syncString(CONTROL_PANEL_TEXT);
+ file.syncString(CONTROL_PANEL_BUTTONS);
+ file.syncString(ON);
+ file.syncString(OFF);
+ file.syncString(CONFIRM_QUIT);
+ file.syncString(MR_WIZARD);
+ file.syncString(NO_LOADING_IN_COMBAT);
+ file.syncString(NO_SAVING_IN_COMBAT);
+ file.syncString(QUICK_FIGHT_TEXT);
+ file.syncStrings(QUICK_FIGHT_OPTIONS, 4);
+ file.syncStrings(WORLD_END_TEXT, 9);
+ file.syncString(WORLD_CONGRATULATIONS);
+ file.syncString(WORLD_CONGRATULATIONS2);
+ file.syncString(CLOUDS_CONGRATULATIONS1);
+ file.syncString(CLOUDS_CONGRATULATIONS2);
+ file.syncStrings(GOOBER, 3);
+ file.syncStrings(MUSIC_FILES1, 5);
+ file.syncStrings2D((String *)MUSIC_FILES2, 6, 7);
+}
} // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index c9e0c2ff5a..513e70d1c4 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -26,6 +26,7 @@
#include "common/scummsys.h"
#include "common/str-array.h"
#include "gui/debugger.h"
+#include "xeen/files.h"
#include "xeen/party.h"
#include "xeen/spells.h"
@@ -36,344 +37,419 @@ namespace Xeen {
class XeenEngine;
class Resources {
-protected:
- Resources();
+ /**
+ * Derived string class to fix automatic type conversion to const char *
+ */
+ class String : public Common::String {
+ public:
+ String() : Common::String() {}
+ String(const Common::String &s) : Common::String(s) {}
+ operator const char *() { return c_str(); }
+ };
+
+ /**
+ * Derived file class with sync method aliases so that the same
+ * code from create_xeen can be re-used for both reading and
+ * writing the resource data
+ */
+ class ResFile : public File {
+ public:
+ ResFile() : File("CONSTANTS") {}
+
+ void syncString(String &str) {
+ str = readString();
+ }
+ void syncStrings(String *str, int count) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count, 0, 0, 0));
+ for (int idx = 0; idx < count; ++idx)
+ str[idx] = readString();
+ }
+ void syncStrings2D(String *str, int count1, int count2) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count1, count2, 0, 0));
+ for (int idx = 0; idx < count1 * count2; ++idx)
+ str[idx] = readString();
+ }
+ void syncNumber(int &val) {
+ val = readSint32LE();
+ }
+ void syncNumbers(int *vals, int count) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count, 0, 0, 0));
+ for (int idx = 0; idx < count; ++idx)
+ vals[idx] = readSint32LE();
+ }
+ void syncNumbers2D(int *vals, int count1, int count2) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count1, count2, 0, 0));
+ for (int idx = 0; idx < count1 * count2; ++idx)
+ vals[idx] = readSint32LE();
+ }
+ void syncNumbers3D(int *vals, int count1, int count2, int count3) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count1, count2, count3, 0));
+ for (int idx = 0; idx < count1 * count2 * count3; ++idx)
+ vals[idx] = readSint32LE();
+ }
+ void syncNumbers4D(int *vals, int count1, int count2, int count3, int count4) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count1, count2, count3, count4));
+ for (int idx = 0; idx < count1 * count2 * count3 * count4; ++idx)
+ vals[idx] = readSint32LE();
+ }
+ void syncBytes2D(byte *vals, int count1, int count2) {
+ uint tag = readUint32LE();
+ assert(tag == MKTAG(count1, count2, 0, 0));
+ read(vals, count1 * count2);
+ }
+ };
+private:
+ /**
+ * Loads all the constants data stored in the xeen.css
+ */
+ void loadData();
public:
SpriteResource _globalSprites;
Common::StringArray _maeNames; // Magic and equipment names
- static const char *const CREDITS;
- static const char *const OPTIONS_TITLE;
- static const char *const THE_PARTY_NEEDS_REST;
- static const char *const WHO_WILL;
- static const char *const HOW_MUCH;
- static const char *const WHATS_THE_PASSWORD;
- static const char *const IN_NO_CONDITION;
- static const char *const NOTHING_HERE;
- static const char *const TERRAIN_TYPES[6];
- static const char *const OUTDOORS_WALL_TYPES[16];
- static const char *const SURFACE_NAMES[16];
- static const char *const WHO_ACTIONS[32];
- static const char *const WHO_WILL_ACTIONS[4];
- static const byte SYMBOLS[20][64];
- static const byte TEXT_COLORS[40][4];
- static const char *const DIRECTION_TEXT_UPPER[4];
- static const char *const DIRECTION_TEXT[4];
- static const char *const RACE_NAMES[5];
- static const int RACE_HP_BONUSES[5];
- static const int RACE_SP_BONUSES[5][2];
- static const char *const CLASS_NAMES[11];
- static const uint CLASS_EXP_LEVELS[10];
- static const char *const ALIGNMENT_NAMES[3];
- static const char *const SEX_NAMES[2];
- static const char *const SKILL_NAMES[18];
- static const char *const CONDITION_NAMES[17];
- static const int CONDITION_COLORS[17];
- static const char *const GOOD;
- static const char *const BLESSED;
- static const char *const POWER_SHIELD;
- static const char *const HOLY_BONUS;
- static const char *const HEROISM;
- static const char *const IN_PARTY;
- static const char *const PARTY_DETAILS;
- static const char *const PARTY_DIALOG_TEXT;
- static const int FACE_CONDITION_FRAMES[17];
- static const int CHAR_FACES_X[6];
- static const int HP_BARS_X[6];
- static const char *const NO_ONE_TO_ADVENTURE_WITH;
- static const byte DARKNESS_XLAT[3][256];
- static const char *const YOUR_ROSTER_IS_FULL;
- static const char *const PLEASE_WAIT;
- static const char *const OOPS;
- static const int8 SCREEN_POSITIONING_X[4][48];
- static const int8 SCREEN_POSITIONING_Y[4][48];
- static const int MONSTER_GRID_BITMASK[12];
- static const int INDOOR_OBJECT_X[2][12];
- static const int MAP_OBJECT_Y[2][12];
- static const int INDOOR_MONSTERS_Y[4];
- static const int OUTDOOR_OBJECT_X[2][12];
- static const int OUTDOOR_MONSTER_INDEXES[26];
- static const int OUTDOOR_MONSTERS_Y[26];
- static const int DIRECTION_ANIM_POSITIONS[4][4];
- static const byte WALL_SHIFTS[4][48];
- static const int DRAW_NUMBERS[25];
- static const int DRAW_FRAMES[25][2];
- static const int COMBAT_FLOAT_X[8];
- static const int COMBAT_FLOAT_Y[8];
- static const int MONSTER_EFFECT_FLAGS[15][8];
- static const uint SPELLS_ALLOWED[3][40];
- static const int BASE_HP_BY_CLASS[10];
- static const int AGE_RANGES[10];
- static const int AGE_RANGES_ADJUST[2][10];
- static const uint STAT_VALUES[24];
- static const int STAT_BONUSES[24];
- static const int ELEMENTAL_CATEGORIES[6];
- static const int ATTRIBUTE_CATEGORIES[10];
- static const int ATTRIBUTE_BONUSES[72];
- static const int ELEMENTAL_RESISTENCES[37];
- static const int ELEMENTAL_DAMAGE[37];
- static const int WEAPON_DAMAGE_BASE[35];
- static const int WEAPON_DAMAGE_MULTIPLIER[35];
- static const int METAL_DAMAGE[22];
- static const int METAL_DAMAGE_PERCENT[22];
- static const int METAL_LAC[9];
- static const int ARMOR_STRENGTHS[14];
- static const int MAKE_ITEM_ARR1[6];
- static const int MAKE_ITEM_ARR2[6][7][2];
- static const int MAKE_ITEM_ARR3[10][7][2];
- static const int MAKE_ITEM_ARR4[2][7][2];
- static const int MAKE_ITEM_ARR5[8][2];
- static const int OUTDOOR_DRAWSTRUCT_INDEXES[44];
- static const int TOWN_MAXES[2][11];
- static const char *const TOWN_ACTION_MUSIC[2][7];
- static const char *const TOWN_ACTION_SHAPES[7];
- static const int TOWN_ACTION_FILES[2][7];
- static const char *const BANK_TEXT;
- static const char *const BLACKSMITH_TEXT;
- static const char *const GUILD_NOT_MEMBER_TEXT;
- static const char *const GUILD_TEXT;
- static const char *const TAVERN_TEXT;
- static const char *const GOOD_STUFF;
- static const char *const HAVE_A_DRINK;
- static const char *const YOURE_DRUNK;
- static const int TAVERN_EXIT_LIST[2][6][5][2];
- static const char *const FOOD_AND_DRINK;
- static const char *const TEMPLE_TEXT;
- static const char *const EXPERIENCE_FOR_LEVEL;
- static const char *const LEARNED_ALL;
- static const char *const ELIGIBLE_FOR_LEVEL;
- static const char *const TRAINING_TEXT;
- static const char *const GOLD_GEMS;
- static const char *const GOLD_GEMS_2;
- static const char *const DEPOSIT_WITHDRAWL[2];
- static const char *const NOT_ENOUGH_X_IN_THE_Y;
- static const char *const NO_X_IN_THE_Y;
- static const char *const STAT_NAMES[16];
- static const char *const CONSUMABLE_NAMES[4];
- static const char *const WHERE_NAMES[2];
- static const char *const AMOUNT;
- static const char *const FOOD_PACKS_FULL;
- static const char *const BUY_SPELLS;
- static const char *const GUILD_OPTIONS;
- static const int MISC_SPELL_INDEX[74];
- static const int SPELL_COSTS[77];
- static const int CLOUDS_SPELL_OFFSETS[5][20];
- static const uint DARK_SPELL_OFFSETS[3][39];
- static const int DARK_SPELL_RANGES[12][2];
- static const int SPELL_LEVEL_OFFSETS[3][39];
- static const int SPELL_GEM_COST[77];
- static const char *const NOT_A_SPELL_CASTER;
- static const char *const SPELLS_FOR;
- static const char *const SPELL_LINES_0_TO_9;
- static const char *const SPELLS_DIALOG_SPELLS;
- static const char *const SPELL_PTS;
- static const char *const GOLD;
- static const char *const SPELLS_PRESS_A_KEY;
- static const char *const SPELLS_PURCHASE;
- static const char *const MAP_TEXT;
- static const char *const LIGHT_COUNT_TEXT;
- static const char *const FIRE_RESISTENCE_TEXT;
- static const char *const ELECRICITY_RESISTENCE_TEXT;
- static const char *const COLD_RESISTENCE_TEXT;
- static const char *const POISON_RESISTENCE_TEXT;
- static const char *const CLAIRVOYANCE_TEXT;
- static const char *const LEVITATE_TEXT;
- static const char *const WALK_ON_WATER_TEXT;
- static const char *const GAME_INFORMATION;
- static const char *const WORLD_GAME_TEXT;
- static const char *const DARKSIDE_GAME_TEXT;
- static const char *const CLOUDS_GAME_TEXT;
- static const char *const SWORDS_GAME_TEXT;
- static const char *const WEEK_DAY_STRINGS[10];
- static const char *const CHARACTER_DETAILS;
- static const char *const PARTY_GOLD;
- static const char *const PLUS_14;
- static const char *const CHARACTER_TEMPLATE;
- static const char *const EXCHANGING_IN_COMBAT;
- static const char *const CURRENT_MAXIMUM_RATING_TEXT;
- static const char *const CURRENT_MAXIMUM_TEXT;
- static const char *const RATING_TEXT[24];
- static const char *const AGE_TEXT;
- static const char *const LEVEL_TEXT;
- static const char *const RESISTENCES_TEXT;
- static const char *const NONE;
- static const char *const EXPERIENCE_TEXT;
- static const char *const ELIGIBLE;
- static const char *const IN_PARTY_IN_BANK;
- static const char *const FOOD_TEXT;
- static const char *const EXCHANGE_WITH_WHOM;
- static const char *const QUICK_REF_LINE;
- static const char *const QUICK_REFERENCE;
- static const uint BLACKSMITH_MAP_IDS[2][4];
- static const char *const ITEMS_DIALOG_TEXT1;
- static const char *const ITEMS_DIALOG_TEXT2;
- static const char *const ITEMS_DIALOG_LINE1;
- static const char *const ITEMS_DIALOG_LINE2;
- static const char *const BTN_BUY;
- static const char *const BTN_SELL;
- static const char *const BTN_IDENTIFY;
- static const char *const BTN_FIX;
- static const char *const BTN_USE;
- static const char *const BTN_EQUIP;
- static const char *const BTN_REMOVE;
- static const char *const BTN_DISCARD;
- static const char *const BTN_QUEST;
- static const char *const BTN_ENCHANT;
- static const char *const BTN_RECHARGE;
- static const char *const BTN_GOLD;
- static const char *const ITEM_BROKEN;
- static const char *const ITEM_CURSED;
- static const char *const BONUS_NAMES[7];
- static const char *const WEAPON_NAMES[35];
- static const char *const ARMOR_NAMES[14];
- static const char *const ACCESSORY_NAMES[11];
- static const char *const MISC_NAMES[22];
- static const char *const *ITEM_NAMES[4];
- static const char *const ELEMENTAL_NAMES[6];
- static const char *const ATTRIBUTE_NAMES[10];
- static const char *const EFFECTIVENESS_NAMES[7];
- static const char *const QUEST_ITEM_NAMES[85];
- static const int WEAPON_BASE_COSTS[35];
- static const int ARMOR_BASE_COSTS[14];
- static const int ACCESSORY_BASE_COSTS[11];
- static const int MISC_MATERIAL_COSTS[22];
- static const int MISC_BASE_COSTS[76];
- static const int METAL_BASE_MULTIPLIERS[22];
- static const int ITEM_SKILL_DIVISORS[4];
- static const int RESTRICTION_OFFSETS[4];
- static const int ITEM_RESTRICTIONS[86];
- static const char *const NOT_PROFICIENT;
- static const char *const NO_ITEMS_AVAILABLE;
- static const char *const CATEGORY_NAMES[4];
- static const char *const X_FOR_THE_Y;
- static const char *const X_FOR_Y;
- static const char *const X_FOR_Y_GOLD;
- static const char *const FMT_CHARGES;
- static const char *const AVAILABLE_GOLD_COST;
- static const char *const CHARGES;
- static const char *const COST;
- static const char *const ITEM_ACTIONS[7];
- static const char *const WHICH_ITEM;
- static const char *const WHATS_YOUR_HURRY;
+ String *ITEM_NAMES[4];
- static const char *const USE_ITEM_IN_COMBAT;
-
- static const char *const NO_SPECIAL_ABILITIES;
-
- static const char *const CANT_CAST_WHILE_ENGAGED;
-
- static const char *const EQUIPPED_ALL_YOU_CAN;
- static const char *const REMOVE_X_TO_EQUIP_Y;
- static const char *const RING;
- static const char *const MEDAL;
- static const char *const CANNOT_REMOVE_CURSED_ITEM;
- static const char *const CANNOT_DISCARD_CURSED_ITEM;
- static const char *const PERMANENTLY_DISCARD;
- static const char *const BACKPACK_IS_FULL;
- static const char *const CATEGORY_BACKPACK_IS_FULL[4];
- static const char *const BUY_X_FOR_Y_GOLD;
- static const char *const SELL_X_FOR_Y_GOLD;
- static const char *const NO_NEED_OF_THIS;
- static const char *const NOT_RECHARGABLE;
- static const char *const SPELL_FAILED;
- static const char *const NOT_ENCHANTABLE;
- static const char *const ITEM_NOT_BROKEN;
- static const char *const FIX_IDENTIFY[2];
- static const char *const FIX_IDENTIFY_GOLD;
- static const char *const IDENTIFY_ITEM_MSG;
- static const char *const ITEM_DETAILS;
- static const char *const ALL;
- static const char *const FIELD_NONE;
- static const char *const DAMAGE_X_TO_Y;
- static const char *const ELEMENTAL_XY_DAMAGE;
- static const char *const ATTR_XY_BONUS;
- static const char *const EFFECTIVE_AGAINST;
- static const char *const QUESTS_DIALOG_TEXT;
- static const char *const CLOUDS_OF_XEEN_LINE;
- static const char *const DARKSIDE_OF_XEEN_LINE;
- static const char *const NO_QUEST_ITEMS;
- static const char *const NO_CURRENT_QUESTS;
- static const char *const NO_AUTO_NOTES;
- static const char *const QUEST_ITEMS_DATA;
- static const char *const CURRENT_QUESTS_DATA;
- static const char *const AUTO_NOTES_DATA;
- static const char *const REST_COMPLETE;
- static const char *const PARTY_IS_STARVING;
- static const char *const HIT_SPELL_POINTS_RESTORED;
- static const char *const TOO_DANGEROUS_TO_REST;
- static const char *const SOME_CHARS_MAY_DIE;
- static const char *const CANT_DISMISS_LAST_CHAR;
- static const char *const REMOVE_DELETE[2];
- static const char *const REMOVE_OR_DELETE_WHICH;
- static const char *const YOUR_PARTY_IS_FULL;
- static const char *const HAS_SLAYER_SWORD;
- static const char *const SURE_TO_DELETE_CHAR;
- static const char *const CREATE_CHAR_DETAILS;
- static const char *const NEW_CHAR_STATS;
- static const char *const NAME_FOR_NEW_CHARACTER;
- static const char *const SELECT_CLASS_BEFORE_SAVING;
- static const char *const EXCHANGE_ATTR_WITH;
- static const int NEW_CHAR_SKILLS[10];
- static const int NEW_CHAR_SKILLS_LEN[10];
- static const int NEW_CHAR_RACE_SKILLS[10];
- static const int RACE_MAGIC_RESISTENCES[5];
- static const int RACE_FIRE_RESISTENCES[5];
- static const int RACE_ELECTRIC_RESISTENCES[5];
- static const int RACE_COLD_RESISTENCES[5];
- static const int RACE_ENERGY_RESISTENCES[5];
- static const int RACE_POISON_RESISTENCES[5];
- static const int NEW_CHARACTER_SPELLS[10][4];
- static const char *const COMBAT_DETAILS;
- static const char *NOT_ENOUGH_TO_CAST;
- static const char *SPELL_CAST_COMPONENTS[2];
- static const char *const CAST_SPELL_DETAILS;
- static const char *const PARTY_FOUND;
- static const char *const BACKPACKS_FULL_PRESS_KEY;
- static const char *const HIT_A_KEY;
- static const char *const GIVE_TREASURE_FORMATTING;
- static const char *const X_FOUND_Y;
- static const char *const ON_WHO;
- static const char *const WHICH_ELEMENT1;
- static const char *const WHICH_ELEMENT2;
- static const char *const DETECT_MONSTERS;
- static const char *const LLOYDS_BEACON;
- static const char *const HOW_MANY_SQUARES;
- static const char *const TOWN_PORTAL;
- static const int TOWN_MAP_NUMBERS[2][5];
- static const char *const MONSTER_DETAILS;
- static const char *const MONSTER_SPECIAL_ATTACKS[23];
- static const char *const IDENTIFY_MONSTERS;
- static const char *const EVENT_SAMPLES[6];
- static const char *const MOONS_NOT_ALIGNED;
- static const char *const AWARDS_FOR;
- static const char *const AWARDS_TEXT;
- static const char *const NO_AWARDS;
- 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;
- static const char *const PICKS_THE_LOCK;
- static const char *const UNABLE_TO_PICK_LOCK;
- static const char *const CONTROL_PANEL_TEXT;
- static const char *const CONTROL_PANEL_BUTTONS;
- static const char *const ON;
- static const char *const OFF;
- static const char *const CONFIRM_QUIT;
- static const char *const MR_WIZARD;
- static const char *const NO_LOADING_IN_COMBAT;
- static const char *const NO_SAVING_IN_COMBAT;
- static const char *const QUICK_FIGHT_TEXT;
- static const char *const QUICK_FIGHT_OPTIONS[4];
- static const char *const WORLD_END_TEXT[9];
- static const char *const WORLD_CONGRATULATIONS;
- static const char *const WORLD_CONGRATULATIONS2;
- static const char *const CLOUDS_CONGRATULATIONS1;
- static const char *const CLOUDS_CONGRATULATIONS2;
- static const char *const GOOBER[3];
+ // Data loaded from xeen.ccs
+ String CREDITS;
+ String OPTIONS_TITLE;
+ String THE_PARTY_NEEDS_REST;
+ String WHO_WILL;
+ String HOW_MUCH;
+ String WHATS_THE_PASSWORD;
+ String IN_NO_CONDITION;
+ String NOTHING_HERE;
+ String TERRAIN_TYPES[6];
+ String OUTDOORS_WALL_TYPES[16];
+ String SURFACE_NAMES[16];
+ String WHO_ACTIONS[32];
+ String WHO_WILL_ACTIONS[4];
+ byte SYMBOLS[20][64];
+ byte TEXT_COLORS[40][4];
+ String DIRECTION_TEXT_UPPER[4];
+ String DIRECTION_TEXT[4];
+ String RACE_NAMES[5];
+ int RACE_HP_BONUSES[5];
+ int RACE_SP_BONUSES[5][2];
+ String CLASS_NAMES[11];
+ int CLASS_EXP_LEVELS[10];
+ String ALIGNMENT_NAMES[3];
+ String SEX_NAMES[2];
+ String SKILL_NAMES[18];
+ String CONDITION_NAMES[17];
+ int CONDITION_COLORS[17];
+ String GOOD;
+ String BLESSED;
+ String POWER_SHIELD;
+ String HOLY_BONUS;
+ String HEROISM;
+ String IN_PARTY;
+ String PARTY_DETAILS;
+ String PARTY_DIALOG_TEXT;
+ int FACE_CONDITION_FRAMES[17];
+ int CHAR_FACES_X[6];
+ int HP_BARS_X[6];
+ String NO_ONE_TO_ADVENTURE_WITH;
+ byte DARKNESS_XLAT[3][256];
+ String YOUR_ROSTER_IS_FULL;
+ String PLEASE_WAIT;
+ String OOPS;
+ int SCREEN_POSITIONING_X[4][48];
+ int SCREEN_POSITIONING_Y[4][48];
+ int MONSTER_GRID_BITMASK[12];
+ int INDOOR_OBJECT_X[2][12];
+ int MAP_OBJECT_Y[2][12];
+ int INDOOR_MONSTERS_Y[4];
+ int OUTDOOR_OBJECT_X[2][12];
+ int OUTDOOR_MONSTER_INDEXES[26];
+ int OUTDOOR_MONSTERS_Y[26];
+ int DIRECTION_ANIM_POSITIONS[4][4];
+ byte WALL_SHIFTS[4][48];
+ int DRAW_NUMBERS[25];
+ int DRAW_FRAMES[25][2];
+ int COMBAT_FLOAT_X[8];
+ int COMBAT_FLOAT_Y[8];
+ int MONSTER_EFFECT_FLAGS[15][8];
+ int SPELLS_ALLOWED[3][40];
+ int BASE_HP_BY_CLASS[10];
+ int AGE_RANGES[10];
+ int AGE_RANGES_ADJUST[2][10];
+ int STAT_VALUES[24];
+ int STAT_BONUSES[24];
+ int ELEMENTAL_CATEGORIES[6];
+ int ATTRIBUTE_CATEGORIES[10];
+ int ATTRIBUTE_BONUSES[72];
+ int ELEMENTAL_RESISTENCES[37];
+ int ELEMENTAL_DAMAGE[37];
+ int WEAPON_DAMAGE_BASE[35];
+ int WEAPON_DAMAGE_MULTIPLIER[35];
+ int METAL_DAMAGE[22];
+ int METAL_DAMAGE_PERCENT[22];
+ int METAL_LAC[9];
+ int ARMOR_STRENGTHS[14];
+ int MAKE_ITEM_ARR1[6];
+ int MAKE_ITEM_ARR2[6][7][2];
+ int MAKE_ITEM_ARR3[10][7][2];
+ int MAKE_ITEM_ARR4[2][7][2];
+ int MAKE_ITEM_ARR5[8][2];
+ int OUTDOOR_DRAWSTRUCT_INDEXES[44];
+ int TOWN_MAXES[2][11];
+ String TOWN_ACTION_MUSIC[2][7];
+ String TOWN_ACTION_SHAPES[7];
+ int TOWN_ACTION_FILES[2][7];
+ String BANK_TEXT;
+ String BLACKSMITH_TEXT;
+ String GUILD_NOT_MEMBER_TEXT;
+ String GUILD_TEXT;
+ String TAVERN_TEXT;
+ String GOOD_STUFF;
+ String HAVE_A_DRINK;
+ String YOURE_DRUNK;
+ int TAVERN_EXIT_LIST[2][6][5][2];
+ String FOOD_AND_DRINK;
+ String TEMPLE_TEXT;
+ String EXPERIENCE_FOR_LEVEL;
+ String LEARNED_ALL;
+ String ELIGIBLE_FOR_LEVEL;
+ String TRAINING_TEXT;
+ String GOLD_GEMS;
+ String GOLD_GEMS_2;
+ String DEPOSIT_WITHDRAWL[2];
+ String NOT_ENOUGH_X_IN_THE_Y;
+ String NO_X_IN_THE_Y;
+ String STAT_NAMES[16];
+ String CONSUMABLE_NAMES[4];
+ String WHERE_NAMES[2];
+ String AMOUNT;
+ String FOOD_PACKS_FULL;
+ String BUY_SPELLS;
+ String GUILD_OPTIONS;
+ int MISC_SPELL_INDEX[74];
+ int SPELL_COSTS[77];
+ int CLOUDS_SPELL_OFFSETS[5][20];
+ int DARK_SPELL_OFFSETS[3][39];
+ int DARK_SPELL_RANGES[12][2];
+ int SPELL_LEVEL_OFFSETS[3][39];
+ int SPELL_GEM_COST[77];
+ String NOT_A_SPELL_CASTER;
+ String SPELLS_FOR;
+ String SPELL_LINES_0_TO_9;
+ String SPELLS_DIALOG_SPELLS;
+ String SPELL_PTS;
+ String GOLD;
+ String SPELLS_PRESS_A_KEY;
+ String SPELLS_PURCHASE;
+ String MAP_TEXT;
+ String LIGHT_COUNT_TEXT;
+ String FIRE_RESISTENCE_TEXT;
+ String ELECRICITY_RESISTENCE_TEXT;
+ String COLD_RESISTENCE_TEXT;
+ String POISON_RESISTENCE_TEXT;
+ String CLAIRVOYANCE_TEXT;
+ String LEVITATE_TEXT;
+ String WALK_ON_WATER_TEXT;
+ String GAME_INFORMATION;
+ String WORLD_GAME_TEXT;
+ String DARKSIDE_GAME_TEXT;
+ String CLOUDS_GAME_TEXT;
+ String SWORDS_GAME_TEXT;
+ String WEEK_DAY_STRINGS[10];
+ String CHARACTER_DETAILS;
+ String PARTY_GOLD;
+ String PLUS_14;
+ String CHARACTER_TEMPLATE;
+ String EXCHANGING_IN_COMBAT;
+ String CURRENT_MAXIMUM_RATING_TEXT;
+ String CURRENT_MAXIMUM_TEXT;
+ String RATING_TEXT[24];
+ String AGE_TEXT;
+ String LEVEL_TEXT;
+ String RESISTENCES_TEXT;
+ String NONE;
+ String EXPERIENCE_TEXT;
+ String ELIGIBLE;
+ String IN_PARTY_IN_BANK;
+ String FOOD_TEXT;
+ String EXCHANGE_WITH_WHOM;
+ String QUICK_REF_LINE;
+ String QUICK_REFERENCE;
+ int BLACKSMITH_MAP_IDS[2][4];
+ String ITEMS_DIALOG_TEXT1;
+ String ITEMS_DIALOG_TEXT2;
+ String ITEMS_DIALOG_LINE1;
+ String ITEMS_DIALOG_LINE2;
+ String BTN_BUY;
+ String BTN_SELL;
+ String BTN_IDENTIFY;
+ String BTN_FIX;
+ String BTN_USE;
+ String BTN_EQUIP;
+ String BTN_REMOVE;
+ String BTN_DISCARD;
+ String BTN_QUEST;
+ String BTN_ENCHANT;
+ String BTN_RECHARGE;
+ String BTN_GOLD;
+ String ITEM_BROKEN;
+ String ITEM_CURSED;
+ String BONUS_NAMES[7];
+ String WEAPON_NAMES[35];
+ String ARMOR_NAMES[14];
+ String ACCESSORY_NAMES[11];
+ String MISC_NAMES[22];
+ String ELEMENTAL_NAMES[6];
+ String ATTRIBUTE_NAMES[10];
+ String EFFECTIVENESS_NAMES[7];
+ String QUEST_ITEM_NAMES[85];
+ int WEAPON_BASE_COSTS[35];
+ int ARMOR_BASE_COSTS[14];
+ int ACCESSORY_BASE_COSTS[11];
+ int MISC_MATERIAL_COSTS[22];
+ int MISC_BASE_COSTS[76];
+ int METAL_BASE_MULTIPLIERS[22];
+ int ITEM_SKILL_DIVISORS[4];
+ int RESTRICTION_OFFSETS[4];
+ int ITEM_RESTRICTIONS[86];
+ String NOT_PROFICIENT;
+ String NO_ITEMS_AVAILABLE;
+ String CATEGORY_NAMES[4];
+ String X_FOR_THE_Y;
+ String X_FOR_Y;
+ String X_FOR_Y_GOLD;
+ String FMT_CHARGES;
+ String AVAILABLE_GOLD_COST;
+ String CHARGES;
+ String COST;
+ String ITEM_ACTIONS[7];
+ String WHICH_ITEM;
+ String WHATS_YOUR_HURRY;
+ String USE_ITEM_IN_COMBAT;
+ String NO_SPECIAL_ABILITIES;
+ String CANT_CAST_WHILE_ENGAGED;
+ String EQUIPPED_ALL_YOU_CAN;
+ String REMOVE_X_TO_EQUIP_Y;
+ String RING;
+ String MEDAL;
+ String CANNOT_REMOVE_CURSED_ITEM;
+ String CANNOT_DISCARD_CURSED_ITEM;
+ String PERMANENTLY_DISCARD;
+ String BACKPACK_IS_FULL;
+ String CATEGORY_BACKPACK_IS_FULL[4];
+ String BUY_X_FOR_Y_GOLD;
+ String SELL_X_FOR_Y_GOLD;
+ String NO_NEED_OF_THIS;
+ String NOT_RECHARGABLE;
+ String SPELL_FAILED;
+ String NOT_ENCHANTABLE;
+ String ITEM_NOT_BROKEN;
+ String FIX_IDENTIFY[2];
+ String FIX_IDENTIFY_GOLD;
+ String IDENTIFY_ITEM_MSG;
+ String ITEM_DETAILS;
+ String ALL;
+ String FIELD_NONE;
+ String DAMAGE_X_TO_Y;
+ String ELEMENTAL_XY_DAMAGE;
+ String ATTR_XY_BONUS;
+ String EFFECTIVE_AGAINST;
+ String QUESTS_DIALOG_TEXT;
+ String CLOUDS_OF_XEEN_LINE;
+ String DARKSIDE_OF_XEEN_LINE;
+ String NO_QUEST_ITEMS;
+ String NO_CURRENT_QUESTS;
+ String NO_AUTO_NOTES;
+ String QUEST_ITEMS_DATA;
+ String CURRENT_QUESTS_DATA;
+ String AUTO_NOTES_DATA;
+ String REST_COMPLETE;
+ String PARTY_IS_STARVING;
+ String HIT_SPELL_POINTS_RESTORED;
+ String TOO_DANGEROUS_TO_REST;
+ String SOME_CHARS_MAY_DIE;
+ String CANT_DISMISS_LAST_CHAR;
+ String REMOVE_DELETE[2];
+ String REMOVE_OR_DELETE_WHICH;
+ String YOUR_PARTY_IS_FULL;
+ String HAS_SLAYER_SWORD;
+ String SURE_TO_DELETE_CHAR;
+ String CREATE_CHAR_DETAILS;
+ String NEW_CHAR_STATS;
+ String NAME_FOR_NEW_CHARACTER;
+ String SELECT_CLASS_BEFORE_SAVING;
+ String EXCHANGE_ATTR_WITH;
+ int NEW_CHAR_SKILLS[10];
+ int NEW_CHAR_SKILLS_LEN[10];
+ int NEW_CHAR_RACE_SKILLS[10];
+ int RACE_MAGIC_RESISTENCES[5];
+ int RACE_FIRE_RESISTENCES[5];
+ int RACE_ELECTRIC_RESISTENCES[5];
+ int RACE_COLD_RESISTENCES[5];
+ int RACE_ENERGY_RESISTENCES[5];
+ int RACE_POISON_RESISTENCES[5];
+ int NEW_CHARACTER_SPELLS[10][4];
+ String COMBAT_DETAILS;
+ String NOT_ENOUGH_TO_CAST;
+ String SPELL_CAST_COMPONENTS[2];
+ String CAST_SPELL_DETAILS;
+ String PARTY_FOUND;
+ String BACKPACKS_FULL_PRESS_KEY;
+ String HIT_A_KEY;
+ String GIVE_TREASURE_FORMATTING;
+ String X_FOUND_Y;
+ String ON_WHO;
+ String WHICH_ELEMENT1;
+ String WHICH_ELEMENT2;
+ String DETECT_MONSTERS;
+ String LLOYDS_BEACON;
+ String HOW_MANY_SQUARES;
+ String TOWN_PORTAL;
+ int TOWN_MAP_NUMBERS[2][5];
+ String MONSTER_DETAILS;
+ String MONSTER_SPECIAL_ATTACKS[23];
+ String IDENTIFY_MONSTERS;
+ String EVENT_SAMPLES[6];
+ String MOONS_NOT_ALIGNED;
+ String AWARDS_FOR;
+ String AWARDS_TEXT;
+ String NO_AWARDS;
+ String WARZONE_BATTLE_MASTER;
+ String WARZONE_MAXED;
+ String WARZONE_LEVEL;
+ String WARZONE_HOW_MANY;
+ String PICKS_THE_LOCK;
+ String UNABLE_TO_PICK_LOCK;
+ String CONTROL_PANEL_TEXT;
+ String CONTROL_PANEL_BUTTONS;
+ String ON;
+ String OFF;
+ String CONFIRM_QUIT;
+ String MR_WIZARD;
+ String NO_LOADING_IN_COMBAT;
+ String NO_SAVING_IN_COMBAT;
+ String QUICK_FIGHT_TEXT;
+ String QUICK_FIGHT_OPTIONS[4];
+ String WORLD_END_TEXT[9];
+ String WORLD_CONGRATULATIONS;
+ String WORLD_CONGRATULATIONS2;
+ String CLOUDS_CONGRATULATIONS1;
+ String CLOUDS_CONGRATULATIONS2;
+ String GOOBER[3];
+ String MUSIC_FILES1[5];
+ String MUSIC_FILES2[6][7];
public:
/**
+ * Constructor
+ */
+ Resources();
+
+ /**
* Initializes an instnace of the resources
*/
- static Resources *init(XeenEngine *vm);
+ Resources *init(XeenEngine *vm);
};
extern Resources *g_resources;
diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 51c22dd6db..27d33824fc 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -1560,7 +1560,7 @@ bool Scripts::ifProc(int action, uint32 val, int mode, int charIndex) {
// Check if the character class can cast the particular spell
for (int idx = 0; idx < 39; ++idx) {
- if (Res.SPELLS_ALLOWED[category][idx] == val) {
+ if (Res.SPELLS_ALLOWED[category][idx] == (int)val) {
// Can cast it. Check if the player has it in their spellbook
if (ps._spells[idx])
v = val;
diff --git a/engines/xeen/worldofxeen/darkside_cutscenes.cpp b/engines/xeen/worldofxeen/darkside_cutscenes.cpp
index a772500eaa..b02e7d9608 100644
--- a/engines/xeen/worldofxeen/darkside_cutscenes.cpp
+++ b/engines/xeen/worldofxeen/darkside_cutscenes.cpp
@@ -1203,7 +1203,7 @@ void DarkSideCutscenes::showDarkSideScore(uint endingScore) {
saves.saveGame();
}
-void DarkSideCutscenes::showPharaohEndText(const char *msg1, const char *msg2, const char *msg3) {
+void DarkSideCutscenes::showPharaohEndText(const Common::String &msg1, const Common::String &msg2, const Common::String &msg3) {
const int YLIST[32] = {
-3, -3, -3, -3, -3, -3, -3, -3, -1, 0, 0, 0, 0, 0, 0, 0,
-1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3
@@ -1225,8 +1225,12 @@ void DarkSideCutscenes::showPharaohEndText(const char *msg1, const char *msg2, c
Windows &windows = *_vm->_windows;
SpriteResource claw("claw.int");
SpriteResource dragon1("dragon1.int");
- int numPages = 0 + (msg1 ? 1 : 0) + (msg2 ? 1 : 0) + (msg3 ? 1 : 0);
- const char *const text[3] = { msg1, msg2, msg3 };
+ int numPages = 0 + (msg1.empty() ? 0 : 1) + (msg2.empty() ? 0 : 1) + (msg3.empty() ? 0 : 1);
+ const char *const text[3] = {
+ msg1.empty() ? nullptr : msg1.c_str(),
+ msg2.empty() ? nullptr : msg2.c_str(),
+ msg3.empty() ? nullptr : msg3.c_str()
+ };
screen.loadBackground("3room.raw");
screen.saveBackground();
diff --git a/engines/xeen/worldofxeen/darkside_cutscenes.h b/engines/xeen/worldofxeen/darkside_cutscenes.h
index f2dd5c5045..9c8db4d8ae 100644
--- a/engines/xeen/worldofxeen/darkside_cutscenes.h
+++ b/engines/xeen/worldofxeen/darkside_cutscenes.h
@@ -61,7 +61,13 @@ protected:
/**
* Shows the Pharaoh ending screen where score text is shown
*/
- void showPharaohEndText(const char *msg1, const char *msg2 = nullptr, const char *msg3 = nullptr);
+ void showPharaohEndText(const Common::String &msg1, const Common::String &msg2, const Common::String &msg3);
+ void showPharaohEndText(const Common::String &msg1) {
+ showPharaohEndText(msg1, "", "");
+ }
+ void showPharaohEndText(const Common::String &msg1, const Common::String &msg2) {
+ showPharaohEndText(msg1, msg2, "");
+ }
public:
DarkSideCutscenes(XeenEngine *vm) : Cutscenes(vm) {}
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index 0730760d14..8e22965e2f 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -86,10 +86,13 @@ XeenEngine::~XeenEngine() {
g_vm = nullptr;
}
-void XeenEngine::initialize() {
+bool XeenEngine::initialize() {
// Create sub-objects of the engine
_files = new FileManager(this);
- _resources = Resources::init(this);
+ if (!_files->setup())
+ return false;
+
+ _resources = new Resources();
_combat = new Combat(this);
_debugger = new Debugger(this);
_events = new EventsManager(this);
@@ -119,12 +122,13 @@ void XeenEngine::initialize() {
if (saveSlot >= 0 && saveSlot <= 999)
_loadSaveSlot = saveSlot;
}
+
+ return true;
}
Common::Error XeenEngine::run() {
- initialize();
-
- outerGameLoop();
+ if (initialize())
+ outerGameLoop();
return Common::kNoError;
}
@@ -256,4 +260,16 @@ void XeenEngine::syncSoundSettings() {
_sound->updateSoundSettings();
}
+void XeenEngine::GUIError(const char *msg, ...) {
+ char buffer[STRINGBUFLEN];
+ va_list va;
+
+ // Generate the full error message
+ va_start(va, msg);
+ vsnprintf(buffer, STRINGBUFLEN, msg, va);
+ va_end(va);
+
+ GUIErrorMessage(buffer);
+}
+
} // End of namespace Xeen
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index cbf9ff3ed4..652284b26f 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -108,7 +108,10 @@ private:
const XeenGameDescription *_gameDescription;
Common::RandomSource _randomSource;
private:
- void initialize();
+ /**
+ * Initializes all the engine sub-objects
+ */
+ bool initialize();
// Engine APIs
virtual Common::Error run();
@@ -176,6 +179,11 @@ public:
int getRandomNumber(int minNumber, int maxNumber);
/**
+ * Displays an error message in a GUI dialog
+ */
+ void GUIError(const char *msg, ...) GCC_PRINTF(2, 3);
+
+ /**
* Returns true if the game should be exited (and likely return to game menu)
*/
bool shouldExit() const { return _quitMode != QMODE_NONE || shouldQuit(); }