|
|
|
@@ -50,7 +50,7 @@ typedef struct
|
|
|
|
|
bool wasClient;
|
|
|
|
|
} MainMenuData;
|
|
|
|
|
static void MenuCreateAll(
|
|
|
|
|
MenuSystem *ms,
|
|
|
|
|
MenuSystem *ms, LoopRunner *l,
|
|
|
|
|
custom_campaigns_t *campaigns,
|
|
|
|
|
EventHandlers *handlers,
|
|
|
|
|
GraphicsDevice *graphics);
|
|
|
|
@@ -59,7 +59,7 @@ static void MainMenuOnEnter(GameLoopData *data);
|
|
|
|
|
static void MainMenuOnExit(GameLoopData *data);
|
|
|
|
|
static GameLoopResult MainMenuUpdate(GameLoopData *data, LoopRunner *l);
|
|
|
|
|
static void MainMenuDraw(GameLoopData *data);
|
|
|
|
|
GameLoopData *MainMenu(GraphicsDevice *graphics)
|
|
|
|
|
GameLoopData *MainMenu(GraphicsDevice *graphics, LoopRunner *l)
|
|
|
|
|
{
|
|
|
|
|
MainMenuData *data;
|
|
|
|
|
CMALLOC(data, sizeof *data);
|
|
|
|
@@ -71,7 +71,7 @@ GameLoopData *MainMenu(GraphicsDevice *graphics)
|
|
|
|
|
data->lastGameMode = GAME_MODE_QUICK_PLAY;
|
|
|
|
|
data->wasClient = false;
|
|
|
|
|
MenuCreateAll(
|
|
|
|
|
&data->ms, &data->campaigns, &gEventHandlers, data->graphics);
|
|
|
|
|
&data->ms, l, &data->campaigns, &gEventHandlers, data->graphics);
|
|
|
|
|
MenuSetCreditsDisplayer(&data->ms, &data->creditsDisplayer);
|
|
|
|
|
return GameLoopDataNew(
|
|
|
|
|
data, MainMenuTerminate, MainMenuOnEnter, MainMenuOnExit,
|
|
|
|
@@ -91,6 +91,12 @@ static void MainMenuOnEnter(GameLoopData *data)
|
|
|
|
|
{
|
|
|
|
|
MainMenuData *mData = data->Data;
|
|
|
|
|
|
|
|
|
|
if (gCampaign.IsLoaded)
|
|
|
|
|
{
|
|
|
|
|
// Loaded game already; skip menus and go straight to game
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GrafxMakeRandomBackground(
|
|
|
|
|
&gGraphicsDevice, &gCampaign, &gMission, &gMap);
|
|
|
|
|
NetClientDisconnect(&gNetClient);
|
|
|
|
@@ -149,6 +155,14 @@ static void MainMenuOnExit(GameLoopData *data)
|
|
|
|
|
static GameLoopResult MainMenuUpdate(GameLoopData *data, LoopRunner *l)
|
|
|
|
|
{
|
|
|
|
|
MainMenuData *mData = data->Data;
|
|
|
|
|
|
|
|
|
|
if (gCampaign.IsLoaded)
|
|
|
|
|
{
|
|
|
|
|
// Loaded game already; skip menus and go straight to game
|
|
|
|
|
LoopRunnerPop(l);
|
|
|
|
|
return UPDATE_RESULT_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const GameLoopResult result = MenuUpdate(&mData->ms);
|
|
|
|
|
if (result == UPDATE_RESULT_OK)
|
|
|
|
|
{
|
|
|
|
@@ -163,12 +177,13 @@ static void MainMenuDraw(GameLoopData *data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static menu_t *MenuCreateStart(
|
|
|
|
|
const char *name, MenuSystem *ms, custom_campaigns_t *campaigns);
|
|
|
|
|
const char *name, MenuSystem *ms, LoopRunner *l,
|
|
|
|
|
custom_campaigns_t *campaigns);
|
|
|
|
|
static menu_t *MenuCreateOptions(const char *name, MenuSystem *ms);
|
|
|
|
|
menu_t *MenuCreateQuit(const char *name);
|
|
|
|
|
|
|
|
|
|
static void MenuCreateAll(
|
|
|
|
|
MenuSystem *ms,
|
|
|
|
|
MenuSystem *ms, LoopRunner *l,
|
|
|
|
|
custom_campaigns_t *campaigns,
|
|
|
|
|
EventHandlers *handlers,
|
|
|
|
|
GraphicsDevice *graphics)
|
|
|
|
@@ -185,7 +200,7 @@ static void MenuCreateAll(
|
|
|
|
|
"",
|
|
|
|
|
MENU_TYPE_NORMAL,
|
|
|
|
|
MENU_DISPLAY_ITEMS_CREDITS | MENU_DISPLAY_ITEMS_AUTHORS);
|
|
|
|
|
MenuAddSubmenu(ms->root, MenuCreateStart("Start", ms, campaigns));
|
|
|
|
|
MenuAddSubmenu(ms->root, MenuCreateStart("Start", ms, l, campaigns));
|
|
|
|
|
MenuAddSubmenu(ms->root, MenuCreateOptions("Options...", ms));
|
|
|
|
|
MenuAddSubmenu(ms->root, MenuCreateQuit("Quit"));
|
|
|
|
|
MenuAddExitType(ms, MENU_TYPE_QUIT);
|
|
|
|
@@ -204,10 +219,11 @@ static menu_t *MenuCreateCampaigns(
|
|
|
|
|
const char *name, const char *title,
|
|
|
|
|
campaign_list_t *list, const GameMode mode);
|
|
|
|
|
static menu_t *CreateJoinLANGame(
|
|
|
|
|
const char *name, const char *title, MenuSystem *ms);
|
|
|
|
|
const char *name, const char *title, MenuSystem *ms, LoopRunner *l);
|
|
|
|
|
static void CheckLANServers(menu_t *menu, void *data);
|
|
|
|
|
static menu_t *MenuCreateStart(
|
|
|
|
|
const char *name, MenuSystem *ms, custom_campaigns_t *campaigns)
|
|
|
|
|
const char *name, MenuSystem *ms, LoopRunner *l,
|
|
|
|
|
custom_campaigns_t *campaigns)
|
|
|
|
|
{
|
|
|
|
|
menu_t *menu = MenuCreateNormal(name, "Start:", MENU_TYPE_NORMAL, 0);
|
|
|
|
|
MenuAddSubmenu(
|
|
|
|
@@ -239,7 +255,7 @@ static menu_t *MenuCreateStart(
|
|
|
|
|
&campaigns->dogfightList,
|
|
|
|
|
GAME_MODE_DEATHMATCH));
|
|
|
|
|
MenuAddSubmenu(
|
|
|
|
|
menu, CreateJoinLANGame("Join LAN game", "Choose LAN server", ms));
|
|
|
|
|
menu, CreateJoinLANGame("Join LAN game", "Choose LAN server", ms, l));
|
|
|
|
|
CheckLANServerData *cdata;
|
|
|
|
|
CMALLOC(cdata, sizeof *cdata);
|
|
|
|
|
cdata->MenuJoinIndex = (int)menu->u.normal.subMenus.size - 1;
|
|
|
|
@@ -371,25 +387,35 @@ static menu_t *MenuCreateCampaignItem(
|
|
|
|
|
return menu;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
MenuSystem *MS;
|
|
|
|
|
LoopRunner *L;
|
|
|
|
|
} CreateJoinLANGameData;
|
|
|
|
|
static void CreateLANServerMenuItems(menu_t *menu, void *data);
|
|
|
|
|
static menu_t *CreateJoinLANGame(
|
|
|
|
|
const char *name, const char *title, MenuSystem *ms)
|
|
|
|
|
const char *name, const char *title, MenuSystem *ms, LoopRunner *l)
|
|
|
|
|
{
|
|
|
|
|
menu_t *menu = MenuCreateNormal(name, title, MENU_TYPE_NORMAL, 0);
|
|
|
|
|
// We'll create our menu items dynamically after entering
|
|
|
|
|
// Creating an item for each scanned server address
|
|
|
|
|
MenuSetPostEnterFunc(menu, CreateLANServerMenuItems, ms, false);
|
|
|
|
|
CreateJoinLANGameData *data;
|
|
|
|
|
CMALLOC(data, sizeof *data);
|
|
|
|
|
data->MS = ms;
|
|
|
|
|
data->L = l;
|
|
|
|
|
MenuSetPostEnterFunc(menu, CreateLANServerMenuItems, data, true);
|
|
|
|
|
return menu;
|
|
|
|
|
}
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
MenuSystem *MS;
|
|
|
|
|
LoopRunner *L;
|
|
|
|
|
int AddrIndex;
|
|
|
|
|
} JoinLANGameData;
|
|
|
|
|
static void JoinLANGame(menu_t *menu, void *data);
|
|
|
|
|
static void CreateLANServerMenuItems(menu_t *menu, void *data)
|
|
|
|
|
{
|
|
|
|
|
MenuSystem *ms = data;
|
|
|
|
|
CreateJoinLANGameData *cData = data;
|
|
|
|
|
|
|
|
|
|
// Clear and recreate all menu items
|
|
|
|
|
MenuClearSubmenus(menu);
|
|
|
|
@@ -413,7 +439,8 @@ static void CreateLANServerMenuItems(menu_t *menu, void *data)
|
|
|
|
|
serverMenu->enterSound = MENU_SOUND_START;
|
|
|
|
|
JoinLANGameData *jdata;
|
|
|
|
|
CMALLOC(jdata, sizeof *jdata);
|
|
|
|
|
jdata->MS = ms;
|
|
|
|
|
jdata->MS = cData->MS;
|
|
|
|
|
jdata->L = cData->L;
|
|
|
|
|
jdata->AddrIndex = _ca_index;
|
|
|
|
|
MenuSetPostEnterFunc(serverMenu, JoinLANGame, jdata, true);
|
|
|
|
|
MenuAddSubmenu(menu, serverMenu);
|
|
|
|
@@ -433,18 +460,13 @@ static void JoinLANGame(menu_t *menu, void *data)
|
|
|
|
|
LOG(LM_MAIN, LL_INFO, "joining LAN game...");
|
|
|
|
|
if (NetClientTryConnect(&gNetClient, sinfo->Addr))
|
|
|
|
|
{
|
|
|
|
|
LoopRunner l = LoopRunnerNew(ScreenWaitForCampaignDef());
|
|
|
|
|
LoopRunnerRun(&l);
|
|
|
|
|
LoopRunnerTerminate(&l);
|
|
|
|
|
LoopRunnerPush(jdata->L, ScreenWaitForCampaignDef());
|
|
|
|
|
goto bail;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
LOG(LM_MAIN, LL_INFO, "failed to connect to LAN game");
|
|
|
|
|
}
|
|
|
|
|
if (!gCampaign.IsLoaded)
|
|
|
|
|
{
|
|
|
|
|
goto bail;
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
bail:
|
|
|
|
|