/* ======================== UI_DrawConnect ======================== */ void UI_DrawConnect( const char *servername, const char *updateInfoString ) { // We need to use this special hack variable, nothing else is set up yet: const char *s = Cvar_VariableString( "ui_mapname" ); // Special case for first map: extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; if ( g_eSavedGameJustLoaded != eFULL && (!strcmp(s,"yavin1") || !strcmp(s,"demo")) ) { ui.R_SetColor( colorTable[CT_BLACK] ); uis.whiteShader = ui.R_RegisterShaderNoMip( "*white" ); ui.R_DrawStretchPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f, 1.0f, uis.whiteShader ); const char *t = SE_GetString( "SP_INGAME_ALONGTIME" ); int w = ui.R_Font_StrLenPixels( t, uiInfo.uiDC.Assets.qhMediumFont, 1.0f ); ui.R_Font_DrawString( (320)-(w/2), 140, t, colorTable[CT_ICON_BLUE], uiInfo.uiDC.Assets.qhMediumFont, -1, 1.0f ); return; } // Grab the loading menu: extern menuDef_t *Menus_FindByName( const char *p ); menuDef_t *menu = Menus_FindByName( "loadingMenu" ); if( !menu ) return; // Find the levelshot item, so we can fix up it's shader: itemDef_t *item = Menu_FindItemByName( menu, "mappic" ); if( !item ) return; item->window.background = ui.R_RegisterShaderNoMip( va( "levelshots/%s", s ) ); if (!item->window.background) { item->window.background = ui.R_RegisterShaderNoMip( "menu/art/unknownmap" ); } // Do the second levelshot as well: qhandle_t firstShot = item->window.background; item = Menu_FindItemByName( menu, "mappic2" ); if( !item ) return; item->window.background = ui.R_RegisterShaderNoMip( va( "levelshots/%s2", s ) ); if (!item->window.background) { item->window.background = firstShot; } const char *b = SE_GetString( "BRIEFINGS", s ); if( b && b[0] ) Cvar_Set( "ui_missionbriefing", va("@BRIEFINGS_%s", s) ); else Cvar_Set( "ui_missionbriefing", "@BRIEFINGS_NONE" ); // Now, force it to draw: extern void Menu_Paint( menuDef_t *menu, qboolean forcePaint ); Menu_Paint( menu, qtrue ); }
static void CG_DrawBottomRightHUD ( menuDef_t *menuHUD, centity_t *cent, vec4_t opacity ) { itemDef_t *focusItem; if (!menuHUD) { return; } focusItem = Menu_FindItemByName(menuHUD, "framebg"); if (focusItem) { vec4_t tmp; MAKERGBA(tmp,0,0,0, cg.jkg_HUDOpacity); trap_R_SetColor( tmp ); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, cgs.media.whiteShader ); } // Draw the bars (temp) CG_DrawJetpackCloak(menuHUD); focusItem = Menu_FindItemByName(menuHUD, "frame"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } // Draw ammo tics or saber style if ( cent->currentState.weapon == WP_SABER ) { CG_DrawSaberStyle(cent,menuHUD); } else { CG_DrawAmmo(cent,menuHUD); } }
void PartyMngt_Script_DialogButton(char **args) { int button; if (!Int_Parse(args, &button)) { return; } if (button < PDLGRESP_OK || button > PDLGRESP_CANCEL) { // Invalid button return; } if (PDlgData.InUse) { if (PDlgData.type == PDLG_TEXT) { menuDef_t *menu; itemDef_t *item; menu = Menus_FindByName("jkg_partymanagement"); if (menu) { item = Menu_FindItemByName(menu, "dlg_textentry"); if (item) { (*PDlgData.callback)(button, item->typeData.edit->buffer); return; } } (*PDlgData.callback)(button, ""); } else { (*PDlgData.callback)(button, NULL); } } }
void Script_AddListItem(itemDef_t *item, qboolean *bAbort, char **args) { const char *itemname = NULL, *val = NULL, *name = NULL; if (String_Parse(args, &itemname) && String_Parse(args, &val) && String_Parse(args, &name)) { itemDef_t *t = Menu_FindItemByName(item->parent, itemname); if (t && t->special) { DC->feederAddItem(t->special, name, atoi(val)); } } }
void JKG_Slice_ProgramListReset() { menuDef_t *menu; itemDef_t *item; listBoxDef_t *listPtr; menu = Menus_FindByName("jkg_slice"); if (!menu) return; item = Menu_FindItemByName(menu, "proglist"); item->cursorPos = -1; listPtr = item->typeData.listbox; listPtr->cursorPos = -1; Menu_SetItemText(menu, "progdesc", "Please select a program"); }
void JKG_Slice_ProgramSetParameter(int param) { menuDef_t *menu; itemDef_t *item; cgImports->SendClientCommand(va("~slc runprog %s %i", sliceData.programs[sliceData.selectedProgram].ID, param)); sliceData.inputState = 0; menu = Menus_FindByName("jkg_slice"); if (!menu) return; item = Menu_FindItemByName(menu, "proglist"); item->disabled = qfalse; Menu_SetItemText(menu, "progdesc", sliceData.programs[sliceData.selectedProgram].desc); Menu_SetItemText(menu, "btn_runprogram", "Run program"); }
void Script_SetEditFocus(itemDef_t *item, qboolean *bAbort, char **args) { const char *name = NULL; if (String_Parse(args, &name)) { itemDef_t *editItem = Menu_FindItemByName(item->parent, name); if (editItem && TEXTFIELD(editItem->type)) { editFieldDef_t *editPtr = (editFieldDef_t *)editItem->typeData; Menu_ClearFocus(item->parent); editItem->window.flags |= WINDOW_HASFOCUS; if (editItem->onFocus) { Item_RunScript(editItem, NULL, editItem->onFocus); } if (DC->Assets.itemFocusSound) { DC->startLocalSound(DC->Assets.itemFocusSound, CHAN_LOCAL_SOUND); } // reset scroll offset so we can see what we're editing if (editPtr) { editPtr->paintOffset = 0; } DC->setCVar(EDITFIELD_TEMP_CVAR, ""); editItem->cursorPos = 0; g_editingField = qtrue; g_editItem = editItem; // the stupidest idea ever, let's just override the console, every ui element, user choice, etc // nuking this //DC->setOverstrikeMode(qtrue); } } }
void Script_SetFocus(itemDef_t *item, qboolean *bAbort, char **args) { const char *name = NULL; if (String_Parse(args, &name)) { itemDef_t *focusItem = Menu_FindItemByName(item->parent, name); if (focusItem && !(focusItem->window.flags & WINDOW_DECORATION) && !(focusItem->window.flags & WINDOW_HASFOCUS)) { Menu_ClearFocus(item->parent); focusItem->window.flags |= WINDOW_HASFOCUS; if (focusItem->onFocus) { Item_RunScript(focusItem, NULL, focusItem->onFocus); } if (DC->Assets.itemFocusSound) { DC->startLocalSound(DC->Assets.itemFocusSound, CHAN_LOCAL_SOUND); } } } }
/* ================ CG_DrawAmmo ================ */ static void CG_DrawAmmo( centity_t *cent,menuDef_t *menuHUD) { playerState_t *ps; int ammo; itemDef_t *focusItem; float width; const char *text; vec4_t opacity; const weaponInfo_t *weaponInfo; if( cg.jkg_WHUDOpacity < 1.0f ) { MAKERGBA(opacity, 1,1,1, cg.jkg_WHUDOpacity); } else { MAKERGBA(opacity, 1,1,1, cg.jkg_HUDOpacity); } ps = &cg.snap->ps; // Can we find the menu? if (!menuHUD) { return; } if (!cent->currentState.weapon ) // We don't have a weapon right now { return; } #ifndef NO_SP_STYLE_AMMO // Figure out whether or not we want to do the thing where we highlight the text whenever we consume ammo or change firing mode (or, change weapon) if (cg.lastAmmo != cg.predictedPlayerState.stats[STAT_AMMO] || cg.lastAmmoGun != cg.predictedPlayerState.weaponId) { cg.lastAmmo = cg.predictedPlayerState.stats[STAT_AMMO]; cg.lastAmmoTime = cg.time + 200; // matches SP 1:1 cg.lastAmmoGun = cg.predictedPlayerState.weaponId; } if(cg.lastAmmoTime > cg.time) { vec4_t colorCopy = { 0.2, 0.72, 0.86, 1 }; Q_RGBCopy(&opacity, colorCopy); } #endif weaponInfo = CG_WeaponInfo (cent->currentState.weapon, cent->currentState.weaponVariation); if ( GetWeaponData( cent->currentState.weapon, cent->currentState.weaponVariation )->firemodes[0].cost == 0 && GetWeaponData( cent->currentState.weapon, cent->currentState.weaponVariation )->firemodes[1].cost == 0) { //just draw "infinite" text = "Ammo: Infinite"; } else { if ( GetWeaponAmmoClip( cent->currentState.weapon, cent->currentState.weaponVariation )) { ammo = ps->stats[STAT_AMMO]; } else { ammo = ps->ammo; } if ( GetWeaponAmmoClip( cent->currentState.weapon, cent->currentState.weaponVariation )) { // Display the amount of clips too float temp; temp = ceil(( float ) ps->ammo / ( float ) GetWeaponAmmoClip( cent->currentState.weapon, cent->currentState.weaponVariation )); text = va( "Ammo: %i (%i)", ammo, ( int ) temp ); } else { text = va( "Ammo: %i", ammo ); } } // Now then, lets render this text ^_^ width = (float)trap_R_Font_StrLenPixels(text, cgDC.Assets.qhSmallFont, 1) * 0.6f; focusItem = Menu_FindItemByName(menuHUD, "infobar"); if (focusItem) { trap_R_Font_DrawString(focusItem->window.rect.x + ((focusItem->window.rect.w/2) - (width/2)), focusItem->window.rect.y, text, opacity, cgDC.Assets.qhSmall3Font, -1, 0.5f); } focusItem = Menu_FindItemByName(menuHUD, "weapicon"); if (focusItem) { trap_R_SetColor( opacity ); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, weaponInfo->hudIcon ); } }
static void PartyMngt_Dialog_Show(const char *line1, const char *line2, const char *line3, int type, PDlgCallback callback) { menuDef_t *menu; itemDef_t *item; if (!callback) { return; } PDlgData.InUse = 1; if (line1) { Q_strncpyz(&PDlgData.line1[0], line1, 255); } else { PDlgData.line1[0] = 0; } if (line2) { Q_strncpyz(&PDlgData.line2[0], line2, 255); } else { PDlgData.line2[0] = 0; } if (line3) { Q_strncpyz(&PDlgData.line3[0], line3, 255); } else { PDlgData.line3[0] = 0; } PDlgData.type = type; PDlgData.callback = callback; menu = Menus_FindByName("jkg_partymanagement"); if (!menu) { return; } // First, disable all controls on the interface Menu_ItemDisable(menu, "list", 1); Menu_ItemDisable(menu, "btn_noparty", 1); Menu_ItemDisable(menu, "btn_inparty", 1); Menu_ItemDisable(menu, "btn_inpartylead", 1); Menu_ItemDisable(menu, "btn_bottom", 1); Menu_ClearFocus(menu); Menu_ShowItemByName(menu, "dialog", qtrue); if (type == PDLG_OK) { Menu_ShowItemByName(menu, "btn_dialogok", qtrue); } else if (type == PDLG_YESNO) { Menu_ShowItemByName(menu, "btn_dialogyesno", qtrue); } else if (type == PDLG_TEXT) { Menu_ShowItemByName(menu, "btn_dialogtext", qtrue); // Clear the text item = Menu_FindItemByName(menu, "dlg_textentry"); if (item) { item->typeData.edit->buffer[0] = 0; item->cursorPos = 0; Menu_SetTextFieldFocus(item); } } else { // Invalid dialog type! assert(0); } }
static void CG_DrawMiniMap ( menuDef_t *menuHUD, vec4_t opacity ) { itemDef_t *focusItem; if (!menuHUD) { return; } // Render the minimap // Use a default fixed radius of 500 units for now MiniMap_Render(menuHUD, 1500.0f); focusItem = Menu_FindItemByName(menuHUD, "frame"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } //Render the credit display focusItem = Menu_FindItemByName(menuHUD, "credits"); if (focusItem) { trap_R_SetColor(opacity); trap_R_Font_DrawString(focusItem->window.rect.x, focusItem->window.rect.y, va("Credits: %i", cg.predictedPlayerState.persistant[PERS_CREDITS]), opacity, cgDC.Assets.qhSmall3Font, -1, focusItem->textscale); } focusItem = Menu_FindItemByName(menuHUD, "smalltext"); if(focusItem) { char buffer[1024]; int mins, sec, msec; int numberItems = 0; buffer[0] = '\0'; trap_R_SetColor(opacity); if(cg_drawTimer.integer == 1 || cg_drawTimer.integer == 3) { //Draw server time msec = cg.time - cgs.levelStartTime; sec = msec/1000; //Convert to mm:ss format mins = floor((float)sec/60); sec -= (mins * 60); strcat(buffer, va("Timer: %.2i:%.2i ", mins, sec)); numberItems++; } if(cg_drawTimer.integer == 2 || cg_drawTimer.integer == 3) { //Add a slash if(numberItems > 0) { strcat(buffer, "/ "); numberItems++; } if(T_meridiem()) { strcat(buffer, va("Clock: %.2i:%.2i PM ", T_hour(qfalse), T_minute())); } else { strcat(buffer, va("Clock: %.2i:%.2i AM ", T_hour(qfalse), T_minute())); } } //TODO: Add more s***e //strcat(buffer, '\0'); trap_R_Font_DrawString(focusItem->window.rect.x, focusItem->window.rect.y, buffer, opacity, cgDC.Assets.qhSmall3Font, -1, focusItem->textscale); } if(cg_drawFPS.integer > 0) { focusItem = Menu_FindItemByName(menuHUD, "fps"); if(focusItem) { CG_DrawFPS(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->iMenuFont, focusItem->textscale); } } }
static void CG_DrawTopLeftHUD ( menuDef_t *menuHUD, vec4_t opacity ) { itemDef_t *focusItem; if (!menuHUD) { return; } // Print background of the bars /*focusItem = Menu_FindItemByName(menuHUD, "barsbackground"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); }*/ if (cg.predictedPlayerState.pm_type != PM_SPECTATOR) { CG_DrawArmor(menuHUD); CG_DrawHealth(menuHUD); CG_DrawForcePower(menuHUD); JKG_DrawFiringMode(menuHUD); focusItem = Menu_FindItemByName(menuHUD, "frame"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } focusItem = Menu_FindItemByName(menuHUD, "hudicon_shield"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } focusItem = Menu_FindItemByName(menuHUD, "hudicon_health"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } focusItem = Menu_FindItemByName(menuHUD, "hudicon_stamina"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } } // Put in the avatar before we put on the frame /*focusItem = Menu_FindItemByName(menuHUD, "avatar"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, cgs.media.avatar_placeholder ); } */ // Print frame // Print level /*focusItem = Menu_FindItemByName(menuHUD, "leveltext"); if (focusItem) { const char *temp = va("%i", 0); int x = ((focusItem->window.rect.w/2) - (trap_R_Font_StrLenPixels(temp, MenuFontToHandle(1), 0.6f) / 2)) + focusItem->window.rect.x; //CG_DrawRect(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 1, colorWhite); trap_R_Font_DrawString( x, focusItem->window.rect.y, temp, opacity,//colorWhite, MenuFontToHandle(1), -1, 0.6f); }*/ /*focusItem = Menu_FindItemByName(menuHUD, "nametext"); if (focusItem) { const char *temp = va("%s", Info_ValueForKey(CG_ConfigString(CS_PLAYERS + cg.snap->ps.clientNum), "n")); //CG_DrawRect(focusItem->window.rect.x,focusItem->window.rect.y,focusItem->window.rect.w,focusItem->window.rect.h,1,colorWhite); // To avoid rounding errors, we get the length at scale 1, then adjust it int x = ((focusItem->window.rect.w/2) - (((float)trap_R_Font_StrLenPixels(temp, MenuFontToHandle(1), 1) * 0.5f) / 2)) + focusItem->window.rect.x; //CG_DrawRect(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 1, colorWhite); ChatBox_SetPaletteAlpha(opacity[3]); trap_R_Font_DrawString( x, focusItem->window.rect.y, temp, opacity,//colorWhite, MenuFontToHandle(1), -1, 0.5f); ChatBox_SetPaletteAlpha(1); }*/ }
/* ================ CG_DrawSaberStyle If the weapon is a light saber (which needs no ammo) then draw a graphic showing the saber style (fast, medium, strong) ================ */ static void CG_DrawSaberStyle( centity_t *cent, menuDef_t *menuHUD) { const weaponInfo_t *weaponInfo; itemDef_t *focusItem; const char *text; float width; if (!cent->currentState.weapon ) // We don't have a weapon right now { return; } if ( cent->currentState.weapon != WP_SABER ) { return; } // Can we find the menu? if (!menuHUD) { return; } weaponInfo = CG_WeaponInfo (WP_SABER, 0); // draw the current saber style in this window // TODO: cvar plz if(jkg_simpleHUD.integer) { text = va( "Style: %s", SaberStances[cg.predictedPlayerState.fd.saberDrawAnimLevel].saberName_simple ); } else { text = va( "Stance: %s", SaberStances[cg.predictedPlayerState.fd.saberDrawAnimLevel].saberName_technical ); } /*switch ( cg.predictedPlayerState.fd.saberDrawAnimLevel ) { case 1: //FORCE_LEVEL_1: Fast text = "Style: Fast"; break; case 2: //FORCE_LEVEL_2: Medium text = "Style: Medium"; break; case 3: //FORCE_LEVEL_3: Strong text = "Style: Strong"; break; case 4: //FORCE_LEVEL_4://Desann text = "Style: Desann"; break; case 5: //FORCE_LEVEL_5://Tavion text = "Style: Tavion"; break; case 6: //SS_DUAL text = "Style: Dual"; break; case 7: //SS_STAFF text = "Style: Staff"; break; default: // ??? Should never happen text = "Style: Unknown"; break; }*/ // Now then, lets render this text ^_^ width = (float)trap_R_Font_StrLenPixels(text, cgDC.Assets.qhSmall3Font, 1) * 0.6f; focusItem = Menu_FindItemByName(menuHUD, "infobar"); if (focusItem) { trap_R_Font_DrawString(focusItem->window.rect.x + ((focusItem->window.rect.w/2) - (width/2)), focusItem->window.rect.y, text, colorWhite, cgDC.Assets.qhSmall3Font, -1, 0.6f); } focusItem = Menu_FindItemByName(menuHUD, "weapicon"); if (focusItem) { trap_R_SetColor( NULL ); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, weaponInfo->hudIcon ); } }
/* ================ CG_DrawArmor ================ */ static void CG_DrawArmor( menuDef_t *menuHUD ) { //vec4_t calcColor; vec4_t glowColor; playerState_t *ps; int armor, maxArmor; itemDef_t *focusItem; double percentage, factor ; //quarterArmor; //int i,currValue,inc; const char *text; int x; static double fcurrent = 0; vec4_t fadecolor = {1, 1, 1, 0.5f}; static vec4_t draincolor = {1, 0.4f, 0.4f, 1}; static vec4_t fillcolor = {0.4f, 1, 0.4f, 1}; vec4_t opacity; int state = 0; MAKERGBA(opacity, 1, 1, 1, cg.jkg_HUDOpacity); //ps = &cg.snap->ps; ps = &cg.predictedPlayerState; // Can we find the menu? if (!menuHUD) { return; } armor = ps->stats[STAT_ARMOR]; maxArmor = ps->stats[STAT_MAX_ARMOR]; // TEST: just render the whole thing for now, we'll fix it later focusItem = Menu_FindItemByName(menuHUD, "shieldbar"); if (focusItem) { percentage = (double)armor / (double)maxArmor; if (percentage > 1) { percentage = 1; } else if (percentage < 0) { percentage = 0; } factor = /*0.6171875f **/ percentage /*+ 0.34375f*/; /*if(factor > 0.95f) { factor = 1.0f; //eezstreet - mega hack }*/ // Fade our fcurrent to this factor if (fcurrent < factor) { // Raise it fcurrent += (cg.frameDelta * .0003); // Go up 30% per second if (fcurrent > factor) { // We passed it fcurrent = factor; } } else if (fcurrent > factor) { // Lower it fcurrent -= (cg.frameDelta * .0003); // Go up 30% per second if (fcurrent < factor) { fcurrent = factor; } } if (fcurrent != 0) { if (fcurrent < factor) { state = 1; // We're filling up, draw up to fcurrent solid, and up to factor translucent trap_R_SetColor(opacity); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * fcurrent, focusItem->window.rect.h, 0, 0, fcurrent, 1, focusItem->window.background); fadecolor[3] *= cg.jkg_HUDOpacity; trap_R_SetColor(fadecolor); trap_R_DrawStretchPic(focusItem->window.rect.x + focusItem->window.rect.w * fcurrent, focusItem->window.rect.y, focusItem->window.rect.w * (factor - fcurrent), focusItem->window.rect.h, fcurrent, 0, factor, 1, focusItem->window.background); trap_R_SetColor(opacity); } else if (fcurrent > factor) { state = 2; // We're draining, draw up to factor solid, and up to fcurrent translucent trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * factor, focusItem->window.rect.h, 0, 0, factor, 1, focusItem->window.background); fadecolor[3] *= cg.jkg_HUDOpacity; trap_R_SetColor(fadecolor); trap_R_DrawStretchPic(focusItem->window.rect.x + focusItem->window.rect.w * factor, focusItem->window.rect.y, focusItem->window.rect.w * (fcurrent - factor), focusItem->window.rect.h, factor, 0, fcurrent, 1, focusItem->window.background); trap_R_SetColor(opacity); } else { state = 0; // Just solid trap_R_SetColor(opacity); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * factor, focusItem->window.rect.h, 0, 0, factor, 1, focusItem->window.background); } } } if (!armor) { return; } focusItem = Menu_FindItemByName(menuHUD, "shieldtext"); if (focusItem) { if (state == 1) { VectorCopy4(fillcolor, glowColor); } else if (state == 2) { VectorCopy4(draincolor, glowColor); } else { VectorCopy4(colorWhite, glowColor); } glowColor[3] *= cg.jkg_HUDOpacity; // Center and draw the text, positioning will be finetuned later on :P text = va("%i / %i", armor, maxArmor); x = ((focusItem->window.rect.w/2) - (trap_R_Font_StrLenPixels(text, cgs.media.hudfont1, 0.6f) / 2)) + focusItem->window.rect.x; trap_R_Font_DrawString( x, focusItem->window.rect.y, text, glowColor, cgs.media.hudfont1, -1, 0.6f); trap_R_SetColor(NULL); } }
/* ================ CG_DrawHealth ================ */ static void CG_DrawHealth( menuDef_t *menuHUD ) { vec4_t glowColor; playerState_t *ps; int healthAmt, maxAmt; //int i,currValue,inc; double percentage, factor; itemDef_t *focusItem; const char *text; int x; static double fcurrent = 0; vec4_t fadecolor = {1, 1, 1, 0.5f}; static vec4_t draincolor = {1, 0.4f, 0.4f, 1}; static vec4_t fillcolor = {0.4f, 1, 0.4f, 1}; vec4_t opacity; int state = 0; MAKERGBA(opacity, 1, 1, 1, cg.jkg_HUDOpacity); // Can we find the menu? if (!menuHUD) { return; } ps = &cg.snap->ps; // What's the health? healthAmt = ps->stats[STAT_HEALTH]; maxAmt = ps->stats[STAT_MAX_HEALTH]; //if (healthAmt > ps->stats[STAT_MAX_HEALTH]) //{ // healthAmt = ps->stats[STAT_MAX_HEALTH]; //} focusItem = Menu_FindItemByName(menuHUD, "healthbar"); if (focusItem) { percentage = (double)healthAmt / (double)maxAmt; if (percentage > 1) { percentage = 1; } else if (percentage < 0) { percentage = 0; } factor = /*0.62109375f **/ percentage /*+ 0.330078125f*/; /*if(factor > 0.95f) { factor = 1.0f; //eezstreet - mega hack }*/ if (fcurrent < factor) { // Raise it fcurrent += (cg.frameDelta * .0003); // Go up 30% per second if (fcurrent > factor) { // We passed it fcurrent = factor; } } else if (fcurrent > factor) { // Lower it fcurrent -= (cg.frameDelta * .0003); // Go up 30% per second if (fcurrent < factor) { fcurrent = factor; } } else { //Stay the same } if (fcurrent != 0) { if (fcurrent < factor) { state = 1; // We're filling up, draw up to fcurrent solid, and up to factor translucent trap_R_SetColor(opacity); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * fcurrent, focusItem->window.rect.h, 0, 0, fcurrent, 1, focusItem->window.background); fadecolor[3] *= cg.jkg_HUDOpacity; trap_R_SetColor(fadecolor); trap_R_DrawStretchPic(focusItem->window.rect.x + focusItem->window.rect.w * fcurrent, focusItem->window.rect.y, focusItem->window.rect.w * (factor - fcurrent), focusItem->window.rect.h, fcurrent, 0, factor, 1, focusItem->window.background); trap_R_SetColor(NULL); } else if (fcurrent > factor) { state = 2; // We're draining, draw up to factor solid, and up to fcurrent translucent trap_R_SetColor(opacity); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * factor, focusItem->window.rect.h, 0, 0, factor, 1, focusItem->window.background); fadecolor[3] *= cg.jkg_HUDOpacity; trap_R_SetColor(fadecolor); trap_R_DrawStretchPic(focusItem->window.rect.x + focusItem->window.rect.w * factor, focusItem->window.rect.y, focusItem->window.rect.w * (fcurrent - factor), focusItem->window.rect.h, factor, 0, fcurrent, 1, focusItem->window.background); trap_R_SetColor(NULL); } else { state = 0; // Just solid trap_R_SetColor(opacity); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * factor, focusItem->window.rect.h, 0, 0, factor, 1, focusItem->window.background); } } } focusItem = Menu_FindItemByName(menuHUD, "healthtext"); if (focusItem) { // Center and draw the text, apply glow if needed if (state == 1) { VectorCopy4(fillcolor, glowColor); } else if (state == 2) { VectorCopy4(draincolor, glowColor); } else { VectorCopy4(colorWhite, glowColor); if (healthAmt < 25) { // Glow the text from red to white float fade = 0.5f + cos((float)cg.time/250) *.5; glowColor[1] = glowColor[2] = fade; } } glowColor[3] *= cg.jkg_HUDOpacity; text = va("%i / %i", healthAmt, maxAmt); x = ((focusItem->window.rect.w/2) - (trap_R_Font_StrLenPixels(text, cgs.media.hudfont1, 0.6f) / 2)) + focusItem->window.rect.x; trap_R_Font_DrawString( x, focusItem->window.rect.y, text, glowColor, cgs.media.hudfont1, -1, 0.6f); trap_R_SetColor(NULL); } }
/* ================ CG_DrawForcePower ================ */ static void CG_DrawForcePower( menuDef_t *menuHUD ) { // This goes in the lower bar on the hud const int maxForcePower = 100; vec4_t calcColor; float percent; qboolean flash=qfalse; itemDef_t *focusItem; vec4_t opacity; MAKERGBA( opacity, 1, 1, 1, 1*cg.jkg_HUDOpacity ); if (!menuHUD) { return; } // Make the hud flash by setting forceHUDTotalFlashTime above cg.time if (cg.forceHUDTotalFlashTime > cg.time ) { flash = qtrue; if (cg.forceHUDNextFlashTime < cg.time) { cg.forceHUDNextFlashTime = cg.time + 400; trap_S_StartSound (NULL, 0, CHAN_LOCAL, cgs.media.noforceSound ); if (cg.forceHUDActive) { cg.forceHUDActive = qfalse; } else { cg.forceHUDActive = qtrue; } } } else // turn HUD back on if it had just finished flashing time. { cg.forceHUDNextFlashTime = 0; cg.forceHUDActive = qtrue; } // if (!cg.forceHUDActive) // { // return; // } if (flash) { MAKERGBA(calcColor, 1, 1, 1, 0.6f*cg.jkg_HUDOpacity); } else { MAKERGBA(calcColor, 1, 1, 1, 1*cg.jkg_HUDOpacity); } /*focusItem = Menu_FindItemByName(menuHUD, "bar2ico"); if (focusItem) { calcColor[3] *= cg.jkg_HUDOpacity; trap_R_SetColor( calcColor ); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, trap_R_RegisterShader("gfx/jkghud/ico_stamina.png") // TODO: Precache this ); }*/ // Work out the bar now percent = (float)cg.predictedPlayerState.forcePower / (float)maxForcePower; //percent *= 0.75f; // Range of the bar is 0 to 0.75f focusItem = Menu_FindItemByName(menuHUD, "staminabar"); if (focusItem) { trap_R_SetColor( opacity ); trap_R_DrawStretchPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w * percent, focusItem->window.rect.h, 0, 0, percent, 1, focusItem->window.background ); } { char *Force = va("%i / %i", cg.predictedPlayerState.forcePower, maxForcePower); trap_R_Font_DrawString( focusItem->window.rect.x + (focusItem->window.rect.w / 2) - (trap_R_Font_StrLenPixels(Force, 1, 0.4)/2), focusItem->window.rect.y - 2/* + (trap_R_Font_HeightPixels(1, 1.0)*0.4)*/, Force, colorWhite, 1, -1, 0.4f ); } }
intptr_t CL_CgameSystemCalls( intptr_t *args ) { #ifndef __NO_JK2 if( com_jk2 && com_jk2->integer ) { args[0] = (intptr_t)CL_ConvertJK2SysCall((cgameJK2Import_t)args[0]); } #endif switch( args[0] ) { case CG_PRINT: Com_Printf( "%s", VMA(1) ); return 0; case CG_ERROR: Com_Error( ERR_DROP, S_COLOR_RED"%s", VMA(1) ); return 0; case CG_MILLISECONDS: return Sys_Milliseconds(); case CG_CVAR_REGISTER: Cvar_Register( (vmCvar_t *) VMA(1), (const char *) VMA(2), (const char *) VMA(3), args[4] ); return 0; case CG_CVAR_UPDATE: Cvar_Update( (vmCvar_t *) VMA(1) ); return 0; case CG_CVAR_SET: Cvar_Set( (const char *) VMA(1), (const char *) VMA(2) ); return 0; case CG_ARGC: return Cmd_Argc(); case CG_ARGV: Cmd_ArgvBuffer( args[1], (char *) VMA(2), args[3] ); return 0; case CG_ARGS: Cmd_ArgsBuffer( (char *) VMA(1), args[2] ); return 0; case CG_FS_FOPENFILE: return FS_FOpenFileByMode( (const char *) VMA(1), (int *) VMA(2), (fsMode_t) args[3] ); case CG_FS_READ: FS_Read( VMA(1), args[2], args[3] ); return 0; case CG_FS_WRITE: FS_Write( VMA(1), args[2], args[3] ); return 0; case CG_FS_FCLOSEFILE: FS_FCloseFile( args[1] ); return 0; case CG_SENDCONSOLECOMMAND: Cbuf_AddText( (const char *) VMA(1) ); return 0; case CG_ADDCOMMAND: CL_AddCgameCommand( (const char *) VMA(1) ); return 0; case CG_SENDCLIENTCOMMAND: CL_AddReliableCommand( (const char *) VMA(1) ); return 0; case CG_UPDATESCREEN: // this is used during lengthy level loading, so pump message loop Com_EventLoop(); // FIXME: if a server restarts here, BAD THINGS HAPPEN! SCR_UpdateScreen(); return 0; case CG_RMG_INIT: /* if (!com_sv_running->integer) { // don't do this if we are connected locally if (!TheRandomMissionManager) { TheRandomMissionManager = new CRMManager; } TheRandomMissionManager->SetLandScape( cmg.landScapes[args[1]] ); TheRandomMissionManager->LoadMission(qfalse); TheRandomMissionManager->SpawnMission(qfalse); cmg.landScapes[args[1]]->UpdatePatches(); } */ //this is SP.. I guess we're always the client and server. // cl.mRMGChecksum = cm.landScapes[args[1]]->get_rand_seed(); RM_CreateRandomModels(args[1], (const char *)VMA(2)); //cmg.landScapes[args[1]]->rand_seed(cl.mRMGChecksum); // restore it, in case we do a vid restart cmg.landScape->rand_seed(cmg.landScape->get_rand_seed()); // TheRandomMissionManager->CreateMap(); return 0; case CG_CM_REGISTER_TERRAIN: return CM_RegisterTerrain((const char *)VMA(1), false)->GetTerrainId(); case CG_RE_INIT_RENDERER_TERRAIN: re.InitRendererTerrain((const char *)VMA(1)); return 0; case CG_CM_LOADMAP: CL_CM_LoadMap( (const char *) VMA(1), args[2] ); return 0; case CG_CM_NUMINLINEMODELS: return CM_NumInlineModels(); case CG_CM_INLINEMODEL: return CM_InlineModel( args[1] ); case CG_CM_TEMPBOXMODEL: return CM_TempBoxModel( (const float *) VMA(1), (const float *) VMA(2) );//, (int) VMA(3) ); case CG_CM_POINTCONTENTS: return CM_PointContents( (float *)VMA(1), args[2] ); case CG_CM_TRANSFORMEDPOINTCONTENTS: return CM_TransformedPointContents( (const float *) VMA(1), args[2], (const float *) VMA(3), (const float *) VMA(4) ); case CG_CM_BOXTRACE: CM_BoxTrace( (trace_t *) VMA(1), (const float *) VMA(2), (const float *) VMA(3), (const float *) VMA(4), (const float *) VMA(5), args[6], args[7] ); return 0; case CG_CM_TRANSFORMEDBOXTRACE: CM_TransformedBoxTrace( (trace_t *) VMA(1), (const float *) VMA(2), (const float *) VMA(3), (const float *) VMA(4), (const float *) VMA(5), args[6], args[7], (const float *) VMA(8), (const float *) VMA(9) ); return 0; case CG_CM_MARKFRAGMENTS: return re.MarkFragments( args[1], (float(*)[3]) VMA(2), (const float *) VMA(3), args[4], (float *) VMA(5), args[6], (markFragment_t *) VMA(7) ); case CG_CM_SNAPPVS: CM_SnapPVS((float(*))VMA(1),(byte *) VMA(2)); return 0; case CG_S_STOPSOUNDS: S_StopSounds( ); return 0; case CG_S_STARTSOUND: // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here // legally during level start where normally the internal s_soundStarted check would return. So ok to hit this. if (!cls.cgameStarted){ return 0; } S_StartSound( (float *) VMA(1), args[2], (soundChannel_t)args[3], args[4] ); return 0; case CG_S_UPDATEAMBIENTSET: // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here // legally during level start where normally the internal s_soundStarted check would return. So ok to hit this. if (!cls.cgameStarted){ return 0; } S_UpdateAmbientSet( (const char *) VMA(1), (float *) VMA(2) ); return 0; case CG_S_ADDLOCALSET: return S_AddLocalSet( (const char *) VMA(1), (float *) VMA(2), (float *) VMA(3), args[4], args[5] ); case CG_AS_PARSESETS: AS_ParseSets(); return 0; case CG_AS_ADDENTRY: AS_AddPrecacheEntry( (const char *) VMA(1) ); return 0; case CG_AS_GETBMODELSOUND: return AS_GetBModelSound( (const char *) VMA(1), args[2] ); case CG_S_STARTLOCALSOUND: // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here // legally during level start where normally the internal s_soundStarted check would return. So ok to hit this. if (!cls.cgameStarted){ return 0; } S_StartLocalSound( args[1], args[2] ); return 0; case CG_S_CLEARLOOPINGSOUNDS: S_ClearLoopingSounds(); return 0; case CG_S_ADDLOOPINGSOUND: // stops an ERR_DROP internally if called illegally from game side, but note that it also gets here // legally during level start where normally the internal s_soundStarted check would return. So ok to hit this. if (!cls.cgameStarted){ return 0; } S_AddLoopingSound( args[1], (const float *) VMA(2), (const float *) VMA(3), args[4], (soundChannel_t)args[5] ); return 0; case CG_S_UPDATEENTITYPOSITION: S_UpdateEntityPosition( args[1], (const float *) VMA(2) ); return 0; case CG_S_RESPATIALIZE: S_Respatialize( args[1], (const float *) VMA(2), (float(*)[3]) VMA(3), args[4] ); return 0; case CG_S_REGISTERSOUND: return S_RegisterSound( (const char *) VMA(1) ); case CG_S_STARTBACKGROUNDTRACK: S_StartBackgroundTrack( (const char *) VMA(1), (const char *) VMA(2), args[3]); return 0; case CG_S_GETSAMPLELENGTH: return S_GetSampleLengthInMilliSeconds( args[1]); case CG_R_LOADWORLDMAP: re.LoadWorld( (const char *) VMA(1) ); return 0; case CG_R_REGISTERMODEL: return re.RegisterModel( (const char *) VMA(1) ); case CG_R_REGISTERSKIN: return re.RegisterSkin( (const char *) VMA(1) ); case CG_R_REGISTERSHADER: return re.RegisterShader( (const char *) VMA(1) ); case CG_R_REGISTERSHADERNOMIP: return re.RegisterShaderNoMip( (const char *) VMA(1) ); case CG_R_REGISTERFONT: return re.RegisterFont( (const char *) VMA(1) ); case CG_R_FONTSTRLENPIXELS: return re.Font_StrLenPixels( (const char *) VMA(1), args[2], VMF(3) ); case CG_R_FONTSTRLENCHARS: return re.Font_StrLenChars( (const char *) VMA(1) ); case CG_R_FONTHEIGHTPIXELS: return re.Font_HeightPixels( args[1], VMF(2) ); case CG_R_FONTDRAWSTRING: re.Font_DrawString(args[1],args[2], (const char *) VMA(3), (float*)args[4], args[5], args[6], VMF(7)); return 0; case CG_LANGUAGE_ISASIAN: return re.Language_IsAsian(); case CG_LANGUAGE_USESSPACES: return re.Language_UsesSpaces(); case CG_ANYLANGUAGE_READFROMSTRING: return re.AnyLanguage_ReadCharFromString( (char *) VMA(1), (int *) VMA(2), (qboolean *) VMA(3) ); case CG_ANYLANGUAGE_READFROMSTRING2: return re.AnyLanguage_ReadCharFromString2( (char **) VMA(1), (qboolean *) VMA(3) ); case CG_R_SETREFRACTIONPROP: *(re.tr_distortionAlpha()) = VMF(1); *(re.tr_distortionStretch()) = VMF(2); *(re.tr_distortionPrePost()) = (qboolean)args[3]; *(re.tr_distortionNegate()) = (qboolean)args[4]; return 0; case CG_R_CLEARSCENE: re.ClearScene(); return 0; case CG_R_ADDREFENTITYTOSCENE: re.AddRefEntityToScene( (const refEntity_t *) VMA(1) ); return 0; case CG_R_INPVS: return re.R_inPVS((float *) VMA(1), (float *) VMA(2)); case CG_R_GETLIGHTING: return re.GetLighting( (const float * ) VMA(1), (float *) VMA(2), (float *) VMA(3), (float *) VMA(4) ); case CG_R_ADDPOLYTOSCENE: re.AddPolyToScene( args[1], args[2], (const polyVert_t *) VMA(3) ); return 0; case CG_R_ADDLIGHTTOSCENE: #ifdef VV_LIGHTING VVLightMan.RE_AddLightToScene ( (const float *) VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) ); #else re.AddLightToScene( (const float *) VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) ); #endif return 0; case CG_R_RENDERSCENE: re.RenderScene( (const refdef_t *) VMA(1) ); return 0; case CG_R_SETCOLOR: re.SetColor( (const float *) VMA(1) ); return 0; case CG_R_DRAWSTRETCHPIC: re.DrawStretchPic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), args[9] ); return 0; // The below was commented out for whatever reason... /me shrugs --eez case CG_R_DRAWSCREENSHOT: re.DrawStretchRaw( VMF(1), VMF(2), VMF(3), VMF(4), SG_SCR_WIDTH, SG_SCR_HEIGHT, SCR_GetScreenshot(0), 0, qtrue); return 0; case CG_R_MODELBOUNDS: re.ModelBounds( args[1], (float *) VMA(2), (float *) VMA(3) ); return 0; case CG_R_LERPTAG: re.LerpTag( (orientation_t *) VMA(1), args[2], args[3], args[4], VMF(5), (const char *) VMA(6) ); return 0; case CG_R_DRAWROTATEPIC: re.DrawRotatePic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), VMF(9), args[10] ); return 0; case CG_R_DRAWROTATEPIC2: re.DrawRotatePic2( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), VMF(9), args[10] ); return 0; case CG_R_SETRANGEFOG: // FIXME: Figure out if this is how it's done in MP :S --eez /*if (tr.rangedFog <= 0.0f) { g_oldRangedFog = tr.rangedFog; } tr.rangedFog = VMF(1); if (tr.rangedFog == 0.0f && g_oldRangedFog) { //restore to previous state if applicable tr.rangedFog = g_oldRangedFog; }*/ re.SetRangedFog( VMF( 1 ) ); return 0; case CG_R_LA_GOGGLES: re.LAGoggles(); return 0; case CG_R_SCISSOR: re.Scissor( VMF(1), VMF(2), VMF(3), VMF(4)); return 0; case CG_GETGLCONFIG: CL_GetGlconfig( (glconfig_t *) VMA(1) ); return 0; case CG_GETGAMESTATE: CL_GetGameState( (gameState_t *) VMA(1) ); return 0; case CG_GETCURRENTSNAPSHOTNUMBER: CL_GetCurrentSnapshotNumber( (int *) VMA(1), (int *) VMA(2) ); return 0; case CG_GETSNAPSHOT: return CL_GetSnapshot( args[1], (snapshot_t *) VMA(2) ); case CG_GETDEFAULTSTATE: return CL_GetDefaultState(args[1], (entityState_t *)VMA(2)); case CG_GETSERVERCOMMAND: return CL_GetServerCommand( args[1] ); case CG_GETCURRENTCMDNUMBER: return CL_GetCurrentCmdNumber(); case CG_GETUSERCMD: return CL_GetUserCmd( args[1], (usercmd_s *) VMA(2) ); case CG_SETUSERCMDVALUE: CL_SetUserCmdValue( args[1], VMF(2), VMF(3), VMF(4) ); return 0; case CG_SETUSERCMDANGLES: CL_SetUserCmdAngles( VMF(1), VMF(2), VMF(3) ); return 0; case COM_SETORGANGLES: Com_SetOrgAngles((float *)VMA(1),(float *)VMA(2)); return 0; /* Ghoul2 Insert Start */ case CG_G2_LISTSURFACES: re.G2API_ListSurfaces( (CGhoul2Info *) VMA(1) ); return 0; case CG_G2_LISTBONES: re.G2API_ListBones( (CGhoul2Info *) VMA(1), args[2]); return 0; case CG_G2_HAVEWEGHOULMODELS: return re.G2API_HaveWeGhoul2Models( *((CGhoul2Info_v *)VMA(1)) ); case CG_G2_SETMODELS: re.G2API_SetGhoul2ModelIndexes( *((CGhoul2Info_v *)VMA(1)),(qhandle_t *)VMA(2),(qhandle_t *)VMA(3)); return 0; /* Ghoul2 Insert End */ case CG_R_GET_LIGHT_STYLE: re.GetLightStyle(args[1], (byte*) VMA(2) ); return 0; case CG_R_SET_LIGHT_STYLE: re.SetLightStyle(args[1], args[2] ); return 0; case CG_R_GET_BMODEL_VERTS: re.GetBModelVerts( args[1], (float (*)[3])VMA(2), (float *)VMA(3) ); return 0; case CG_R_WORLD_EFFECT_COMMAND: re.WorldEffectCommand( (const char *) VMA(1) ); return 0; case CG_CIN_PLAYCINEMATIC: return CIN_PlayCinematic( (const char *) VMA(1), args[2], args[3], args[4], args[5], args[6], (const char *) VMA(7)); case CG_CIN_STOPCINEMATIC: return CIN_StopCinematic(args[1]); case CG_CIN_RUNCINEMATIC: return CIN_RunCinematic(args[1]); case CG_CIN_DRAWCINEMATIC: CIN_DrawCinematic(args[1]); return 0; case CG_CIN_SETEXTENTS: CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]); return 0; case CG_Z_MALLOC: return (intptr_t)Z_Malloc(args[1], (memtag_t) args[2], qfalse); case CG_Z_FREE: Z_Free((void *) VMA(1)); return 0; case CG_UI_SETACTIVE_MENU: UI_SetActiveMenu((const char *) VMA(1),NULL); return 0; case CG_UI_MENU_OPENBYNAME: Menus_OpenByName((const char *) VMA(1)); return 0; case CG_UI_MENU_RESET: Menu_Reset(); return 0; case CG_UI_MENU_NEW: Menu_New((char *) VMA(1)); return 0; case CG_UI_PARSE_INT: PC_ParseInt((int *) VMA(1)); return 0; case CG_UI_PARSE_STRING: PC_ParseString((const char **) VMA(1)); return 0; case CG_UI_PARSE_FLOAT: PC_ParseFloat((float *) VMA(1)); return 0; case CG_UI_STARTPARSESESSION: return(PC_StartParseSession((char *) VMA(1),(char **) VMA(2))); case CG_UI_ENDPARSESESSION: PC_EndParseSession((char *) VMA(1)); return 0; case CG_UI_PARSEEXT: char **holdPtr; holdPtr = (char **) VMA(1); if(!holdPtr) { Com_Error(ERR_FATAL, "CG_UI_PARSEEXT: NULL holdPtr"); } *holdPtr = PC_ParseExt(); return 0; case CG_UI_MENUCLOSE_ALL: Menus_CloseAll(); return 0; case CG_UI_MENUPAINT_ALL: Menu_PaintAll(); return 0; case CG_OPENJK_MENU_PAINT: Menu_Paint( (menuDef_t *)VMA(1), (intptr_t)VMA(2) ); return 0; case CG_OPENJK_GETMENU_BYNAME: return (intptr_t)Menus_FindByName( (const char *)VMA(1) ); case CG_UI_STRING_INIT: String_Init(); return 0; case CG_UI_GETMENUINFO: menuDef_t *menu; int *xPos,*yPos,*w,*h,result; #ifndef __NO_JK2 if(com_jk2 && !com_jk2->integer) { #endif menu = Menus_FindByName((char *) VMA(1)); // Get menu if (menu) { xPos = (int *) VMA(2); *xPos = (int) menu->window.rect.x; yPos = (int *) VMA(3); *yPos = (int) menu->window.rect.y; w = (int *) VMA(4); *w = (int) menu->window.rect.w; h = (int *) VMA(5); *h = (int) menu->window.rect.h; result = qtrue; } else { result = qfalse; } return result; #ifndef __NO_JK2 } else { menu = Menus_FindByName((char *) VMA(1)); // Get menu if (menu) { xPos = (int *) VMA(2); *xPos = (int) menu->window.rect.x; yPos = (int *) VMA(3); *yPos = (int) menu->window.rect.y; result = qtrue; } else { result = qfalse; } return result; } #endif break; case CG_UI_GETITEMTEXT: itemDef_t *item; menu = Menus_FindByName((char *) VMA(1)); // Get menu if (menu) { item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) menu, (char *) VMA(2)); if (item) { Q_strncpyz( (char *) VMA(3), item->text, 256 ); result = qtrue; } else { result = qfalse; } } else { result = qfalse; } return result; case CG_UI_GETITEMINFO: menu = Menus_FindByName((char *) VMA(1)); // Get menu if (menu) { qhandle_t *background; item = (itemDef_s *) Menu_FindItemByName((menuDef_t *) menu, (char *) VMA(2)); if (item) { xPos = (int *) VMA(3); *xPos = (int) item->window.rect.x; yPos = (int *) VMA(4); *yPos = (int) item->window.rect.y; w = (int *) VMA(5); *w = (int) item->window.rect.w; h = (int *) VMA(6); *h = (int) item->window.rect.h; vec4_t *color; color = (vec4_t *) VMA(7); if (!color) { return qfalse; } (*color)[0] = (float) item->window.foreColor[0]; (*color)[1] = (float) item->window.foreColor[1]; (*color)[2] = (float) item->window.foreColor[2]; (*color)[3] = (float) item->window.foreColor[3]; background = (qhandle_t *) VMA(8); if (!background) { return qfalse; } *background = item->window.background; result = qtrue; } else { result = qfalse; } } else { result = qfalse; } return result; case CG_SP_GETSTRINGTEXTSTRING: #ifndef __NO_JK2 case CG_SP_GETSTRINGTEXT: if(com_jk2 && com_jk2->integer) { const char* text; assert(VMA(1)); // assert(VMA(2)); // can now pass in NULL to just query the size if (args[0] == CG_SP_GETSTRINGTEXT) { text = JK2SP_GetStringText( args[1] ); } else { text = JK2SP_GetStringTextString( (const char *) VMA(1) ); } if (VMA(2)) // only if dest buffer supplied... { if ( text[0] ) { Q_strncpyz( (char *) VMA(2), text, args[3] ); } else { Q_strncpyz( (char *) VMA(2), "??", args[3] ); } } return strlen(text); } else { #endif const char* text; assert(VMA(1)); text = SE_GetString( (const char *) VMA(1) ); if (VMA(2)) // only if dest buffer supplied... { if ( text[0] ) { Q_strncpyz( (char *) VMA(2), text, args[3] ); } else { Com_sprintf( (char *) VMA(2), args[3], "??%s", VMA(1) ); } } return strlen(text); #ifndef __NO_JK2 } //break; case CG_SP_REGISTER: return JK2SP_Register( (const char *) VMA(1), args[2]?(SP_REGISTER_MENU|SP_REGISTER_REQUIRED):SP_REGISTER_CLIENT ); #endif default: Com_Error( ERR_DROP, "Bad cgame system trap: %ld", (long int) args[0] ); } return 0; }
static void CG_DrawHotkeyBar ( menuDef_t *menuHUD, vec4_t opacity ) { itemDef_t *focusItem; int i; if (!menuHUD) { return; } focusItem = Menu_FindItemByName(menuHUD, "frame"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } // Print background of the bars for (i=0; i<11; i++) { focusItem = Menu_FindItemByName(menuHUD, va("slot%i", i)); if (focusItem) { vec4_t col = {0.11f, 0.11f, 0.11f, 1.0f}; qhandle_t shader = cgs.media.whiteShader; //dummy col[3] *= cg.jkg_HUDOpacity; if ( i < MAX_ACI_SLOTS && cg.playerACI[i] >= 0 && cg.playerInventory[cg.playerACI[i]].id && cg.playerInventory[cg.playerACI[i]].id->itemID ) { int weapon, variation; if(cg.playerInventory[cg.playerACI[i]].id->itemType == ITEM_WEAPON) { if ( BG_GetWeaponByIndex (cg.playerInventory[cg.playerACI[i]].id->varID, &weapon, &variation) ) { const weaponInfo_t *weaponInfo = CG_WeaponInfo (weapon, variation); shader = weaponInfo->hudIcon; col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; /*trap_R_SetColor (colorTable[CT_MDGREY]); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, cgs.media.whiteShader);*/ if(i == cg.weaponSelect) { trap_R_SetColor (opacity); //TODO: precache me! trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, trap_R_RegisterShaderNoMip("gfx/jkghud/aciselect")); } } } else { col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; shader = trap_R_RegisterShaderNoMip(cg.playerInventory[cg.playerACI[i]].id->itemIcon); } } if(shader != cgs.media.whiteShader) { trap_R_SetColor( col ); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, shader); } //CG_DrawRect(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 1, colorWhite); } focusItem = Menu_FindItemByName(menuHUD, va("slotl%i", i)); if (focusItem) { trap_R_Font_DrawString(focusItem->window.rect.x, focusItem->window.rect.y, va("%i", i), opacity, cgDC.Assets.qhSmallFont, -1, 0.4f); } } focusItem = Menu_FindItemByName(menuHUD, "frame_overlay"); if(focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } }