#ifndef GAMETYPELIST_H #define GAMETYPELIST_H #include "listbox.qc" CLASS(XonoticGametypeList, XonoticListBox) METHOD(XonoticGametypeList, configureXonoticGametypeList, void(entity)) ATTRIB(XonoticGametypeList, rowsPerItem, float, 2) METHOD(XonoticGametypeList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticGametypeList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticGametypeList, setSelected, void(entity, float)) METHOD(XonoticGametypeList, loadCvars, void(entity)) METHOD(XonoticGametypeList, saveCvars, void(entity)) METHOD(XonoticGametypeList, keyDown, float(entity, float, float, float)) METHOD(XonoticGametypeList, clickListBoxItem, void(entity, float, vector)) ATTRIB(XonoticGametypeList, realFontSize, vector, '0 0 0') ATTRIB(XonoticGametypeList, realUpperMargin, float, 0) ATTRIB(XonoticGametypeList, columnIconOrigin, float, 0) ATTRIB(XonoticGametypeList, columnIconSize, float, 0) ATTRIB(XonoticGametypeList, columnNameOrigin, float, 0) ATTRIB(XonoticGametypeList, columnNameSize, float, 0) ENDCLASS(XonoticGametypeList) entity makeXonoticGametypeList(); #endif #ifdef IMPLEMENTATION entity makeXonoticGametypeList(void) { entity me; me = NEW(XonoticGametypeList); me.configureXonoticGametypeList(me); return me; } void XonoticGametypeList_configureXonoticGametypeList(entity me) { me.configureXonoticListBox(me); me.nItems = GameType_GetCount(); // we want the pics mipmapped for(int i = 0; i < GameType_GetCount(); ++i) draw_PreloadPictureWithFlags(GameType_GetIcon(i), PRECACHE_PIC_MIPMAP); me.loadCvars(me); } void XonoticGametypeList_setSelected(entity me, float i) { SUPER(XonoticGametypeList).setSelected(me, i); me.saveCvars(me); } void XonoticGametypeList_loadCvars(entity me) { float t; t = MapInfo_CurrentGametype(); float i; for(i = 0; i < GameType_GetCount(); ++i) if(t == GameType_GetID(i)) break; if(i >= GameType_GetCount()) { for(i = 0; i < GameType_GetCount(); ++i) if(t == MAPINFO_TYPE_DEATHMATCH) break; if(i >= GameType_GetCount()) i = 0; } me.setSelected(me, i); // do we need this: me.parent.gameTypeChangeNotify(me.parent); // to make sure } void XonoticGametypeList_saveCvars(entity me) { int t = GameType_GetID(me.selectedItem); if (t == MapInfo_CurrentGametype()) { return; } MapInfo_SwitchGameType(t); entity owner = me.parent; if (owner) { // not set immediately owner.gameTypeChangeNotify(owner); } } void XonoticGametypeList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s1, s2; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); else if(isFocused) { me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); } draw_Picture(me.columnIconOrigin * eX, GameType_GetIcon(i), me.columnIconSize * eX + eY, '1 1 1', SKINALPHA_LISTBOX_SELECTED); s1 = GameType_GetName(i); if(_MapInfo_GetTeamPlayBool(GameType_GetID(i))) s2 = _("teamplay"); else s2 = _("free for all"); vector save_fontscale = draw_fontscale; float f = draw_CondensedFontFactor(strcat(s1, " ", s2), false, me.realFontSize, 1); draw_fontscale.x *= f; vector fs = me.realFontSize; fs.x *= f; draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s1, fs, '1 1 1', SKINALPHA_TEXT, 0); draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 1.0 * (me.columnNameSize - draw_TextWidth(s2, 0, fs))) * eX, s2, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT, 0); draw_fontscale = save_fontscale; } void XonoticGametypeList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) { me.itemAbsSize = '0 0 0'; SUPER(XonoticServerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize); me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize.y * me.itemHeight)); me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize.x * (1 - me.controlWidth))); me.realUpperMargin = 0.5 * (1 - me.realFontSize.y); me.columnIconOrigin = 0; me.columnIconSize = me.itemAbsSize.y / me.itemAbsSize.x; me.columnNameOrigin = me.columnIconOrigin + me.columnIconSize + (0.5 * me.realFontSize.x); me.columnNameSize = 1 - me.columnIconSize - (1.5 * me.realFontSize.x); } float XonoticGametypeList_keyDown(entity me, float scan, float ascii, float shift) { if(scan == K_ENTER || scan == K_KP_ENTER) { m_play_click_sound(MENU_SOUND_EXECUTE); me.parent.gameTypeSelectNotify(me.parent); return 1; } return SUPER(XonoticGametypeList).keyDown(me, scan, ascii, shift); } void XonoticGametypeList_clickListBoxItem(entity me, float i, vector where) { m_play_click_sound(MENU_SOUND_SELECT); } #endif