void PlayerSelectMenusCreate( PlayerSelectMenu *menu, int numPlayers, int player, Character *c, struct PlayerData *pData, EventHandlers *handlers, GraphicsDevice *graphics, InputConfig *inputConfig, const NameGen *ng) { MenuSystem *ms = &menu->ms; PlayerSelectMenuData *data = &menu->data; struct PlayerData *p = pData; Vec2i pos = Vec2iZero(); Vec2i size = Vec2iZero(); int w = graphics->cachedConfig.Res.x; int h = graphics->cachedConfig.Res.y; data->nameMenuSelection = (int)strlen(letters); data->display.c = c; data->display.currentMenu = &ms->current; data->display.pData = pData; data->controls.inputConfig = inputConfig; data->controls.pData = pData; data->nameGenerator = ng; switch (numPlayers) { case 1: // Single menu, entire screen pos = Vec2iNew(w / 2, 0); size = Vec2iNew(w / 2, h); break; case 2: // Two menus, side by side pos = Vec2iNew(player * w / 2 + w / 4, 0); size = Vec2iNew(w / 4, h); break; case 3: case 4: // Four corners pos = Vec2iNew((player & 1) * w / 2 + w / 4, (player / 2) * h / 2); size = Vec2iNew(w / 4, h / 2); break; default: assert(0 && "not implemented"); break; } MenuSystemInit(ms, handlers, graphics, pos, size); ms->align = MENU_ALIGN_LEFT; ms->root = ms->current = MenuCreateNormal( "", "", MENU_TYPE_NORMAL, 0); MenuAddSubmenu( ms->root, MenuCreateCustom( "Name", DrawNameMenu, HandleInputNameMenu, data)); MenuAddSubmenu(ms->root, CreateCustomizeMenu("Customize...", data, c, p)); MenuAddSubmenu( ms->root, MenuCreateVoidFunc("Shuffle", ShuffleAppearance, data)); MenuAddSubmenu(ms->root, CreateUseTemplateMenu("Load", data)); MenuAddSubmenu(ms->root, CreateSaveTemplateMenu("Save", data)); MenuAddSubmenu(ms->root, MenuCreateSeparator("")); MenuAddSubmenu( ms->root, MenuCreateNormal("Done", "", MENU_TYPE_NORMAL, 0)); MenuAddExitType(ms, MENU_TYPE_RETURN); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayer, data); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayerControls, &data->controls); // Detect when there have been new player templates created, // to re-enable the load menu CheckReenableLoadMenu(ms->root, NULL); MenuSetPostEnterFunc(ms->root, CheckReenableLoadMenu, NULL); SetPlayer(c, pData); }
void PlayerSelectMenusCreate( PlayerSelectMenu *menu, int numPlayers, int player, Character *c, struct PlayerData *pData, EventHandlers *handlers, GraphicsDevice *graphics, InputConfig *inputConfig) { MenuSystem *ms = &menu->ms; PlayerSelectMenuData *data = &menu->data; struct PlayerData *p = pData; Vec2i pos = Vec2iZero(); Vec2i size = Vec2iZero(); int w = graphics->cachedConfig.Res.x; int h = graphics->cachedConfig.Res.y; data->nameMenuSelection = (int)strlen(letters); data->display.c = c; data->display.currentMenu = &ms->current; data->display.pData = pData; data->controls.inputConfig = inputConfig; data->controls.pData = pData; switch (numPlayers) { case 1: // Single menu, entire screen pos = Vec2iNew(w / 2, 0); size = Vec2iNew(w / 2, h); break; case 2: // Two menus, side by side pos = Vec2iNew(player * w / 2 + w / 4, 0); size = Vec2iNew(w / 4, h); break; case 3: case 4: // Four corners pos = Vec2iNew((player & 1) * w / 2 + w / 4, (player / 2) * h / 2); size = Vec2iNew(w / 4, h / 2); break; default: assert(0 && "not implemented"); break; } MenuSystemInit(ms, handlers, graphics, pos, size); ms->align = MENU_ALIGN_LEFT; ms->root = ms->current = MenuCreateNormal( "", "", MENU_TYPE_NORMAL, 0); MenuAddSubmenu( ms->root, MenuCreateCustom( "Name", DrawNameMenu, HandleInputNameMenu, data)); data->faceData.c = c; data->faceData.pData = p; data->faceData.menuCount = FACE_COUNT; data->faceData.strFunc = IndexToFaceStr; data->faceData.property = &p->looks.face; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Face", &data->faceData)); data->skinData.c = c; data->skinData.pData = p; data->skinData.menuCount = SHADE_COUNT; data->skinData.strFunc = IndexToShadeStr; data->skinData.property = &p->looks.skin; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Skin", &data->skinData)); data->hairData.c = c; data->hairData.pData = p; data->hairData.menuCount = SHADE_COUNT; data->hairData.strFunc = IndexToShadeStr; data->hairData.property = &p->looks.hair; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Hair", &data->hairData)); data->armsData.c = c; data->armsData.pData = p; data->armsData.menuCount = SHADE_COUNT; data->armsData.strFunc = IndexToShadeStr; data->armsData.property = &p->looks.arm; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Arms", &data->armsData)); data->bodyData.c = c; data->bodyData.pData = p; data->bodyData.menuCount = SHADE_COUNT; data->bodyData.strFunc = IndexToShadeStr; data->bodyData.property = &p->looks.body; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Body", &data->bodyData)); data->legsData.c = c; data->legsData.pData = p; data->legsData.menuCount = SHADE_COUNT; data->legsData.strFunc = IndexToShadeStr; data->legsData.property = &p->looks.leg; MenuAddSubmenu(ms->root, CreateAppearanceMenu("Legs", &data->legsData)); MenuAddSubmenu(ms->root, CreateUseTemplateMenu("Load", data)); MenuAddSubmenu(ms->root, CreateSaveTemplateMenu("Save", data)); MenuAddSubmenu(ms->root, MenuCreateSeparator("")); MenuAddSubmenu( ms->root, MenuCreateNormal("Done", "", MENU_TYPE_NORMAL, 0)); MenuAddExitType(ms, MENU_TYPE_RETURN); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayer, data); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayerControls, &data->controls); // Detect when there have been new player templates created, // to re-enable the load menu CheckReenableLoadMenu(ms->root, NULL); MenuSetPostEnterFunc(ms->root, CheckReenableLoadMenu, NULL); SetPlayer(c, pData); }
void PlayerSelectMenusCreate( PlayerSelectMenu *menu, int numPlayers, int player, const int playerUID, EventHandlers *handlers, GraphicsDevice *graphics, const NameGen *ng) { MenuSystem *ms = &menu->ms; PlayerSelectMenuData *data = &menu->data; Vec2i pos, size; int w = graphics->cachedConfig.Res.x; int h = graphics->cachedConfig.Res.y; data->nameMenuSelection = (int)strlen(letters); data->display.PlayerUID = playerUID; data->display.currentMenu = &ms->current; data->PlayerUID = playerUID; data->nameGenerator = ng; switch (numPlayers) { case 1: // Single menu, entire screen pos = Vec2iNew(w / 2, 0); size = Vec2iNew(w / 2, h); break; case 2: // Two menus, side by side pos = Vec2iNew(player * w / 2 + w / 4, 0); size = Vec2iNew(w / 4, h); break; case 3: case 4: // Four corners pos = Vec2iNew((player & 1) * w / 2 + w / 4, (player / 2) * h / 2); size = Vec2iNew(w / 4, h / 2); break; default: CASSERT(false, "not implemented"); pos = Vec2iNew(w / 2, 0); size = Vec2iNew(w / 2, h); break; } MenuSystemInit(ms, handlers, graphics, pos, size); ms->align = MENU_ALIGN_LEFT; ms->root = ms->current = MenuCreateNormal( "", "", MENU_TYPE_NORMAL, 0); MenuAddSubmenu( ms->root, MenuCreateCustom( "Name", DrawNameMenu, HandleInputNameMenu, data)); MenuAddSubmenu( ms->root, CreateCustomizeMenu("Customize...", data, playerUID)); MenuAddSubmenu( ms->root, MenuCreateVoidFunc("Shuffle", ShuffleAppearance, data)); MenuAddSubmenu(ms->root, CreateUseTemplateMenu("Load", data)); MenuAddSubmenu(ms->root, CreateSaveTemplateMenu("Save", data)); MenuAddSubmenu(ms->root, MenuCreateSeparator("")); MenuAddSubmenu( ms->root, MenuCreateNormal("Done", "", MENU_TYPE_NORMAL, 0)); // Select "Done" ms->root->u.normal.index = (int)ms->root->u.normal.subMenus.size - 1; MenuAddExitType(ms, MENU_TYPE_RETURN); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayer, data); MenuSystemAddCustomDisplay( ms, MenuDisplayPlayerControls, &data->PlayerUID); // Detect when there have been new player templates created, // to re-enable the load menu CheckReenableLoadMenu(ms->root, NULL); MenuSetPostEnterFunc(ms->root, CheckReenableLoadMenu, NULL, false); PlayerData *p = PlayerDataGetByUID(playerUID); CharacterSetColors(&p->Char); }