An example of a GUI mode.
#include "WelcomeMode.h"
#define DATA ((__WELCOME_MODE_DATA_STRUCT__*)(this->m_PrivData))
#define PDATA(x) ((__WELCOME_MODE_DATA_STRUCT__*)(x->m_PrivData))
using namespace GUI_SourceRects;
#define WELCOME_MODE_MARGIN 4
#define WELCOME_MODE_WIDTH 268
#define WELCOME_MODE_HEIGHT 217
#define WELCOME_MODE_HEADER "Cavestory... MULTIPLAYER?!"
#define WELCOME_MODE_BODY "Welcome to Cavestory Multiplayer! Excited to see you!"
struct __WELCOME_MODE_DATA_STRUCT__
{
FontObject* WM_Font_Header;
FontObject* WM_Font_Body;
};
int WelcomeMode::Init()
{
m_PrivData = (void*)new __WELCOME_MODE_DATA_STRUCT__();
m_ModeConfig.AllowKeyControl = true;
m_ModeConfig.AllowMouseControl = true;
m_ModeConfig.ProcessMouseOnMove = true;
DATA->WM_Entire_Rect =
GUI_RECT(0, 0, WELCOME_MODE_WIDTH, WELCOME_MODE_HEIGHT);
strcpy(DATA->WM_Button_OK.text, "OK!");
WELCOME_MODE_MARGIN,
WELCOME_MODE_WIDTH - (WELCOME_MODE_MARGIN * 2),
);
DATA->WM_Button_OK.calculate();
DATA->WM_Text_Header.setFont(DATA->WM_Font_Header);
DATA->WM_Text_Header.rect =
GUI_RECT(WELCOME_MODE_MARGIN, WELCOME_MODE_MARGIN, WELCOME_MODE_WIDTH - (WELCOME_MODE_MARGIN * 2),
TEXT_HEIGHT_2S(DATA->WM_Font_Header, WELCOME_MODE_HEADER));
DATA->WM_Text_Header.setText(WELCOME_MODE_HEADER);
DATA->WM_Text_Header.calculate();
DATA->WM_Text_Description.setFont(DATA->WM_Font_Body);
DATA->WM_Text_Description.rect =
GUI_RECT(WELCOME_MODE_MARGIN, DATA->WM_Text_Header.rect.bottom() + WELCOME_MODE_MARGIN, WELCOME_MODE_WIDTH - (WELCOME_MODE_MARGIN * 2),
TEXT_HEIGHT_2S(DATA->WM_Font_Body, WELCOME_MODE_BODY));
DATA->WM_Text_Description.setText(WELCOME_MODE_BODY);
DATA->WM_Text_Description.calculate();
if (AllocSurface(-1, WELCOME_MODE_WIDTH, WELCOME_MODE_HEIGHT) == -1)
{
#ifdef _DEBUG
CSM_Log(__FUNCTION__
"() - Failed to allocate a surface for the escape menu.");
#endif
return 1;
}
ShowCursor();
return 0;
}
int WelcomeMode::Free()
{
delete m_PrivData;
FreeAllSurfaces();
HideCursor();
return 0;
}
void WelcomeMode::ProcessLogic()
{
if (!IsFocusedMode())
return;
CaveNet::ProcessNet();
if (CaveNet::Client::IsConnected())
{
if (iRetCode == 0)
{
m_RetValue = 0;
m_End = true;
return;
}
if (iRetCode == 2)
{
m_RetValue = 1;
m_End = true;
return;
}
}
}
void WelcomeMode::ProcessMouse(
GUI_POINT mouse_point)
{
mouse_point =
GUI_POINT((Mouse::GetMousePosition().x / magnification) - GetCenteredX(0), (Mouse::GetMousePosition().y / magnification) - GetCenteredY(0));
int prt = DATA->WM_Button_OK.process(mouse_point);
if (prt & GuiBase::ProcessReturnType::PRT_DIRTY)
{
SetDirty();
}
if (prt & GuiBase::ProcessReturnType::PRT_SELECTED)
{
DATA->NL_SelectedButton = 0;
HandleSelection();
}
if (prt & GuiBase::ProcessReturnType::PRT_IGNORE_MOUSE)
{
return;
}
}
void WelcomeMode::ProcessKeys()
{
if (m_ModeInput.KeyTrg & (gKeyOk |
KEY_ESCAPE | gKeyCancel))
{
m_ModeInput.KeyTrg &= ~(gKeyOk |
KEY_ESCAPE | gKeyCancel);
m_ModeInput.Key &= ~(gKeyOk |
KEY_ESCAPE | gKeyCancel);
m_End = true;
}
}
void WelcomeMode::PreRender()
{
SelectSurface(0);
NULL,
0x00000000
);
&DATA->WM_Entire_Rect,
GUI_SourceRects::rc_FRAME_EscapeBox,
CacheSurface::BitmapBoxType::BMPBOX_TYPE_BOTH,
);
DATA->WM_Text_Header.render();
DATA->WM_Text_Description.render();
DATA->WM_Button_OK.render();
}
void WelcomeMode::Draw()
{
if (CaveNet::Client::IsConnected())
DrawGame(false);
else
DrawScreenGrab();
}
#define MODE_DRAW_CENTERED_SURFACE
The center flag for DrawSurface(). Do not change this.
Definition: CSMAPI_BaseModeInstance.h:91
@ SURFACE_ID_GUI
GUI.
Definition: CSMAPI_enums.h:812
@ KEY_ESCAPE
Escape button.
Definition: CSMAPI_enums.h:201
static FontObject * GetDefaultFont(unsigned int iMagnification=0)
Get the default font that all GUIs should use.
Draw centered text.
Definition: CSMAPI_types.h:2961
static void UnloadFont(FontObject *fo)
Unload a font object.
static FontObject * LoadFont(const char *font_name, int font_width, int font_height, bool bDoNotUse=false, VideoTexture *pTexture=NULL, FontManager **resultingManager=NULL, unsigned int iMagnification=0xFFFFFFFF)
Load a font by name & size.
#define TEXT_HEIGHT_2S(font_object, string)
Get the rendered height of a string, automatically divide it by the current global magnification leve...
Definition: CSMAPI_drawing.h:86
void CSM_Log(const char *pFormat,...)
Log a message to the console.
Definition: CavestoryModAPI.cpp:50
static void DrawBitmapBox(GUI_RECT *out_rect, GUI_RECT *bmp_rects, BitmapBoxType type, Surface_Ids bmp_id)
Draw a bitmap box.
static void DrawFilledRect(GUI_RECT *r, unsigned long color, bool bAbsolutePos=false)
Fill a given rect.
Manages points.
Definition: CSMAPI_types.h:546
Definition: CSMAPI_types.h:842