[Scummvm-git-logs] scummvm master -> edc46621635d233734993fa24f3fada94676b662

dreammaster noreply at scummvm.org
Thu Mar 2 05:32:13 UTC 2023


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

Summary:
edc4662163 MM: MM1: Remainder of training view


Commit: edc46621635d233734993fa24f3fada94676b662
    https://github.com/scummvm/scummvm/commit/edc46621635d233734993fa24f3fada94676b662
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-01T21:32:04-08:00

Commit Message:
MM: MM1: Remainder of training view

Changed paths:
    devtools/create_mm/files/mm1/strings_en.yml
    engines/mm/mm1/views/locations/training.cpp
    engines/mm/mm1/views_enh/locations/location.cpp
    engines/mm/mm1/views_enh/locations/location.h
    engines/mm/mm1/views_enh/locations/training.cpp
    engines/mm/mm1/views_enh/locations/training.h


diff --git a/devtools/create_mm/files/mm1/strings_en.yml b/devtools/create_mm/files/mm1/strings_en.yml
index db413c4bf1f..7d13522208e 100644
--- a/devtools/create_mm/files/mm1/strings_en.yml
+++ b/devtools/create_mm/files/mm1/strings_en.yml
@@ -526,6 +526,8 @@ enhdialogs:
 		title: "Training"
 		train: "\x01""37Train"
 		esc: "ESC"
+		needs: "%s\nneeds %d experience for level %d."
+		eligible: "%s\nis eligible for level %d."
 stats:
 	none: "None"
 	inventory: "-----<Equipped>----------<Backpack>----"
diff --git a/engines/mm/mm1/views/locations/training.cpp b/engines/mm/mm1/views/locations/training.cpp
index abe0e1ccfa6..8d4b5340438 100644
--- a/engines/mm/mm1/views/locations/training.cpp
+++ b/engines/mm/mm1/views/locations/training.cpp
@@ -53,8 +53,10 @@ void Training::checkCharacter() {
 	Character &c = *g_globals->_currCharacter;
 
 	_currLevel = c._level._base;
-	if (_currLevel >= MAX_LEVEL)
+	if (_currLevel >= MAX_LEVEL) {
+		_canTrain = false;
 		return;
+	}
 
 	// Initialize fields
 	_expTotal = 0;
diff --git a/engines/mm/mm1/views_enh/locations/location.cpp b/engines/mm/mm1/views_enh/locations/location.cpp
index cf77cb43cab..8b1249e3a2d 100644
--- a/engines/mm/mm1/views_enh/locations/location.cpp
+++ b/engines/mm/mm1/views_enh/locations/location.cpp
@@ -61,7 +61,7 @@ void Location::displayMessage(const Common::String &msg) {
 	infoMsg._timeoutCallback = []() {
 		Location *loc = dynamic_cast<Location *>(g_events->focusedView());
 		assert(loc);
-		loc->leave();
+		loc->messageShown();
 	};
 
 	g_events->send(infoMsg);
diff --git a/engines/mm/mm1/views_enh/locations/location.h b/engines/mm/mm1/views_enh/locations/location.h
index f851bbfb533..0a2035964ba 100644
--- a/engines/mm/mm1/views_enh/locations/location.h
+++ b/engines/mm/mm1/views_enh/locations/location.h
@@ -71,6 +71,13 @@ public:
 	 */
 	bool msgGame(const GameMessage &msg) override;
 
+	/**
+	 * Called when a message is finished being shown
+	 */
+	virtual void messageShown() {
+		leave();
+	}
+
 	/**
 	 * Leave the location, turning around
 	 */
diff --git a/engines/mm/mm1/views_enh/locations/training.cpp b/engines/mm/mm1/views_enh/locations/training.cpp
index 298ebf313e4..986b1c9ef99 100644
--- a/engines/mm/mm1/views_enh/locations/training.cpp
+++ b/engines/mm/mm1/views_enh/locations/training.cpp
@@ -38,33 +38,55 @@ Training::Training() : Location("Training", LOC_TRAINING) {
 
 bool Training::msgFocus(const FocusMessage &msg) {
 	Location::msgFocus(msg);
+	checkCharacter();
 	return true;
 }
 
 void Training::draw() {
 	Location::draw();
+	const Character &c = *g_globals->_currCharacter;
 
 	setReduced(false);
 	writeLine(0, STRING["enhdialogs.training.title"], ALIGN_MIDDLE);
-	writeLine(1, STRING["enhdialogs.location.options_for"], ALIGN_MIDDLE);
-	writeLine(3, camelCase(g_globals->_currCharacter->_name), ALIGN_MIDDLE);
+	writeLine(1, STRING["enhdialogs.location.options"], ALIGN_MIDDLE);
+
+	if (_currLevel >= MAX_LEVEL) {
+		writeLine(3, c._name, ALIGN_MIDDLE);
+		writeLine(5, STRING["dialogs.training.no_way"], ALIGN_MIDDLE);
+
+	} else if (_remainingExp > 0) {
+		writeLine(3, Common::String::format(
+			STRING["enhdialogs.training.needs"].c_str(),
+			c._name, _remainingExp, _currLevel + 1), ALIGN_MIDDLE);
+
+	} else {
+		writeLine(3, Common::String::format(
+			STRING["enhdialogs.training.eligible"].c_str(),
+			c._name, _currLevel + 1), ALIGN_MIDDLE);
+	}
 
 	writeLine(10, STRING["enhdialogs.location.gold"]);
-	writeLine(10, Common::String::format("%d",
-		g_globals->_currCharacter->_gold), ALIGN_RIGHT);
+	writeLine(10, Common::String::format("%d", c._gold), ALIGN_RIGHT);
 
 	setReduced(true);
 	writeString(5, 122, STRING["enhdialogs.training.train"]);
 	writeString(43, 122, STRING["enhdialogs.training.esc"]);
 }
 
+bool Training::msgGame(const GameMessage &msg) {
+	Location::msgGame(msg);
+	if (msg._name == "UPDATE")
+		checkCharacter();
+	return true;
+}
+
 bool Training::msgKeypress(const KeypressMessage &msg) {
 	// If a delay is active, end it
 	if (endDelay())
 		return true;
 
 	switch (msg.keycode) {
-	case Common::KEYCODE_a:
+	case Common::KEYCODE_t:
 		if (_canTrain)
 			train();
 		break;
@@ -73,6 +95,7 @@ bool Training::msgKeypress(const KeypressMessage &msg) {
 		redraw();
 		break;
 	default:
+		return Location::msgKeypress(msg);
 		break;
 	}
 
@@ -88,15 +111,18 @@ bool Training::msgAction(const ActionMessage &msg) {
 		return true;
 	}
 
-	return false;
+	return Location::msgAction(msg);
 }
 
 void Training::checkCharacter() {
+	assert(g_globals->_currCharacter);
 	Character &c = *g_globals->_currCharacter;
 
 	_currLevel = c._level._base;
-	if (_currLevel >= MAX_LEVEL)
+	if (_currLevel >= MAX_LEVEL) {
+		_canTrain = false;
 		return;
+	}
 
 	// Initialize fields
 	_expTotal = 0;
@@ -141,12 +167,12 @@ void Training::train() {
 	Character &c = *g_globals->_currCharacter;
 
 	if (c._condition) {
+		// Having a condition prevents characters from training
 		Sound::sound(SOUND_3);
-		clearSurface();
-		writeString(8, 5, STRING["dialogs.training.condition"]);
-		delaySeconds(3);
+		displayMessage(STRING["dialogs.training.condition"]);
 
 	} else if (!_canAfford) {
+		// Can't afford training
 		notEnoughGold();
 
 	} else {
@@ -155,21 +181,32 @@ void Training::train() {
 		Character::LevelIncrease lvl = c.increaseLevel();
 		Sound::sound(SOUND_2);
 
-		clearSurface();
-		writeString(0, 3, STRING["dialogs.training.congrats"]);
-		writeNumber(c._level._base);
+		Common::String msg = Common::String::format("%s%d",
+			STRING["dialogs.training.congrats"].c_str(),
+			c._level._base);
 
-		writeString(7, 5, Common::String::format(
-			STRING["dialogs.training.hp"].c_str(), lvl._numHP));
+		msg = Common::String::format(STRING["dialogs.training.hp"].c_str(),
+			lvl._numHP);
 
-		if (lvl._numSpells != 0)
-			writeString(7, 6, STRING["dialogs.training.new_spells"]);
+		if (lvl._numSpells != 0) {
+			msg += ". ";
+			msg += STRING["dialogs.training.new_spells"];
+		}
 
-		Sound::sound(SOUND_2);
-		delaySeconds(10);
+		displayMessage(msg);
 	}
 }
 
+void Training::timeout() {
+	checkCharacter();
+	Location::timeout();
+}
+
+void Training::messageShown() {
+	checkCharacter();
+	redraw();
+}
+
 } // namespace Location
 } // namespace ViewsEnh
 } // namespace MM1
diff --git a/engines/mm/mm1/views_enh/locations/training.h b/engines/mm/mm1/views_enh/locations/training.h
index 088c104c5c1..40f59361032 100644
--- a/engines/mm/mm1/views_enh/locations/training.h
+++ b/engines/mm/mm1/views_enh/locations/training.h
@@ -58,8 +58,11 @@ public:
 
 	bool msgFocus(const FocusMessage &msg) override;
 	void draw() override;
+	bool msgGame(const GameMessage &msg);
 	bool msgKeypress(const KeypressMessage &msg) override;
 	bool msgAction(const ActionMessage &msg) override;
+	void timeout() override;
+	void messageShown() override;
 };
 
 } // namespace Locations




More information about the Scummvm-git-logs mailing list