[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