[Scummvm-git-logs] scummvm master -> e4a26c25e0c158752f1cbb2edade8752b65d9993
dreammaster
paulfgilbert at gmail.com
Tue Apr 28 02:49:26 UTC 2020
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ea5361359e ULTIMA4: Making Escape key a keybinding action
193c66a9c1 ULTIMA4: Default values for waitable controllers
92df813caf ULTIMA4: Further Coverity fixes
e4a26c25e0 ULTIMA4: Further Coverity fixes
Commit: ea5361359ef5091722c11e460773f9430267f2c4
https://github.com/scummvm/scummvm/commit/ea5361359ef5091722c11e460773f9430267f2c4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-27T19:45:45-07:00
Commit Message:
ULTIMA4: Making Escape key a keybinding action
Changed paths:
engines/ultima/ultima4/controllers/alpha_action_controller.cpp
engines/ultima/ultima4/controllers/alpha_action_controller.h
engines/ultima/ultima4/controllers/controller.cpp
engines/ultima/ultima4/controllers/controller.h
engines/ultima/ultima4/controllers/game_controller.cpp
engines/ultima/ultima4/controllers/menu_controller.h
engines/ultima/ultima4/controllers/read_dir_controller.cpp
engines/ultima/ultima4/controllers/read_dir_controller.h
engines/ultima/ultima4/controllers/reagents_menu_controller.cpp
engines/ultima/ultima4/controllers/reagents_menu_controller.h
engines/ultima/ultima4/controllers/ztats_controller.cpp
engines/ultima/ultima4/controllers/ztats_controller.h
engines/ultima/ultima4/meta_engine.cpp
engines/ultima/ultima4/meta_engine.h
diff --git a/engines/ultima/ultima4/controllers/alpha_action_controller.cpp b/engines/ultima/ultima4/controllers/alpha_action_controller.cpp
index cfdc58bc76..aaa4b54ae4 100644
--- a/engines/ultima/ultima4/controllers/alpha_action_controller.cpp
+++ b/engines/ultima/ultima4/controllers/alpha_action_controller.cpp
@@ -34,11 +34,6 @@ bool AlphaActionController::keyPressed(int key) {
if (key >= 'A' && key <= toupper(_lastValidLetter)) {
_value = key - 'A';
doneWaiting();
- } else if (key == Common::KEYCODE_SPACE || key == Common::KEYCODE_ESCAPE
- || key == Common::KEYCODE_RETURN) {
- g_screen->screenMessage("\n");
- _value = -1;
- doneWaiting();
} else {
g_screen->screenMessage("\n%s", _prompt.c_str());
g_screen->update();
@@ -48,6 +43,14 @@ bool AlphaActionController::keyPressed(int key) {
return true;
}
+void AlphaActionController::keybinder(KeybindingAction action) {
+ if (action == KEYBIND_ESCAPE) {
+ g_screen->screenMessage("\n");
+ _value = -1;
+ doneWaiting();
+ }
+}
+
int AlphaActionController::get(char lastValidLetter, const Common::String &prompt, EventHandler *eh) {
if (!eh)
eh = eventHandler;
diff --git a/engines/ultima/ultima4/controllers/alpha_action_controller.h b/engines/ultima/ultima4/controllers/alpha_action_controller.h
index f50e50f492..4de0ce9eb0 100644
--- a/engines/ultima/ultima4/controllers/alpha_action_controller.h
+++ b/engines/ultima/ultima4/controllers/alpha_action_controller.h
@@ -34,16 +34,17 @@ namespace Ultima4 {
* argument in the range 'a' - lastValidLetter.
*/
class AlphaActionController : public WaitableController<int> {
+private:
+ char _lastValidLetter;
+ Common::String _prompt;
public:
- AlphaActionController(char letter, const Common::String &p) : _lastValidLetter(letter), _prompt(p) {
- }
+ AlphaActionController(char letter, const Common::String &p) :
+ _lastValidLetter(letter), _prompt(p) {}
+
bool keyPressed(int key) override;
+ void keybinder(KeybindingAction action) override;
static int get(char lastValidLetter, const Common::String &prompt, EventHandler *eh = nullptr);
-
-private:
- char _lastValidLetter;
- Common::String _prompt;
};
} // End of namespace Ultima4
diff --git a/engines/ultima/ultima4/controllers/controller.cpp b/engines/ultima/ultima4/controllers/controller.cpp
index 5a500ec19d..c42cfefecc 100644
--- a/engines/ultima/ultima4/controllers/controller.cpp
+++ b/engines/ultima/ultima4/controllers/controller.cpp
@@ -47,8 +47,9 @@ int Controller::getTimerInterval() {
}
void Controller::setActive() {
- // Controllers by default won't use the keybindings
- MetaEngine::setKeybindingsActive(false);
+ // By default, only the Escape action is turned on for controllers,
+ // to allow the different sorts of input prompts to be aborted
+ MetaEngine::setKeybindingMode(KBMODE_MINIMAL);
}
void Controller::timerFired() {
diff --git a/engines/ultima/ultima4/controllers/controller.h b/engines/ultima/ultima4/controllers/controller.h
index e448ec37f4..21a52083ce 100644
--- a/engines/ultima/ultima4/controllers/controller.h
+++ b/engines/ultima/ultima4/controllers/controller.h
@@ -68,7 +68,9 @@ public:
/**
* Key was pressed
*/
- virtual bool keyPressed(int key) = 0;
+ virtual bool keyPressed(int key) {
+ return false;
+ }
/**
* Handles keybinder actions
diff --git a/engines/ultima/ultima4/controllers/game_controller.cpp b/engines/ultima/ultima4/controllers/game_controller.cpp
index d203fa2c28..166ff6c2c8 100644
--- a/engines/ultima/ultima4/controllers/game_controller.cpp
+++ b/engines/ultima/ultima4/controllers/game_controller.cpp
@@ -332,7 +332,7 @@ void GameController::update(Location *location, MoveEvent &event) {
void GameController::setActive() {
// The game controller has the keybindings enabled
- MetaEngine::setKeybindingsActive(true);
+ MetaEngine::setKeybindingMode(KBMODE_NORMAL);
}
void GameController::keybinder(KeybindingAction action) {
diff --git a/engines/ultima/ultima4/controllers/menu_controller.h b/engines/ultima/ultima4/controllers/menu_controller.h
index acfb74dd15..bdc9ce1c65 100644
--- a/engines/ultima/ultima4/controllers/menu_controller.h
+++ b/engines/ultima/ultima4/controllers/menu_controller.h
@@ -38,8 +38,7 @@ class TextView;
class MenuController : public WaitableController<void *> {
public:
MenuController(Menu *menu, TextView *view);
- bool keyPressed(int key);
-
+ bool keyPressed(int key) override;
protected:
Menu *_menu;
TextView *_view;
diff --git a/engines/ultima/ultima4/controllers/read_dir_controller.cpp b/engines/ultima/ultima4/controllers/read_dir_controller.cpp
index ca339bf4e1..798d18612c 100644
--- a/engines/ultima/ultima4/controllers/read_dir_controller.cpp
+++ b/engines/ultima/ultima4/controllers/read_dir_controller.cpp
@@ -33,8 +33,8 @@ ReadDirController::ReadDirController() {
}
void ReadDirController::setActive() {
- // Have the keybinder active for the direction keys
- MetaEngine::setKeybindingsActive(true);
+ // Special mode for inputing directions
+ MetaEngine::setKeybindingMode(KBMODE_DIRECTION);
}
void ReadDirController::keybinder(KeybindingAction action) {
@@ -51,7 +51,7 @@ void ReadDirController::keybinder(KeybindingAction action) {
case KEYBIND_RIGHT:
_value = DIR_EAST;
break;
- case KEYBIND_PASS:
+ case KEYBIND_ESCAPE:
_value = DIR_NONE;
doneWaiting();
break;
@@ -62,21 +62,5 @@ void ReadDirController::keybinder(KeybindingAction action) {
doneWaiting();
}
-bool ReadDirController::keyPressed(int key) {
- switch (key) {
- case Common::KEYCODE_ESCAPE:
- case Common::KEYCODE_SPACE:
- case Common::KEYCODE_RETURN:
- _value = DIR_NONE;
- doneWaiting();
- return true;
-
- default:
- break;
- }
-
- return false;
-}
-
} // End of namespace Ultima4
} // End of namespace Ultima
diff --git a/engines/ultima/ultima4/controllers/read_dir_controller.h b/engines/ultima/ultima4/controllers/read_dir_controller.h
index afaf0e4bd2..a62d127e37 100644
--- a/engines/ultima/ultima4/controllers/read_dir_controller.h
+++ b/engines/ultima/ultima4/controllers/read_dir_controller.h
@@ -41,11 +41,6 @@ public:
*/
void setActive() override;
- /**
- * Key was pressed
- */
- bool keyPressed(int key) override;
-
/**
* Handles keybinder actions
*/
diff --git a/engines/ultima/ultima4/controllers/reagents_menu_controller.cpp b/engines/ultima/ultima4/controllers/reagents_menu_controller.cpp
index f8f9cf6568..8308cdbae7 100644
--- a/engines/ultima/ultima4/controllers/reagents_menu_controller.cpp
+++ b/engines/ultima/ultima4/controllers/reagents_menu_controller.cpp
@@ -65,11 +65,6 @@ bool ReagentsMenuController::keyPressed(int key) {
eventHandler->setControllerDone();
break;
- case Common::KEYCODE_ESCAPE:
- _ingredients->revert();
- eventHandler->setControllerDone();
- break;
-
default:
return MenuController::keyPressed(key);
}
@@ -77,5 +72,13 @@ bool ReagentsMenuController::keyPressed(int key) {
return true;
}
+void ReagentsMenuController::keybinder(KeybindingAction action) {
+ if (action == KEYBIND_ESCAPE) {
+ _ingredients->revert();
+ eventHandler->setControllerDone();
+ }
+}
+
+
} // End of namespace Ultima4
} // End of namespace Ultima
diff --git a/engines/ultima/ultima4/controllers/reagents_menu_controller.h b/engines/ultima/ultima4/controllers/reagents_menu_controller.h
index af5d40127b..fc7dd4fb41 100644
--- a/engines/ultima/ultima4/controllers/reagents_menu_controller.h
+++ b/engines/ultima/ultima4/controllers/reagents_menu_controller.h
@@ -43,6 +43,8 @@ public:
*/
bool keyPressed(int key) override;
+ void keybinder(KeybindingAction action) override;
+
private:
Ingredients *_ingredients;
};
diff --git a/engines/ultima/ultima4/controllers/ztats_controller.cpp b/engines/ultima/ultima4/controllers/ztats_controller.cpp
index 6274a7d197..9690fe979e 100644
--- a/engines/ultima/ultima4/controllers/ztats_controller.cpp
+++ b/engines/ultima/ultima4/controllers/ztats_controller.cpp
@@ -53,16 +53,17 @@ bool ZtatsController::keyPressed(int key) {
case '0':
g_context->_stats->setView(StatsView(STATS_WEAPONS));
return true;
- case Common::KEYCODE_ESCAPE:
- case Common::KEYCODE_SPACE:
- case Common::KEYCODE_RETURN:
- g_context->_stats->setView(StatsView(STATS_PARTY_OVERVIEW));
- doneWaiting();
- return true;
default:
return KeyHandler::defaultHandler(key, nullptr);
}
}
+void ZtatsController::keybinder(KeybindingAction action) {
+ if (action == KEYBIND_ESCAPE) {
+ g_context->_stats->setView(StatsView(STATS_PARTY_OVERVIEW));
+ doneWaiting();
+ }
+}
+
} // End of namespace Ultima4
} // End of namespace Ultima
diff --git a/engines/ultima/ultima4/controllers/ztats_controller.h b/engines/ultima/ultima4/controllers/ztats_controller.h
index c76dd6bd02..61c9bb22a3 100644
--- a/engines/ultima/ultima4/controllers/ztats_controller.h
+++ b/engines/ultima/ultima4/controllers/ztats_controller.h
@@ -34,6 +34,7 @@ namespace Ultima4 {
class ZtatsController : public WaitableController<void *> {
public:
bool keyPressed(int key) override;
+ void keybinder(KeybindingAction action) override;
};
} // End of namespace Ultima4
diff --git a/engines/ultima/ultima4/meta_engine.cpp b/engines/ultima/ultima4/meta_engine.cpp
index 423872cc80..e8c21ef711 100644
--- a/engines/ultima/ultima4/meta_engine.cpp
+++ b/engines/ultima/ultima4/meta_engine.cpp
@@ -38,8 +38,9 @@ struct KeybindingRecord {
const char *_joy;
};
-static const KeybindingRecord KEYS[] = {
+static const KeybindingRecord NORMAL_KEYS[] = {
{ KEYBIND_INTERACT, "INTERACT", "Interact", "interact", "RETURN", nullptr },
+ { KEYBIND_ESCAPE, "ESCAPE", "Abort Action", "", "ESCAPE", nullptr },
{ KEYBIND_UP, "UP", "Up", "move up", "UP", nullptr },
{ KEYBIND_DOWN, "DOWN", "Down", "move down", "DOWN", nullptr },
{ KEYBIND_LEFT, "LEFT", "Left", "move left", "LEFT", nullptr },
@@ -114,43 +115,64 @@ static const KeybindingRecord CHEAT_KEYS[] = {
{ KEYBIND_NONE, nullptr, nullptr, nullptr, nullptr, nullptr }
};
+static const KeybindingRecord INPUT_KEYS[] = {
+ { KEYBIND_ESCAPE, "ESCAPE", "Abort Action", "", "ESCAPE", nullptr },
+ { KEYBIND_NONE, nullptr, nullptr, nullptr, nullptr, nullptr }
+};
+
+static const KeybindingRecord DIRECTION_KEYS[] = {
+ { KEYBIND_ESCAPE, "ESCAPE", "Escape", nullptr, "ESCAPE", nullptr },
+ { KEYBIND_UP, "UP", "Up", nullptr, "UP", nullptr },
+ { KEYBIND_DOWN, "DOWN", "Down", nullptr, "DOWN", nullptr },
+ { KEYBIND_LEFT, "LEFT", "Left", nullptr, "LEFT", nullptr },
+ { KEYBIND_RIGHT, "RIGHT", "Right", nullptr, "RIGHT", nullptr },
+ { KEYBIND_NONE, nullptr, nullptr, nullptr, nullptr, nullptr }
+};
+
struct KeysRecord {
const char *_id;
const char *_desc;
const KeybindingRecord *_keys;
};
-static const KeysRecord KEYS_RECORDS[3] = {
- { "ultima4", "Ultima IV", KEYS },
+
+static const KeysRecord NORMAL_RECORDS[] = {
+ { "ultima4", "Ultima IV", NORMAL_KEYS },
{ "ultima4_party", "Ultima IV - Party", PARTY_KEYS },
{ "ultima4_cheats", "Ultima IV - Cheats", CHEAT_KEYS },
+ { nullptr, nullptr, nullptr }
+};
+
+static const KeysRecord INPUT_RECORDS[3] = {
+ { "ultima4", "Ultima IV", INPUT_KEYS },
+ { nullptr, nullptr, nullptr }
+};
+
+static const KeysRecord DIRECTION_RECORDS[3] = {
+ { "ultima4", "Ultima IV", DIRECTION_KEYS },
+ { nullptr, nullptr, nullptr }
};
-Common::KeymapArray MetaEngine::initKeymaps() {
+static const KeysRecord *MODE_RECORDS[3] = {
+ NORMAL_RECORDS, INPUT_RECORDS, DIRECTION_RECORDS
+};
+
+Common::KeymapArray MetaEngine::initKeymaps(KeybindingMode mode) {
Common::KeymapArray keymapArray;
Common::Keymap *keyMap;
Common::Action *act;
+ const KeysRecord *recPtr = MODE_RECORDS[mode];
- for (int kCtr = 0; kCtr < 3; ++kCtr) {
+ for (int kCtr = 0; recPtr->_id; ++recPtr, ++kCtr) {
// Core keymaps
keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame,
- KEYS_RECORDS[kCtr]._id, _(KEYS_RECORDS[kCtr]._desc));
+ recPtr->_id, recPtr->_desc);
keymapArray.push_back(keyMap);
if (kCtr == 0) {
- act = new Common::Action("LCLK", _("Interact via Left Click"));
- act->setLeftClickEvent();
- act->addDefaultInputMapping("MOUSE_LEFT");
- act->addDefaultInputMapping("JOY_A");
- keyMap->addAction(act);
-
- act = new Common::Action("RCLK", _("Interact via Right Click"));
- act->setRightClickEvent();
- act->addDefaultInputMapping("MOUSE_RIGHT");
- act->addDefaultInputMapping("JOY_B");
- keyMap->addAction(act);
+ addMouseClickActions(*keyMap);
}
- for (const KeybindingRecord *r = KEYS_RECORDS[kCtr]._keys; r->_id; ++r) {
+ for (const KeybindingRecord *r = recPtr->_keys; r->_id; ++r) {
act = new Common::Action(r->_id, _(r->_desc));
act->setCustomEngineActionEvent(r->_action);
act->addDefaultInputMapping(r->_key);
@@ -168,10 +190,31 @@ Common::KeymapArray MetaEngine::initKeymaps() {
return keymapArray;
}
-void MetaEngine::setKeybindingsActive(bool isActive) {
- g_engine->getEventManager()->getKeymapper()->setEnabled(isActive);
+void MetaEngine::addMouseClickActions(Common::Keymap &keyMap) {
+ Common::Action *act;
+
+ act = new Common::Action("LCLK", _("Interact via Left Click"));
+ act->setLeftClickEvent();
+ act->addDefaultInputMapping("MOUSE_LEFT");
+ act->addDefaultInputMapping("JOY_A");
+ keyMap.addAction(act);
+
+ act = new Common::Action("RCLK", _("Interact via Right Click"));
+ act->setRightClickEvent();
+ act->addDefaultInputMapping("MOUSE_RIGHT");
+ act->addDefaultInputMapping("JOY_B");
+ keyMap.addAction(act);
}
+void MetaEngine::setKeybindingMode(KeybindingMode mode) {
+ Common::Keymapper *const mapper = g_engine->getEventManager()->getKeymapper();
+ mapper->cleanupGameKeymaps();
+
+ Common::KeymapArray arr = initKeymaps(mode);
+
+ for (uint idx = 0; idx < arr.size(); ++idx)
+ mapper->addGameKeymap(arr[idx]);
+}
void MetaEngine::executeAction(KeybindingAction keyAction) {
Common::String methodName = getMethod(keyAction);
@@ -181,7 +224,7 @@ void MetaEngine::executeAction(KeybindingAction keyAction) {
Common::String MetaEngine::getMethod(KeybindingAction keyAction) {
for (int kCtr = 0; kCtr < 3; ++kCtr) {
- for (const KeybindingRecord *r = KEYS_RECORDS[kCtr]._keys; r->_id; ++r) {
+ for (const KeybindingRecord *r = NORMAL_RECORDS[kCtr]._keys; r->_id; ++r) {
if (r->_action == keyAction)
return r->_method;
}
diff --git a/engines/ultima/ultima4/meta_engine.h b/engines/ultima/ultima4/meta_engine.h
index f493691337..0b92763277 100644
--- a/engines/ultima/ultima4/meta_engine.h
+++ b/engines/ultima/ultima4/meta_engine.h
@@ -38,7 +38,7 @@ enum KeybindingAction {
KEYBIND_QUIT_SAVE, KEYBIND_SPEED_UP, KEYBIND_SPEED_DOWN,
KEYBIND_SPEED_NORMAL, KEYBIND_READY_WEAPON, KEYBIND_SEARCH,
KEYBIND_STATS, KEYBIND_TALK, KEYBIND_TOGGLE_MUSIC, KEYBIND_USE,
- KEYBIND_WEAR, KEYBIND_YELL, KEYBIND_INTERACT,
+ KEYBIND_WEAR, KEYBIND_YELL, KEYBIND_INTERACT, KEYBIND_ESCAPE,
KEYBIND_PARTY0, KEYBIND_PARTY1, KEYBIND_PARTY2, KEYBIND_PARTY3,
KEYBIND_PARTY4, KEYBIND_PARTY5, KEYBIND_PARTY6, KEYBIND_PARTY7,
@@ -54,17 +54,28 @@ enum KeybindingAction {
KEYBIND_NONE
};
+enum KeybindingMode {
+ KBMODE_NORMAL, ///< Keys available when normal in-game
+ KBMODE_MINIMAL, ///< Minimal list available when reading input
+ KBMODE_DIRECTION ///< Mode for selecting direction
+};
+
class MetaEngine {
private:
/**
* Get the method to execute
*/
static Common::String getMethod(KeybindingAction keyAction);
+
+ /**
+ * Adds the default actions for the mouse buttons
+ */
+ static void addMouseClickActions(Common::Keymap &keyMap);
public:
/**
* Initialize keymaps
*/
- static Common::KeymapArray initKeymaps();
+ static Common::KeymapArray initKeymaps(KeybindingMode mode = KBMODE_NORMAL);
/**
* Execute an engine keymap action
@@ -72,9 +83,9 @@ public:
static void executeAction(KeybindingAction keyAction);
/**
- * Enables/disables the keymaps when not waiting for an in-game action
+ * Sets the current set of actions which are active
*/
- static void setKeybindingsActive(bool isActive);
+ static void setKeybindingMode(KeybindingMode mode);
};
} // End of namespace Ultima4
Commit: 193c66a9c114385515683ef997dbfbb198358e81
https://github.com/scummvm/scummvm/commit/193c66a9c114385515683ef997dbfbb198358e81
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-27T19:45:45-07:00
Commit Message:
ULTIMA4: Default values for waitable controllers
Changed paths:
engines/ultima/ultima4/controllers/alpha_action_controller.h
engines/ultima/ultima4/controllers/combat_controller.cpp
engines/ultima/ultima4/controllers/combat_controller.h
engines/ultima/ultima4/controllers/controller.h
engines/ultima/ultima4/controllers/menu_controller.cpp
engines/ultima/ultima4/controllers/read_choice_controller.cpp
engines/ultima/ultima4/controllers/read_dir_controller.cpp
engines/ultima/ultima4/controllers/read_string_controller.cpp
engines/ultima/ultima4/controllers/ztats_controller.h
engines/ultima/ultima4/core/debugger.cpp
diff --git a/engines/ultima/ultima4/controllers/alpha_action_controller.h b/engines/ultima/ultima4/controllers/alpha_action_controller.h
index 4de0ce9eb0..aa69c88e1b 100644
--- a/engines/ultima/ultima4/controllers/alpha_action_controller.h
+++ b/engines/ultima/ultima4/controllers/alpha_action_controller.h
@@ -39,7 +39,7 @@ private:
Common::String _prompt;
public:
AlphaActionController(char letter, const Common::String &p) :
- _lastValidLetter(letter), _prompt(p) {}
+ WaitableController<int>(-1), _lastValidLetter(letter), _prompt(p) {}
bool keyPressed(int key) override;
void keybinder(KeybindingAction action) override;
diff --git a/engines/ultima/ultima4/controllers/combat_controller.cpp b/engines/ultima/ultima4/controllers/combat_controller.cpp
index ecac605b18..4668c433ba 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.cpp
+++ b/engines/ultima/ultima4/controllers/combat_controller.cpp
@@ -86,15 +86,21 @@ CombatMap *getCombatMap(Map *punknown) {
* CombatController class implementation
*/
CombatController::CombatController() : _map(nullptr) {
+ init();
+
g_context->_party->addObserver(this);
}
CombatController::CombatController(CombatMap *m) : _map(m) {
+ init();
+
g_game->setMap(_map, true, nullptr, this);
g_context->_party->addObserver(this);
}
-CombatController::CombatController(MapId id) {
+CombatController::CombatController(MapId id) : _map(nullptr) {
+ init();
+
_map = getCombatMap(mapMgr->get(id));
g_game->setMap(_map, true, nullptr, this);
g_context->_party->addObserver(this);
@@ -105,6 +111,21 @@ CombatController::~CombatController() {
g_context->_party->deleteObserver(this);
}
+void CombatController::init() {
+ _focus = 0;
+ Common::fill(&creatureTable[0], &creatureTable[AREA_CREATURES],
+ (const Creature *)nullptr);
+ _creature = nullptr;
+
+ _camping = false;
+ _forceStandardEncounterSize = false;
+ _placePartyOnMap = false;
+ _placeCreaturesOnMap = false;
+ _winOrLose = false;
+ _showMessage = false;
+ _exitDir = DIR_NONE;
+}
+
// Accessor Methods
bool CombatController::isCamping() const {
return _camping;
@@ -179,6 +200,8 @@ void CombatController::initDungeonRoom(int room, Direction from) {
ASSERT(g_context->_location->_prev->_context & CTX_DUNGEON, "Error: called initDungeonRoom from non-dungeon context");
{
Dungeon *dng = dynamic_cast<Dungeon *>(g_context->_location->_prev->_map);
+ assert(dng);
+
byte *party_x = &dng->_rooms[room]._partyNorthStartX[0],
*party_y = &dng->_rooms[room]._partyNorthStartY[0];
@@ -947,7 +970,9 @@ bool CombatController::keyPressed(int key) {
case 't':
if (settings._debug && _map->isDungeonRoom()) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_prev->_map);
+ assert(dungeon);
Trigger *triggers = dungeon->_rooms[dungeon->_currentRoom]._triggers;
+ assert(triggers);
int i;
g_screen->screenMessage("Triggers!\n");
diff --git a/engines/ultima/ultima4/controllers/combat_controller.h b/engines/ultima/ultima4/controllers/combat_controller.h
index 5e2494fc95..afef95d0dc 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.h
+++ b/engines/ultima/ultima4/controllers/combat_controller.h
@@ -200,6 +200,8 @@ protected:
private:
CombatController(const CombatController &);
const CombatController &operator=(const CombatController &);
+
+ void init();
};
/**
diff --git a/engines/ultima/ultima4/controllers/controller.h b/engines/ultima/ultima4/controllers/controller.h
index 21a52083ce..b33de36928 100644
--- a/engines/ultima/ultima4/controllers/controller.h
+++ b/engines/ultima/ultima4/controllers/controller.h
@@ -104,11 +104,21 @@ void Controller_endWait();
*/
template<class T>
class WaitableController : public Controller {
+private:
+ bool _exitWhenDone;
+ T _defaultValue;
+protected:
+ T _value;
+ void doneWaiting() {
+ if (_exitWhenDone)
+ Controller_endWait();
+ }
public:
- WaitableController() : _exitWhenDone(false) {}
+ WaitableController(T defaultValue) : _defaultValue(defaultValue),
+ _value(defaultValue), _exitWhenDone(false) {}
virtual T getValue() {
- return _value;
+ return shouldQuit() ? _defaultValue : _value;
}
virtual T waitFor() {
@@ -116,16 +126,6 @@ public:
Controller_startWait();
return getValue();
}
-
-protected:
- T _value;
- void doneWaiting() {
- if (_exitWhenDone)
- Controller_endWait();
- }
-
-private:
- bool _exitWhenDone;
};
class TurnCompleter {
diff --git a/engines/ultima/ultima4/controllers/menu_controller.cpp b/engines/ultima/ultima4/controllers/menu_controller.cpp
index e2ebb68b35..74c7c11fb0 100644
--- a/engines/ultima/ultima4/controllers/menu_controller.cpp
+++ b/engines/ultima/ultima4/controllers/menu_controller.cpp
@@ -28,7 +28,8 @@
namespace Ultima {
namespace Ultima4 {
-MenuController::MenuController(Menu *menu, TextView *view) {
+MenuController::MenuController(Menu *menu, TextView *view) :
+ WaitableController<void *>(nullptr) {
this->_menu = menu;
this->_view = view;
}
diff --git a/engines/ultima/ultima4/controllers/read_choice_controller.cpp b/engines/ultima/ultima4/controllers/read_choice_controller.cpp
index ebc5f82233..75e58b4b22 100644
--- a/engines/ultima/ultima4/controllers/read_choice_controller.cpp
+++ b/engines/ultima/ultima4/controllers/read_choice_controller.cpp
@@ -26,7 +26,8 @@ namespace Ultima {
namespace Ultima4 {
-ReadChoiceController::ReadChoiceController(const Common::String &choices) {
+ReadChoiceController::ReadChoiceController(const Common::String &choices) :
+ WaitableController<int>(-1) {
_choices = choices;
}
diff --git a/engines/ultima/ultima4/controllers/read_dir_controller.cpp b/engines/ultima/ultima4/controllers/read_dir_controller.cpp
index 798d18612c..384d41d0fe 100644
--- a/engines/ultima/ultima4/controllers/read_dir_controller.cpp
+++ b/engines/ultima/ultima4/controllers/read_dir_controller.cpp
@@ -28,8 +28,7 @@ namespace Ultima {
namespace Ultima4 {
-ReadDirController::ReadDirController() {
- _value = DIR_NONE;
+ReadDirController::ReadDirController() : WaitableController<Direction>(DIR_NONE) {
}
void ReadDirController::setActive() {
diff --git a/engines/ultima/ultima4/controllers/read_string_controller.cpp b/engines/ultima/ultima4/controllers/read_string_controller.cpp
index f71b4c57af..0f4936388f 100644
--- a/engines/ultima/ultima4/controllers/read_string_controller.cpp
+++ b/engines/ultima/ultima4/controllers/read_string_controller.cpp
@@ -27,7 +27,8 @@
namespace Ultima {
namespace Ultima4 {
-ReadStringController::ReadStringController(int maxlen, int screenX, int screenY, const Common::String &accepted_chars) {
+ReadStringController::ReadStringController(int maxlen, int screenX, int screenY,
+ const Common::String &accepted_chars) : WaitableController<Common::String>("") {
_maxLen = maxlen;
_screenX = screenX;
_screenY = screenY;
@@ -35,7 +36,8 @@ ReadStringController::ReadStringController(int maxlen, int screenX, int screenY,
_accepted = accepted_chars;
}
-ReadStringController::ReadStringController(int maxlen, TextView *view, const Common::String &accepted_chars) {
+ReadStringController::ReadStringController(int maxlen, TextView *view,
+ const Common::String &accepted_chars) : WaitableController<Common::String>("") {
_maxLen = maxlen;
_screenX = view->getCursorX();
_screenY = view->getCursorY();
diff --git a/engines/ultima/ultima4/controllers/ztats_controller.h b/engines/ultima/ultima4/controllers/ztats_controller.h
index 61c9bb22a3..3e22e2e5de 100644
--- a/engines/ultima/ultima4/controllers/ztats_controller.h
+++ b/engines/ultima/ultima4/controllers/ztats_controller.h
@@ -33,6 +33,8 @@ namespace Ultima4 {
*/
class ZtatsController : public WaitableController<void *> {
public:
+ ZtatsController() : WaitableController<void *>(nullptr) {}
+
bool keyPressed(int key) override;
void keybinder(KeybindingAction action) override;
};
diff --git a/engines/ultima/ultima4/core/debugger.cpp b/engines/ultima/ultima4/core/debugger.cpp
index 11f1de6319..5add774117 100644
--- a/engines/ultima/ultima4/core/debugger.cpp
+++ b/engines/ultima/ultima4/core/debugger.cpp
@@ -929,15 +929,14 @@ bool Debugger::cmdReadyWeapon(int argc, const char **argv) {
// get the weapon to use
g_context->_stats->setView(STATS_WEAPONS);
printN("Weapon: ");
- WeaponType weapon = (WeaponType)AlphaActionController::get(WEAP_MAX + 'a' - 1, "Weapon: ");
+ int weapon = AlphaActionController::get(WEAP_MAX + 'a' - 1, "Weapon: ");
g_context->_stats->setView(STATS_PARTY_OVERVIEW);
if (weapon == -1)
return isDebuggerActive();
PartyMember *p = g_context->_party->member(player);
- const Weapon *w = g_weapons->get(weapon);
-
-
+ const Weapon *w = g_weapons->get((WeaponType)weapon);
+
if (!w) {
print("");
return isDebuggerActive();
Commit: 92df813caf36668c576841212844157894a48f15
https://github.com/scummvm/scummvm/commit/92df813caf36668c576841212844157894a48f15
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-27T19:45:45-07:00
Commit Message:
ULTIMA4: Further Coverity fixes
Changed paths:
engines/ultima/ultima4/controllers/combat_controller.cpp
engines/ultima/ultima4/controllers/combat_controller.h
engines/ultima/ultima4/controllers/game_controller.cpp
engines/ultima/ultima4/controllers/inn_controller.cpp
engines/ultima/ultima4/controllers/intro_controller.cpp
engines/ultima/ultima4/controllers/read_string_controller.cpp
engines/ultima/ultima4/conversation/conversation.cpp
engines/ultima/ultima4/core/debugger.cpp
engines/ultima/ultima4/core/debugger_actions.cpp
engines/ultima/ultima4/events/event_handler.cpp
engines/ultima/ultima4/filesys/savegame.cpp
engines/ultima/ultima4/filesys/savegame.h
engines/ultima/ultima4/game/context.cpp
engines/ultima/ultima4/game/context.h
engines/ultima/ultima4/game/creature.cpp
engines/ultima/ultima4/game/game.cpp
engines/ultima/ultima4/game/item.cpp
engines/ultima/ultima4/game/person.cpp
engines/ultima/ultima4/game/player.cpp
engines/ultima/ultima4/game/portal.cpp
engines/ultima/ultima4/game/script.cpp
engines/ultima/ultima4/game/spell.cpp
engines/ultima/ultima4/gfx/image.cpp
engines/ultima/ultima4/gfx/screen.cpp
engines/ultima/ultima4/map/shrine.cpp
diff --git a/engines/ultima/ultima4/controllers/combat_controller.cpp b/engines/ultima/ultima4/controllers/combat_controller.cpp
index 4668c433ba..b12e260d3b 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.cpp
+++ b/engines/ultima/ultima4/controllers/combat_controller.cpp
@@ -113,7 +113,7 @@ CombatController::~CombatController() {
void CombatController::init() {
_focus = 0;
- Common::fill(&creatureTable[0], &creatureTable[AREA_CREATURES],
+ Common::fill(&_creatureTable[0], &_creatureTable[AREA_CREATURES],
(const Creature *)nullptr);
_creature = nullptr;
@@ -179,7 +179,7 @@ void CombatController::init(class Creature *m) {
/* initialize creature info */
for (i = 0; i < AREA_CREATURES; i++) {
- creatureTable[i] = nullptr;
+ _creatureTable[i] = nullptr;
}
for (i = 0; i < AREA_PLAYERS; i++) {
@@ -224,7 +224,7 @@ void CombatController::initDungeonRoom(int room, Direction from) {
for (i = 0; i < AREA_CREATURES; i++) {
if (dng->_rooms[room]._creatureTiles[i] > 0) {
_placeCreaturesOnMap = true;
- creatureTable[i] = creatureMgr->getByTile(dng->_rooms[room]._creatureTiles[i]);
+ _creatureTable[i] = creatureMgr->getByTile(dng->_rooms[room]._creatureTiles[i]);
}
_map->creature_start[i].x = dng->_rooms[room]._creatureStartX[i];
_map->creature_start[i].y = dng->_rooms[room]._creatureStartY[i];
@@ -416,7 +416,7 @@ void CombatController::fillCreatureTable(const Creature *creature) {
/* find a free spot in the creature table */
do {
j = xu4_random(AREA_CREATURES) ;
- } while (creatureTable[j] != nullptr);
+ } while (_creatureTable[j] != nullptr);
/* see if creature is a leader or leader's leader */
if (creatureMgr->getById(baseCreature->getLeader()) != baseCreature && /* leader is a different creature */
@@ -429,7 +429,7 @@ void CombatController::fillCreatureTable(const Creature *creature) {
}
/* place this creature in the creature table */
- creatureTable[j] = current;
+ _creatureTable[j] = current;
}
}
}
@@ -499,7 +499,7 @@ void CombatController::placeCreatures() {
int i;
for (i = 0; i < AREA_CREATURES; i++) {
- const Creature *m = creatureTable[i];
+ const Creature *m = _creatureTable[i];
if (m)
_map->addCreature(m, _map->creature_start[i]);
}
diff --git a/engines/ultima/ultima4/controllers/combat_controller.h b/engines/ultima/ultima4/controllers/combat_controller.h
index afef95d0dc..07e6968705 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.h
+++ b/engines/ultima/ultima4/controllers/combat_controller.h
@@ -186,7 +186,7 @@ protected:
PartyMemberVector _party;
byte _focus;
- const Creature *creatureTable[AREA_CREATURES];
+ const Creature *_creatureTable[AREA_CREATURES];
Creature *_creature;
bool _camping;
diff --git a/engines/ultima/ultima4/controllers/game_controller.cpp b/engines/ultima/ultima4/controllers/game_controller.cpp
index 166ff6c2c8..c54287f261 100644
--- a/engines/ultima/ultima4/controllers/game_controller.cpp
+++ b/engines/ultima/ultima4/controllers/game_controller.cpp
@@ -85,7 +85,7 @@ void GameController::init() {
// initialize the global game context, conversation and game state variables
g_context = new Context();
g_context->_line = TEXT_AREA_H - 1;
- g_context->col = 0;
+ g_context->_col = 0;
g_context->_stats = new StatsArea();
g_context->_moonPhase = 0;
g_context->_windDirection = DIR_NORTH;
@@ -156,6 +156,7 @@ void GameController::setMap(Map *map, bool saveLocation, const Portal *portal, T
if (isCity(map)) {
City *city = dynamic_cast<City *>(map);
+ assert(city);
city->addPeople();
}
}
@@ -249,6 +250,8 @@ void GameController::finishTurn() {
if (g_context->_location->_context == CTX_DUNGEON) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
+
if (g_context->_party->getTorchDuration() <= 0)
g_screen->screenMessage("It's Dark!\n");
else g_context->_party->burnTorch();
@@ -320,10 +323,13 @@ void GameController::update(Location *location, MoveEvent &event) {
case Map::DUNGEON:
avatarMovedInDungeon(event);
break;
- case Map::COMBAT:
+ case Map::COMBAT: {
// FIXME: let the combat controller handle it
- dynamic_cast<CombatController *>(eventHandler->getController())->movePartyMember(event);
+ CombatController *ctl = dynamic_cast<CombatController *>(eventHandler->getController());
+ assert(ctl);
+ ctl->movePartyMember(event);
break;
+ }
default:
avatarMoved(event);
break;
@@ -523,8 +529,9 @@ void GameController::avatarMoved(MoveEvent &event) {
}
void GameController::avatarMovedInDungeon(MoveEvent &event) {
- Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
Direction realDir = dirNormalize((Direction)g_ultima->_saveGame->_orientation, event._dir);
+ Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
if (!settings._filterMoveMessages) {
if (event._userEvent) {
@@ -562,6 +569,7 @@ void GameController::avatarMovedInDungeon(MoveEvent &event) {
room = (0x10 * (g_context->_location->_coords.z / 2)) + room;
Dungeon *dng = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dng);
dng->_currentRoom = room;
/* set the map and start combat! */
diff --git a/engines/ultima/ultima4/controllers/inn_controller.cpp b/engines/ultima/ultima4/controllers/inn_controller.cpp
index 79e0798cbc..44c1799e15 100644
--- a/engines/ultima/ultima4/controllers/inn_controller.cpp
+++ b/engines/ultima/ultima4/controllers/inn_controller.cpp
@@ -125,17 +125,18 @@ void InnController::maybeMeetIsaac() {
}
// Otherwise, we need to create Isaac
- Person *Isaac;
- Isaac = new Person(creatureMgr->getById(GHOST_ID)->getTile());
+ Person *isaac = new Person(creatureMgr->getById(GHOST_ID)->getTile());
- Isaac->setMovementBehavior(MOVEMENT_WANDER);
+ isaac->setMovementBehavior(MOVEMENT_WANDER);
- Isaac->setDialogue(city->_extraDialogues[0]);
- Isaac->getStart() = coords;
- Isaac->setPrevTile(Isaac->getTile());
+ isaac->setDialogue(city->_extraDialogues[0]);
+ isaac->getStart() = coords;
+ isaac->setPrevTile(isaac->getTile());
// Add Isaac near the Avatar
- city->addPerson(Isaac);
+ city->addPerson(isaac);
+
+ delete isaac;
}
}
}
diff --git a/engines/ultima/ultima4/controllers/intro_controller.cpp b/engines/ultima/ultima4/controllers/intro_controller.cpp
index fef26946c1..943fb0f8a8 100644
--- a/engines/ultima/ultima4/controllers/intro_controller.cpp
+++ b/engines/ultima/ultima4/controllers/intro_controller.cpp
@@ -718,7 +718,9 @@ void IntroController::finishInitiateGame(const Common::String &nameBuffer, SexTy
SaveGame &saveGame = *g_ultima->_saveGame;
SaveGamePlayerRecord avatar;
avatar.init();
- strcpy(avatar.name, nameBuffer.c_str());
+ strncpy(avatar._name, nameBuffer.c_str(), 15);
+ avatar._name[15] = '\0';
+
avatar._sex = sex;
saveGame.init(&avatar);
g_screen->screenHideCursor();
@@ -1318,7 +1320,7 @@ void IntroController::initPlayers(SaveGame *saveGame) {
ASSERT((int)saveGame->_players[0]._class < 8, "bad class: %d", saveGame->_players[0]._class);
saveGame->_players[0]._weapon = initValuesForClass[saveGame->_players[0]._class].weapon;
- saveGame->_players[0].armor = initValuesForClass[saveGame->_players[0]._class].armor;
+ saveGame->_players[0]._armor = initValuesForClass[saveGame->_players[0]._class].armor;
saveGame->_players[0]._xp = initValuesForClass[saveGame->_players[0]._class].xp;
saveGame->_x = initValuesForClass[saveGame->_players[0]._class].x;
saveGame->_y = initValuesForClass[saveGame->_players[0]._class].y;
@@ -1381,8 +1383,9 @@ void IntroController::initPlayers(SaveGame *saveGame) {
saveGame->_players[p]._dex = initValuesForNpcClass[i].dex;
saveGame->_players[p]._intel = initValuesForNpcClass[i].intel;
saveGame->_players[p]._weapon = initValuesForClass[i].weapon;
- saveGame->_players[p].armor = initValuesForClass[i].armor;
- strcpy(saveGame->_players[p].name, initValuesForNpcClass[i].name);
+ saveGame->_players[p]._armor = initValuesForClass[i].armor;
+ strncpy(saveGame->_players[p]._name, initValuesForNpcClass[i].name, 15);
+ saveGame->_players[p]._name[15] = '\0';
saveGame->_players[p]._sex = initValuesForNpcClass[i].sex;
saveGame->_players[p]._hp = saveGame->_players[p]._hpMax = initValuesForClass[i].level * 100;
saveGame->_players[p]._mp = player.getMaxMp();
diff --git a/engines/ultima/ultima4/controllers/read_string_controller.cpp b/engines/ultima/ultima4/controllers/read_string_controller.cpp
index 0f4936388f..db76b6881c 100644
--- a/engines/ultima/ultima4/controllers/read_string_controller.cpp
+++ b/engines/ultima/ultima4/controllers/read_string_controller.cpp
@@ -80,7 +80,7 @@ bool ReadStringController::keyPressed(int key) {
g_screen->screenHideCursor();
g_screen->screenTextAt(_screenX + len, _screenY, "%c", key);
g_screen->screenSetCursorPos(_screenX + len + 1, _screenY);
- g_context->col = len + 1;
+ g_context->_col = len + 1;
g_screen->screenShowCursor();
}
}
diff --git a/engines/ultima/ultima4/conversation/conversation.cpp b/engines/ultima/ultima4/conversation/conversation.cpp
index 255a97c445..a6d1470621 100644
--- a/engines/ultima/ultima4/conversation/conversation.cpp
+++ b/engines/ultima/ultima4/conversation/conversation.cpp
@@ -230,7 +230,8 @@ Common::String Dialogue::dump(const Common::String &arg) {
* Conversation class
*/
-Conversation::Conversation() : _state(INTRO), _script(new Script()) {
+Conversation::Conversation() : _state(INTRO), _script(new Script()),
+ _question(nullptr), _quant(0), _player(0), _price(0) {
#ifdef IOS_ULTIMA4
U4IOS::incrementConversationCount();
#endif
diff --git a/engines/ultima/ultima4/core/debugger.cpp b/engines/ultima/ultima4/core/debugger.cpp
index 5add774117..0484a8c24f 100644
--- a/engines/ultima/ultima4/core/debugger.cpp
+++ b/engines/ultima/ultima4/core/debugger.cpp
@@ -170,10 +170,12 @@ bool Debugger::handleCommand(int argc, const char **argv, bool &keepRunning) {
bool result = Shared::Debugger::handleCommand(argc, argv, keepRunning);
if (result) {
- if (!isActive() && !_dontEndTurn)
+ if (!isActive() && !_dontEndTurn) {
g_game->finishTurn();
- else if (_dontEndTurn && eventHandler->getController() == g_game)
+ } else if (_dontEndTurn && eventHandler->getController() == g_game) {
+ assert(g_context);
g_context->_location->_turnCompleter->finishTurn();
+ }
}
_dontEndTurn = false;
@@ -1196,8 +1198,8 @@ bool Debugger::cmdCollisions(int argc, const char **argv) {
bool Debugger::cmdCompanions(int argc, const char **argv) {
for (int m = g_ultima->_saveGame->_members; m < 8; m++) {
- if (g_context->_party->canPersonJoin(g_ultima->_saveGame->_players[m].name, nullptr)) {
- g_context->_party->join(g_ultima->_saveGame->_players[m].name);
+ if (g_context->_party->canPersonJoin(g_ultima->_saveGame->_players[m]._name, nullptr)) {
+ g_context->_party->join(g_ultima->_saveGame->_players[m]._name);
}
}
@@ -1592,7 +1594,7 @@ bool Debugger::cmdTransport(int argc, const char **argv) {
coords.move(dir, g_context->_location->_map);
if (coords != g_context->_location->_coords) {
- bool ok = false;
+ bool ok;
MapTile *ground = g_context->_location->_map->tileAt(coords, WITHOUT_OBJECTS);
switch (transport) {
@@ -1606,6 +1608,7 @@ bool Debugger::cmdTransport(int argc, const char **argv) {
ok = ground->getTileType()->isWalkable();
break;
default:
+ ok = false;
break;
}
diff --git a/engines/ultima/ultima4/core/debugger_actions.cpp b/engines/ultima/ultima4/core/debugger_actions.cpp
index f7be84e88b..59dd09289c 100644
--- a/engines/ultima/ultima4/core/debugger_actions.cpp
+++ b/engines/ultima/ultima4/core/debugger_actions.cpp
@@ -91,6 +91,7 @@ bool DebuggerActions::destroyAt(const Coords &coords) {
if (obj) {
if (isCreature(obj)) {
Creature *c = dynamic_cast<Creature *>(obj);
+ assert(c);
g_screen->screenMessage("%s Destroyed!\n", c->getName().c_str());
} else {
Tile *t = g_context->_location->_map->_tileSet->get(obj->getTile()._id);
@@ -270,7 +271,7 @@ bool DebuggerActions::mixReagentsForSpellU5(int spell) {
printN("How many? ");
- int howmany = ReadIntController::get(2, TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ int howmany = ReadIntController::get(2, TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
gameSpellMixHowMany(spell, howmany, &ingredients);
return true;
@@ -358,6 +359,7 @@ bool DebuggerActions::talkAt(const Coords &coords) {
}
city = dynamic_cast<City *>(g_context->_location->_map);
+ assert(city);
Person *talker = city ? city->personAt(coords) : nullptr;
// Make sure we have someone we can talk with
diff --git a/engines/ultima/ultima4/events/event_handler.cpp b/engines/ultima/ultima4/events/event_handler.cpp
index 08ec2f2333..8bee51a8f6 100644
--- a/engines/ultima/ultima4/events/event_handler.cpp
+++ b/engines/ultima/ultima4/events/event_handler.cpp
@@ -153,39 +153,39 @@ void EventHandler::run() {
while (!_ended && !_controllerDone) {
Common::Event event;
- g_system->getEventManager()->pollEvent(event);
-
- switch (event.type) {
- case Common::EVENT_KEYDOWN:
- handleKeyDownEvent(event, getController(), _updateScreen);
- break;
-
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- case Common::EVENT_MBUTTONDOWN:
- handleMouseButtonDownEvent(event, getController(), _updateScreen);
- break;
-
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- case Common::EVENT_MBUTTONUP:
- handleMouseButtonUpEvent(event, getController(), _updateScreen);
- break;
-
- case Common::EVENT_MOUSEMOVE:
- handleMouseMotionEvent(event);
- continue;
-
- case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
- getController()->keybinder((KeybindingAction)event.customType);
- break;
-
- case Common::EVENT_QUIT:
- _ended = true;
- return;
-
- default:
- break;
+ if (g_system->getEventManager()->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ handleKeyDownEvent(event, getController(), _updateScreen);
+ break;
+
+ case Common::EVENT_LBUTTONDOWN:
+ case Common::EVENT_RBUTTONDOWN:
+ case Common::EVENT_MBUTTONDOWN:
+ handleMouseButtonDownEvent(event, getController(), _updateScreen);
+ break;
+
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONUP:
+ case Common::EVENT_MBUTTONUP:
+ handleMouseButtonUpEvent(event, getController(), _updateScreen);
+ break;
+
+ case Common::EVENT_MOUSEMOVE:
+ handleMouseMotionEvent(event);
+ continue;
+
+ case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+ getController()->keybinder((KeybindingAction)event.customType);
+ break;
+
+ case Common::EVENT_QUIT:
+ _ended = true;
+ return;
+
+ default:
+ break;
+ }
}
// Brief delay
diff --git a/engines/ultima/ultima4/filesys/savegame.cpp b/engines/ultima/ultima4/filesys/savegame.cpp
index c5d46eb9df..34ffed8fce 100644
--- a/engines/ultima/ultima4/filesys/savegame.cpp
+++ b/engines/ultima/ultima4/filesys/savegame.cpp
@@ -37,6 +37,7 @@ namespace Ultima4 {
void SaveGame::save(Common::WriteStream *stream) {
Common::Serializer ser(nullptr, stream);
+ assert(g_context);
if (g_context->_location) {
if (g_context->_location->_prev) {
@@ -139,6 +140,8 @@ void SaveGame::save(Common::WriteStream *stream) {
void SaveGame::load(Common::SeekableReadStream *stream) {
Common::Serializer *ser = nullptr;
+ assert(g_context);
+
if (stream) {
ser = new Common::Serializer(stream, nullptr);
synchronize(*ser);
@@ -352,8 +355,8 @@ void SaveGamePlayerRecord::synchronize(Common::Serializer &s) {
s.syncAsUint16LE(_mp);
s.syncAsUint16LE(_unknown);
s.syncAsUint16LE(_weapon);
- s.syncAsUint16LE(armor);
- s.syncBytes((byte *)name, 16);
+ s.syncAsUint16LE(_armor);
+ s.syncBytes((byte *)_name, 16);
s.syncAsByte(_sex);
s.syncAsByte(_class);
s.syncAsByte(_status);
@@ -371,10 +374,10 @@ void SaveGamePlayerRecord::init() {
_mp = 0;
_unknown = 0;
_weapon = WEAP_HANDS;
- armor = ARMR_NONE;
+ _armor = ARMR_NONE;
for (i = 0; i < 16; ++i)
- name[i] = '\0';
+ _name[i] = '\0';
_sex = SEX_MALE;
_class = CLASS_MAGE;
diff --git a/engines/ultima/ultima4/filesys/savegame.h b/engines/ultima/ultima4/filesys/savegame.h
index 2958c07723..d412e0a262 100644
--- a/engines/ultima/ultima4/filesys/savegame.h
+++ b/engines/ultima/ultima4/filesys/savegame.h
@@ -198,8 +198,8 @@ struct SaveGamePlayerRecord {
unsigned short _mp;
unsigned short _unknown;
WeaponType _weapon;
- ArmorType armor;
- char name[16];
+ ArmorType _armor;
+ char _name[16];
SexType _sex;
ClassType _class;
StatusType _status;
diff --git a/engines/ultima/ultima4/game/context.cpp b/engines/ultima/ultima4/game/context.cpp
index 038eaf9966..c21ca7129c 100644
--- a/engines/ultima/ultima4/game/context.cpp
+++ b/engines/ultima/ultima4/game/context.cpp
@@ -27,7 +27,12 @@ namespace Ultima4 {
Context *g_context;
-Context::Context() : _party(nullptr), _location(nullptr) {
+Context::Context() : _party(nullptr), _location(nullptr),
+ _line(0), _col(0), _stats(nullptr), _moonPhase(0),
+ _windDirection(0), _windCounter(0), _windLock(false),
+ _aura(nullptr), _horseSpeed(0), _opacity(0),
+ _transportContext(TRANSPORT_ANY), _lastCommandTime(0),
+ _lastShip(nullptr) {
g_context = this;
}
diff --git a/engines/ultima/ultima4/game/context.h b/engines/ultima/ultima4/game/context.h
index 380e46f0bf..2f9bf379b1 100644
--- a/engines/ultima/ultima4/game/context.h
+++ b/engines/ultima/ultima4/game/context.h
@@ -59,8 +59,8 @@ public:
~Context();
Party *_party;
- class Location *_location;
- int _line, col;
+ Location *_location;
+ int _line, _col;
StatsArea *_stats;
int _moonPhase;
int _windDirection;
@@ -71,8 +71,8 @@ public:
int _opacity;
TransportContext _transportContext;
uint32 _lastCommandTime;
- class Object *_lastShip;
-
+ Object *_lastShip;
+public:
/**
* Provides scripts with information
*/
diff --git a/engines/ultima/ultima4/game/creature.cpp b/engines/ultima/ultima4/game/creature.cpp
index c65cb105fc..c95e2853ea 100644
--- a/engines/ultima/ultima4/game/creature.cpp
+++ b/engines/ultima/ultima4/game/creature.cpp
@@ -48,8 +48,11 @@ bool isCreature(Object *punknown) {
return false;
}
-Creature::Creature(MapTile tile) :
- Object(Object::CREATURE) {
+Creature::Creature(MapTile tile) : Object(Object::CREATURE),
+ _id(0), _leader(0), _baseHp(0), _hp(0), _xp(0), _ranged(0),
+ _leavesTile(false), _mAttr(MATTR_STEALFOOD),
+ _movementAttr(MATTR_STATIONARY), _slowedType(SLOWED_BY_NOTHING),
+ _encounterSize(0), _resists(0), _spawn(0) {
const Creature *m = creatureMgr->getByTile(tile);
if (m)
*this = *m;
diff --git a/engines/ultima/ultima4/game/game.cpp b/engines/ultima/ultima4/game/game.cpp
index 3e242b7a0c..f28eb4ffe5 100644
--- a/engines/ultima/ultima4/game/game.cpp
+++ b/engines/ultima/ultima4/game/game.cpp
@@ -151,8 +151,6 @@ void gameSpellEffect(int spell, int player, Sound sound) {
}
switch (effect) {
- case Spell::SFX_NONE:
- break;
case Spell::SFX_TREMOR:
case Spell::SFX_INVERT:
gameUpdateScreen();
@@ -165,9 +163,10 @@ void gameSpellEffect(int spell, int player, Sound sound) {
gameUpdateScreen();
soundPlay(SOUND_RUMBLE, false);
g_screen->screenShake(8);
-
}
+ break;
+ default:
break;
}
}
@@ -180,7 +179,7 @@ Common::String gameGetInput(int maxlen) {
helper.beginConversation(U4IOS::UIKeyboardTypeDefault);
#endif
- return ReadStringController::get(maxlen, TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ return ReadStringController::get(maxlen, TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
}
int gameGetPlayer(bool canBeDisabled, bool canBeActivePlayer) {
@@ -202,9 +201,9 @@ int gameGetPlayer(bool canBeDisabled, bool canBeActivePlayer) {
}
}
- g_context->col--;// display the selected character name, in place of the number
+ g_context->_col--;// display the selected character name, in place of the number
if ((player >= 0) && (player < 8)) {
- g_screen->screenMessage("%s\n", g_ultima->_saveGame->_players[player].name); //Write player's name after prompt
+ g_screen->screenMessage("%s\n", g_ultima->_saveGame->_players[player]._name); //Write player's name after prompt
}
if (!canBeDisabled && g_context->_party->member(player)->isDisabled()) {
@@ -251,6 +250,7 @@ bool fireAt(const Coords &coords, bool originAvatar) {
obj = g_context->_location->_map->objectAt(coords);
Creature *m = dynamic_cast<Creature *>(obj);
+ assert(m);
if (obj && obj->getType() == Object::CREATURE && m->isAttackable())
validObject = true;
@@ -474,6 +474,7 @@ bool creatureRangeAttack(const Coords &coords, Creature *m) {
// See if the attack hits the avatar
Object *obj = g_context->_location->_map->objectAt(coords);
m = dynamic_cast<Creature *>(obj);
+ assert(m);
// Does the attack hit the avatar?
if (coords == g_context->_location->_coords) {
@@ -855,7 +856,7 @@ void mixReagentsSuper() {
g_screen->screenMessage("You can make %d.\n", (mixQty > ingQty) ? ingQty : mixQty);
g_screen->screenMessage("How many? ");
- int howmany = ReadIntController::get(2, TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ int howmany = ReadIntController::get(2, TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
if (howmany == 0) {
g_screen->screenMessage("\nNone mixed!\n");
diff --git a/engines/ultima/ultima4/game/item.cpp b/engines/ultima/ultima4/game/item.cpp
index 57eccab35f..1db4c89d9e 100644
--- a/engines/ultima/ultima4/game/item.cpp
+++ b/engines/ultima/ultima4/game/item.cpp
@@ -572,8 +572,8 @@ void useStone(int item) {
* in the abyss, on an altar to place the stones
*/
else if ((g_context->_location->_map->_id == MAP_ABYSS) &&
- (g_context->_location->_context & CTX_DUNGEON) &&
- (dynamic_cast<Dungeon *>(g_context->_location->_map)->currentToken() == DUNGEON_ALTAR)) {
+ (g_context->_location->_context & CTX_DUNGEON) &&
+ (static_cast<Dungeon *>(g_context->_location->_map)->currentToken() == DUNGEON_ALTAR)) {
int virtueMask = getBaseVirtues((Virtue)g_context->_location->_coords.z);
if (virtueMask > 0)
diff --git a/engines/ultima/ultima4/game/person.cpp b/engines/ultima/ultima4/game/person.cpp
index 77427dd901..4cd745d4a4 100644
--- a/engines/ultima/ultima4/game/person.cpp
+++ b/engines/ultima/ultima4/game/person.cpp
@@ -208,7 +208,7 @@ Common::List<Common::String> Person::getConversationText(Conversation *cnv, cons
U4IOS::IOSConversationHelper ipadNumberInput;
ipadNumberInput.beginConversation(U4IOS::UIKeyboardTypeNumberPad, "Amount?");
#endif
- int val = ReadIntController::get(script->getInputMaxLen(), TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ int val = ReadIntController::get(script->getInputMaxLen(), TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
script->setVar(script->getInputName(), val);
}
break;
@@ -218,7 +218,7 @@ Common::List<Common::String> Person::getConversationText(Conversation *cnv, cons
U4IOS::IOSConversationHelper ipadNumberInput;
ipadNumberInput.beginConversation(U4IOS::UIKeyboardTypeDefault);
#endif
- Common::String str = ReadStringController::get(script->getInputMaxLen(), TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ Common::String str = ReadStringController::get(script->getInputMaxLen(), TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
if (str.size()) {
lowercase(str);
script->setVar(script->getInputName(), str);
diff --git a/engines/ultima/ultima4/game/player.cpp b/engines/ultima/ultima4/game/player.cpp
index 4f551aa9e1..2b30cee72f 100644
--- a/engines/ultima/ultima4/game/player.cpp
+++ b/engines/ultima/ultima4/game/player.cpp
@@ -165,11 +165,11 @@ const Weapon *PartyMember::getWeapon() const {
}
const Armor *PartyMember::getArmor() const {
- return g_armors->get(_player->armor);
+ return g_armors->get(_player->_armor);
}
Common::String PartyMember::getName() const {
- return _player->name;
+ return _player->_name;
}
SexType PartyMember::getSex() const {
@@ -368,7 +368,7 @@ EquipError PartyMember::setArmor(const Armor *a) {
if (type != ARMR_NONE)
_party->_saveGame->_armor[type]--;
- _player->armor = type;
+ _player->_armor = type;
notifyOfChange();
return EQUIP_SUCCEEDED;
@@ -413,9 +413,11 @@ bool PartyMember::applyDamage(int damage, bool) {
if (isCombatMap(g_context->_location->_map) && getStatus() == STAT_DEAD) {
Coords p = getCoords();
Map *map = getMap();
+
+ assert(_party);
map->_annotations->add(p, g_tileSets->findTileByName("corpse")->getId())->setTTL(_party->size() * 2);
- if (_party) {
+ {
_party->setChanged();
PartyEvent event(PartyEvent::PLAYER_KILLED, this);
event._player = this;
@@ -437,7 +439,7 @@ int PartyMember::getAttackBonus() const {
}
int PartyMember::getDefense() const {
- return g_armors->get(_player->armor)->getDefense();
+ return g_armors->get(_player->_armor)->getDefense();
}
bool PartyMember::dealDamage(Creature *m, int damage) {
@@ -787,15 +789,20 @@ void Party::applyEffect(TileEffect effect) {
case EFFECT_NONE:
case EFFECT_ELECTRICITY:
_members[i]->applyEffect(effect);
+ break;
case EFFECT_LAVA:
case EFFECT_FIRE:
case EFFECT_SLEEP:
if (xu4_random(2) == 0)
_members[i]->applyEffect(effect);
+ break;
case EFFECT_POISONFIELD:
case EFFECT_POISON:
if (xu4_random(5) == 0)
_members[i]->applyEffect(effect);
+ break;
+ default:
+ break;
}
}
}
@@ -833,7 +840,7 @@ bool Party::canPersonJoin(Common::String name, Virtue *v) {
return 0;
for (i = 1; i < 8; i++) {
- if (name == _saveGame->_players[i].name) {
+ if (name == _saveGame->_players[i]._name) {
if (v)
*v = (Virtue) _saveGame->_players[i]._class;
return true;
@@ -970,7 +977,7 @@ bool Party::isPersonJoined(Common::String name) {
return false;
for (i = 1; i < _saveGame->_members; i++) {
- if (name == _saveGame->_players[i].name)
+ if (name == _saveGame->_players[i]._name)
return true;
}
return false;
@@ -981,7 +988,7 @@ CannotJoinError Party::join(Common::String name) {
SaveGamePlayerRecord tmp;
for (i = _saveGame->_members; i < 8; i++) {
- if (name == _saveGame->_players[i].name) {
+ if (name == _saveGame->_players[i]._name) {
/* ensure avatar is experienced enough */
if (_saveGame->_members + 1 > (_saveGame->_players[0]._hpMax / 100))
diff --git a/engines/ultima/ultima4/game/portal.cpp b/engines/ultima/ultima4/game/portal.cpp
index 72dcd82280..7fbfa55c28 100644
--- a/engines/ultima/ultima4/game/portal.cpp
+++ b/engines/ultima/ultima4/game/portal.cpp
@@ -67,6 +67,8 @@ int usePortalAt(Location *location, MapCoords coords, PortalTriggerAction action
/* if it's a dungeon, then ladders are predictable. Create one! */
if (location->_context == CTX_DUNGEON) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(location->_map);
+ assert(dungeon);
+
if ((action & ACTION_KLIMB) && dungeon->ladderUpAt(coords))
createDngLadder(location, action, &dngLadder);
else if ((action & ACTION_DESCEND) && dungeon->ladderDownAt(coords))
@@ -102,6 +104,7 @@ int usePortalAt(Location *location, MapCoords coords, PortalTriggerAction action
switch (destination->_type) {
case Map::CITY: {
City *city = dynamic_cast<City *>(destination);
+ assert(city);
g_screen->screenMessage("Enter %s!\n\n%s\n\n", city->_type.c_str(), city->getName().c_str());
}
break;
@@ -158,6 +161,7 @@ int usePortalAt(Location *location, MapCoords coords, PortalTriggerAction action
if (destination->_type == Map::SHRINE) {
Shrine *shrine = dynamic_cast<Shrine *>(destination);
+ assert(shrine);
shrine->enter();
}
diff --git a/engines/ultima/ultima4/game/script.cpp b/engines/ultima/ultima4/game/script.cpp
index a227e8c7b5..da841fcfe6 100644
--- a/engines/ultima/ultima4/game/script.cpp
+++ b/engines/ultima/ultima4/game/script.cpp
@@ -94,8 +94,10 @@ bool Script::Variable::isSet() const {
return _set;
}
-Script::Script() : _vendorScriptDoc(nullptr), _scriptNode(nullptr), _debug(false), _state(STATE_UNLOADED),
- _nounName("item"), _idPropName("id") {
+Script::Script() : _vendorScriptDoc(nullptr), _scriptNode(nullptr),
+ _debug(false), _state(STATE_UNLOADED), _currentScript(nullptr),
+ _currentItem(nullptr), _inputType(INPUT_CHOICE), _inputMaxLen(0),
+ _nounName("item"), _idPropName("id"), _iterator(0) {
_actionMap["context"] = ACTION_SET_CONTEXT;
_actionMap["unset_context"] = ACTION_UNSET_CONTEXT;
_actionMap["end"] = ACTION_END;
diff --git a/engines/ultima/ultima4/game/spell.cpp b/engines/ultima/ultima4/game/spell.cpp
index 6c75b35347..bd298611dd 100644
--- a/engines/ultima/ultima4/game/spell.cpp
+++ b/engines/ultima/ultima4/game/spell.cpp
@@ -783,6 +783,7 @@ static int spellYup(int unused) {
return 0;
/* staying in the dungeon */
else if (coords.z > 0) {
+ assert(dungeon);
for (int i = 0; i < 0x20; i++) {
coords = MapCoords(xu4_random(8), xu4_random(8), g_context->_location->_coords.z - 1);
if (dungeon->validTeleportLocation(coords)) {
@@ -805,6 +806,7 @@ static int spellYup(int unused) {
static int spellZdown(int unused) {
MapCoords coords = g_context->_location->_coords;
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
/* can't cast in the Abyss */
if (g_context->_location->_map->_id == MAP_ABYSS)
diff --git a/engines/ultima/ultima4/gfx/image.cpp b/engines/ultima/ultima4/gfx/image.cpp
index 6e994ba544..d7a5b2b13e 100644
--- a/engines/ultima/ultima4/gfx/image.cpp
+++ b/engines/ultima/ultima4/gfx/image.cpp
@@ -34,7 +34,8 @@
namespace Ultima {
namespace Ultima4 {
-Image::Image() : _surface(nullptr), _disposeAfterUse(DisposeAfterUse::NO) {
+Image::Image() : _surface(nullptr), _disposeAfterUse(DisposeAfterUse::NO),
+ _paletted(false) {
}
Image *Image::create(int w, int h, bool paletted, Image::Type type) {
diff --git a/engines/ultima/ultima4/gfx/screen.cpp b/engines/ultima/ultima4/gfx/screen.cpp
index 02386689b7..b0689d6549 100644
--- a/engines/ultima/ultima4/gfx/screen.cpp
+++ b/engines/ultima/ultima4/gfx/screen.cpp
@@ -243,7 +243,7 @@ void Screen::screenTextAt(int x, int y, const char *fmt, ...) {
}
void Screen::screenPrompt() {
- if (_needPrompt && _cursorEnabled && g_context->col == 0) {
+ if (_needPrompt && _cursorEnabled && g_context->_col == 0) {
screenMessage("%c", CHARSET_PROMPT);
_needPrompt = 0;
}
@@ -285,9 +285,9 @@ void Screen::screenMessage(const char *fmt, ...) {
/* backspace */
if (buffer[i] == '\b') {
- g_context->col--;
- if (g_context->col < 0) {
- g_context->col += 16;
+ g_context->_col--;
+ if (g_context->_col < 0) {
+ g_context->_col += 16;
g_context->_line--;
}
continue;
@@ -307,11 +307,11 @@ void Screen::screenMessage(const char *fmt, ...) {
}
/* check for word wrap */
- if ((g_context->col + wordlen > 16) || buffer[i] == '\n' || g_context->col == 16) {
+ if ((g_context->_col + wordlen > 16) || buffer[i] == '\n' || g_context->_col == 16) {
if (buffer[i] == '\n' || buffer[i] == ' ')
i++;
g_context->_line++;
- g_context->col = 0;
+ g_context->_col = 0;
#ifdef IOS_ULTIMA4
recursed = true;
#endif
@@ -321,17 +321,17 @@ void Screen::screenMessage(const char *fmt, ...) {
/* code for move cursor right */
if (buffer[i] == 0x12) {
- g_context->col++;
+ g_context->_col++;
continue;
}
/* don't show a space in column 1. Helps with Hawkwind. */
- if (buffer[i] == ' ' && g_context->col == 0)
+ if (buffer[i] == ' ' && g_context->_col == 0)
continue;
- screenShowChar(buffer[i], TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
- g_context->col++;
+ screenShowChar(buffer[i], TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
+ g_context->_col++;
}
- screenSetCursorPos(TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ screenSetCursorPos(TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
screenShowCursor();
_needPrompt = 1;
diff --git a/engines/ultima/ultima4/map/shrine.cpp b/engines/ultima/ultima4/map/shrine.cpp
index f72d5bb369..ca2d5ff8e2 100644
--- a/engines/ultima/ultima4/map/shrine.cpp
+++ b/engines/ultima/ultima4/map/shrine.cpp
@@ -131,7 +131,7 @@ void Shrine::enter() {
U4IOS::IOSConversationHelper inputVirture;
inputVirture.beginConversation(U4IOS::UIKeyboardTypeDefault, "Upon which virtue dost thou meditate?");
#endif
- virtue = ReadStringController::get(32, TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ virtue = ReadStringController::get(32, TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
#ifdef IOS_ULTIMA4
}
#endif
@@ -237,7 +237,7 @@ void Shrine::askMantra() {
U4IOS::IOSConversationHelper mantraHelper;
mantraHelper.beginConversation(U4IOS::UIKeyboardTypeASCIICapable, "Mantra?");
#endif
- mantra = ReadStringController::get(4, TEXT_AREA_X + g_context->col, TEXT_AREA_Y + g_context->_line);
+ mantra = ReadStringController::get(4, TEXT_AREA_X + g_context->_col, TEXT_AREA_Y + g_context->_line);
g_screen->screenMessage("\n");
#ifdef IOS_ULTIMA4
}
Commit: e4a26c25e0c158752f1cbb2edade8752b65d9993
https://github.com/scummvm/scummvm/commit/e4a26c25e0c158752f1cbb2edade8752b65d9993
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-04-27T19:45:45-07:00
Commit Message:
ULTIMA4: Further Coverity fixes
Changed paths:
engines/ultima/ultima4/filesys/savegame.h
engines/ultima/ultima4/gfx/imagemgr.cpp
engines/ultima/ultima4/gfx/screen.cpp
engines/ultima/ultima4/map/dungeon.cpp
engines/ultima/ultima4/map/dungeon.h
engines/ultima/ultima4/map/dungeonview.cpp
engines/ultima/ultima4/map/location.cpp
engines/ultima/ultima4/map/map.cpp
engines/ultima/ultima4/map/map.h
engines/ultima/ultima4/map/map_tile.h
engines/ultima/ultima4/map/maploader.cpp
engines/ultima/ultima4/map/mapmgr.cpp
engines/ultima/ultima4/map/movement.cpp
engines/ultima/ultima4/map/shrine.cpp
engines/ultima/ultima4/map/tile.cpp
engines/ultima/ultima4/map/tileset.h
engines/ultima/ultima4/ultima4.cpp
diff --git a/engines/ultima/ultima4/filesys/savegame.h b/engines/ultima/ultima4/filesys/savegame.h
index d412e0a262..72c6623e79 100644
--- a/engines/ultima/ultima4/filesys/savegame.h
+++ b/engines/ultima/ultima4/filesys/savegame.h
@@ -218,6 +218,9 @@ struct SaveGameMonsterRecord {
byte _unused1;
byte _unused2;
+ SaveGameMonsterRecord() : _tile(0), _x(0), _y(0), _prevTile(0),
+ _prevX(0), _prevY(0), _unused1(0), _unused2(0) {}
+
static void synchronize(SaveGameMonsterRecord *monsterTable, Common::Serializer &s);
};
diff --git a/engines/ultima/ultima4/gfx/imagemgr.cpp b/engines/ultima/ultima4/gfx/imagemgr.cpp
index e64aa6d745..adad9ab615 100644
--- a/engines/ultima/ultima4/gfx/imagemgr.cpp
+++ b/engines/ultima/ultima4/gfx/imagemgr.cpp
@@ -68,7 +68,7 @@ void ImageMgr::destroy() {
}
}
-ImageMgr::ImageMgr() {
+ImageMgr::ImageMgr() : _baseSet(nullptr) {
settings.addObserver(this);
}
@@ -339,7 +339,7 @@ void ImageMgr::fixupIntro(Image *im, int prescale) {
im->setPaletteIndex(15, im->setColor(226, 226, 255));
// update the color of "Origin Systems, Inc."
- im->setPaletteIndex(9, im->setColor(129, 129, 255));
+ (void)im->setPaletteIndex(9, im->setColor(129, 129, 255));
#ifdef TODO
borderInfo->_image->save("border.png");
diff --git a/engines/ultima/ultima4/gfx/screen.cpp b/engines/ultima/ultima4/gfx/screen.cpp
index b0689d6549..b51eb6e4a3 100644
--- a/engines/ultima/ultima4/gfx/screen.cpp
+++ b/engines/ultima/ultima4/gfx/screen.cpp
@@ -1384,9 +1384,6 @@ Image *Screen::screenScaleDown(Image *src, int scale) {
if (!dest)
return nullptr;
- if (!dest)
- dest = Image::duplicate(src);
-
if (dest->isIndexed())
dest->setPaletteFromImage(src);
diff --git a/engines/ultima/ultima4/map/dungeon.cpp b/engines/ultima/ultima4/map/dungeon.cpp
index 4d1fbdd5b7..771317e64f 100644
--- a/engines/ultima/ultima4/map/dungeon.cpp
+++ b/engines/ultima/ultima4/map/dungeon.cpp
@@ -44,6 +44,12 @@ bool isDungeon(Map *punknown) {
return false;
}
+Dungeon::Dungeon() : _nRooms(0), _rooms(nullptr),
+ _roomMaps(nullptr), _currentRoom(0) {
+ Common::fill(&_partyStartX[0], &_partyStartX[8], 0);
+ Common::fill(&_partyStartY[0], &_partyStartY[8], 0);
+}
+
Common::String Dungeon::getName() {
return _name;
}
@@ -94,6 +100,8 @@ byte Dungeon::subTokenAt(MapCoords coords) {
void dungeonSearch(void) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
+
DungeonToken token = dungeon->currentToken();
Annotation::List a = dungeon->_annotations->allAt(g_context->_location->_coords);
const ItemLocation *item;
@@ -138,6 +146,7 @@ void dungeonDrinkFountain() {
return;
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
FountainType type = (FountainType) dungeon->currentSubToken();
switch (type) {
@@ -245,6 +254,8 @@ void dungeonTouchOrb() {
bool dungeonHandleTrap(TrapType trap) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
+
switch ((TrapType)dungeon->currentSubToken()) {
case TRAP_WINDS:
g_screen->screenMessage("\nWinds!\n");
diff --git a/engines/ultima/ultima4/map/dungeon.h b/engines/ultima/ultima4/map/dungeon.h
index f42fa361e0..942ae62100 100644
--- a/engines/ultima/ultima4/map/dungeon.h
+++ b/engines/ultima/ultima4/map/dungeon.h
@@ -86,7 +86,7 @@ enum DungeonToken {
class Dungeon : public Map {
public:
- Dungeon() {}
+ Dungeon();
// Members
/**
diff --git a/engines/ultima/ultima4/map/dungeonview.cpp b/engines/ultima/ultima4/map/dungeonview.cpp
index 50327e6bbf..4b6b5c04c6 100644
--- a/engines/ultima/ultima4/map/dungeonview.cpp
+++ b/engines/ultima/ultima4/map/dungeonview.cpp
@@ -297,6 +297,7 @@ DungeonGraphicType DungeonView::tilesToGraphic(const Std::vector<MapTile> &tiles
* token
*/
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_map);
+ assert(dungeon);
DungeonToken token = dungeon->tokenForTile(tile);
switch (token) {
diff --git a/engines/ultima/ultima4/map/location.cpp b/engines/ultima/ultima4/map/location.cpp
index 3e6425568b..aa2cdb1711 100644
--- a/engines/ultima/ultima4/map/location.cpp
+++ b/engines/ultima/ultima4/map/location.cpp
@@ -233,10 +233,12 @@ TileId Location::getReplacementTile(MapCoords atCoords, const Tile *forTile) {
int Location::getCurrentPosition(MapCoords *coords) {
if (_context & CTX_COMBAT) {
CombatController *cc = dynamic_cast<CombatController *>(eventHandler->getController());
+ assert(cc);
PartyMemberVector *party = cc->getParty();
*coords = (*party)[cc->getFocus()]->getCoords();
- } else
+ } else {
*coords = this->_coords;
+ }
return 1;
}
diff --git a/engines/ultima/ultima4/map/map.cpp b/engines/ultima/ultima4/map/map.cpp
index ee14d1a461..27c47fe8d6 100644
--- a/engines/ultima/ultima4/map/map.cpp
+++ b/engines/ultima/ultima4/map/map.cpp
@@ -233,18 +233,11 @@ int MapCoords::distance(const MapCoords &c, const Map *map) const {
/*-------------------------------------------------------------------*/
-Map::Map() {
+Map::Map() : _id(0), _type(WORLD), _width(0), _height(0), _levels(1),
+ _chunkWidth(0), _chunkHeight(0), _offset(0), _flags(0),
+ _borderBehavior(BORDER_WRAP), _music(Music::NONE),
+ _tileSet(nullptr), _tileMap(nullptr) {
_annotations = new AnnotationMgr();
- _flags = 0;
- _width = 0;
- _height = 0;
- _levels = 1;
- _chunkWidth = 0;
- _chunkHeight = 0;
- _offset = 0;
- _id = 0;
- _tileSet = nullptr;
- _tileMap = nullptr;
}
Map::~Map() {
@@ -718,6 +711,7 @@ bool Map::fillMonsterTable() {
// Moving objects first
if ((obj->getType() == Object::CREATURE) && (obj->getMovementBehavior() != MOVEMENT_FIXED)) {
Creature *c = dynamic_cast<Creature *>(obj);
+ assert(c);
// Whirlpools and storms are separated from other moving objects
if (c->getId() == WHIRLPOOL_ID || c->getId() == STORM_ID)
monsters.push_back(obj);
diff --git a/engines/ultima/ultima4/map/map.h b/engines/ultima/ultima4/map/map.h
index f005fdac3d..063dc61d9e 100644
--- a/engines/ultima/ultima4/map/map.h
+++ b/engines/ultima/ultima4/map/map.h
@@ -260,31 +260,28 @@ public:
uint translateToRawTileIndex(MapTile &tile) const;
public:
- MapId _id;
- Common::String _fname;
- Type _type;
- uint _width,
- _height,
- _levels;
- uint _chunkWidth,
- _chunkHeight;
- uint _offset;
-
- Source _baseSource;
+ MapId _id;
+ Common::String _fname;
+ Type _type;
+ uint _width, _height, _levels;
+ uint _chunkWidth, _chunkHeight;
+ uint _offset;
+
+ Source _baseSource;
Common::List<Source> _extraSources;
- CompressedChunkList _compressedChunks;
- BorderBehavior _borderBehavior;
+ CompressedChunkList _compressedChunks;
+ BorderBehavior _borderBehavior;
- PortalList _portals;
- AnnotationMgr *_annotations;
- int _flags;
- Music::Type _music;
- MapData _data;
- ObjectDeque _objects;
+ PortalList _portals;
+ AnnotationMgr *_annotations;
+ int _flags;
+ Music::Type _music;
+ MapData _data;
+ ObjectDeque _objects;
Std::map<Common::String, MapCoords> _labels;
- Tileset *_tileSet;
- TileMap *_tileMap;
+ Tileset *_tileSet;
+ TileMap *_tileMap;
// u4dos compatibility
SaveGameMonsterRecord _monsterTable[MONSTERTABLE_SIZE];
diff --git a/engines/ultima/ultima4/map/map_tile.h b/engines/ultima/ultima4/map/map_tile.h
index f8b512d9f9..9b1b4e3062 100644
--- a/engines/ultima/ultima4/map/map_tile.h
+++ b/engines/ultima/ultima4/map/map_tile.h
@@ -34,7 +34,7 @@ namespace Ultima4 {
*/
class MapTile {
public:
- MapTile() : _id(0), _frame(0) {
+ MapTile() : _id(0), _frame(0), _freezeAnimation(false) {
}
MapTile(const TileId &i, byte f = 0) : _id(i), _frame(f), _freezeAnimation(false) {
}
diff --git a/engines/ultima/ultima4/map/maploader.cpp b/engines/ultima/ultima4/map/maploader.cpp
index 571900a73d..b77c32020f 100644
--- a/engines/ultima/ultima4/map/maploader.cpp
+++ b/engines/ultima/ultima4/map/maploader.cpp
@@ -127,6 +127,7 @@ bool MapLoader::isChunkCompressed(Map *map, int chunk) {
bool CityMapLoader::load(Map *map) {
City *city = dynamic_cast<City *>(map);
+ assert(city);
uint i, j;
Person *people[CITY_MAX_PERSONS];
@@ -282,6 +283,7 @@ bool ConMapLoader::load(Map *map) {
bool DngMapLoader::load(Map *map) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(map);
+ assert(dungeon);
Common::File *dng = u4fopen(dungeon->_fname);
if (!dng)
diff --git a/engines/ultima/ultima4/map/mapmgr.cpp b/engines/ultima/ultima4/map/mapmgr.cpp
index 441f0f28fb..50f7b5448d 100644
--- a/engines/ultima/ultima4/map/mapmgr.cpp
+++ b/engines/ultima/ultima4/map/mapmgr.cpp
@@ -172,6 +172,7 @@ Map *MapMgr::initMapFromConf(const ConfigElement &mapConf) {
if (isCombatMap(map)) {
CombatMap *cm = dynamic_cast<CombatMap *>(map);
+ assert(cm);
cm->setContextual(mapConf.getBool("contextual"));
}
diff --git a/engines/ultima/ultima4/map/movement.cpp b/engines/ultima/ultima4/map/movement.cpp
index c187409900..ef4631d3b5 100644
--- a/engines/ultima/ultima4/map/movement.cpp
+++ b/engines/ultima/ultima4/map/movement.cpp
@@ -325,6 +325,7 @@ int moveCombatObject(int act, Map *map, Creature *obj, MapCoords target) {
void movePartyMember(MoveEvent &event) {
CombatController *ct = dynamic_cast<CombatController *>(eventHandler->getController());
CombatMap *cm = getCombatMap();
+ assert(cm && ct);
int member = ct->getFocus();
MapCoords newCoords;
PartyMemberVector *party = ct->getParty();
@@ -371,9 +372,10 @@ void movePartyMember(MoveEvent &event) {
// Handle dungeon room triggers
if (cm->isDungeonRoom()) {
Dungeon *dungeon = dynamic_cast<Dungeon *>(g_context->_location->_prev->_map);
- int i;
+ assert(dungeon);
Trigger *triggers = dungeon->_rooms[dungeon->_currentRoom]._triggers;
+ int i;
for (i = 0; i < 4; i++) {
/*const Creature *m = creatures.getByTile(triggers[i].tile);*/
diff --git a/engines/ultima/ultima4/map/shrine.cpp b/engines/ultima/ultima4/map/shrine.cpp
index ca2d5ff8e2..7368eb5784 100644
--- a/engines/ultima/ultima4/map/shrine.cpp
+++ b/engines/ultima/ultima4/map/shrine.cpp
@@ -69,6 +69,8 @@ void Shrines::loadAdvice() {
bool shrineCanEnter(const Portal *p) {
Shrine *shrine = dynamic_cast<Shrine *>(mapMgr->get(p->_destid));
+ assert(shrine);
+
if (!g_context->_party->canEnterShrine(shrine->getVirtue())) {
g_screen->screenMessage("Thou dost not bear the rune of entry! A strange force keeps you out!\n");
return 0;
@@ -86,7 +88,7 @@ bool isShrine(Map *punknown) {
/*-------------------------------------------------------------------*/
-Shrine::Shrine() {}
+Shrine::Shrine() : _virtue(VIRT_HONESTY) {}
Common::String Shrine::getName() {
if (_name.empty()) {
diff --git a/engines/ultima/ultima4/map/tile.cpp b/engines/ultima/ultima4/map/tile.cpp
index 45f339504c..c2b4ed4b07 100644
--- a/engines/ultima/ultima4/map/tile.cpp
+++ b/engines/ultima/ultima4/map/tile.cpp
@@ -163,6 +163,7 @@ void Tile::loadImage() {
// Draw the tile from the image we found to our tile image
if (subimage) {
Image *tiles = info->_image;
+ assert(tiles);
tiles->drawSubRectOn(_image, 0, 0, subimage->x * _scale, subimage->y * _scale, subimage->width * _scale, subimage->height * _scale);
} else info->_image->drawOn(_image, 0, 0);
}
diff --git a/engines/ultima/ultima4/map/tileset.h b/engines/ultima/ultima4/map/tileset.h
index 337589f0e2..f517eaa055 100644
--- a/engines/ultima/ultima4/map/tileset.h
+++ b/engines/ultima/ultima4/map/tileset.h
@@ -63,6 +63,8 @@ public:
typedef Common::HashMap<TileId, Tile *> TileIdMap;
typedef Common::HashMap<Common::String, Tile *> TileStrMap;
public:
+ Tileset() : _totalFrames(0), _extends(nullptr) {}
+
/**
* Loads a tileset.
*/
diff --git a/engines/ultima/ultima4/ultima4.cpp b/engines/ultima/ultima4/ultima4.cpp
index 364165f804..4b1a7c57cc 100644
--- a/engines/ultima/ultima4/ultima4.cpp
+++ b/engines/ultima/ultima4/ultima4.cpp
@@ -216,7 +216,7 @@ void Ultima4Engine::quitGame() {
// Do an event poll to all the quit message to be processed
Common::Event e;
- g_system->getEventManager()->pollEvent(e);
+ (void)g_system->getEventManager()->pollEvent(e);
}
} // End of namespace Ultima4
More information about the Scummvm-git-logs
mailing list