Fix LAN game menu (#208)

Remove authors from cli
This commit is contained in:
Cong
2017-07-02 21:47:57 +10:00
parent 04c4f445eb
commit c0c99e28aa
7 changed files with 57 additions and 29 deletions

View File

@@ -100,7 +100,8 @@ static void MainLoop(void)
{
for (;;)
{
LoopRunner l = LoopRunnerNew(MainMenu(&gGraphicsDevice));
LoopRunner l = LoopRunnerNew(NULL);
LoopRunnerPush(&l, MainMenu(&gGraphicsDevice, &l));
if (!gCampaign.IsLoaded)
{
LoopRunnerRun(&l);

View File

@@ -83,7 +83,8 @@ bool CampaignLoad(CampaignOptions *co, CampaignEntry *entry)
CASSERT(!co->IsLoaded, "loading campaign without unloading last one");
// Note: use the mode already set by the menus
const GameMode mode = co->Entry.Mode;
co->Entry = *entry;
CampaignEntryTerminate(&co->Entry);
CampaignEntryCopy(&co->Entry, entry);
co->Entry.Mode = mode;
CampaignSettingInit(&co->Setting);
if (entry->Mode == GAME_MODE_QUICK_PLAY)

View File

@@ -40,10 +40,6 @@
void PrintTitle(void)
{
printf("C-Dogs SDL %s\n", CDOGS_SDL_VERSION);
printf("Original Code Copyright Ronny Wester 1995\n");
printf("Game Data Copyright Ronny Wester 1995\n");
printf("SDL Port by Jeremy Chin, Lucas Martin-King and Cong Xu, Copyright 2003-2016\n\n");
}
void PrintHelp(void)

View File

@@ -64,7 +64,10 @@ LoopRunner LoopRunnerNew(GameLoopData *newData)
{
LoopRunner l;
CArrayInit(&l.Loops, sizeof(GameLoopData *));
LoopRunnerPush(&l, newData);
if (newData != NULL)
{
LoopRunnerPush(&l, newData);
}
return l;
}
static void GameLoopTerminate(GameLoopData *data);

View File

@@ -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:

View File

@@ -31,4 +31,4 @@
#include "game_loop.h"
// Run main menu loop
GameLoopData *MainMenu(GraphicsDevice *graphics);
GameLoopData *MainMenu(GraphicsDevice *graphics, LoopRunner *l);

View File

@@ -130,7 +130,12 @@ static GameLoopResult ScreenWaitUpdate(GameLoopData *data, LoopRunner *l)
{
return result;
}
return MenuUpdate(&swData->ms);
const GameLoopResult menuResult = MenuUpdate(&swData->ms);
if (menuResult == UPDATE_RESULT_OK)
{
LoopRunnerPop(l);
}
return menuResult;
}
static void ScreenWaitDraw(GameLoopData *data)
{