[Scummvm-git-logs] scummvm master -> 18ad7d19620d8465ea130050c7bb6d9d1d3cd225

dreammaster noreply at scummvm.org
Mon Mar 6 06:19:12 UTC 2023


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

Summary:
9f4e22d0f5 MM: MM1: Adding buttons to manage character view
18ad7d1962 MM: MM1: Implement character renaming


Commit: 9f4e22d0f557bff3e7fe9cbf870bd7f71844e3de
    https://github.com/scummvm/scummvm/commit/9f4e22d0f557bff3e7fe9cbf870bd7f71844e3de
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-05T22:18:59-08:00

Commit Message:
MM: MM1: Adding buttons to manage character view

Changed paths:
    devtools/create_mm/files/mm1/strings_en.yml
    engines/mm/mm1/data/character.h
    engines/mm/mm1/views_enh/character_manage.cpp
    engines/mm/mm1/views_enh/character_manage.h


diff --git a/devtools/create_mm/files/mm1/strings_en.yml b/devtools/create_mm/files/mm1/strings_en.yml
index 58edeee9bdb..4e18c7b6fa3 100644
--- a/devtools/create_mm/files/mm1/strings_en.yml
+++ b/devtools/create_mm/files/mm1/strings_en.yml
@@ -478,6 +478,10 @@ enhdialogs:
 		item: "\x01""37Item"
 		quick: "\x01""37Quick"
 		exchange: "\x01""37Exch"
+		portrait: "Portrait"
+		rename: "Rename"
+		delete: "Delete"
+		are_you_sure: "Are you sure? (Y/N)"
 		conditions:
 			good: "Good"
 	character_select:
@@ -507,6 +511,7 @@ enhdialogs:
 		no_gold: "No gold, no food!"
 	misc:
 		exit: "Exit"
+		go_back: "Go back"
 	quickref:
 		title: "Quick Reference Chart"
 		headers:
diff --git a/engines/mm/mm1/data/character.h b/engines/mm/mm1/data/character.h
index 95a8a63841c..61d4ce2b8e1 100644
--- a/engines/mm/mm1/data/character.h
+++ b/engines/mm/mm1/data/character.h
@@ -32,6 +32,7 @@ namespace MM1 {
 
 #define INVENTORY_COUNT 6
 #define MAX_LEVEL 200
+#define NUM_PORTRAITS 12
 
 enum CharacterClass {
 	KNIGHT = 1, PALADIN = 2, ARCHER = 3, CLERIC = 4,
diff --git a/engines/mm/mm1/views_enh/character_manage.cpp b/engines/mm/mm1/views_enh/character_manage.cpp
index 686dd4cbd1f..574bf005824 100644
--- a/engines/mm/mm1/views_enh/character_manage.cpp
+++ b/engines/mm/mm1/views_enh/character_manage.cpp
@@ -27,70 +27,82 @@ namespace MM {
 namespace MM1 {
 namespace ViewsEnh {
 
+CharacterManage::CharacterManage() : CharacterBase("CharacterManage") {
+	addButton(&_escSprite, Common::Point(20, 172), 0, Common::KEYCODE_p, true);
+	addButton(&_escSprite, Common::Point(90, 172), 0, Common::KEYCODE_r, true);
+	addButton(&_escSprite, Common::Point(160, 172), 0, Common::KEYCODE_d, true);
+	addButton(&_escSprite, Common::Point(230, 172), 0, KEYBIND_ESCAPE, true);
+}
+
+bool CharacterManage::msgFocus(const FocusMessage &msg) {
+	CharacterBase::msgFocus(msg);
+	_changed = false;
+	return true;
+}
+
+bool CharacterManage::msgUnfocus(const UnfocusMessage &msg) {
+	if (_changed)
+		g_globals->_roster.save();
+	CharacterBase::msgUnfocus(msg);
+	return true;
+}
+
 void CharacterManage::draw() {
 	assert(g_globals->_currCharacter);
-	CharacterBase::draw();
-/*
+	setReduced(false);
+
 	switch (_state) {
 	case DISPLAY:
-		writeString(6, 21, STRING["dialogs.view_character.rename"]);
-		writeString(6, 22, STRING["dialogs.view_character.delete"]);
-		escToGoBack();
+		CharacterBase::draw();
+
+		setReduced(true);
+		writeString(35, 174, STRING["enhdialogs.character.portrait"]);
+		writeString(105, 174, STRING["enhdialogs.character.rename"]);
+		writeString(175, 174, STRING["enhdialogs.character.delete"]);
+		writeString(245, 174, STRING["enhdialogs.misc.go_back"]);
 		break;
 
 	case RENAME:
-		writeString(6, 21, STRING["dialogs.view_character.name"]);
-		writeString(_newName);
-		writeChar('_');
 		break;
 
 	case DELETE:
-		writeString(6, 21, STRING["dialogs.view_character.are_you_sure"]);
 		break;
 	}
-	*/
 }
 
 bool CharacterManage::msgKeypress(const KeypressMessage &msg) {
+	Character &c = *g_globals->_currCharacter;
+
 	switch (_state) {
 	case DISPLAY:
-		if ((msg.flags & Common::KBD_CTRL) && msg.keycode == Common::KEYCODE_n) {
-			_state = RENAME;
-			_newName = "";
-			redraw();
-		} else if ((msg.flags & Common::KBD_CTRL) && msg.keycode == Common::KEYCODE_d) {
-			_state = DELETE;
+		switch (msg.keycode) {
+		case Common::KEYCODE_p:
+			c._portrait = (c._portrait + 1) % NUM_PORTRAITS;
+			c.loadFaceSprites();
 			redraw();
+			break;
+		case Common::KEYCODE_r:
+			warning("TODO: Rename character");
+			break;
+		case Common::KEYCODE_d:
+			break;
 		}
 		break;
 
 	case RENAME:
-		if (msg.ascii >= 32 && msg.ascii <= 127) {
-			_newName += toupper(msg.ascii);
-			redraw();
-		}
-		if (msg.keycode == Common::KEYCODE_RETURN || _newName.size() == 15) {
-			strncpy(g_globals->_currCharacter->_name, _newName.c_str(), 16);
-			_state = DISPLAY;
-			redraw();
-		} else if (msg.keycode == Common::KEYCODE_BACKSPACE &&
-				!_newName.empty()) {
-			_newName.deleteLastChar();
-			redraw();
-		}
 		break;
 
 	case DELETE:
-		if (msg.keycode == Common::KEYCODE_y) {
-			// Removes the character and returns to View All Characters
-			g_globals->_roster.remove(g_globals->_currCharacter);
-			close();
-		} else {
-			// Any other keypress returns to display mode
-			redraw();
+		switch (msg.keycode) {
+		case Common::KEYCODE_y:
+			msgAction(ActionMessage(KEYBIND_SELECT));
+			break;
+		case Common::KEYCODE_n:
+			msgAction(ActionMessage(KEYBIND_ESCAPE));
+			break;
+		default:
+			break;
 		}
-
-		_state = DISPLAY;
 		break;
 	}
 
@@ -98,25 +110,27 @@ bool CharacterManage::msgKeypress(const KeypressMessage &msg) {
 }
 
 bool CharacterManage::msgAction(const ActionMessage &msg) {
+	Character &c = *g_globals->_currCharacter;
+
 	if (msg._action == KEYBIND_ESCAPE) {
-		if (_state != DISPLAY) {
-			redraw();
-		} else {
+		switch (_state) {
+		case DISPLAY:
 			close();
+			break;
+		default:
+			_state = DISPLAY;
+			break;
 		}
 
-		_state = DISPLAY;
 		return true;
-	} else if (msg._action >= KEYBIND_VIEW_PARTY1 &&
-			msg._action <= KEYBIND_VIEW_PARTY6 &&
-			_state == DISPLAY) {
-		g_globals->_currCharacter = &g_globals->_party[
-			msg._action - KEYBIND_VIEW_PARTY1];
-		addView();
+	} else if (msg._action == KEYBIND_SELECT && _state == RENAME) {
+		Common::strcpy_s(c._name, _newName.c_str());
+		c._name[15] = '\0';
+		_state = DISPLAY;
 		return true;
 	}
 
-	return false;
+	return CharacterBase::msgAction(msg);
 }
 
 } // namespace ViewsEnh
diff --git a/engines/mm/mm1/views_enh/character_manage.h b/engines/mm/mm1/views_enh/character_manage.h
index 714cbfac794..dd8f660004c 100644
--- a/engines/mm/mm1/views_enh/character_manage.h
+++ b/engines/mm/mm1/views_enh/character_manage.h
@@ -36,10 +36,13 @@ class CharacterManage : public CharacterBase {
 	enum ViewState { DISPLAY = 0, RENAME = 1, DELETE = 2 };
 	ViewState _state = DISPLAY;
 	Common::String _newName;
+	bool _changed = false;
 public:
-	CharacterManage() : CharacterBase("CharacterManage") {}
+	CharacterManage();
 	virtual ~CharacterManage() {}
 
+	bool msgFocus(const FocusMessage &msg) override;
+	bool msgUnfocus(const UnfocusMessage &msg) override;
 	void draw() override;
 	bool msgKeypress(const KeypressMessage &msg) override;
 	bool msgAction(const ActionMessage &msg) override;


Commit: 18ad7d19620d8465ea130050c7bb6d9d1d3cd225
    https://github.com/scummvm/scummvm/commit/18ad7d19620d8465ea130050c7bb6d9d1d3cd225
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-05T22:18:59-08:00

Commit Message:
MM: MM1: Implement character renaming

Changed paths:
  A engines/mm/mm1/views_enh/text_entry.cpp
  A engines/mm/mm1/views_enh/text_entry.h
    engines/mm/mm1/views_enh/character_manage.cpp
    engines/mm/mm1/views_enh/character_manage.h
    engines/mm/module.mk


diff --git a/engines/mm/mm1/views_enh/character_manage.cpp b/engines/mm/mm1/views_enh/character_manage.cpp
index 574bf005824..c65dac34ef6 100644
--- a/engines/mm/mm1/views_enh/character_manage.cpp
+++ b/engines/mm/mm1/views_enh/character_manage.cpp
@@ -51,10 +51,10 @@ void CharacterManage::draw() {
 	assert(g_globals->_currCharacter);
 	setReduced(false);
 
+	CharacterBase::draw();
+
 	switch (_state) {
 	case DISPLAY:
-		CharacterBase::draw();
-
 		setReduced(true);
 		writeString(35, 174, STRING["enhdialogs.character.portrait"]);
 		writeString(105, 174, STRING["enhdialogs.character.rename"]);
@@ -63,9 +63,21 @@ void CharacterManage::draw() {
 		break;
 
 	case RENAME:
+		writeString(80, 172, STRING["dialogs.view_character.name"]);
+		_textEntry.display(130, 180, 15, false,
+			[]() {
+				CharacterManage *view = static_cast<CharacterManage *>(g_events->focusedView());
+				view->setMode(DISPLAY);
+			},
+			[](const Common::String &name) {
+				CharacterManage *view = static_cast<CharacterManage *>(g_events->focusedView());
+				view->setName(name);
+			}
+		);
 		break;
 
 	case DELETE:
+		writeString(120, 174, STRING["enhdialogs.character.are_you_sure"]);
 		break;
 	}
 }
@@ -82,9 +94,10 @@ bool CharacterManage::msgKeypress(const KeypressMessage &msg) {
 			redraw();
 			break;
 		case Common::KEYCODE_r:
-			warning("TODO: Rename character");
+			setMode(RENAME);
 			break;
 		case Common::KEYCODE_d:
+			setMode(DELETE);
 			break;
 		}
 		break;
@@ -118,7 +131,7 @@ bool CharacterManage::msgAction(const ActionMessage &msg) {
 			close();
 			break;
 		default:
-			_state = DISPLAY;
+			setMode(DISPLAY);
 			break;
 		}
 
@@ -126,13 +139,30 @@ bool CharacterManage::msgAction(const ActionMessage &msg) {
 	} else if (msg._action == KEYBIND_SELECT && _state == RENAME) {
 		Common::strcpy_s(c._name, _newName.c_str());
 		c._name[15] = '\0';
-		_state = DISPLAY;
+		setMode(DISPLAY);
 		return true;
 	}
 
 	return CharacterBase::msgAction(msg);
 }
 
+void CharacterManage::setMode(ViewState state) {
+	_state = state;
+
+	for (int i = 0; i < 4; ++i)
+		setButtonEnabled(i, state == DISPLAY);
+	redraw();
+}
+
+void CharacterManage::setName(const Common::String &newName) {
+	Character &c = *g_globals->_currCharacter;
+	Common::strcpy_s(c._name, newName.c_str());
+	c._name[15] = '\0';
+	_changed = true;
+
+	setMode(DISPLAY);
+}
+
 } // namespace ViewsEnh
 } // namespace MM1
 } // namespace MM
diff --git a/engines/mm/mm1/views_enh/character_manage.h b/engines/mm/mm1/views_enh/character_manage.h
index dd8f660004c..e50f46b8cb3 100644
--- a/engines/mm/mm1/views_enh/character_manage.h
+++ b/engines/mm/mm1/views_enh/character_manage.h
@@ -24,6 +24,7 @@
 
 #include "common/array.h"
 #include "mm/mm1/views_enh/character_base.h"
+#include "mm/mm1/views_enh/text_entry.h"
 
 namespace MM {
 namespace MM1 {
@@ -34,9 +35,22 @@ namespace ViewsEnh {
  */
 class CharacterManage : public CharacterBase {
 	enum ViewState { DISPLAY = 0, RENAME = 1, DELETE = 2 };
+private:
 	ViewState _state = DISPLAY;
 	Common::String _newName;
 	bool _changed = false;
+	TextEntry _textEntry;
+
+	/**
+	 * Set the mode
+	 */
+	void setMode(ViewState state);
+
+	/**
+	 * Set a new name
+	 */
+	void setName(const Common::String &newName);
+
 public:
 	CharacterManage();
 	virtual ~CharacterManage() {}
diff --git a/engines/mm/mm1/views_enh/text_entry.cpp b/engines/mm/mm1/views_enh/text_entry.cpp
new file mode 100644
index 00000000000..10229729c02
--- /dev/null
+++ b/engines/mm/mm1/views_enh/text_entry.cpp
@@ -0,0 +1,105 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mm/mm1/views_enh/text_entry.h"
+
+namespace MM {
+namespace MM1 {
+namespace ViewsEnh {
+
+void TextEntry::display(int x, int y, int maxLen,
+		bool isNumeric, Abort abortFn, Enter enterFn) {
+	_maxLen = maxLen;
+	_abortFn = abortFn;
+	_enterFn = enterFn;
+	_isNumeric = isNumeric;
+	_text = "";
+	_bounds = Common::Rect(x, y, x + maxLen * 8, y + 9);
+
+	addView(this);
+}
+
+void TextEntry::draw() {
+	drawText();
+	writeChar('_');
+}
+
+void TextEntry::drawText() {
+	Graphics::ManagedSurface s = getSurface();
+	s.clear(0x99);
+
+	writeString(0, 0, _text);
+}
+
+bool TextEntry::msgKeypress(const KeypressMessage &msg) {
+	if (msg.keycode == Common::KEYCODE_BACKSPACE &&
+			!_text.empty()) {
+		_text.deleteLastChar();
+		redraw();
+		return true;
+
+	} else if (msg.ascii >= 32 && msg.ascii <= 127 &&
+			_text.size() < _maxLen) {
+		if (_isNumeric && (msg.ascii < '0' || msg.ascii > '9'))
+			return true;
+
+		_text += msg.ascii;
+
+		// Single character numeric fields, particular spell
+		// level/number selection, return immediately
+		if (_isNumeric && _maxLen == 1) {
+			drawText();
+			msgAction(ActionMessage(KEYBIND_SELECT));
+
+		} else {
+			redraw();
+		}
+	}
+
+	return true;
+}
+
+bool TextEntry::msgAction(const ActionMessage &msg) {
+	switch (msg._action) {
+	case KEYBIND_ESCAPE:
+		drawText();
+		close();
+		_abortFn();
+		break;
+
+	case KEYBIND_SELECT:
+		if (!_text.empty()) {
+			drawText();
+			close();
+			_enterFn(_text);
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	return true;
+}
+
+} // namespace ViewsEnh
+} // namespace MM1
+} // namespace MM
diff --git a/engines/mm/mm1/views_enh/text_entry.h b/engines/mm/mm1/views_enh/text_entry.h
new file mode 100644
index 00000000000..0c00c1a737d
--- /dev/null
+++ b/engines/mm/mm1/views_enh/text_entry.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MM1_VIEWS_ENH_TEXT_ENTRY_H
+#define MM1_VIEWS_ENH_TEXT_ENTRY_H
+
+#include "mm/mm1/views_enh/text_view.h"
+
+namespace MM {
+namespace MM1 {
+namespace ViewsEnh {
+
+/**
+ * Text or numeric entry.
+ */
+class TextEntry : public TextView {
+private:
+	/**
+	 * Draw the entered text
+	 */
+	void drawText();
+
+public:
+	typedef void (*Abort)();
+	typedef void (*Enter)(const Common::String &text);
+	Abort _abortFn;
+	Enter _enterFn;
+	bool _isNumeric = false;
+	Common::String _text;
+	size_t _maxLen = 0;
+public:
+	TextEntry() : TextView("TextEntry") {}
+	virtual ~TextEntry() {}
+
+	void draw() override;
+	bool msgKeypress(const KeypressMessage &msg) override;
+	bool msgAction(const ActionMessage &msg) override;
+
+	void display(int x, int y, int maxLen, bool isNumeric,
+		Abort abortFn, Enter enterFn);
+};
+
+} // namespace ViewsEnh
+} // namespace MM1
+} // namespace MM
+
+#endif
diff --git a/engines/mm/module.mk b/engines/mm/module.mk
index da21d36fe9e..38413e7c578 100644
--- a/engines/mm/module.mk
+++ b/engines/mm/module.mk
@@ -145,6 +145,7 @@ MODULE_OBJS += \
 	mm1/views_enh/scroll_popup.o \
 	mm1/views_enh/scroll_text.o \
 	mm1/views_enh/scroll_view.o \
+	mm1/views_enh/text_entry.o \
 	mm1/views_enh/text_view.o \
 	mm1/views_enh/interactions/interaction.o \
 	mm1/views_enh/interactions/statue.o \




More information about the Scummvm-git-logs mailing list