From 92bbb78ed168ca421310a29de7f1aac4f6a7af84 Mon Sep 17 00:00:00 2001 From: "wrenczes@gmail.com" Date: Sat, 4 Dec 2010 04:25:43 +0000 Subject: [PATCH] Fix for [PSP|PC]ability menus and card view switch causes a crash. This broke as a side effect to the addition of the 'details' option that Mike added - the ActionStack had very rigid interpretations of what a valid control ID would be (either -1, or a valid id in its container). As kInfoMenuID is assigned a value of -200, this would crash when attempting to look up that index value in the vector. I've patched the problem so that ActionLayer checks for a valid ID before doing anything, and does a no-op for IDs it doesn't know how to handle. However, this only fixes the problem during gameplay. It's quite possible that hitting the triangle button in other places in the app might equally cause a crash. Issue: 544 --- JGE/src/JGui.cpp | 5 +++-- projects/mtg/include/SimpleMenu.h | 1 + projects/mtg/src/ActionLayer.cpp | 13 +++++++++---- projects/mtg/src/SimpleMenu.cpp | 4 ++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/JGE/src/JGui.cpp b/JGE/src/JGui.cpp index a27fa91fe..e105462a7 100644 --- a/JGE/src/JGui.cpp +++ b/JGE/src/JGui.cpp @@ -90,9 +90,9 @@ void JGuiController::Render() for (int i = 0; i < mCount; i++) if (mObjects[i] != NULL) mObjects[i]->Render(); } + bool JGuiController::CheckUserInput(JButton key) { - if (!mCount) return false; if (key == mActionButton) { @@ -112,8 +112,8 @@ bool JGuiController::CheckUserInput(JButton key) else if (JGE_BTN_CANCEL == key) { if (mListener != NULL) mListener->ButtonPressed(mId, kInfoMenuID); + return true; } - else if ((JGE_BTN_LEFT == key) || (JGE_BTN_UP == key)) // || mEngine->GetAnalogY() < 64 || mEngine->GetAnalogX() < 64) { int n = mCurr; @@ -185,6 +185,7 @@ bool JGuiController::CheckUserInput(JButton key) } return false; } + void JGuiController::Update(float dt) { for (int i = 0; i < mCount; i++) diff --git a/projects/mtg/include/SimpleMenu.h b/projects/mtg/include/SimpleMenu.h index 85a67f314..d2211e42c 100644 --- a/projects/mtg/include/SimpleMenu.h +++ b/projects/mtg/include/SimpleMenu.h @@ -32,6 +32,7 @@ class SimpleMenu:public JGuiController{ public: bool autoTranslate; SimpleMenu(int id, JGuiListener* listener, int fontId, float x, float y, const char * _title = "", int _maxItems = 7); + virtual ~SimpleMenu(); void Render(); void Update(float dt); void Add(int id, const char * Text,string desc = "", bool forceFocus = false); diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index bf14fefb5..f9f04cc6d 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -307,17 +307,22 @@ void ActionLayer::doReactTo(int menuIndex) void ActionLayer::ButtonPressed(int controllerid, int controlid) { - if (controlid != -1) + if (controlid >= 0 && controlid < mObjects.size()) { ActionElement * currentAction = (ActionElement *) mObjects[controlid]; currentAction->reactToTargetClick(menuObject); + menuObject = 0; + } + else if (controlid == kCancelMenuID) + { + GameObserver::GetInstance()->mLayers->stackLayer()->endOfInterruption(); + menuObject = 0; } else { - GameObserver::GetInstance()->mLayers->stackLayer()->endOfInterruption(); + // fallthrough case. We have an id we don't recognize - do nothing, don't clear the menu! + //assert(false); } - menuObject = 0; - } ActionLayer::ActionLayer() diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 9cd996c42..61a2db50f 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -57,6 +57,10 @@ SimpleMenu::SimpleMenu(int id, JGuiListener* listener, int fontId, float x, floa stars->FireAt(mX, mY); } +SimpleMenu::~SimpleMenu() +{ +} + void SimpleMenu::drawHorzPole(float x, float y, float width) { JRenderer* renderer = JRenderer::GetInstance();