Permalink
Comparing changes
Open a pull request
- 3 commits
- 7 files changed
- 0 commit comments
- 1 contributor
Unified
Split
Showing
with
30 additions
and 17 deletions.
- +3 −0 README
- +1 −1 engines/xeen/character.cpp
- +11 −0 engines/xeen/detection.cpp
- +6 −6 engines/xeen/detection_tables.h
- +6 −9 engines/xeen/interface_scene.cpp
- +1 −0 engines/xeen/xeen.cpp
- +2 −1 engines/xeen/xeen.h
| @@ -544,13 +544,16 @@ ScummVM will skip copy protection in the following games: | ||
| -- bypassed with kind permission from Wyrmkeep Entertainment, | ||
| since it was bypassed in all CD releases of the game. | ||
| * Loom (EGA DOS) | ||
| * Lure of the Temptress | ||
| * Maniac Mansion | ||
| * Might and Magic: World of Xeen | ||
| * Monkey Island 2: LeChuck's Revenge | ||
| * Simon the Sorcerer 1 (Floppy version) | ||
| * Simon the Sorcerer 2 (Floppy version) | ||
| -- bypassed with kind permission from Adventure Soft, | ||
| since it was bypassed in all CD releases of the game. | ||
| * The Secret of Monkey Island (VGA) | ||
| * Voyeur | ||
| * Waxworks | ||
| * Zak McKracken and the Alien Mindbenders | ||
|
|
||
| @@ -1222,7 +1222,7 @@ void Character::subtractHitPoints(int amount) { | ||
|
|
||
| // Subtract the given HP amount | ||
| _currentHp -= amount; | ||
| bool breakFlag = _currentHp <= -10; | ||
| bool breakFlag = _currentHp <= (g_vm->_extOptions._durableArmor ? -80 : -10); | ||
| assert(_currentHp < 65000); | ||
|
|
||
| if (_currentHp < 1) { | ||
| @@ -73,6 +73,7 @@ static const PlainGameDescriptor XeenGames[] = { | ||
| }; | ||
|
|
||
| #define GAMEOPTION_SHOW_ITEM_COSTS GUIO_GAMEOPTIONS1 | ||
| #define GAMEOPTION_DURABLE_ARMOR GUIO_GAMEOPTIONS2 | ||
|
|
||
| #include "xeen/detection_tables.h" | ||
|
|
||
| @@ -88,6 +89,16 @@ static const ADExtraGuiOptionsMap optionsList[] = { | ||
| } | ||
| }, | ||
|
|
||
| { | ||
| GAMEOPTION_DURABLE_ARMOR, | ||
| { | ||
| _s("More durable armor"), | ||
| _s("Armor won't break until character is at -80HP, rather than merely -10HP"), | ||
| "DurableArmor", | ||
| false | ||
| } | ||
| }, | ||
|
|
||
| AD_EXTRA_GUI_OPTIONS_TERMINATOR | ||
| }; | ||
|
|
||
| @@ -36,7 +36,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::EN_ANY, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_WorldOfXeen, | ||
| 0 | ||
| @@ -55,7 +55,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::DE_DEU, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_WorldOfXeen, | ||
| 0 | ||
| @@ -74,7 +74,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::EN_ANY, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_WorldOfXeen, | ||
| 0 | ||
| @@ -92,7 +92,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::EN_ANY, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_Clouds, | ||
| 0 | ||
| @@ -110,7 +110,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::EN_ANY, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_DarkSide, | ||
| 0 | ||
| @@ -128,7 +128,7 @@ static const XeenGameDescription gameDescriptions[] = { | ||
| Common::EN_ANY, | ||
| Common::kPlatformDOS, | ||
| ADGF_NO_FLAGS, | ||
| GUIO1(GAMEOPTION_SHOW_ITEM_COSTS) | ||
| GUIO2(GAMEOPTION_SHOW_ITEM_COSTS, GAMEOPTION_DURABLE_ARMOR) | ||
| }, | ||
| GType_Swords, | ||
| 0 | ||
| @@ -167,6 +167,9 @@ OutdoorDrawList::OutdoorDrawList() : _sky1(_data[0]), _sky2(_data[1]), | ||
| _data[129] = DrawStruct(0, 47, 36, 0, SPRFLAG_HORIZ_FLIPPED); | ||
| _data[130] = DrawStruct(0, 118, 42); | ||
| _data[131] = DrawStruct(0, 26, 42, 0, SPRFLAG_HORIZ_FLIPPED); | ||
|
|
||
| for (int idx = 0; idx < 132; ++idx) | ||
| _data[idx]._flags |= SPRFLAG_SCENE_CLIPPED; | ||
| } | ||
|
|
||
| /*------------------------------------------------------------------------*/ | ||
| @@ -366,6 +369,9 @@ IndoorDrawList::IndoorDrawList() : | ||
| _data[167] = DrawStruct(0, 47, 36, 0, SPRFLAG_HORIZ_FLIPPED); | ||
| _data[168] = DrawStruct(0, 118, 42); | ||
| _data[169] = DrawStruct(0, 26, 42, 0, SPRFLAG_HORIZ_FLIPPED); | ||
|
|
||
| for (int idx = 0; idx < 170; ++idx) | ||
| _data[idx]._flags |= SPRFLAG_SCENE_CLIPPED; | ||
| } | ||
|
|
||
| /*------------------------------------------------------------------------*/ | ||
| @@ -4378,10 +4384,6 @@ void InterfaceScene::drawIndoors() { | ||
| _indoorList._ground._flags = _flipDefaultGround ? SPRFLAG_HORIZ_FLIPPED : 0; | ||
| _indoorList._horizon._frame = 7; | ||
|
|
||
| // FIXME: I seem to be missing the scene area clipping flag on some list entries | ||
| for (int idx = 0; idx < _indoorList.size(); ++idx) | ||
| _indoorList[idx]._flags |= SPRFLAG_SCENE_CLIPPED; | ||
|
|
||
| // Finally draw the darn indoor scene | ||
| windows[3].drawList(&_indoorList[0], _indoorList.size()); | ||
|
|
||
| @@ -4463,11 +4465,6 @@ void InterfaceScene::drawOutdoors() { | ||
| _outdoorList._sky1._flags = _outdoorList._sky2._flags = _flipSky ? SPRFLAG_HORIZ_FLIPPED : 0; | ||
| _outdoorList._groundSprite._flags = _flipWater ? SPRFLAG_HORIZ_FLIPPED : 0; | ||
|
|
||
| // FIXME: I seem to be missing the scene area clipping flag on some list entries. | ||
| // Just re-flagging them all in a loop is simpler than hunting down the missing entries | ||
| for (int idx = 0; idx < _outdoorList.size(); ++idx) | ||
| _outdoorList[idx]._flags |= SPRFLAG_SCENE_CLIPPED; | ||
|
|
||
| // Finally render the outdoor scene | ||
| windows[3].drawList(&_outdoorList[0], _outdoorList.size()); | ||
|
|
||
| @@ -129,6 +129,7 @@ void XeenEngine::loadSettings() { | ||
| _finalScore = ConfMan.hasKey("final_score") ? ConfMan.getInt("final_score") : 0; | ||
|
|
||
| _extOptions._showItemCosts = ConfMan.hasKey("ShowItemCosts") && ConfMan.getBool("ShowItemCosts"); | ||
| _extOptions._durableArmor = ConfMan.hasKey("DurableArmor") && ConfMan.getBool("DurableArmor"); | ||
|
|
||
| // If requested, load a savegame instead of showing the intro | ||
| if (ConfMan.hasKey("save_slot")) { | ||
| @@ -112,8 +112,9 @@ class XeenEngine : public Engine { | ||
| */ | ||
| struct ExtendedOptions { | ||
| bool _showItemCosts; | ||
| bool _durableArmor; | ||
|
|
||
| ExtendedOptions() : _showItemCosts(false) {} | ||
| ExtendedOptions() : _showItemCosts(false), _durableArmor(false) {} | ||
| }; | ||
| private: | ||
| const XeenGameDescription *_gameDescription; | ||