// Load all the template names to the menu entries static void PostEnterLoadTemplateNames(menu_t *menu, void *data) { bool *isSave = (bool *)data; int numTemplates = PlayerTemplatesGetCount(gPlayerTemplates); for (int i = 0; i < numTemplates; i++) { // Add menu if necessary if (i == (int)menu->u.normal.subMenus.size) { MenuAddSubmenu(menu, MenuCreateBack("")); } menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, i); strcpy(subMenu->name, gPlayerTemplates[i].name); } if (*isSave && (int)menu->u.normal.subMenus.size == numTemplates) { MenuAddSubmenu(menu, MenuCreateBack("(new)")); } }
// Load all the template names to the menu entries static void PostEnterLoadTemplateNames(menu_t *menu, void *data) { bool *isSave = (bool *)data; for (int i = 0; i < (int)gPlayerTemplates.size; i++) { // Add menu if necessary if (i == (int)menu->u.normal.subMenus.size) { MenuAddSubmenu(menu, MenuCreateBack("")); } menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, i); const PlayerTemplate *pt = CArrayGet(&gPlayerTemplates, i); CFREE(subMenu->name); CSTRDUP(subMenu->name, pt->name); } if (*isSave && menu->u.normal.subMenus.size == gPlayerTemplates.size) { MenuAddSubmenu(menu, MenuCreateBack("(new)")); } }
static menu_t *CreateCustomizeMenu( const char *name, PlayerSelectMenuData *data, Character *c, struct PlayerData *p) { menu_t *menu = MenuCreateNormal(name, "", MENU_TYPE_NORMAL, 0); data->faceData.c = c; data->faceData.pData = p; data->faceData.menuCount = FACE_COUNT; data->faceData.strFunc = IndexToFaceStr; data->faceData.property = &p->looks.face; MenuAddSubmenu(menu, 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(menu, 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(menu, 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(menu, 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(menu, 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(menu, CreateAppearanceMenu("Legs", &data->legsData)); MenuAddSubmenu(menu, MenuCreateSeparator("")); MenuAddSubmenu(menu, MenuCreateBack("Back")); return menu; }
static menu_t *CreateAppearanceMenu( const char *name, AppearanceMenuData *data) { menu_t *menu = MenuCreateNormal(name, "", MENU_TYPE_NORMAL, 0); int i; menu->u.normal.maxItems = 11; for (i = 0; i < data->menuCount; i++) { MenuAddSubmenu(menu, MenuCreateBack(data->strFunc(i))); } MenuSetPostInputFunc(menu, PostInputAppearanceMenu, data); return menu; }
static menu_t *CreateCustomizeMenu( const char *name, PlayerSelectMenuData *data, const int playerUID) { menu_t *menu = MenuCreateNormal(name, "", MENU_TYPE_NORMAL, 0); data->faceData.PlayerUID = playerUID; data->faceData.menuCount = FACE_COUNT; data->faceData.strFunc = IndexToFaceStr; data->faceData.propertyOffset = offsetof(NCharLooks, Face); MenuAddSubmenu(menu, CreateAppearanceMenu("Face", &data->faceData)); data->skinData.PlayerUID = playerUID; data->skinData.menuCount = SHADE_COUNT; data->skinData.strFunc = IndexToShadeStr; data->skinData.propertyOffset = offsetof(NCharLooks, Skin); MenuAddSubmenu(menu, CreateAppearanceMenu("Skin", &data->skinData)); data->hairData.PlayerUID = playerUID; data->hairData.menuCount = SHADE_COUNT; data->hairData.strFunc = IndexToShadeStr; data->hairData.propertyOffset = offsetof(NCharLooks, Hair); MenuAddSubmenu(menu, CreateAppearanceMenu("Hair", &data->hairData)); data->armsData.PlayerUID = playerUID; data->armsData.menuCount = SHADE_COUNT; data->armsData.strFunc = IndexToShadeStr; data->armsData.propertyOffset = offsetof(NCharLooks, Arm); MenuAddSubmenu(menu, CreateAppearanceMenu("Arms", &data->armsData)); data->bodyData.PlayerUID = playerUID; data->bodyData.menuCount = SHADE_COUNT; data->bodyData.strFunc = IndexToShadeStr; data->bodyData.propertyOffset = offsetof(NCharLooks, Body); MenuAddSubmenu(menu, CreateAppearanceMenu("Body", &data->bodyData)); data->legsData.PlayerUID = playerUID; data->legsData.menuCount = SHADE_COUNT; data->legsData.strFunc = IndexToShadeStr; data->legsData.propertyOffset = offsetof(NCharLooks, Leg); MenuAddSubmenu(menu, CreateAppearanceMenu("Legs", &data->legsData)); MenuAddSubmenu(menu, MenuCreateSeparator("")); MenuAddSubmenu(menu, MenuCreateBack("Back")); return menu; }
static menu_t *MenuCreateAllowedWeapons( const char *name, AllowedWeaponsData *data) { // Create a menu to choose allowable weapons for this map // The weapons will be chosen from the available weapons menu_t *m = MenuCreateNormal(name, "Available Weapons:", MENU_TYPE_OPTIONS, 0); m->customPostInputData = data; for (int i = 0; i < (int)data->weapons->size; i++) { const GunDescription **g = CArrayGet(data->weapons, i); MenuAddSubmenu(m, MenuCreateOptionToggle((*g)->name, CArrayGet(&data->allowed, i))); } MenuAddSubmenu(m, MenuCreateSeparator("")); MenuAddSubmenu(m, MenuCreateBack("Done")); return m; }
void WeaponMenuCreate( WeaponMenu *menu, int numPlayers, int player, const int playerUID, EventHandlers *handlers, GraphicsDevice *graphics) { MenuSystem *ms = &menu->ms; WeaponMenuData *data = &menu->data; Vec2i pos, size; int w = graphics->cachedConfig.Res.x; int h = graphics->cachedConfig.Res.y; data->display.PlayerUID = playerUID; data->display.currentMenu = &ms->current; data->display.Dir = DIRECTION_DOWN; data->PlayerUID = playerUID; 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); ms->root->u.normal.maxItems = 11; const CArray *weapons = &gMission.Weapons; for (int i = 0; i < (int)weapons->size; i++) { const GunDescription **g = CArrayGet(weapons, i); menu_t *gunMenu; if ((*g)->Description != NULL) { // Gun description menu gunMenu = MenuCreateNormal((*g)->name, "", MENU_TYPE_NORMAL, 0); char *buf; CMALLOC(buf, strlen((*g)->Description) * 2); FontSplitLines((*g)->Description, buf, size.x * 5 / 6); MenuAddSubmenu(gunMenu, MenuCreateBack(buf)); CFREE(buf); gunMenu->u.normal.isSubmenusAlt = true; MenuSetCustomDisplay(gunMenu, DisplayDescriptionGunIcon, *g); } else { gunMenu = MenuCreate((*g)->name, MENU_TYPE_BASIC); } MenuAddSubmenu(ms->root, gunMenu); } MenuSetPostInputFunc(ms->root, WeaponSelect, &data->display); // Disable menu items where the player already has the weapon PlayerData *pData = PlayerDataGetByUID(playerUID); for (int i = 0; i < pData->weaponCount; i++) { for (int j = 0; j < (int)weapons->size; j++) { const GunDescription **g = CArrayGet(weapons, j); if (pData->weapons[i] == *g) { MenuDisableSubmenu(ms->root, j); } } } MenuAddSubmenu(ms->root, MenuCreateSeparator("")); MenuAddSubmenu( ms->root, MenuCreateNormal("(End)", "", MENU_TYPE_NORMAL, 0)); // Select "(End)" ms->root->u.normal.index = (int)ms->root->u.normal.subMenus.size - 1; // Disable "Done" if no weapons selected if (pData->weaponCount == 0) { MenuDisableSubmenu(ms->root, (int)ms->root->u.normal.subMenus.size - 1); } MenuSetCustomDisplay(ms->root, DisplayGunIcon, NULL); MenuSystemAddCustomDisplay(ms, MenuDisplayPlayer, &data->display); MenuSystemAddCustomDisplay(ms, DisplayEquippedWeapons, data); MenuSystemAddCustomDisplay( ms, MenuDisplayPlayerControls, &data->PlayerUID); }