[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