summaryrefslogtreecommitdiffstats
path: root/src/core/FrontEndControls.cpp
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2020-04-14 23:10:50 +0200
committerSergeanur <s.anureev@yandex.ua>2020-04-14 23:10:50 +0200
commite373d0526ef07183cba8e89aba46f2ab416e67ba (patch)
treee6b2052e078cd2ad2ae1503262421c6858a20a0f /src/core/FrontEndControls.cpp
parentCFont (diff)
parentRwMatFX support with linked RW libs (diff)
downloadre3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar.gz
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar.bz2
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar.lz
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar.xz
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.tar.zst
re3-e373d0526ef07183cba8e89aba46f2ab416e67ba.zip
Diffstat (limited to 'src/core/FrontEndControls.cpp')
-rw-r--r--src/core/FrontEndControls.cpp1881
1 files changed, 1881 insertions, 0 deletions
diff --git a/src/core/FrontEndControls.cpp b/src/core/FrontEndControls.cpp
new file mode 100644
index 00000000..866be42f
--- /dev/null
+++ b/src/core/FrontEndControls.cpp
@@ -0,0 +1,1881 @@
+#include "common.h"
+#include "main.h"
+#include "Timer.h"
+#include "Pad.h"
+#include "ControllerConfig.h"
+#include "VisibilityPlugins.h"
+#include "Sprite2d.h"
+#include "Text.h"
+#include "Font.h"
+#include "Frontend.h"
+#include "FrontEndControls.h"
+
+
+void
+CPlaceableShText::Draw(float x, float y)
+{
+ if(m_text == nil)
+ return;
+
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOn();
+ if(m_bDropShadow){
+ CFont::SetDropShadowPosition(m_shadowOffset.x);
+ CFont::SetDropColor(m_shadowColor);
+ }
+ CFont::SetColor(m_color);
+ CFont::PrintString(x+m_position.x, y+m_position.y, m_text);
+ if(m_bDropShadow)
+ CFont::SetDropShadowPosition(0);
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOff();
+}
+
+void
+CPlaceableShText::Draw(const CRGBA &color, float x, float y)
+{
+ if(m_text == nil)
+ return;
+
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOn();
+ if(m_bDropShadow){
+ CFont::SetDropShadowPosition(m_shadowOffset.x);
+ CFont::SetDropColor(m_shadowColor);
+ }
+ CFont::SetColor(color);
+ CFont::PrintString(x+m_position.x, y+m_position.y, m_text);
+ if(m_bDropShadow)
+ CFont::SetDropShadowPosition(0);
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOff();
+}
+
+void
+CPlaceableShTextTwoLines::Draw(float x, float y)
+{
+ if(m_line1.m_text == nil && m_line2.m_text == nil)
+ return;
+
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOn();
+ if(m_bDropShadow){
+ CFont::SetDropShadowPosition(m_shadowOffset.x);
+ CFont::SetDropColor(m_shadowColor);
+ }
+
+ if(m_line1.m_text){
+ CFont::SetColor(m_line1.m_color);
+ CFont::PrintString(x+m_line1.m_position.x, y+m_line1.m_position.y, m_line1.m_text);
+ }
+ if(m_line2.m_text){
+ CFont::SetColor(m_line2.m_color);
+ CFont::PrintString(x+m_line2.m_position.x, y+m_line2.m_position.y, m_line2.m_text);
+ }
+
+ if(m_bDropShadow)
+ CFont::SetDropShadowPosition(0);
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOff();
+}
+
+void
+CPlaceableShTextTwoLines::Draw(const CRGBA &color, float x, float y)
+{
+ if(m_line1.m_text == nil && m_line2.m_text == nil)
+ return;
+
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOn();
+ if(m_bDropShadow){
+ CFont::SetDropShadowPosition(m_shadowOffset.x);
+ CFont::SetDropColor(m_shadowColor);
+ }
+
+ if(m_line1.m_text){
+ CFont::SetColor(color);
+ CFont::PrintString(x+m_line1.m_position.x, y+m_line1.m_position.y, m_line1.m_text);
+ }
+ if(m_line2.m_text){
+ CFont::SetColor(color);
+ CFont::PrintString(x+m_line2.m_position.x, y+m_line2.m_position.y, m_line2.m_text);
+ }
+
+ if(m_bDropShadow)
+ CFont::SetDropShadowPosition(0);
+ if(m_bRightJustify)
+ CFont::SetRightJustifyOff();
+}
+
+void
+CPlaceableShOption::Draw(const CRGBA &highlightColor, float x, float y, bool bHighlight)
+{
+ if(bHighlight)
+ CPlaceableShText::Draw(highlightColor, x, y);
+ else if(m_bSelected)
+ CPlaceableShText::Draw(m_selectedColor, x, y);
+ else
+ CPlaceableShText::Draw(x, y);
+}
+
+void
+CPlaceableShOptionTwoLines::Draw(const CRGBA &highlightColor, float x, float y, bool bHighlight)
+{
+ if(bHighlight)
+ CPlaceableShTextTwoLines::Draw(highlightColor, x, y);
+ else if(m_bSelected)
+ CPlaceableShTextTwoLines::Draw(m_selectedColor, x, y);
+ else
+ CPlaceableShTextTwoLines::Draw(x, y);
+}
+
+void
+CPlaceableSprite::Draw(float x, float y)
+{
+ Draw(m_color, x, y);
+}
+
+void
+CPlaceableSprite::Draw(const CRGBA &color, float x, float y)
+{
+ if(m_pSprite)
+ m_pSprite->Draw(CRect(m_position.x+x, m_position.y+y,
+ m_position.x+x + m_size.x, m_position.y+y + m_size.y),
+ color);
+}
+
+void
+CPlaceableShSprite::Draw(float x, float y)
+{
+ if(m_bDropShadow)
+ m_shadow.Draw(m_shadow.m_color, m_sprite.m_position.x+x, m_sprite.m_position.y+y);
+ m_sprite.Draw(x, y);
+}
+
+
+/*
+ * CMenuPictureAndText
+ */
+
+void
+CMenuPictureAndText::SetNewOldShadowWrapX(bool bWrapX, float newWrapX, float oldWrapX)
+{
+ m_bWrap = bWrapX;
+ m_wrapX = newWrapX;
+ m_oldWrapx = oldWrapX;
+}
+
+void
+CMenuPictureAndText::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale)
+{
+ m_bSetTextScale = bTextScale;
+ m_textScale = newScale;
+ m_oldTextScale = oldScale;
+}
+
+void
+CMenuPictureAndText::SetTextsColor(CRGBA const &color)
+{
+ int i;
+ for(i = 0; i < m_numTexts; i++)
+ m_texts[i].m_color = color;
+}
+
+void
+CMenuPictureAndText::AddText(wchar *text, float positionX, float positionY, CRGBA const &color, bool bRightJustify)
+{
+ int i;
+ if(m_numTexts >= 20)
+ return;
+ i = m_numTexts++;
+ m_texts[i].m_text = text;
+ m_texts[i].m_position.x = positionX;
+ m_texts[i].m_position.y = positionY;
+ m_texts[i].m_color = color;
+ m_texts[i].m_bRightJustify = bRightJustify;
+}
+
+void
+CMenuPictureAndText::AddPicture(CSprite2d *sprite, CSprite2d *shadow, float positionX, float positionY, float width, float height, CRGBA const &color)
+{
+ int i;
+ if(m_numSprites >= 5)
+ return;
+ i = m_numSprites++;
+ m_sprites[i].m_sprite.m_pSprite = sprite;
+ m_sprites[i].m_shadow.m_pSprite = shadow;
+ m_sprites[i].m_sprite.m_position.x = positionX;
+ m_sprites[i].m_sprite.m_position.y = positionY;
+ m_sprites[i].m_sprite.m_size.x = width;
+ m_sprites[i].m_sprite.m_size.y = height;
+ m_sprites[i].m_shadow.m_size.x = width;
+ m_sprites[i].m_shadow.m_size.y = height;
+ m_sprites[i].m_sprite.m_color = color;
+}
+
+void
+CMenuPictureAndText::AddPicture(CSprite2d *sprite, float positionX, float positionY, float width, float height, CRGBA const &color)
+{
+ int i;
+ if(m_numSprites >= 5)
+ return;
+ i = m_numSprites++;
+ m_sprites[i].m_sprite.m_pSprite = sprite;
+ m_sprites[i].m_shadow.m_pSprite = nil;
+ m_sprites[i].m_sprite.m_position.x = positionX;
+ m_sprites[i].m_sprite.m_position.y = positionY;
+ m_sprites[i].m_sprite.m_size.x = width;
+ m_sprites[i].m_sprite.m_size.y = height;
+ m_sprites[i].m_shadow.m_size.x = width;
+ m_sprites[i].m_shadow.m_size.y = height;
+ m_sprites[i].m_sprite.m_color = color;
+}
+
+void
+CMenuPictureAndText::Draw(CRGBA const &,CRGBA const &, float x, float y)
+{
+ int i;
+
+ for(i = 0; i < m_numSprites; i++)
+ m_sprites[i].Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ for(i = 0; i < m_numTexts; i++)
+ if(m_bWrap)
+ m_texts[i].DrawShWrap(m_position.x+x, m_position.y+y, m_wrapX, m_oldWrapx);
+ else
+ m_texts[i].Draw(m_position.x+x, m_position.y+y);
+ if(m_bSetTextScale)
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+}
+
+void
+CMenuPictureAndText::SetAlpha(uint8 alpha)
+{
+ int i;
+
+ for(i = 0; i < m_numSprites; i++)
+ m_sprites[i].SetAlpha(alpha);
+ for(i = 0; i < m_numTexts; i++)
+ m_texts[i].SetAlpha(alpha);
+}
+
+void
+CMenuPictureAndText::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
+{
+ int i;
+
+ for(i = 0; i < 5; i++)
+ m_sprites[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+ for(i = 0; i < 20; i++)
+ m_texts[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+/*
+ * CMenuMultiChoice
+ */
+
+void
+CMenuMultiChoice::AddTitle(wchar *text, float positionX, float positionY, bool bRightJustify)
+{
+ m_title.m_text = text;
+ m_title.SetPosition(positionX, positionY, bRightJustify);
+}
+
+CPlaceableShOption*
+CMenuMultiChoice::AddOption(wchar *text, float positionX, float positionY, bool bSelected, bool bRightJustify)
+{
+ if(m_numOptions == NUM_MULTICHOICE_OPTIONS)
+ return nil;
+ m_options[m_numOptions].m_text = text;
+ m_options[m_numOptions].SetPosition(positionX, positionY);
+ m_options[m_numOptions].m_bSelected = bSelected;
+ m_options[m_numOptions].m_bRightJustify = bRightJustify;
+ return &m_options[m_numOptions++];
+}
+
+void
+CMenuMultiChoice::SetColors(const CRGBA &title, const CRGBA &normal, const CRGBA &selected)
+{
+ int i;
+ m_title.SetColor(title);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetColors(normal, selected);
+}
+
+void
+CMenuMultiChoice::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
+{
+ m_bSetTextScale = bTextScale;
+ m_textScale = newScale;
+ m_oldTextScale = oldScale;
+ m_bSetTitleTextScale = bTitleTextScale;
+}
+
+void
+CMenuMultiChoice::Draw(CRGBA const &optionHighlight ,CRGBA const &titleHighlight, float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_cursor == -1)
+ m_title.Draw(m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ if(m_cursor == -1)
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+ else
+ for(i = 0; i < m_numOptions; i++){
+ if(i == m_cursor)
+ m_options[i].Draw(optionHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+ }
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoice::DrawNormal(float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ m_title.Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoice::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_cursor == -1)
+ m_title.Draw(m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoice::SetAlpha(uint8 alpha)
+{
+ int i;
+ m_title.SetAlpha(alpha);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetAlpha(alpha);
+}
+
+void
+CMenuMultiChoice::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
+{
+ int i;
+ m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+
+bool
+CMenuMultiChoice::GoNext(void)
+{
+ if(m_cursor == m_numOptions-1){
+ m_cursor = -1;
+ return false;
+ }else{
+ m_cursor++;
+ return true;
+ }
+}
+
+bool
+CMenuMultiChoice::GoPrev(void)
+{
+ if(m_cursor == 0){
+ m_cursor = -1;
+ return false;
+ }else{
+ m_cursor--;
+ return true;
+ }
+}
+
+void
+CMenuMultiChoice::SelectCurrentOptionUnderCursor(void)
+{
+ int i;
+ if(m_cursor == -1)
+ return;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].m_bSelected = false;
+ m_options[m_cursor].m_bSelected = true;
+}
+
+int
+CMenuMultiChoice::GetMenuSelection(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ if(m_options[i].m_bSelected)
+ return i;
+ return -1;
+}
+
+void
+CMenuMultiChoice::SetMenuSelection(int selection)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].m_bSelected = false;
+ m_options[selection%NUM_MULTICHOICE_OPTIONS].m_bSelected = true;
+}
+
+/*
+ * CMenuMultiChoiceTriggered
+ */
+
+void
+CMenuMultiChoiceTriggered::Initialise(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_triggers[i] = nil;
+ m_defaultCancel = nil;
+}
+
+CPlaceableShOption*
+CMenuMultiChoiceTriggered::AddOption(wchar *text, float positionX, float positionY, Trigger trigger, bool bSelected, bool bRightJustify)
+{
+ CPlaceableShOption *option;
+ option = CMenuMultiChoice::AddOption(text, positionX, positionY, bSelected, bRightJustify);
+ if(option)
+ m_triggers[m_numOptions-1] = trigger;
+ return option;
+}
+
+void
+CMenuMultiChoiceTriggered::SelectCurrentOptionUnderCursor(void)
+{
+ CMenuMultiChoice::SelectCurrentOptionUnderCursor();
+ if(m_cursor != -1)
+ m_triggers[m_cursor](this);
+}
+
+void
+CMenuMultiChoiceTriggered::SelectDefaultCancelAction(void)
+{
+ if(m_defaultCancel)
+ m_defaultCancel(this);
+}
+
+/*
+ * CMenuMultiChoiceTriggeredAlways
+ */
+
+void
+CMenuMultiChoiceTriggeredAlways::Draw(CRGBA const &optionHighlight, CRGBA const &titleHighlight, float x, float y)
+{
+ if(m_alwaysTrigger)
+ m_alwaysTrigger(this);
+ CMenuMultiChoiceTriggered::Draw(optionHighlight, titleHighlight, x, y);
+}
+
+void
+CMenuMultiChoiceTriggeredAlways::DrawNormal(float x, float y)
+{
+ if(m_alwaysNormalTrigger)
+ m_alwaysNormalTrigger(this);
+ CMenuMultiChoiceTriggered::DrawNormal(x, y);
+}
+
+void
+CMenuMultiChoiceTriggeredAlways::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
+{
+ if(m_alwaysHighlightTrigger)
+ m_alwaysHighlightTrigger(this);
+ CMenuMultiChoiceTriggered::DrawHighlighted(titleHighlight, x, y);
+}
+
+/*
+ * CMenuMultiChoicePictured
+ */
+
+void
+CMenuMultiChoicePictured::Initialise(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_bHasSprite[i] = false;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_sprites[i].m_pSprite = nil;
+}
+
+CPlaceableShOption*
+CMenuMultiChoicePictured::AddOption(CSprite2d *sprite, float positionX, float positionY, const CVector2D &size, bool bSelected)
+{
+ CPlaceableShOption *option;
+ option = CMenuMultiChoice::AddOption(nil, 0.0f, 0.0f, bSelected, false);
+ if(option){
+ m_sprites[m_numOptions-1].m_pSprite = sprite;
+ m_sprites[m_numOptions-1].SetPosition(positionX, positionY);
+ m_sprites[m_numOptions-1].m_size = size;
+ m_bHasSprite[m_numOptions-1] = true;
+ }
+ return option;
+}
+
+void
+CMenuMultiChoicePictured::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
+{
+ int i;
+
+ // The title and all the text
+ CMenuMultiChoice::Draw(optionHighlight, titleHighlight, x, y);
+
+ CRGBA selectedColor = m_options[0].GetSelectedColor();
+ CRGBA color = m_options[0].GetColor();
+
+ // The sprites
+ if(m_cursor == -1){
+ for(i = 0; i < m_numOptions; i++)
+ if(m_bHasSprite[i]){
+ if(m_options[i].m_bSelected)
+ m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
+ else
+ m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
+ }
+ }else{
+ for(i = 0; i < m_numOptions; i++)
+ if(i == m_cursor){
+ if(m_bHasSprite[i])
+ m_sprites[i].Draw(CRGBA(255, 255, 255, 255), m_position.x+x, m_position.y+y);
+ }else{
+ if(m_bHasSprite[i]){
+ if(m_options[i].m_bSelected)
+ m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
+ else
+ m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
+ }
+ }
+ }
+}
+
+void
+CMenuMultiChoicePictured::DrawNormal(float x, float y)
+{
+ int i;
+
+ // The title and all the text
+ CMenuMultiChoice::DrawNormal(x, y);
+
+ CRGBA selectedColor = m_options[0].GetSelectedColor();
+ CRGBA color = m_options[0].GetColor();
+
+ // The sprites
+ for(i = 0; i < m_numOptions; i++)
+ if(m_bHasSprite[i]){
+ if(m_options[i].m_bSelected)
+ m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
+ else
+ m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
+ }
+}
+
+void
+CMenuMultiChoicePictured::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
+{
+ int i;
+
+ // The title and all the text
+ CMenuMultiChoice::DrawHighlighted(titleHighlight, x, y);
+
+ CRGBA selectedColor = m_options[0].GetSelectedColor();
+ CRGBA color = m_options[0].GetColor();
+
+ // The sprites
+ for(i = 0; i < m_numOptions; i++)
+ if(m_bHasSprite[i]){
+ if(m_options[i].m_bSelected)
+ m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
+ else
+ m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
+ }
+}
+
+void
+CMenuMultiChoicePictured::SetAlpha(uint8 alpha)
+{
+ int i;
+ CMenuMultiChoice::SetAlpha(alpha);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_sprites[i].SetAlpha(alpha);
+
+}
+
+
+/*
+ * CMenuMultiChoicePicturedTriggered
+ */
+
+void
+CMenuMultiChoicePicturedTriggered::Initialise(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_triggers[i] = nil;
+ m_defaultCancel = nil; // missing on PS2
+}
+
+CPlaceableShOption*
+CMenuMultiChoicePicturedTriggered::AddOption(CSprite2d *sprite, float positionX, float positionY, const CVector2D &size, Trigger trigger, bool bSelected)
+{
+ CPlaceableShOption *option;
+ option = CMenuMultiChoicePictured::AddOption(sprite, positionX, positionY, size, bSelected);
+ if(option)
+ m_triggers[m_numOptions-1] = trigger;
+ return option;
+}
+
+void
+CMenuMultiChoicePicturedTriggered::SelectCurrentOptionUnderCursor(void)
+{
+ CMenuMultiChoice::SelectCurrentOptionUnderCursor();
+ if(m_cursor != -1)
+ m_triggers[m_cursor](this);
+}
+
+void
+CMenuMultiChoicePicturedTriggered::SelectDefaultCancelAction(void)
+{
+ if(m_defaultCancel)
+ m_defaultCancel(this);
+}
+
+/*
+ * CMenuMultiChoicePicturedTriggeredAnyMove
+ */
+
+void
+CMenuMultiChoicePicturedTriggeredAnyMove::Initialise(void)
+{
+ int i;
+ CMenuMultiChoicePicturedTriggered::Initialise();
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++){
+ m_moveTab[i].right = -1;
+ m_moveTab[i].left = -1;
+ m_moveTab[i].down = -1;
+ m_moveTab[i].up = -1;
+ }
+}
+
+CPlaceableShOption*
+CMenuMultiChoicePicturedTriggeredAnyMove::AddOption(CSprite2d *sprite, FEC_MOVETAB *moveTab, float positionX, float positionY, const CVector2D &size, Trigger trigger, bool bSelected)
+{
+ CPlaceableShOption *option;
+ option = CMenuMultiChoicePicturedTriggered::AddOption(sprite, positionX, positionY, size, trigger, bSelected);
+ if(option && moveTab)
+ m_moveTab[m_numOptions-1] = *moveTab;
+ return option;
+}
+
+bool
+CMenuMultiChoicePicturedTriggeredAnyMove::GoDown(void)
+{
+ int move = m_moveTab[m_cursor].down;
+ if(move == -1)
+ return GoNext();
+ m_cursor = move;
+ return true;
+}
+
+bool
+CMenuMultiChoicePicturedTriggeredAnyMove::GoUp(void)
+{
+ int move = m_moveTab[m_cursor].up;
+ if(move == -1)
+ return GoPrev();
+ m_cursor = move;
+ return true;
+}
+
+bool
+CMenuMultiChoicePicturedTriggeredAnyMove::GoLeft(void)
+{
+ int move = m_moveTab[m_cursor].left;
+ if(move == -1)
+ return GoPrev();
+ m_cursor = move;
+ return true;
+}
+
+bool
+CMenuMultiChoicePicturedTriggeredAnyMove::GoRight(void)
+{
+ int move = m_moveTab[m_cursor].right;
+ if(move == -1)
+ return GoNext();
+ m_cursor = move;
+ return true;
+}
+
+
+/*
+ * CMenuMultiChoiceTwoLines
+ */
+
+void
+CMenuMultiChoiceTwoLines::AddTitle(wchar *text, float positionX, float positionY, bool bRightJustify)
+{
+ m_title.m_text = text;
+ m_title.SetPosition(positionX, positionY, bRightJustify);
+}
+
+CPlaceableShOptionTwoLines*
+CMenuMultiChoiceTwoLines::AddOption(wchar *text, float positionX, float positionY, bool bSelected, bool bRightJustify)
+{
+ return AddOption(text, positionX, positionY, nil, 0.0f, 0.0f, bSelected, bRightJustify);
+}
+
+CPlaceableShOptionTwoLines*
+CMenuMultiChoiceTwoLines::AddOption(wchar *text1, float positionX1, float positionY1, wchar *text2, float positionX2, float positionY2, bool bSelected, bool bRightJustify)
+{
+ if(m_numOptions == NUM_MULTICHOICE_OPTIONS)
+ return nil;
+ m_options[m_numOptions].m_line1.m_text = text1;
+ m_options[m_numOptions].m_line2.m_text = text2;
+ m_options[m_numOptions].m_line1.SetPosition(positionX1, positionY1);
+ m_options[m_numOptions].m_line2.SetPosition(positionX2, positionY2);
+ m_options[m_numOptions].m_bSelected = bSelected;
+ m_options[m_numOptions].m_bRightJustify = bRightJustify;
+ return &m_options[m_numOptions++];
+}
+
+
+void
+CMenuMultiChoiceTwoLines::SetColors(const CRGBA &title, const CRGBA &normal, const CRGBA &selected)
+{
+ int i;
+ m_title.SetColor(title);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetColors(normal, selected);
+}
+
+void
+CMenuMultiChoiceTwoLines::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
+{
+ m_bSetTextScale = bTextScale;
+ m_textScale = newScale;
+ m_oldTextScale = oldScale;
+ m_bSetTitleTextScale = bTitleTextScale;
+}
+
+void
+CMenuMultiChoiceTwoLines::Draw(CRGBA const &optionHighlight ,CRGBA const &titleHighlight, float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_cursor == -1)
+ m_title.Draw(m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ if(m_cursor == -1)
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+ else
+ for(i = 0; i < m_numOptions; i++){
+ if(i == m_cursor)
+ m_options[i].Draw(optionHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+ }
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoiceTwoLines::DrawNormal(float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ m_title.Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoiceTwoLines::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
+{
+ int i;
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_cursor == -1)
+ m_title.Draw(m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ for(i = 0; i < m_numOptions; i++)
+ m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale){
+ CFont::DrawFonts();
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+ }
+}
+
+void
+CMenuMultiChoiceTwoLines::SetAlpha(uint8 alpha)
+{
+ int i;
+ m_title.SetAlpha(alpha);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetAlpha(alpha);
+}
+
+void
+CMenuMultiChoiceTwoLines::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
+{
+ int i;
+ m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+
+bool
+CMenuMultiChoiceTwoLines::GoNext(void)
+{
+ if(m_cursor == m_numOptions-1){
+ m_cursor = -1;
+ return false;
+ }else{
+ m_cursor++;
+ return true;
+ }
+}
+
+bool
+CMenuMultiChoiceTwoLines::GoPrev(void)
+{
+ if(m_cursor == 0){
+ m_cursor = -1;
+ return false;
+ }else{
+ m_cursor--;
+ return true;
+ }
+}
+
+void
+CMenuMultiChoiceTwoLines::SelectCurrentOptionUnderCursor(void)
+{
+ int i;
+ if(m_cursor == -1)
+ return;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].m_bSelected = false;
+ m_options[m_cursor].m_bSelected = true;
+}
+
+int
+CMenuMultiChoiceTwoLines::GetMenuSelection(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ if(m_options[i].m_bSelected)
+ return i;
+ return -1;
+}
+
+void
+CMenuMultiChoiceTwoLines::SetMenuSelection(int selection)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_options[i].m_bSelected = false;
+ m_options[selection%NUM_MULTICHOICE_OPTIONS].m_bSelected = true;
+}
+
+/*
+ * CMenuMultiChoiceTwoLinesTriggered
+ */
+
+void
+CMenuMultiChoiceTwoLinesTriggered::Initialise(void)
+{
+ int i;
+ for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
+ m_triggers[i] = nil;
+ m_defaultCancel = nil;
+}
+
+CPlaceableShOptionTwoLines*
+CMenuMultiChoiceTwoLinesTriggered::AddOption(wchar *text, float positionX, float positionY, Trigger trigger, bool bSelected, bool bRightJustify)
+{
+ CPlaceableShOptionTwoLines *option;
+ option = CMenuMultiChoiceTwoLines::AddOption(text, positionX, positionY, bSelected, bRightJustify);
+ if(option)
+ m_triggers[m_numOptions-1] = trigger;
+ return option;
+}
+
+CPlaceableShOptionTwoLines*
+CMenuMultiChoiceTwoLinesTriggered::AddOption(wchar *text1, float positionX1, float positionY1, wchar *text2, float positionX2, float positionY2, Trigger trigger, bool bSelected, bool bRightJustify)
+{
+ CPlaceableShOptionTwoLines *option;
+ option = CMenuMultiChoiceTwoLines::AddOption(text1, positionX1, positionY1, text2, positionX2, positionY2, bSelected, bRightJustify);
+ if(option)
+ m_triggers[m_numOptions-1] = trigger;
+ return option;
+}
+
+void
+CMenuMultiChoiceTwoLinesTriggered::SelectCurrentOptionUnderCursor(void)
+{
+ CMenuMultiChoiceTwoLines::SelectCurrentOptionUnderCursor();
+ if(m_cursor != -1)
+ m_triggers[m_cursor](this);
+}
+
+void
+CMenuMultiChoiceTwoLinesTriggered::SelectDefaultCancelAction(void)
+{
+ if(m_defaultCancel)
+ m_defaultCancel(this);
+}
+
+
+/*
+ * CMenuOnOff
+ */
+
+void
+CMenuOnOff::SetColors(const CRGBA &title, const CRGBA &options)
+{
+ m_title.SetColors(title, title);
+ m_options[0].SetColor(options);
+ m_options[1].SetColor(options);
+}
+
+void
+CMenuOnOff::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
+{
+ m_bSetTextScale = bTextScale;
+ m_textScale = newScale;
+ m_oldTextScale = oldScale;
+ m_bSetTitleTextScale = bTitleTextScale;
+}
+
+void
+CMenuOnOff::SetOptionPosition(float x, float y, bool bRightJustify)
+{
+ m_options[0].SetPosition(x, y, bRightJustify);
+ m_options[1].SetPosition(x, y, bRightJustify);
+}
+
+void
+CMenuOnOff::AddTitle(wchar *text, bool bSelected, float positionX, float positionY, bool bRightJustify)
+{
+ m_title.m_text = text;
+ m_title.m_bSelected = bSelected;
+ m_title.SetPosition(positionX, positionY, bRightJustify);
+}
+
+void
+CMenuOnOff::Draw(CRGBA const &optionHighlight, CRGBA const &titleHighlight, float x, float y)
+{
+ if(m_type == 1){
+ m_options[0].m_text = TheText.Get("FEM_NO");
+ m_options[1].m_text = TheText.Get("FEM_YES");
+ }else if(m_type == 0){
+ m_options[0].m_text = TheText.Get("FEM_OFF");
+ m_options[1].m_text = TheText.Get("FEM_ON");
+ }
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_bActive)
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ if(m_bActive){
+ if(m_title.m_bSelected)
+ m_options[1].Draw(optionHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_options[0].Draw(optionHighlight, m_position.x+x, m_position.y+y);
+ }else{
+ if(m_title.m_bSelected)
+ m_options[1].Draw(m_position.x+x, m_position.y+y);
+ else
+ m_options[0].Draw(m_position.x+x, m_position.y+y);
+ }
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+}
+
+void
+CMenuOnOff::DrawNormal(float x, float y)
+{
+ if(m_type == 1){
+ m_options[0].m_text = TheText.Get("FEM_NO");
+ m_options[1].m_text = TheText.Get("FEM_YES");
+ }else if(m_type == 0){
+ m_options[0].m_text = TheText.Get("FEM_OFF");
+ m_options[1].m_text = TheText.Get("FEM_ON");
+ }
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ if(m_title.m_bSelected)
+ m_options[1].Draw(m_position.x+x, m_position.y+y);
+ else
+ m_options[0].Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+}
+
+void
+CMenuOnOff::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
+{
+ if(m_type == 1){
+ m_options[0].m_text = TheText.Get("FEM_NO");
+ m_options[1].m_text = TheText.Get("FEM_YES");
+ }else if(m_type == 0){
+ m_options[0].m_text = TheText.Get("FEM_OFF");
+ m_options[1].m_text = TheText.Get("FEM_ON");
+ }
+
+ if(m_bSetTextScale && m_bSetTitleTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+ if(m_bActive)
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_textScale.x, m_textScale.y);
+
+ if(m_title.m_bSelected)
+ m_options[1].Draw(m_position.x+x, m_position.y+y);
+ else
+ m_options[0].Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bSetTextScale)
+ CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
+}
+
+void
+CMenuOnOff::SetAlpha(uint8 alpha)
+{
+ m_title.SetAlpha(alpha);
+ m_options[0].SetAlpha(alpha);
+ m_options[1].SetAlpha(alpha);
+}
+
+void
+CMenuOnOff::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
+{
+ m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
+ m_options[0].SetShadows(bDropShadows, shadowColor, shadowOffset);
+ m_options[1].SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+/*
+ * CMenuOnOffTriggered
+ */
+
+void
+CMenuOnOffTriggered::SetOptionPosition(float x, float y, Trigger trigger, bool bRightJustify)
+{
+ CMenuOnOff::SetOptionPosition(x, y, bRightJustify);
+ if(trigger)
+ m_trigger = trigger;
+}
+
+void
+CMenuOnOffTriggered::SelectCurrentOptionUnderCursor(void)
+{
+ CMenuOnOff::SelectCurrentOptionUnderCursor();
+ if(m_trigger)
+ m_trigger(this);
+}
+
+
+
+/*
+ * CMenuSlider
+ */
+
+char CMenuSlider::Buf8[8];
+wchar CMenuSlider::Buf16[8];
+
+void
+CMenuSlider::SetColors(const CRGBA &title, const CRGBA &percentage, const CRGBA &left, const CRGBA &right)
+{
+ m_title.SetColor(title);
+ m_percentageText.SetColor(percentage);
+ m_colors[0] = left;
+ m_colors[1] = right;
+}
+
+
+void
+CMenuSlider::AddTickBox(float positionX, float positionY, float width, float heightLeft, float heightRight)
+{
+ m_box.SetPosition(positionX, positionY);
+ m_size[0].x = width;
+ m_size[0].y = heightLeft;
+ m_size[1].x = width;
+ m_size[1].y = heightRight;
+}
+
+void
+CMenuSlider::AddTitle(wchar *text, float positionX, float positionY)
+{
+ m_title.m_text = text;
+ m_title.SetPosition(positionX, positionY);
+}
+
+static CRGBA SELECTED_TEXT_COLOR_0(255, 182, 48, 255);
+
+void
+CMenuSlider::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
+{
+ if(m_bActive){
+ CRGBA selectionCol = m_colors[0];
+ if(selectionCol.red == SELECTED_TEXT_COLOR_0.red &&
+ selectionCol.green == SELECTED_TEXT_COLOR_0.green &&
+ selectionCol.blue == SELECTED_TEXT_COLOR_0.blue &&
+ selectionCol.alpha == SELECTED_TEXT_COLOR_0.alpha)
+ selectionCol = m_colors[1];
+
+ if(m_style == 1){
+ // solid bar
+ CRGBA shadowCol = m_box.GetShadowColor();
+ float f = m_value/1000.0f;
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ if(m_box.m_bDropShadow)
+ CSprite2d::DrawRect(
+ CRect(boxPos.x + m_box.m_shadowOffset.x,
+ boxPos.y + m_box.m_shadowOffset.y,
+ boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
+ boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ shadowCol);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
+ m_colors[1]);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
+ selectionCol);
+ }else if(m_style == 0){
+ // ticks...
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ DrawTicks(boxPos, m_size[0], m_size[1].y,
+ m_value/1000.0f, m_colors[0], selectionCol, m_colors[1],
+ m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
+ }
+
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+
+ if(m_bDrawPercentage){
+ sprintf(Buf8, "%d%%", m_value/10);
+ AsciiToUnicode(Buf8, Buf16);
+ m_percentageText.m_text = Buf16;
+ m_percentageText.Draw(optionHighlight, m_position.x+x, m_position.y+y);
+ }
+ }else
+ CMenuSlider::DrawNormal(x, y);
+}
+
+void
+CMenuSlider::DrawNormal(float x, float y)
+{
+ if(m_style == 1){
+ // solid bar
+ CRGBA shadowCol = m_box.GetShadowColor();
+ float f = m_value/1000.0f;
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ if(m_box.m_bDropShadow)
+ CSprite2d::DrawRect(
+ CRect(boxPos.x + m_box.m_shadowOffset.x,
+ boxPos.y + m_box.m_shadowOffset.y,
+ boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
+ boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ shadowCol);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
+ m_colors[1]);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
+ m_colors[0]);
+ }else if(m_style == 0){
+ // ticks...
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ DrawTicks(boxPos, m_size[0], m_size[1].y,
+ m_value/1000.0f, m_colors[0], m_colors[1],
+ m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
+ }
+
+ m_title.Draw(m_position.x+x, m_position.y+y);
+
+ if(m_bDrawPercentage){
+ sprintf(Buf8, "%d%%", m_value/10);
+ AsciiToUnicode(Buf8, Buf16);
+ m_percentageText.m_text = Buf16;
+ m_percentageText.Draw(m_percentageText.GetColor(), m_position.x+x, m_position.y+y);
+ }
+}
+
+void
+CMenuSlider::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
+{
+ if(m_bActive)
+ m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
+ else
+ m_title.Draw(m_position.x+x, m_position.y+y);
+
+ if(m_style == 1){
+ // solid bar
+ CRGBA shadowCol = m_box.GetShadowColor();
+ float f = m_value/1000.0f;
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ if(m_box.m_bDropShadow)
+ CSprite2d::DrawRect(
+ CRect(boxPos.x + m_box.m_shadowOffset.x,
+ boxPos.y + m_box.m_shadowOffset.y,
+ boxPos.x + m_box.m_shadowOffset.x + m_size[0].x,
+ boxPos.y + m_box.m_shadowOffset.y + m_size[0].y),
+ shadowCol);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
+ m_colors[1]);
+ CSprite2d::DrawRect(
+ CRect(boxPos.x, boxPos.y,
+ boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
+ m_colors[0]);
+ }else if(m_style == 0){
+ // ticks...
+ CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
+ DrawTicks(boxPos, m_size[0], m_size[1].y,
+ m_value/1000.0f, m_colors[0], m_colors[1],
+ m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
+ }
+
+ if(m_bDrawPercentage){
+ sprintf(Buf8, "%d%%", m_value/10);
+ AsciiToUnicode(Buf8, Buf16);
+ m_percentageText.m_text = Buf16;
+ m_percentageText.Draw(m_percentageText.GetColor(), m_position.x+x, m_position.y+y);
+ }
+}
+
+void
+CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &selCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
+{
+ int i;
+ int numTicks = size.x / 8.0f;
+ float dy = heightRight - size.y;
+ float stepy = dy / numTicks;
+ int left = level*numTicks;
+ int drewSelection = 0;
+ for(i = 0; i < numTicks; i++){
+ CRect rect(position.x + 8.0f*i, position.y + dy - stepy*i,
+ position.x + 8.0f*i + 4.0f, position.y + dy + size.y);
+ if(bShadow){
+ CRect shadowRect = rect;
+ shadowRect.left += shadowOffset.x;
+ shadowRect.right += shadowOffset.x;
+ shadowRect.top += shadowOffset.y;
+ shadowRect.bottom += shadowOffset.y;
+ CSprite2d::DrawRect(shadowRect, shadowColor);
+ }
+ if(i < left)
+ CSprite2d::DrawRect(rect, leftCol);
+ else if(!drewSelection){
+ CSprite2d::DrawRect(rect, selCol);
+ drewSelection = 1;
+ }else
+ CSprite2d::DrawRect(rect, rightCol);
+ }
+}
+
+void
+CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
+{
+ int i;
+ int numTicks = size.x / 8.0f;
+ float dy = heightRight - size.y;
+ float stepy = dy / numTicks;
+ int left = level*numTicks;
+ for(i = 0; i < numTicks; i++){
+ CRect rect(position.x + 8.0f*i, position.y + dy - stepy*i,
+ position.x + 8.0f*i + 4.0f, position.y + dy + size.y);
+ if(bShadow){
+ CRect shadowRect = rect;
+ shadowRect.left += shadowOffset.x;
+ shadowRect.right += shadowOffset.x;
+ shadowRect.top += shadowOffset.y;
+ shadowRect.bottom += shadowOffset.y;
+ CSprite2d::DrawRect(shadowRect, shadowColor);
+ }
+ if(i < left)
+ CSprite2d::DrawRect(rect, leftCol);
+ else
+ CSprite2d::DrawRect(rect, rightCol);
+ }
+}
+
+void
+CMenuSlider::SetAlpha(uint8 alpha)
+{
+ m_title.SetAlpha(alpha);
+ m_box.SetAlpha(alpha);
+ m_someAlpha = alpha;
+ m_percentageText.SetAlpha(alpha);
+ m_colors[0].alpha = alpha;
+ m_colors[1].alpha = alpha;
+}
+
+void
+CMenuSlider::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
+{
+ m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
+ m_box.SetShadows(bDropShadows, shadowColor, shadowOffset);
+ m_percentageText.SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+/*
+ * CMenuSliderTriggered
+ */
+
+void
+CMenuSliderTriggered::AddTickBox(float positionX, float positionY, float width, float heightLeft, float heightRight, Trigger trigger, Trigger alwaysTrigger)
+{
+ CMenuSlider::AddTickBox(positionX, positionY, width, heightLeft, heightRight);
+ m_trigger = trigger;
+ m_alwaysTrigger = alwaysTrigger;
+}
+
+void
+CMenuSliderTriggered::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
+{
+ CMenuSlider::Draw(optionHighlight, titleHighlight, x, y);
+ if(m_alwaysTrigger)
+ m_alwaysTrigger(this);
+}
+
+bool
+CMenuSliderTriggered::GoLeft(void)
+{
+ CMenuSlider::GoLeft();
+ if(m_trigger)
+ m_trigger(this);
+ return true;
+}
+
+bool
+CMenuSliderTriggered::GoRight(void)
+{
+ CMenuSlider::GoRight();
+ if(m_trigger)
+ m_trigger(this);
+ return true;
+}
+
+bool
+CMenuSliderTriggered::GoLeftStill(void)
+{
+ CMenuSlider::GoLeftStill();
+ if(m_trigger)
+ m_trigger(this);
+ return true;
+}
+
+bool
+CMenuSliderTriggered::GoRightStill(void)
+{
+ CMenuSlider::GoRightStill();
+ if(m_trigger)
+ m_trigger(this);
+ return true;
+}
+
+/*
+ * CMenuLineLister
+ */
+
+CMenuLineLister::CMenuLineLister(void)
+ : m_numLines(0), m_width(0.0f), m_height(0.0f),
+ m_scrollPosition(0.0f), m_scrollSpeed(1.0f), m_lineSpacing(15.0f), field_10E8(0)
+{
+ int i;
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ m_lineAlphas[i] = 0;
+ m_lineFade[i] = 0;
+ }
+}
+
+
+void
+CMenuLineLister::SetLinesColor(const CRGBA &color)
+{
+ int i;
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ m_linesLeft[i].SetColor(color);
+ m_linesRight[i].SetColor(color);
+ }
+}
+
+void
+CMenuLineLister::ResetNumberOfTextLines(void)
+{
+ int i;
+ m_numLines = 0;
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ m_lineAlphas[i] = 0;
+ m_lineFade[i] = 0;
+ }
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ // note this doesn't clear lines 0-14, probably an oversight
+ GetLeftLine(i)->m_text = nil;
+ GetRightLine(i)->m_text = nil;
+ }
+}
+
+bool
+CMenuLineLister::AddTextLine(wchar *left, wchar *right)
+{
+ CPlaceableShText *leftLine, *rightLine;
+ if(m_numLines == NUM_LINELISTER_LINES)
+ return false;
+ leftLine = GetLeftLine(m_numLines);
+ leftLine->m_text = left;
+ leftLine->SetPosition(0.0f, m_lineSpacing*(m_numLines+15));
+ rightLine = GetRightLine(m_numLines);
+ rightLine->m_text = right;
+ rightLine->SetPosition(leftLine->m_position.x, leftLine->m_position.y);
+ m_numLines++;
+ return true;
+}
+
+void
+CMenuLineLister::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
+{
+ int i, n;
+
+ m_scrollPosition += m_scrollSpeed;
+ n = m_numLines + 15;
+ if(m_scrollSpeed > 0.0f){
+ if(m_scrollPosition > n*m_lineSpacing)
+ m_scrollPosition = 0.0f;
+ }else{
+ if(m_scrollPosition < 0.0f)
+ m_scrollPosition = n*m_lineSpacing;
+ }
+ // this is a weird condition....
+ for(i = 0;
+ m_scrollPosition < i*m_lineSpacing || m_scrollPosition >= (i+1)*m_lineSpacing;
+ i++);
+
+ float screenPos = 0.0f;
+ for(; i < n; i++){
+ CVector2D linePos = m_linesLeft[i].m_position;
+
+ if(linePos.y+m_position.y - (m_scrollPosition+m_position.y) < 64.0f)
+ m_lineFade[i] = -4.0f*Abs(m_scrollSpeed);
+ else
+ m_lineFade[i] = 4.0f*Abs(m_scrollSpeed);
+ int newAlpha = m_lineAlphas[i] + m_lineFade[i];
+ if(newAlpha < 0) newAlpha = 0;
+ if(newAlpha > 255) newAlpha = 255;
+ m_lineAlphas[i] = newAlpha;
+
+ uint8 alpha = m_linesLeft[i].m_shadowColor.alpha;
+
+ // apply alpha
+ m_linesLeft[i].SetAlpha((alpha*m_lineAlphas[i])>>8);
+ m_linesRight[i].SetAlpha((alpha*m_lineAlphas[i])>>8);
+
+ m_linesLeft[i].Draw(m_position.x+x, m_position.y+y - m_scrollPosition);
+ CFont::SetRightJustifyOn();
+ m_linesRight[i].Draw(m_position.x+x + m_width, m_position.y+y - m_scrollPosition);
+ CFont::SetRightJustifyOff();
+
+ // restore alpha
+ m_linesLeft[i].SetAlpha(alpha);
+ m_linesRight[i].SetAlpha(alpha);
+
+ screenPos += m_lineSpacing;
+ if(screenPos >= m_height)
+ break;
+ }
+
+ m_scrollSpeed = 1.0f;
+}
+
+void
+CMenuLineLister::SetAlpha(uint8 alpha)
+{
+ int i;
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ m_linesLeft[i].SetAlpha(alpha);
+ m_linesRight[i].SetAlpha(alpha);
+ }
+}
+
+void
+CMenuLineLister::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
+{
+ int i;
+ for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
+ m_linesLeft[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+ m_linesRight[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
+ }
+}
+
+
+/*
+ * CMenuPage
+ */
+
+void
+CMenuPage::Initialise(void)
+{
+ int i;
+ m_numControls = 0;
+ m_pCurrentControl = nil;
+ m_cursor = 0;
+ for(i = 0; i < NUM_PAGE_WIDGETS; i++)
+ m_controls[i] = nil;
+}
+
+bool
+CMenuPage::AddMenu(CMenuBase *widget)
+{
+ if(m_numControls >= NUM_PAGE_WIDGETS)
+ return false;
+ m_controls[m_numControls] = widget;
+ if(m_numControls == 0){
+ m_pCurrentControl = widget;
+ m_cursor = 0;
+ }
+ m_numControls++;
+ return true;
+}
+
+bool
+CMenuPage::IsActiveMenuTwoState(void)
+{
+ return m_pCurrentControl && m_pCurrentControl->m_bTwoState;
+}
+
+void
+CMenuPage::ActiveMenuTwoState_SelectNextPosition(void)
+{
+ int sel;
+ if(m_pCurrentControl == nil || !m_pCurrentControl->m_bTwoState)
+ return;
+ m_pCurrentControl->GoFirst();
+ sel = m_pCurrentControl->GetMenuSelection();
+ if(sel == 1)
+ m_pCurrentControl->SelectCurrentOptionUnderCursor();
+ else if(sel == 0){
+ m_pCurrentControl->GoNext();
+ m_pCurrentControl->SelectCurrentOptionUnderCursor();
+ }
+}
+
+void
+CMenuPage::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
+{
+ int i;
+ for(i = 0; i < m_numControls; i++)
+ if(m_controls[i]){
+ if(i == m_cursor)
+ m_controls[i]->Draw(optionHighlight, titleHighlight, x, y);
+ else
+ m_controls[i]->DrawNormal(x, y);
+ }
+}
+
+void
+CMenuPage::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
+{
+ int i;
+ for(i = 0; i< m_numControls; i++)
+ if(m_controls[i]){
+ if(i == m_cursor)
+ m_controls[i]->DrawHighlighted(titleHighlight, x, y);
+ else
+ m_controls[i]->DrawNormal(x, y);
+ }
+}
+
+void
+CMenuPage::DrawNormal(float x, float y)
+{
+ int i;
+ for(i = 0; i< m_numControls; i++)
+ if(m_controls[i])
+ m_controls[i]->DrawNormal(x, y);
+}
+
+void
+CMenuPage::ActivatePage(void)
+{
+ m_cursor = 0;
+ if(m_numControls == 0)
+ return;
+ for(;;){
+ m_pCurrentControl = m_controls[m_cursor];
+ if(m_pCurrentControl->GoFirst())
+ return;
+ if(m_cursor == m_numControls-1)
+ m_cursor = 0;
+ else
+ m_cursor++;
+ }
+}
+
+void
+CMenuPage::SetAlpha(uint8 alpha)
+{
+ int i;
+ for(i = 0; i< m_numControls; i++)
+ if(m_controls[i])
+ m_controls[i]->SetAlpha(alpha);
+}
+
+void
+CMenuPage::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
+{
+ int i;
+ for(i = 0; i< m_numControls; i++)
+ if(m_controls[i])
+ m_controls[i]->SetShadows(bDropShadows, shadowColor, shadowOffset);
+}
+
+void
+CMenuPage::GoUpMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ do{
+ if(m_cursor == 0)
+ m_cursor = m_numControls-1;
+ else
+ m_cursor--;
+ m_pCurrentControl = m_controls[m_cursor];
+ }while(!m_pCurrentControl->GoLast());
+}
+
+void
+CMenuPage::GoDownMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ do{
+ if(m_cursor == m_numControls-1)
+ m_cursor = 0;
+ else
+ m_cursor++;
+ m_pCurrentControl = m_controls[m_cursor];
+ }while(!m_pCurrentControl->GoFirst());
+}
+
+void
+CMenuPage::GoLeftMenuOnPage(void)
+{
+ // same as up
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ do{
+ if(m_cursor == 0)
+ m_cursor = m_numControls-1;
+ else
+ m_cursor--;
+ m_pCurrentControl = m_controls[m_cursor];
+ }while(!m_pCurrentControl->GoLast());
+}
+
+void
+CMenuPage::GoRightMenuOnPage(void)
+{
+ // same as right
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ do{
+ if(m_cursor == m_numControls-1)
+ m_cursor = 0;
+ else
+ m_cursor++;
+ m_pCurrentControl = m_controls[m_cursor];
+ }while(!m_pCurrentControl->GoFirst());
+}
+
+/*
+ * CMenuPageAnyMove
+ */
+
+void
+CMenuPageAnyMove::Initialise(void)
+{
+ int i;
+ CMenuPage::Initialise();
+ for(i = 0; i < NUM_PAGE_WIDGETS; i++){
+ m_moveTab[i].left = -1;
+ m_moveTab[i].right = -1;
+ m_moveTab[i].up = -1;
+ m_moveTab[i].down = -1;
+ }
+}
+
+bool
+CMenuPageAnyMove::AddMenu(CMenuBase *widget, FEC_MOVETAB *moveTab)
+{
+ if(AddMenu(widget)){
+ m_moveTab[m_numControls-1] = *moveTab;
+ return true;
+ }
+ return false;
+}
+
+void
+CMenuPageAnyMove::GoUpMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ int move = m_moveTab[m_cursor].up;
+ if(move == -1)
+ CMenuPage::GoUpMenuOnPage();
+ else{ // BUG: no else in original code
+ m_cursor = move;
+ m_pCurrentControl = m_controls[m_cursor];
+ m_pCurrentControl->GoLast();
+ }
+}
+
+void
+CMenuPageAnyMove::GoDownMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ int move = m_moveTab[m_cursor].down;
+ if(move == -1)
+ CMenuPage::GoDownMenuOnPage();
+ else{ // BUG: no else in original code
+ m_cursor = move;
+ m_pCurrentControl = m_controls[m_cursor];
+ m_pCurrentControl->GoLast();
+ }
+}
+
+void
+CMenuPageAnyMove::GoLeftMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ int move = m_moveTab[m_cursor].left;
+ if(move == -1)
+ CMenuPage::GoLeftMenuOnPage();
+ else{ // BUG: no else in original code
+ m_cursor = move;
+ m_pCurrentControl = m_controls[m_cursor];
+ m_pCurrentControl->GoLast();
+ }
+}
+
+void
+CMenuPageAnyMove::GoRightMenuOnPage(void)
+{
+ if(m_pCurrentControl == nil)
+ return;
+ m_pCurrentControl->DeactivateMenu();
+ int move = m_moveTab[m_cursor].right;
+ if(move == -1)
+ CMenuPage::GoRightMenuOnPage();
+ else{ // BUG: no else in original code
+ m_cursor = move;
+ m_pCurrentControl = m_controls[m_cursor];
+ m_pCurrentControl->GoLast();
+ }
+}