////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : menu_public.sch // // AUTHOR : Kenneth Ross // // DESCRIPTION : Public functions to set up a menu and display it. // // // ////////////////////////////////////////////////////////////////////////////////////////// USING "rage_builtins.sch" USING "globals.sch" USING "commands_camera.sch" USING "net_hud_activating.sch" USING "cellphone_public.sch" USING "scaleform_helper.sch" USING "vehicle_int_to_rgb.sch" USING "shared_hud_displays.sch" USING "menu_cursor_public.sch" FUNC STRING GET_MENU_STRING_FROM_TEXT_LABEL(STRING paramStr) RETURN paramStr ENDFUNC /// PURPOSE: Returns the texture name for the specified icon FUNC STRING GET_MENU_ICON_TEXTURE(MENU_ICON_TYPE paramIcon, BOOL paramSelected) STRING sTexture[2] IF NOT IS_STRING_NULL_OR_EMPTY(g_sMenuData.sIconTextureOverride[paramIcon]) IF GET_HASH_KEY(g_sMenuData.sIconTextureOverride[paramIcon]) = HASH("CREW_LOGO") TEXT_LABEL_63 outTXDName GAMER_HANDLE gamerHandle = GET_GAMER_HANDLE_PLAYER(PLAYER_ID()) IF NETWORK_CLAN_GET_EMBLEM_TXD_NAME(gamerHandle, outTXDName) RETURN GET_MENU_STRING_FROM_TEXT_LABEL(outTXDName) ENDIF ELSE RETURN GET_MENU_STRING_FROM_TEXT_LABEL(g_sMenuData.sIconTextureOverride[paramIcon]) ENDIF ENDIF SWITCH paramIcon CASE MENU_ICON_CROWN sTexture[0] = "MP_hostCrown" sTexture[1] = "MP_hostCrown" BREAK CASE MENU_ICON_BLADE sTexture[0] = "MP_SpecItem_Coke" sTexture[1] = "MP_SpecItem_Coke" BREAK CASE MENU_ICON_SYRINGE sTexture[0] = "MP_SpecItem_Heroin" sTexture[1] = "MP_SpecItem_Heroin" BREAK CASE MENU_ICON_WEED sTexture[0] = "MP_SpecItem_Weed" sTexture[1] = "MP_SpecItem_Weed" BREAK CASE MENU_ICON_METH sTexture[0] = "MP_SpecItem_Meth" sTexture[1] = "MP_SpecItem_Meth" BREAK CASE MENU_ICON_CASH sTexture[0] = "MP_SpecItem_Cash" sTexture[1] = "MP_SpecItem_Cash" BREAK CASE MENU_ICON_STAR sTexture[0] = "shop_NEW_Star" sTexture[1] = "shop_NEW_Star" BREAK CASE MENU_ICON_LEFT_STAR sTexture[0] = "shop_NEW_Star" sTexture[1] = "shop_NEW_Star" BREAK CASE MENU_ICON_TICK sTexture[0] = "Shop_Tick_Icon" sTexture[1] = "Shop_Tick_Icon" BREAK CASE MENU_ICON_BOX_CROSS sTexture[0] = "Shop_Box_CrossB" sTexture[1] = "Shop_Box_Cross" BREAK CASE MENU_ICON_BOX_EMPTY sTexture[0] = "Shop_Box_BlankB" sTexture[1] = "Shop_Box_Blank" BREAK CASE MENU_ICON_BOX_TICK sTexture[0] = "Shop_Box_TickB" sTexture[1] = "Shop_Box_Tick" BREAK CASE MENU_ICON_COLOUR sTexture[0] = "shop_NEW_Star" sTexture[1] = "shop_NEW_Star" BREAK CASE MENU_ICON_TSHIRT sTexture[0] = "Shop_Clothing_Icon_B" sTexture[1] = "Shop_Clothing_Icon_A" BREAK CASE MENU_ICON_GUN sTexture[0] = "Shop_GunClub_Icon_B" sTexture[1] = "Shop_GunClub_Icon_A" BREAK CASE MENU_ICON_AMMO sTexture[0] = "Shop_Ammo_Icon_B" sTexture[1] = "Shop_Ammo_Icon_A" BREAK CASE MENU_ICON_ARMOUR sTexture[0] = "Shop_Armour_Icon_B" sTexture[1] = "Shop_Armour_Icon_A" BREAK CASE MENU_ICON_HEALTH sTexture[0] = "Shop_Health_Icon_B" sTexture[1] = "Shop_Health_Icon_A" BREAK CASE MENU_ICON_MAKEUP sTexture[0] = "Shop_MakeUp_Icon_B" sTexture[1] = "Shop_MakeUp_Icon_A" BREAK CASE MENU_ICON_INK sTexture[0] = "Shop_Tattoos_Icon_B" sTexture[1] = "Shop_Tattoos_Icon_A" BREAK CASE MENU_ICON_CAR sTexture[0] = "Shop_Garage_Icon_B" sTexture[1] = "Shop_Garage_Icon_A" BREAK CASE MENU_ICON_BIKE sTexture[0] = "Shop_Garage_Bike_Icon_B" sTexture[1] = "Shop_Garage_Bike_Icon_A" BREAK CASE MENU_ICON_SCISSORS sTexture[0] = "Shop_Barber_Icon_B" sTexture[1] = "Shop_Barber_Icon_A" BREAK CASE MENU_ICON_LOCK sTexture[0] = "shop_Lock" sTexture[1] = "shop_Lock" BREAK CASE MENU_ICON_LSC sTexture[0] = "Shop_Tick_Icon" sTexture[1] = "Shop_Tick_Icon" BREAK // The LSC logo is big so we load separately and override. CASE MENU_ICON_ARROW_L sTexture[0] = "arrowleft" sTexture[1] = "arrowleft" BREAK CASE MENU_ICON_ARROW_R sTexture[0] = "arrowright" sTexture[1] = "arrowright" BREAK CASE MENU_ICON_ALERT sTexture[0] = "MP_AlertTriangle" sTexture[1] = "MP_AlertTriangle" BREAK CASE MENU_ICON_HEADER sTexture[0] = "shop_NEW_Star" sTexture[1] = "shop_NEW_Star" BREAK // Script should override this CASE MENU_ICON_M sTexture[0] = "Shop_Michael_Icon_B" sTexture[1] = "Shop_Michael_Icon_A" BREAK CASE MENU_ICON_F sTexture[0] = "Shop_Franklin_Icon_B" sTexture[1] = "Shop_Franklin_Icon_A" BREAK CASE MENU_ICON_T sTexture[0] = "Shop_Trevor_Icon_B" sTexture[1] = "Shop_Trevor_Icon_A" BREAK CASE MENU_ICON_DISCOUNT sTexture[0] = "SaleIcon" sTexture[1] = "SaleIcon" BREAK CASE MENU_ICON_YACHT sTexture[0] = "Shop_Tick_Icon" sTexture[1] = "Shop_Tick_Icon" BREAK CASE MENU_ICON_STAR_FADED sTexture[0] = "shop_NEW_Star" sTexture[1] = "shop_NEW_Star" BREAK CASE MENU_ICON_BIN_LOCK sTexture[0] = "Shop_Lock_Arena" sTexture[1] = "Shop_Lock_Arena" BREAK CASE MENU_ICON_CLUBS sTexture[0] = "Card_Suit_Clubs" sTexture[1] = "Card_Suit_Clubs" BREAK CASE MENU_ICON_HEARTS sTexture[0] = "Card_Suit_Hearts" sTexture[1] = "Card_Suit_Hearts" BREAK CASE MENU_ICON_SPADES sTexture[0] = "Card_Suit_Spades" sTexture[1] = "Card_Suit_Spades" BREAK CASE MENU_ICON_DIAMONDS sTexture[0] = "Card_Suit_Diamonds" sTexture[1] = "Card_Suit_Diamonds" BREAK CASE MENU_ICON_DECORATION sTexture[0] = "Shop_Art_Icon_B" sTexture[1] = "Shop_Art_Icon_A" BREAK CASE MENU_ICON_DECORATION_FADED sTexture[0] = "Shop_Art_Icon_B" sTexture[1] = "Shop_Art_Icon_A" BREAK CASE MENU_ICON_CHIPS sTexture[0] = "Shop_Chips_A" sTexture[1] = "Shop_Chips_B" BREAK CASE MENU_ICON_DUMMY sTexture[0] = "" sTexture[1] = "" BREAK ENDSWITCH IF paramSelected RETURN sTexture[0] ELSE RETURN sTexture[1] ENDIF ENDFUNC /// PURPOSE: Returns the texture name for the specified icon FUNC STRING GET_MENU_ICON_TXD(MENU_ICON_TYPE paramIcon) IF NOT IS_STRING_NULL_OR_EMPTY(g_sMenuData.sIconTXDOverride[paramIcon]) IF GET_HASH_KEY(g_sMenuData.sIconTXDOverride[paramIcon]) = HASH("CREW_LOGO") TEXT_LABEL_63 outTXDName GAMER_HANDLE gamerHandle = GET_GAMER_HANDLE_PLAYER(PLAYER_ID()) NETWORK_CLAN_GET_EMBLEM_TXD_NAME(gamerHandle, outTXDName) RETURN GET_MENU_STRING_FROM_TEXT_LABEL(outTXDName) ELSE RETURN GET_MENU_STRING_FROM_TEXT_LABEL(g_sMenuData.sIconTXDOverride[paramIcon]) ENDIF ENDIF IF paramIcon = MENU_ICON_DISCOUNT RETURN "MPShopSale" ENDIF RETURN "CommonMenu" ENDFUNC /// PURPOSE: Returns the rgb for menu icon PROC GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_TYPE paramIcon, BOOL paramSelected, INT &iR, INT &iG, INT &iB, INT &iA) GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) iA = 255 SWITCH paramIcon CASE MENU_ICON_ALERT iR = 194 iG = 80 iB = 80 BREAK CASE MENU_ICON_LOCK CASE MENU_ICON_TICK CASE MENU_ICON_LSC CASE MENU_ICON_ARROW_L CASE MENU_ICON_ARROW_R CASE MENU_ICON_SURVIVAL CASE MENU_ICON_MISSION CASE MENU_ICON_LTS CASE MENU_ICON_CAPTURE CASE MENU_ICON_BASE_JUMPING CASE MENU_ICON_GANG_ATTACK CASE MENU_ICON_RACE_LAND CASE MENU_ICON_RACE_STUNT CASE MENU_ICON_RACE_WATER CASE MENU_ICON_RACE_AIR CASE MENU_ICON_RACE_BIKE CASE MENU_ICON_DEATHMATCH CASE MENU_ICON_TEAM_DM CASE MENU_ICON_VEH_DM CASE MENU_ICON_YACHT CASE MENU_ICON_CLUBS CASE MENU_ICON_HEARTS CASE MENU_ICON_SPADES CASE MENU_ICON_DIAMONDS IF paramSelected iR = 0 iG = 0 iB = 0 ENDIF BREAK CASE MENU_ICON_STAR_FADED iA = 100 BREAK CASE MENU_ICON_DECORATION_FADED iA = 100 BREAK CASE MENU_ICON_BIN_LOCK GET_HUD_COLOUR(HUD_COLOUR_PINK, iR, iG, iB, iA) iA = 255 BREAK ENDSWITCH ENDPROC /// PURPOSE: Returns the scale multiplier for menu icon. Defaults to 1.0 FUNC FLOAT GET_MENU_ICON_SCALE_MULTIPLIER(MENU_ICON_TYPE paramIcon) SWITCH paramIcon CASE MENU_ICON_SURVIVAL CASE MENU_ICON_MISSION CASE MENU_ICON_LTS CASE MENU_ICON_CAPTURE CASE MENU_ICON_BASE_JUMPING CASE MENU_ICON_GANG_ATTACK CASE MENU_ICON_RACE_LAND CASE MENU_ICON_RACE_WATER CASE MENU_ICON_RACE_AIR CASE MENU_ICON_RACE_BIKE CASE MENU_ICON_RACE_STUNT CASE MENU_ICON_DEATHMATCH CASE MENU_ICON_TEAM_DM CASE MENU_ICON_VEH_DM RETURN 0.85 BREAK ENDSWITCH RETURN 1.0 ENDFUNC /// PURPOSE: Returns the scale multiplier for menu icon. Defaults to 1.0 FUNC FLOAT GET_MENU_ICON_TEXTURE_SCALE(MENU_ICON_TYPE paramIcon) SWITCH paramIcon // Fix for bug # 1859693 - Reducing size as textures were doubled in size CASE MENU_ICON_T CASE MENU_ICON_TICK CASE MENU_ICON_INK CASE MENU_ICON_M CASE MENU_ICON_MAKEUP CASE MENU_ICON_LOCK // CASE MENU_ICON_BIN_LOCK CASE MENU_ICON_GUN CASE MENU_ICON_CAR CASE MENU_ICON_BIKE CASE MENU_ICON_F CASE MENU_ICON_TSHIRT CASE MENU_ICON_BOX_TICK CASE MENU_ICON_BOX_CROSS CASE MENU_ICON_BOX_EMPTY CASE MENU_ICON_SCISSORS CASE MENU_ICON_ARMOUR CASE MENU_ICON_HEALTH CASE MENU_ICON_AMMO CASE MENU_ICON_ALERT CASE MENU_ICON_ARROW_L CASE MENU_ICON_ARROW_R // CASE MENU_ICON_STAR // CASE MENU_ICON_LEFT_STAR // CASE MENU_ICON_DISCOUNT CASE MENU_ICON_YACHT CASE MENU_ICON_CLUBS CASE MENU_ICON_HEARTS CASE MENU_ICON_SPADES CASE MENU_ICON_DIAMONDS CASE MENU_ICON_DECORATION CASE MENU_ICON_DECORATION_FADED RETURN 0.5 BREAK CASE MENU_ICON_CHIPS RETURN 0.8 BREAK ENDSWITCH RETURN 1.0 ENDFUNC /// PURPOSE: Is the horizontal width so much larger than the vertical that we should assume the game /// is running a triple monitor setup? FUNC BOOL IS_PHYSICAL_RES_CONSIDERED_TRIPLE_HEAD(INT iScreenXPixels, INT iScreenYPixels) RETURN TO_FLOAT(iScreenXPixels)/TO_FLOAT(iScreenYPixels) > CUSTOM_MENU_TRIPLE_HEAD_THRESHOLD_RATIO ENDFUNC /// PURPOSE: Calculate the resolution that the menu should consider as the full screen. NB. This may not be the /// actual resolution if the game is running a triple head setup where the menu should only use the center screen. PROC GET_SCREEN_RESOLUTION_FOR_MENU(BOOL bUseActualRes, INT &iScreenXPixels, INT &iScreenYPixels, FLOAT &fAspectMultiplier) IF NOT bUseActualRes //At least in the past, this native returned a hardcoded 16:9 resolution. GET_SCREEN_RESOLUTION(iScreenXPixels, iScreenYPixels) EXIT ENDIF GET_ACTUAL_SCREEN_RESOLUTION(iScreenXPixels, iScreenYPixels) FLOAT fScreenXPixels = TO_FLOAT(iScreenXPixels) FLOAT fScreenYPixels = TO_FLOAT(iScreenYPixels) FLOAT fFakeAspect = GET_ASPECT_RATIO(FALSE) //Is the physical res considered large enough for the game to be running triple head? IF IS_PHYSICAL_RES_CONSIDERED_TRIPLE_HEAD(iScreenXPixels, iScreenYPixels) //Yes, pretend the screen width is actually the size of a standard 16:9 monitor. fAspectMultiplier = 1.0 iScreenXPixels = ROUND(fScreenYPixels * fFakeAspect) iScreenYPixels = ROUND(fScreenYPixels) EXIT ENDIF //No, calculate the real aspect ratio. fAspectMultiplier = (fScreenXPixels / fScreenYPixels) / fFakeAspect iScreenXPixels = ROUND(fScreenXPixels/fAspectMultiplier) iScreenYPixels = ROUND(fScreenYPixels/fAspectMultiplier) ENDPROC /// PURPOSE: Gets the width and height of a specific icon in screen space. FUNC BOOL GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_TYPE paramIcon, BOOL paramSelected, BOOL paramForRender, FLOAT &fWidth, FLOAT &fHeight, BOOL bUseActualRes = FALSE) TEXT_LABEL_63 sTXD = GET_MENU_ICON_TXD(paramIcon) TEXT_LABEL_63 sTexture = GET_MENU_ICON_TEXTURE(paramIcon, paramSelected) IF GET_HASH_KEY(sTexture) != 0 // B* 2147964 - Gets the physical screen aspect and compares to fake aspect ratio to get a multiplier INT xScreen, yScreen FLOAT fAspectMulti = 1.0 GET_SCREEN_RESOLUTION_FOR_MENU(bUseActualRes, xScreen, yScreen, fAspectMulti) VECTOR vTexture = GET_TEXTURE_RESOLUTION(sTXD, sTexture) FLOAT fTextureResScale = GET_MENU_ICON_TEXTURE_SCALE(paramIcon)/fAspectMulti vTexture *= fTextureResScale // All dds files have a border around them so subtract IF NOT paramForRender vTexture.X -= 2.0 vTexture.Y -= 2.0 ENDIF IF paramIcon = MENU_ICON_DLC_IMAGE vTexture.X = 288 vTexture.Y = 106 ENDIF IF paramIcon = MENU_ICON_HEADER AND GET_HASH_KEY(g_sMenuData.sIconTextureOverride[MENU_ICON_HEADER]) = HASH("CREW_LOGO") vTexture.X = 106 vTexture.Y = 106 ENDIF fWidth = (vTexture.X/xScreen) * (xScreen/yScreen) fHeight = (vTexture.Y/yScreen) / (vTexture.X/xScreen) * fWidth IF NOT bUseActualRes IF NOT GET_IS_WIDESCREEN() AND paramIcon != MENU_ICON_DLC_IMAGE fWidth *= 1.33 ENDIF ENDIF // Some textures have been upscaled so we need to ensure they do not exceed the menu width. IF paramIcon = MENU_ICON_HEADER IF fWidth > CUSTOM_MENU_W // Make sure we scale the height to match this.. fHeight *= (CUSTOM_MENU_W / fWidth) fWidth = CUSTOM_MENU_W ENDIF ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: Sets the appropriate text states for heading text PROC SETUP_MENU_HEADING_TEXT() INT iR, iG, iB, iA GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) IF g_sMenuData.bUseCustomHeaderTextColour iR = g_sMenuData.iHeaderTextR iG = g_sMenuData.iHeaderTextG iB = g_sMenuData.iHeaderTextB iA = g_sMenuData.iHeaderTextA ENDIF SET_TEXT_FONT(FONT_STANDARD) SET_TEXT_SCALE(0.0000, CUSTOM_MENU_TEXT_SCALE_Y) SET_TEXT_COLOUR(iR, iG, iB, iA) SET_TEXT_WRAP(CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X, CUSTOM_MENU_X+CUSTOM_MENU_W-CUSTOM_MENU_TEXT_INDENT_X) SET_TEXT_CENTRE(FALSE) SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0) SET_TEXT_EDGE(0, 0, 0, 0, 0) ENDPROC PROC SETUP_MENU_CUSTOM_ITEM_TEXT_COLOUR(BOOL bSelected) INT iR, iG, iB, iA IF bSelected GET_HUD_COLOUR(g_sMenuData.eRowColour[0], iR, iG, iB, iA) ELSE GET_HUD_COLOUR(g_sMenuData.eRowColour[1], iR, iG, iB, iA) ENDIF SET_TEXT_COLOUR(iR, iG, iB, 255) ENDPROC /// PURPOSE: Sets the appropriate text states for item text PROC SETUP_MENU_ITEM_TEXT(BOOL bSelected, BOOL bIsSelectable = TRUE, BOOL bIsDefault = FALSE, BOOL bSetCarColour = FALSE, INT iArray = 0, BOOL bPlayerNameFont = FALSE, BOOL bCondensedFont = FALSE) INT iR, iG, iB, iA IF bIsDefault IF bSetCarColour GET_VEHICLE_RGB_FROM_INT(g_sMenuData.iCarColour[iArray], iR, iG, iB) IF iR < 20 AND iG < 20 AND iB < 20 IF bSelected = FALSE GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) ENDIF ELIF iR > 230 AND iG > 230 AND iB > 230 IF bSelected iR = 0 iG = 0 iB = 0 ENDIF ENDIF SET_TEXT_COLOUR(iR, iG, iB, 255) ELIF bIsSelectable IF bSelected GET_HUD_COLOUR(HUD_COLOUR_YELLOWDARK, iR, iG, iB, iA) SET_TEXT_COLOUR(iR, iG, iB, 255) ELSE GET_HUD_COLOUR(HUD_COLOUR_YELLOW, iR, iG, iB, iA) SET_TEXT_COLOUR(iR, iG, iB, 255) ENDIF ELSE IF bSelected SET_TEXT_COLOUR(155, 155, 155, 255) ELSE SET_TEXT_COLOUR(155, 155, 155, 255) ENDIF ENDIF ELSE IF bIsSelectable IF bSelected SET_TEXT_COLOUR(0, 0 ,0 , FLOOR(255*0.8)) // ELSE GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) SET_TEXT_COLOUR(iR, iG, iB, iA) ENDIF ELSE IF bSelected SET_TEXT_COLOUR(155, 155, 155, 255) ELSE SET_TEXT_COLOUR(155, 155, 155, 255) ENDIF ENDIF ENDIF SET_TEXT_SCALE(0.0000, CUSTOM_MENU_TEXT_SCALE_Y) SET_TEXT_JUSTIFICATION(FONT_LEFT) IF bPlayerNameFont SET_TEXT_SCALE(0.0000, CUSTOM_MENU_CONDENSED_TEXT_SCALE_Y) SET_TEXT_FONT(FONT_CONDENSED) ELIF bCondensedFont SET_TEXT_SCALE(0.0000, CUSTOM_MENU_CONDENSED_TEXT_SCALE_Y) SET_TEXT_FONT(FONT_CONDENSED_NOT_GAMERNAME) ELSE SET_TEXT_FONT(FONT_STANDARD) ENDIF SET_TEXT_WRAP(0.0, 1.0) SET_TEXT_CENTRE(FALSE) SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0) SET_TEXT_EDGE(0, 0, 0, 0, 0) ENDPROC /// PURPOSE: Sets the appropriate text states for item text PROC SETUP_MENU_ITEM_MESSAGE_TEXT(FLOAT fXWrapStart) INT iR, iG, iB, iA GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) SET_TEXT_FONT(FONT_STANDARD) SET_TEXT_SCALE(0.0000, CUSTOM_MENU_TEXT_SCALE_Y) SET_TEXT_LEADING(2) SET_TEXT_COLOUR(iR, iG, iB, iA) SET_TEXT_WRAP(fXWrapStart, CUSTOM_MENU_X+CUSTOM_MENU_W-CUSTOM_MENU_TEXT_INDENT_X) SET_TEXT_CENTRE(FALSE) SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0) SET_TEXT_EDGE(0, 0, 0, 0, 0) ENDPROC /// PURPOSE: Sets the appropriate text states for item text PROC SETUP_MENU_HELP_KEY_TEXT(FLOAT fWrapStartX = -1.0, FLOAT fWrapEndX = -1.0) INT iR, iG, iB, iA GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) SET_TEXT_FONT(FONT_STANDARD) SET_TEXT_SCALE(0.0000, 0.315) SET_TEXT_COLOUR(iR, iG, iB, iA) IF fWrapStartX != -1.0 OR fWrapEndX != -1.0 SET_TEXT_WRAP(fWrapStartX, fWrapEndX) ELSE SET_TEXT_WRAP(CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X, CUSTOM_MENU_X+CUSTOM_MENU_W-CUSTOM_MENU_TEXT_INDENT_X) ENDIF SET_TEXT_CENTRE(FALSE) SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0) SET_TEXT_EDGE(0, 0, 0, 0, 0) ENDPROC FUNC FLOAT GET_MENU_HEADING_TEXT_HEIGHT() IF NOT DOES_TEXT_LABEL_EXIST(g_sMenuData.tl15Title) RETURN GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) ENDIF FLOAT fHeaderGraphicHeight = 0.0 FLOAT fTempWidth, fTempHeight IF g_sMenuData.bUseHeaderGraphic AND GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_HEADER, TRUE, TRUE, fTempWidth, fTempHeight) fHeaderGraphicHeight = fTempHeight ENDIF INT iIntParam, iFloatParam, iTextParam, iPlayerNameParam, i SETUP_MENU_HEADING_TEXT() BEGIN_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(g_sMenuData.tl15Title) REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iTitleInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fTitleFloat[iFloatParam], g_sMenuData.iTitleFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ENDIF ENDREPEAT RETURN (GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*END_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X, CUSTOM_MENU_Y+fHeaderGraphicHeight+0.008)) ENDFUNC FUNC FLOAT GET_MENU_HEADING_TEXT_WIDTH() IF NOT DOES_TEXT_LABEL_EXIST(g_sMenuData.tl15Title) RETURN 0.0 ENDIF FLOAT fWidth INT iIntParam, iFloatParam, iTextParam, iPlayerNameParam, i SETUP_MENU_HEADING_TEXT() BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(g_sMenuData.tl15Title) REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iTitleInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fTitleFloat[iFloatParam], g_sMenuData.iTitleFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ENDIF ENDREPEAT fWidth = END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) // Return the largest value IF g_sMenuData.fTitleWidth > fWidth RETURN g_sMenuData.fTitleWidth ENDIF RETURN fWidth ENDFUNC FUNC FLOAT GET_MENU_ITEM_COUNT_WIDTH(STRING sLabel, INT iCurrentItem, INT iTotalItems) IF NOT IS_STRING_NULL(sLabel) IF GET_HASH_KEY(sLabel) = 0 RETURN 0.0 ENDIF ELSE RETURN 0.0 ENDIF SETUP_MENU_HEADING_TEXT() BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(sLabel) ADD_TEXT_COMPONENT_INTEGER(iCurrentItem) ADD_TEXT_COMPONENT_INTEGER(iTotalItems) RETURN END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_WIDTH(STRING sLabel) IF NOT IS_STRING_NULL(sLabel) IF GET_HASH_KEY(sLabel) = 0 RETURN 0.0 ENDIF ELSE RETURN 0.0 ENDIF SETUP_MENU_ITEM_TEXT(FALSE) BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(sLabel) RETURN END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDFUNC FUNC FLOAT GET_LAST_MENU_ITEM_TEXT_WIDTH() FLOAT fTotalWidth, fWidth, fHeight INT iIntCount, iFloatCount, iIconCount, iPlayerNameCount, i REPEAT g_sMenuData.iComponentCount i IF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_TEXT // Use the g_sMenuData.iLastTextItem int for array offset ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME // Use the g_sMenuData.iLastTextItem int for array offset ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_INT iIntCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_FLOAT iFloatCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_ICON iIconCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_RADIO_STATION iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_LITERAL iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL iPlayerNameCount++ ENDIF ENDREPEAT SETUP_MENU_ITEM_TEXT(FALSE, TRUE, FALSE, FALSE, 0, (iPlayerNameCount > 0)) IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) ENDIF INT iCurrentText, iCurrentInt, iCurrentFloat, iCurrentPlayerName REPEAT g_sMenuData.iComponentCount i IF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_TEXT iCurrentText++ IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem+iCurrentText]) ENDIF ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME iCurrentText++ IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem+iCurrentText]) ENDIF ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_INT IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iItem[g_sMenuData.iCurrentIntItem-iIntCount+iCurrentInt]) ENDIF iCurrentInt++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_FLOAT IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fItem[g_sMenuData.iCurrentFloatItem-iFloatCount+iCurrentFloat], g_sMenuData.iFloatDP[g_sMenuData.iCurrentFloatItem-iFloatCount+iCurrentFloat]) ENDIF iCurrentFloat++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-iPlayerNameCount+iCurrentPlayerName]) ENDIF iCurrentPlayerName++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_RADIO_STATION IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-iPlayerNameCount+iCurrentPlayerName]) ENDIF iCurrentPlayerName++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-iPlayerNameCount+iCurrentPlayerName]) ENDIF iCurrentPlayerName++ ELIF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-iPlayerNameCount+iCurrentPlayerName]) ENDIF iCurrentPlayerName++ ENDIF ENDREPEAT IF GET_HASH_KEY(g_sMenuData.tl15Item[g_sMenuData.iLastTextItem]) != 0 fTotalWidth = END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDIF REPEAT iIconCount i IF g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem-iIconCount+i] <> MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem-iIconCount+i], TRUE, FALSE, fWidth, fHeight) fTotalWidth += fWidth ENDIF ENDREPEAT RETURN fTotalWidth ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_WIDTH_WITH_INT(STRING sLabel, INT iNumber) IF NOT DOES_TEXT_LABEL_EXIST(sLabel) RETURN 0.0 ENDIF SETUP_MENU_ITEM_TEXT(TRUE) BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(sLabel) ADD_TEXT_COMPONENT_INTEGER(iNumber) RETURN END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_WIDTH_WITH_FLOAT(STRING sLabel, FLOAT fNumber, INT iDecimalPlaces) IF NOT DOES_TEXT_LABEL_EXIST(sLabel) RETURN 0.0 ENDIF SETUP_MENU_ITEM_TEXT(TRUE) BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(sLabel) ADD_TEXT_COMPONENT_FLOAT(fNumber, iDecimalPlaces) RETURN END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_WIDTH_WITH_LITERAL(STRING sLabel, STRING sLiteral, BOOL bCondensedFont = FALSE) IF NOT DOES_TEXT_LABEL_EXIST(sLabel) RETURN 0.0 ENDIF SETUP_MENU_ITEM_TEXT(TRUE, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, bCondensedFont) BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(sLabel) ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(sLiteral) RETURN END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_HEIGHT(STRING sLabel) // At some point we may add multiply this value by the number of lines that the string occupies // We would need to add x/y screen and wrap coords. IF NOT DOES_TEXT_LABEL_EXIST(sLabel) ENDIF RETURN GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) ENDFUNC FUNC FLOAT GET_LAST_MENU_ITEM_TEXT_HEIGHT() // At some point we may add multiply this value by the number of lines that the string occupies // We would need to add x/y screen and wrap coords. INT i, iIconCount FLOAT fFinalHeight, fWidth, fHeight REPEAT g_sMenuData.iComponentCount i IF g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][i] = MENU_TEXT_COMP_ICON iIconCount++ ENDIF ENDREPEAT REPEAT iIconCount i IF g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem-iIconCount+i] <> MENU_ICON_DUMMY IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem-iIconCount+i], TRUE, FALSE, fWidth, fHeight) IF fHeight > fFinalHeight fFinalHeight = fHeight ENDIF ENDIF ENDIF ENDREPEAT IF fFinalHeight > GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) RETURN fFinalHeight ENDIF RETURN GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_HEIGHT_WITH_INT(STRING sLabel, INT iNumber) // At some point we may add multiply this value by the number of lines that the string occupies // We would need to add x/y screen and wrap coords. IF NOT DOES_TEXT_LABEL_EXIST(sLabel) ENDIF IF iNumber = 0 ENDIF RETURN GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) ENDFUNC FUNC FLOAT GET_MENU_ITEM_TEXT_HEIGHT_WITH_FLOAT(STRING sLabel, FLOAT fNumber, INT iDecimalPlaces) // At some point we may add multiply this value by the number of lines that the string occupies // We would need to add x/y screen and wrap coords. IF NOT DOES_TEXT_LABEL_EXIST(sLabel) ENDIF IF fNumber = 0 ENDIF IF iDecimalPlaces = 0 ENDIF RETURN GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y) ENDFUNC /// PURPOSE: Resets all the stored menu data back to the default state PROC CLEAR_MENU_DATA(BOOL bUseActualRes = FALSE, BOOL bClearSelectable = FALSE) DEBUG_PRINTCALLSTACK() INT i, j REPEAT MAX_STORED_MENU_TEXT_LABELS i g_sMenuData.tl15Item[i] = "" REPEAT MAX_STORED_TEXT_COMPS j g_sMenuData.eTextItemComps[i][j] = MENU_TEXT_COMP_DUMMY ENDREPEAT ENDREPEAT REPEAT MAX_STORED_MENU_PLAYER_NAMES i g_TUMenuGlobals_tlPlayerNameItem[i] = "" ENDREPEAT REPEAT MAX_STORED_MENU_INTS i g_sMenuData.iItem[i] = 0 ENDREPEAT REPEAT MAX_STORED_MENU_FLOATS i g_sMenuData.fItem[i] = 0.0 ENDREPEAT REPEAT MAX_STORED_MENU_ICONS i g_sMenuData.eIconItem[i] = MENU_ICON_DUMMY ENDREPEAT REPEAT MAX_MENU_ROWS i g_sMenuData.iItemBitset[i] = 0 g_sMenuData.bMenuRowDoesntAddToCount[i] = FALSE g_sMenuData.bMenuRowHasSpacer[i] = FALSE g_sMenuData.fMenuItemScreenY[i] = 0.0 g_sMenuData.bMenuRowHasDisplayItems[i] = FALSE g_sMenuData.fRowHeight[i] = 0.0 ENDREPEAT REPEAT MAX_MENU_COLUMNS i g_sMenuData.eItemLayout[i] = MENU_ITEM_DUMMY g_sMenuData.fColumnWidth[i] = 0.0 g_sMenuData.fColumnXOffset[i] = -1.0 g_sMenuData.bItemToggleable[i] = FALSE g_sMenuData.eJustification[i] = FONT_LEFT ENDREPEAT REPEAT MAX_STORED_HELP_KEYS i g_sMenuData.tl15HelpText[i] = "" g_sMenuData.iHelpTextINT[i] = -1 g_sMenuData.caHelpTextInput[i] = MAX_INPUTS g_sMenuData.caHelpTextInputGroup[i] = MAX_INPUTGROUPS ENDREPEAT REPEAT CUSTOM_MENU_ICON_COUNT i g_sMenuData.sIconTXDOverride[i] = "" g_sMenuData.sIconTextureOverride[i] = "" ENDREPEAT IF bClearSelectable REPEAT MAX_STORED_MENU_TEXT_LABELS i g_sMenuData.bIsSelectable[i] = FALSE ENDREPEAT ENDIF #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.tl15HelpText = "" g_sMenuData_TU.iHelpTextINT = -1 #ENDIF g_sMenuData.bUseHeaderGraphic = FALSE // g_sMenuData.bForceFooter = FALSE g_sMenuData.iCurrentRow = 0 g_sMenuData.iCurrentColumn = 0 g_sMenuData.iCurrentTextItem = 0 g_sMenuData.iCurrentIntItem = 0 g_sMenuData.iCurrentFloatItem = 0 g_sMenuData.iCurrentIconItem = 0 g_sMenuData.iCurrentPlayerNameItem = 0 g_sMenuData.bDisplayCurrentItemToggles = FALSE g_sMenuData.bDefaultOptionAdded = FALSE g_sMenuData.iCurrentItem = 0 g_sMenuData.iTopItem = 0 g_sMenuData.iLastDisplayItem = 0 g_sMenuData.tl23Desc = "" g_sMenuData.iDescTotalParams = 0 g_sMenuData.iDescIntParams = 0 g_sMenuData.iDescFloatParams = 0 g_sMenuData.iDescTextParams = 0 g_sMenuData.iDescClearTimer = 0 g_sMenuData.iDescStartTimer = 0 REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT g_sMenuData.eDescIcon = MENU_ICON_DUMMY g_sMenuData_TU.tl15Discount = "" g_sMenuData_TU.iDiscountTotalParams = 0 g_sMenuData_TU.iDiscountIntParams = 0 g_sMenuData_TU.iDiscountFloatParams = 0 g_sMenuData_TU.iDiscountTextParams = 0 g_sMenuData_TU.iDiscountClearTimer = 0 g_sMenuData_TU.iDiscountStartTimer = 0 REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT g_sMenuData_TU.eDiscountIcon = MENU_ICON_DUMMY g_sMenuData.tl15Title = "" g_sMenuData.fTitleWidth = 0.0 g_sMenuData.iTitleTotalParams = 0 g_sMenuData.iTitleIntParams = 0 g_sMenuData.iTitleFloatParams = 0 g_sMenuData.iTitleTextParams = 0 g_sMenuData.iTitlePlayerNameParams = 0 REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT g_sMenuData.eLastAddedItemType = MENU_ITEM_DUMMY g_sMenuData.iComponentCount = 0 g_sMenuData.iComponentItems = 0 g_sMenuData.iLastTextItem = 0 g_sMenuData.iHelpCount = 0 g_sMenuData.bHelpCreated = FALSE g_sMenuData.iMenuRows = 10 g_sMenuData.iMenuColumns = 0 g_sMenuData.fMenuFinalScreenY = 0.0 g_sMenuData.fCurrentItemScreenY = 0.0 g_sMenuData.bSetupComplete = FALSE g_sMenuData.bDisplayRowsDefined = FALSE g_sMenuData.fSetupFinalBodyY = 0.0 g_sMenuData.iSetupTotalRows = 0 g_sMenuData.iSetupTotalSelectableRows = 0 g_sMenuData.iSetupTotalDisplayRows = 0 g_sMenuData.iSetupCurrentSelectableItem = 0 g_sMenuData.bOverrideTitleRowCounts = FALSE g_sMenuData.iTitleRowOverride1 = 0 g_sMenuData.iTitleRowOverride2 = 0 g_sMenuData.bUseCustomRowColour = FALSE REPEAT MAX_COLOURED_ITEMS i g_sMenuData.iCarColourItem[i] = -1 g_sMenuData.iCarColour[i] = -1 ENDREPEAT g_sMenuData.fHelpKeyClearSpace = 0.0 g_sMenuData.iHelpKeyIsClickableBits = 0 g_sMenuData.bStackedKeys = FALSE REPEAT COUNT_OF(g_sMenuData.iRowIsGrayedOutBS) i g_sMenuData.iRowIsGrayedOutBS[i] = 0 ENDREPEAT g_sMenuData.bUseCustomHeaderTextColour = FALSE g_sMenuData.bUseCustomHeaderColour = FALSE g_sMenuData.bUseCustomBodyColour = FALSE g_sMenuData.bUseCustomFooterColour = FALSE g_sMenuData.bUseCustomHelpColour = FALSE g_sMenuData.bUseCustomSelectionBarColour = FALSE g_sMenuData.bUseInvertedScrollColour = FALSE CUSTOM_MENU_X = 0.05 CUSTOM_MENU_Y = 0.05 CUSTOM_MENU_W = 0.225 // Force the menu width to match the current screen size. FLOAT fScreenAspectRatio = GET_ASPECT_RATIO(FALSE) IF bUseActualRes // Scales the menu width depending on the aspect ratio (fake) and normalises against a 16:9 ratio CUSTOM_MENU_W = ( 0.225 * ( CUSTOM_MENU_SIXTEEN_BY_NINE_ASPECT / fScreenAspectRatio ) ) ELSE IF fScreenAspectRatio < 1.77777 CUSTOM_MENU_W = ( 0.225 * ( CUSTOM_MENU_SIXTEEN_BY_NINE_ASPECT / fScreenAspectRatio ) ) ELSE CUSTOM_MENU_W = 0.225 ENDIF ENDIF ENDPROC /// PURPOSE: Define the item layout for a menu row PROC SET_MENU_ITEM_LAYOUT(MENU_ITEM_TYPE param1 = MENU_ITEM_DUMMY, MENU_ITEM_TYPE param2 = MENU_ITEM_DUMMY, MENU_ITEM_TYPE param3 = MENU_ITEM_DUMMY, MENU_ITEM_TYPE param4 = MENU_ITEM_DUMMY, MENU_ITEM_TYPE param5 = MENU_ITEM_DUMMY) g_sMenuData.eItemLayout[0] = param1 g_sMenuData.eItemLayout[1] = param2 g_sMenuData.eItemLayout[2] = param3 g_sMenuData.eItemLayout[3] = param4 g_sMenuData.eItemLayout[4] = param5 g_sMenuData.iMenuColumns = 0 IF param1 != MENU_ITEM_DUMMY g_sMenuData.iMenuColumns++ ENDIF IF param2 != MENU_ITEM_DUMMY g_sMenuData.iMenuColumns++ ENDIF IF param3 != MENU_ITEM_DUMMY g_sMenuData.iMenuColumns++ ENDIF IF param4 != MENU_ITEM_DUMMY g_sMenuData.iMenuColumns++ ENDIF IF param5 != MENU_ITEM_DUMMY g_sMenuData.iMenuColumns++ ENDIF ENDPROC /// PURPOSE: Sets the x offset for the given menu item /// NOTE: This offset is from the x pos of the menu, not the previous column PROC SET_MENU_ITEM_X_OFFSET(FLOAT param1 = -1.0, FLOAT param2 = -1.0, FLOAT param3 = -1.0, FLOAT param4 = -1.0, FLOAT param5 = -1.0) g_sMenuData.fColumnXOffset[0] = param1 g_sMenuData.fColumnXOffset[1] = param2 g_sMenuData.fColumnXOffset[2] = param3 g_sMenuData.fColumnXOffset[3] = param4 g_sMenuData.fColumnXOffset[4] = param5 ENDPROC /// PURPOSE: Sets the cell alignment of a given menu item PROC SET_MENU_ITEM_JUSTIFICATION(eTextJustification param1 = FONT_LEFT, eTextJustification param2 = FONT_LEFT, eTextJustification param3 = FONT_LEFT, eTextJustification param4 = FONT_LEFT, eTextJustification param5 = FONT_LEFT) g_sMenuData.eJustification[0] = param1 g_sMenuData.eJustification[1] = param2 g_sMenuData.eJustification[2] = param3 g_sMenuData.eJustification[3] = param4 g_sMenuData.eJustification[4] = param5 ENDPROC /// PURPOSE: Sets the width of a given menu item PROC SET_MENU_ITEM_TOGGLEABLE(BOOL param1 = FALSE, BOOL param2 = FALSE, BOOL param3 = FALSE, BOOL param4 = FALSE, BOOL param5 = FALSE) g_sMenuData.bItemToggleable[0] = param1 g_sMenuData.bItemToggleable[1] = param2 g_sMenuData.bItemToggleable[2] = param3 g_sMenuData.bItemToggleable[3] = param4 g_sMenuData.bItemToggleable[4] = param5 ENDPROC /// PURPOSE: Sets the number of rows in the menu /// NOTE: This will get set to 10 when CLEAR_MENU_DATA() is called PROC SET_MENU_ROW_ADDS_TO_COUNT(INT paramRow, BOOL paramAddToCount) g_sMenuData.bMenuRowDoesntAddToCount[paramRow] = !paramAddToCount ENDPROC /// PURPOSE: Sets the number of rows in the menu /// NOTE: This will get set to 10 when CLEAR_MENU_DATA() is called PROC SET_MAX_MENU_ROWS_TO_DISPLAY(INT paramMaxRowsToDisplay) g_sMenuData.iMenuRows = paramMaxRowsToDisplay ENDPROC /// PURPOSE: Gets the number of rows in the menu FUNC INT GET_MAX_MENU_ROWS_TO_DISPLAY() RETURN g_sMenuData.iMenuRows ENDFUNC /// PURPOSE: Sets the x pos of the menu, default is 0.05 PROC SET_MENU_X_POS(FLOAT paramMenuXPos) CUSTOM_MENU_X = paramMenuXPos ENDPROC /// PURPOSE: Sets the clear space for menu help keys PROC SET_MENU_HELP_CLEAR_SPACE(FLOAT fScreenPercent) g_sMenuData.fHelpKeyClearSpace = fScreenPercent ENDPROC /// PURPOSE: Sets if the help keys should be stacked PROC SET_MENU_HELP_KEYS_STACKED(BOOL bStacked) g_sMenuData.bStackedKeys = bStacked ENDPROC PROC SET_MENU_ITEM_ICON_TEXTURE_OVERRIDE(MENU_ICON_TYPE paramIcon, STRING paramTXDOverride, STRING paramTextureOverride) g_sMenuData.sIconTXDOverride[paramIcon] = paramTXDOverride g_sMenuData.sIconTextureOverride[paramIcon] = paramTextureOverride ENDPROC PROC SET_MENU_HEADER_COLOUR(INT iRed, INT iGreen, INT iBlue, INT iAlpha, BOOL bUseCustomColour) g_sMenuData.bUseCustomHeaderColour = bUseCustomColour g_sMenuData.iHeaderR = iRed g_sMenuData.iHeaderG = iGreen g_sMenuData.iHeaderB = iBlue g_sMenuData.iHeaderA = iAlpha ENDPROC PROC SET_MENU_HEADER_TEXT_COLOUR(INT iRed, INT iGreen, INT iBlue, INT iAlpha, BOOL bUseCustomColour) g_sMenuData.bUseCustomHeaderTextColour = bUseCustomColour g_sMenuData.iHeaderTextR = iRed g_sMenuData.iHeaderTextG = iGreen g_sMenuData.iHeaderTextB = iBlue g_sMenuData.iHeaderTextA = iAlpha ENDPROC PROC SET_MENU_BODY_COLOUR(INT iRed, INT iGreen, INT iBlue, INT iAlpha, BOOL bUseCustomColour) g_sMenuData.bUseCustomBodyColour = bUseCustomColour g_sMenuData.iBodyR = iRed g_sMenuData.iBodyG = iGreen g_sMenuData.iBodyB = iBlue g_sMenuData.iBodyA = iAlpha ENDPROC PROC SET_MENU_FOOTER_COLOUR(INT iRed, INT iGreen, INT iBlue, INT iAlpha, BOOL bUseCustomColour) g_sMenuData.bUseCustomFooterColour = bUseCustomColour g_sMenuData.iFooterR = iRed g_sMenuData.iFooterG = iGreen g_sMenuData.iFooterB = iBlue g_sMenuData.iFooterA = iAlpha ENDPROC PROC SET_MENU_HELP_COLOUR(INT iRed, INT iGreen, INT iBlue, INT iAlpha, BOOL bUseCustomColour) g_sMenuData.bUseCustomHelpColour = bUseCustomColour g_sMenuData.iHelpR = iRed g_sMenuData.iHelpG = iGreen g_sMenuData.iHelpB = iBlue g_sMenuData.iHelpA = iAlpha ENDPROC PROC SET_MENU_SELECTION_BAR_COLOUR(HUD_COLOURS paramColour, BOOL bUseCustomColour) g_sMenuData.bUseCustomSelectionBarColour = bUseCustomColour g_sMenuData.eSelectionBarColour = paramColour ENDPROC PROC SET_MENU_ROW_TEXT_COLOUR(INT paramRow, HUD_COLOURS paramColourDefault, HUD_COLOURS paramColourSelected, BOOL bUseCustomColour) g_sMenuData.bUseCustomRowColour = bUseCustomColour g_sMenuData.eRowColour[0] = paramColourDefault g_sMenuData.eRowColour[1] = paramColourSelected g_sMenuData.iCustomRowColour = paramRow ENDPROC PROC SET_MENU_USES_INVERTED_SCROLL_ICON(BOOL bUseInvertedScrollColour) g_sMenuData.bUseInvertedScrollColour = bUseInvertedScrollColour ENDPROC PROC SET_CURSOR_POSITION_FOR_MENU() IF IS_PC_VERSION() SET_CURSOR_POSITION(0.325, 0.3)//0.2) // SET_CURSOR_POSITION(CUSTOM_MENU_X+(CUSTOM_MENU_W/2.0), CUSTOM_MENU_Y+(CUSTOM_MENU_ITEM_BAR_H*TO_FLOAT(iStartItem))) ENDIF ENDPROC ////////////////////////////////////////////////////////////////////////////// /// /// HEADER /// /// PURPOSE: Set the header graphic PROC SET_MENU_USES_HEADER_GRAPHIC(BOOL paramUseGraphic, STRING paramGraphicTXD, STRING paramGraphicTexture) g_sMenuData.bUseHeaderGraphic = paramUseGraphic SET_MENU_ITEM_ICON_TEXTURE_OVERRIDE(MENU_ICON_HEADER, paramGraphicTXD, paramGraphicTexture) ENDPROC ////////////////////////////////////////////////////////////////////////////// /// /// TITLE /// /// PURPOSE: Set the menu title PROC SET_MENU_TITLE(STRING paramLabel) g_sMenuData.tl15Title = paramLabel g_sMenuData.iTitleTotalParams = 0 g_sMenuData.iTitleIntParams = 0 g_sMenuData.iTitleFloatParams = 0 g_sMenuData.iTitleTextParams = 0 g_sMenuData.iTitlePlayerNameParams = 0 INT i REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT ENDPROC /// PURPOSE: Adds an int to the item description PROC ADD_MENU_TITLE_INT(INT paramInt) IF g_sMenuData.iTitleIntParams >= MAX_STORED_DESC_INTS OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_TITLE_INT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_INT g_sMenuData.iTitleTotalParams++ g_sMenuData.iTitleInt[g_sMenuData.iTitleIntParams] = paramInt g_sMenuData.iTitleIntParams++ ENDPROC /// PURPOSE: Adds a float to the item description PROC ADD_MENU_TITLE_FLOAT(FLOAT paramFloat, INT paramDecimalPlaces = 1) IF g_sMenuData.iTitleFloatParams >= MAX_STORED_DESC_FLOATS OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_TITLE_FLOAT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_FLOAT g_sMenuData.iTitleTotalParams++ g_sMenuData.fTitleFloat[g_sMenuData.iTitleFloatParams] = paramFloat g_sMenuData.iTitleFloatDP[g_sMenuData.iTitleFloatParams] = paramDecimalPlaces g_sMenuData.iTitleFloatParams++ ENDPROC /// PURPOSE: Adds a float to the item description PROC ADD_MENU_TITLE_STRING(STRING paramSubString) IF g_sMenuData.iTitleTextParams >= MAX_STORED_DESC_STRINGS OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_TITLE_STRING: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_TEXT g_sMenuData.iTitleTotalParams++ g_sMenuData.tl15TitleText[g_sMenuData.iTitleTextParams] = paramSubString g_sMenuData.iTitleTextParams++ ENDPROC /// PURPOSE: Adds a player name to the title PROC ADD_PLAYER_NAME_TO_MENU_TITLE(TEXT_LABEL_63 tlPlayerNameItem) IF g_sMenuData.iTitlePlayerNameParams >= MAX_STORED_DESC_PLAYER_NAMES OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_PLAYER_NAME_TO_MENU_TITLE: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_PLAYER_NAME g_sMenuData.iTitleTotalParams++ g_sMenuData.tlTitlePlayerName[g_sMenuData.iTitlePlayerNameParams] = tlPlayerNameItem g_sMenuData.iTitlePlayerNameParams++ ENDPROC /// PURPOSE: Adds a player name to the title PROC ADD_LITERAL_TO_MENU_TITLE(STRING paramLiteral) IF g_sMenuData.iTitlePlayerNameParams >= MAX_STORED_DESC_PLAYER_NAMES OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_LITERAL_TO_MENU_TITLE: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_LITERAL g_sMenuData.iTitleTotalParams++ g_sMenuData.tlTitlePlayerName[g_sMenuData.iTitlePlayerNameParams] = paramLiteral g_sMenuData.iTitlePlayerNameParams++ ENDPROC /// PURPOSE: Adds a radio station name to the title PROC ADD_RADIO_STATION_NAME_TO_MENU_TITLE(TEXT_LABEL_31 tlRadioStationItem) IF g_sMenuData.iTitlePlayerNameParams >= MAX_STORED_DESC_PLAYER_NAMES OR g_sMenuData.iTitleTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_RADIO_STATION_NAME_TO_MENU_TITLE: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eTitleComps[g_sMenuData.iTitleTotalParams] = MENU_TEXT_COMP_RADIO_STATION g_sMenuData.iTitleTotalParams++ g_sMenuData.tlTitlePlayerName[g_sMenuData.iTitlePlayerNameParams] = tlRadioStationItem g_sMenuData.iTitlePlayerNameParams++ ENDPROC /// PURPOSE: Sets the minimum width of the title box PROC SET_MENU_TITLE_WIDTH(FLOAT paramWidth) g_sMenuData.fTitleWidth = paramWidth ENDPROC /// PURPOSE: Override the current row selection and total row count that appears on the title bar PROC SET_MENU_TITLE_ROW_COUNT_OVERRIDE(BOOL bOverride, INT iCurrent, INT iTotal) g_sMenuData.bOverrideTitleRowCounts = bOverride g_sMenuData.iTitleRowOverride1 = iCurrent g_sMenuData.iTitleRowOverride2 = iTotal ENDPROC ////////////////////////////////////////////////////////////////////////////// /// /// DESCRIPTION /// /// PURPOSE: Returns the description label PROC GET_CURRENT_MENU_ITEM_DESCRIPTION(TEXT_LABEL_15 &tlDesc) tlDesc = g_sMenuData.tl23Desc ENDPROC /// PURPOSE: Set the current item description PROC SET_CURRENT_MENU_ITEM_DESCRIPTION_AS_TEXT_LABEL(TEXT_LABEL_23 paramLabel, INT paramClearTimer = 0, MENU_ICON_TYPE eIcon = MENU_ICON_DUMMY) g_sMenuData.tl23Desc = paramLabel g_sMenuData.iDescTotalParams = 0 g_sMenuData.iDescIntParams = 0 g_sMenuData.iDescFloatParams = 0 g_sMenuData.iDescTextParams = 0 g_sMenuData.iDescClearTimer = paramClearTimer g_sMenuData.iDescStartTimer = GET_GAME_TIMER() g_sMenuData.eDescIcon = eIcon INT i REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT ENDPROC PROC SET_CURRENT_MENU_ITEM_DESCRIPTION(STRING paramLabel, INT paramClearTimer = 0, MENU_ICON_TYPE eIcon = MENU_ICON_DUMMY) g_sMenuData.tl23Desc = paramLabel g_sMenuData.iDescTotalParams = 0 g_sMenuData.iDescIntParams = 0 g_sMenuData.iDescFloatParams = 0 g_sMenuData.iDescTextParams = 0 g_sMenuData.iDescClearTimer = paramClearTimer g_sMenuData.iDescStartTimer = GET_GAME_TIMER() g_sMenuData.eDescIcon = eIcon INT i REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT ENDPROC PROC SET_CURRENT_MENU_ITEM_DESCRIPTION_EXTRA(STRING paramLabel) g_sMenuData.tl23DescExtra = paramLabel ENDPROC /// PURPOSE: Adds an int to the item description PROC ADD_CURRENT_MENU_ITEM_DESCRIPTION_INT(INT paramInt) IF g_sMenuData.iDescIntParams >= MAX_STORED_DESC_INTS OR g_sMenuData.iDescTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DESCRIPTION_INT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eDescComps[g_sMenuData.iDescTotalParams] = MENU_TEXT_COMP_INT g_sMenuData.iDescTotalParams++ g_sMenuData.iDescInt[g_sMenuData.iDescIntParams] = paramInt g_sMenuData.iDescIntParams++ ENDPROC /// PURPOSE: Adds a float to the item description PROC ADD_CURRENT_MENU_ITEM_DESCRIPTION_FLOAT(FLOAT paramFloat, INT paramDecimalPlaces = 1) IF g_sMenuData.iDescFloatParams >= MAX_STORED_DESC_FLOATS OR g_sMenuData.iDescTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DESCRIPTION_FLOAT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eDescComps[g_sMenuData.iDescTotalParams] = MENU_TEXT_COMP_FLOAT g_sMenuData.iDescTotalParams++ g_sMenuData.fDescFloat[g_sMenuData.iDescFloatParams] = paramFloat g_sMenuData.iDescFloatDP[g_sMenuData.iDescFloatParams] = paramDecimalPlaces g_sMenuData.iDescFloatParams++ ENDPROC /// PURPOSE: Adds a string to the item description PROC ADD_CURRENT_MENU_ITEM_DESCRIPTION_STRING(STRING paramSubString) IF g_sMenuData.iDescTextParams >= MAX_STORED_DESC_STRINGS OR g_sMenuData.iDescTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DESCRIPTION_STRING: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eDescComps[g_sMenuData.iDescTotalParams] = MENU_TEXT_COMP_TEXT g_sMenuData.iDescTotalParams++ g_sMenuData.tl15DescText[g_sMenuData.iDescTextParams] = paramSubString g_sMenuData.iDescTextParams++ ENDPROC /// PURPOSE: Adds a player name to the item description PROC ADD_CURRENT_MENU_ITEM_DESCRIPTION_PLAYER_NAME(STRING paramPlayerName) IF g_sMenuData.iDescTextParams >= MAX_STORED_DESC_STRINGS OR g_sMenuData.iDescTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DESCRIPTION_PLAYER_NAME: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eDescComps[g_sMenuData.iDescTotalParams] = MENU_TEXT_COMP_PLAYER_NAME g_sMenuData.iDescTotalParams++ g_sMenuData.tl15DescText[g_sMenuData.iDescTextParams] = paramPlayerName g_sMenuData.iDescTextParams++ ENDPROC /// PURPOSE: Adds a player name to the item description PROC ADD_CURRENT_MENU_ITEM_DESCRIPTION_RADIO_STATION(STRING paramPlayerName) IF g_sMenuData.iDescTextParams >= MAX_STORED_DESC_STRINGS OR g_sMenuData.iDescTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DESCRIPTION_RADIO_STATION: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.eDescComps[g_sMenuData.iDescTotalParams] = MENU_TEXT_COMP_RADIO_STATION g_sMenuData.iDescTotalParams++ g_sMenuData.tl15DescText[g_sMenuData.iDescTextParams] = paramPlayerName g_sMenuData.iDescTextParams++ ENDPROC ////////////////////////////////////////////////////////////////////////////// /// /// DISCOUNT /// /// PURPOSE: Returns the Discount label PROC GET_CURRENT_MENU_ITEM_DISCOUNT(TEXT_LABEL_15 &tlDiscount) tlDiscount = g_sMenuData_TU.tl15Discount ENDPROC /// PURPOSE: Set the current item Discount PROC SET_CURRENT_MENU_ITEM_DISCOUNT(STRING paramLabel, INT paramClearTimer = 0, MENU_ICON_TYPE eIcon = MENU_ICON_DUMMY) g_sMenuData_TU.tl15Discount = paramLabel g_sMenuData_TU.iDiscountTotalParams = 0 g_sMenuData_TU.iDiscountIntParams = 0 g_sMenuData_TU.iDiscountFloatParams = 0 g_sMenuData_TU.iDiscountTextParams = 0 g_sMenuData_TU.iDiscountClearTimer = paramClearTimer g_sMenuData_TU.iDiscountStartTimer = GET_GAME_TIMER() g_sMenuData_TU.eDiscountIcon = eIcon INT i REPEAT MAX_STORED_TEXT_COMPS i g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_DUMMY ENDREPEAT ENDPROC /// PURPOSE: Adds an int to the item Discount PROC ADD_CURRENT_MENU_ITEM_DISCOUNT_INT(INT paramInt) IF g_sMenuData_TU.iDiscountIntParams >= MAX_STORED_DISCOUNT_INTS OR g_sMenuData_TU.iDiscountTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DISCOUNT_INT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData_TU.eDiscountComps[g_sMenuData_TU.iDiscountTotalParams] = MENU_TEXT_COMP_INT g_sMenuData_TU.iDiscountTotalParams++ g_sMenuData_TU.iDiscountInt[g_sMenuData_TU.iDiscountIntParams] = paramInt g_sMenuData_TU.iDiscountIntParams++ ENDPROC /// PURPOSE: Adds a float to the item Discount PROC ADD_CURRENT_MENU_ITEM_DISCOUNT_FLOAT(FLOAT paramFloat, INT paramDecimalPlaces = 1) IF g_sMenuData_TU.iDiscountFloatParams >= MAX_STORED_DISCOUNT_FLOATS OR g_sMenuData_TU.iDiscountTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DISCOUNT_FLOAT: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData_TU.eDiscountComps[g_sMenuData_TU.iDiscountTotalParams] = MENU_TEXT_COMP_FLOAT g_sMenuData_TU.iDiscountTotalParams++ g_sMenuData_TU.fDiscountFloat[g_sMenuData_TU.iDiscountFloatParams] = paramFloat g_sMenuData_TU.iDiscountFloatDP[g_sMenuData_TU.iDiscountFloatParams] = paramDecimalPlaces g_sMenuData_TU.iDiscountFloatParams++ ENDPROC /// PURPOSE: Adds a string to the item Discount PROC ADD_CURRENT_MENU_ITEM_DISCOUNT_STRING(STRING paramSubString) IF g_sMenuData_TU.iDiscountTextParams >= MAX_STORED_DISCOUNT_STRINGS OR g_sMenuData_TU.iDiscountTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DISCOUNT_STRING: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData_TU.eDiscountComps[g_sMenuData_TU.iDiscountTotalParams] = MENU_TEXT_COMP_TEXT g_sMenuData_TU.iDiscountTotalParams++ g_sMenuData_TU.tl15DiscountText[g_sMenuData_TU.iDiscountTextParams] = paramSubString g_sMenuData_TU.iDiscountTextParams++ ENDPROC /// PURPOSE: Adds a player name to the item Discount PROC ADD_CURRENT_MENU_ITEM_DISCOUNT_PLAYER_NAME(STRING paramPlayerName) IF g_sMenuData_TU.iDiscountTextParams >= MAX_STORED_DISCOUNT_STRINGS OR g_sMenuData_TU.iDiscountTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DISCOUNT_PLAYER_NAME: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData_TU.eDiscountComps[g_sMenuData_TU.iDiscountTotalParams] = MENU_TEXT_COMP_PLAYER_NAME g_sMenuData_TU.iDiscountTotalParams++ g_sMenuData_TU.tl15DiscountText[g_sMenuData_TU.iDiscountTextParams] = paramPlayerName g_sMenuData_TU.iDiscountTextParams++ ENDPROC /// PURPOSE: Adds a player name to the item Discount PROC ADD_CURRENT_MENU_ITEM_DISCOUNT_RADIO_STATION(STRING paramPlayerName) IF g_sMenuData_TU.iDiscountTextParams >= MAX_STORED_DISCOUNT_STRINGS OR g_sMenuData_TU.iDiscountTotalParams >= MAX_STORED_TEXT_COMPS #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_CURRENT_MENU_ITEM_DISCOUNT_RADIO_STATION: Unable to add new param. If you need more params tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData_TU.eDiscountComps[g_sMenuData_TU.iDiscountTotalParams] = MENU_TEXT_COMP_RADIO_STATION g_sMenuData_TU.iDiscountTotalParams++ g_sMenuData_TU.tl15DiscountText[g_sMenuData_TU.iDiscountTextParams] = paramPlayerName g_sMenuData_TU.iDiscountTextParams++ ENDPROC ////////////////////////////////////////////////////////////////////////////// /// /// MENU ITEMS /// /// PURPOSE: Specifies if the specific menu item should use car colours when drawing to screen PROC SET_MENU_ITEM_USES_CAR_COLOUR(INT iMenuRow, INT iMenuColumn, INT iCarColour, INT iArray = 0) IF iArray < MAX_COLOURED_ITEMS g_sMenuData.iCarColourItem[iArray] = (iMenuRow*MAX_MENU_COLUMNS)+iMenuColumn g_sMenuData.iCarColour[iArray] = iCarColour ENDIF ENDPROC /// PURPOSE: Specifies which menu item we should be displaying at the top of the list PROC SET_TOP_MENU_ITEM(INT iTopItem) g_sMenuData.iTopItem = iTopItem ENDPROC /// PURPOSE: Specifies which menu item we should be displaying at the top of the list FUNC INT GET_TOP_MENU_ITEM() RETURN g_sMenuData.iTopItem ENDFUNC /// PURPOSE: Specifies which menu item we should be highlighting PROC SET_CURRENT_MENU_ITEM(INT iCurrentItem, BOOL bClearCurrentItemDescription = TRUE, BOOL bDisplayToggles = TRUE) g_sMenuData.iCurrentItem = iCurrentItem g_sMenuData.bDisplayCurrentItemToggles = bDisplayToggles // Update top item IF g_sMenuData.iCurrentItem < g_sMenuData.iTopItem g_sMenuData.iTopItem = g_sMenuData.iCurrentItem ELIF (g_sMenuData.bDisplayRowsDefined AND g_sMenuData.iCurrentItem > g_sMenuData.iLastDisplayItem) OR (NOT g_sMenuData.bDisplayRowsDefined AND g_sMenuData.iCurrentItem >= (g_sMenuData.iTopItem+g_sMenuData.iMenuRows)) // Update top item until we have 10 items on display INT i, iItemCount FOR i = g_sMenuData.iTopItem TO g_sMenuData.iCurrentItem IF i >= 0 AND i < MAX_MENU_ROWS-1 IF g_sMenuData.iItemBitset[i] != 0 iItemCount++ ENDIF ENDIF ENDFOR WHILE iItemCount > g_sMenuData.iMenuRows AND g_sMenuData.iTopItem < MAX_MENU_ROWS g_sMenuData.iTopItem++ iItemCount = 0 FOR i = g_sMenuData.iTopItem TO g_sMenuData.iCurrentItem IF i >= 0 AND i < MAX_MENU_ROWS-1 IF g_sMenuData.iItemBitset[i] != 0 iItemCount++ ENDIF ENDIF ENDFOR ENDWHILE ENDIF // Force update so we can get new item count g_sMenuData.bSetupComplete = FALSE g_sMenuData.bDisplayRowsDefined = FALSE // Clear the item description IF bClearCurrentItemDescription g_sMenuData.tl23Desc = "" g_sMenuData_TU.tl15Discount = "" ENDIF ENDPROC PROC SET_CURRENT_MENU_ITEM_WITH_WRAP(INT iCurrentItem, BOOL bClearCurrentItemDescription = TRUE, BOOL bDisplayToggles = TRUE) IF iCurrentItem < 0 CDEBUG1LN(DEBUG_EXT_MENU, "(lower) Wrapping menu selection from ", iCurrentItem, " to ", g_sMenuData.iCurrentRow) iCurrentItem = g_sMenuData.iCurrentRow ELIF iCurrentItem > g_sMenuData.iCurrentRow CDEBUG1LN(DEBUG_EXT_MENU, "(upper) Wrapping menu selection from ", iCurrentItem, " to ", 0) iCurrentItem = 0 ENDIF SET_CURRENT_MENU_ITEM(iCurrentItem, bClearCurrentItemDescription, bDisplayToggles) ENDPROC PROC SET_CURRENT_MENU_ITEM_WITH_CLAMP(INT iCurrentItem, BOOL bClearCurrentItemDescription = TRUE, BOOL bDisplayToggles = TRUE) IF iCurrentItem < 0 CDEBUG1LN(DEBUG_EXT_MENU, "(lower) Clamping menu selection from ", iCurrentItem, " to ", 0) iCurrentItem = 0 ELIF iCurrentItem > g_sMenuData.iCurrentRow CDEBUG1LN(DEBUG_EXT_MENU, "(upper) Clamping menu selection from ", iCurrentItem, " to ", g_sMenuData.iCurrentRow) iCurrentItem = g_sMenuData.iCurrentRow ENDIF SET_CURRENT_MENU_ITEM(iCurrentItem, bClearCurrentItemDescription, bDisplayToggles) ENDPROC PROC SetMenuRowAsGrayedOut(INT iRow, BOOL bSet) INT iArray = FLOOR( TO_FLOAT(iRow) / 32.0) #IF IS_DEBUG_BUILD IF NOT (iArray < COUNT_OF(g_sMenuData.iRowIsGrayedOutBS)) SCRIPT_ASSERT("SetMenuRowAsGrayedOut - need to increase array size! see g_sMenuData.iRowIsGrayedOutBS[]") ENDIF #ENDIF IF (bSet) SET_BIT(g_sMenuData.iRowIsGrayedOutBS[iArray], (iRow - (iArray*32))) ELSE CLEAR_BIT(g_sMenuData.iRowIsGrayedOutBS[iArray], (iRow - (iArray*32))) ENDIF ENDPROC FUNC BOOL IS_RT_AND_LT_BEING_HELD() IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) RETURN IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CREATOR_RT) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CREATOR_LT) ENDIF RETURN IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RT) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LT) ENDFUNC FUNC BOOL IS_MENU_ROW_SELECTABLE(INT iRow) INT iArray = FLOOR( TO_FLOAT(iRow) / 32.0) #IF IS_DEBUG_BUILD IF NOT (iArray < COUNT_OF(g_sMenuData.iRowIsGrayedOutBS)) SCRIPT_ASSERT("IS_MENU_ROW_SELECTABLE - need to increase array size! see MenuData.iRowIsGrayedOutBS[]") ENDIF #ENDIF IF IS_ROCKSTAR_DEV() AND IS_RT_AND_LT_BEING_HELD() AND GET_CURRENT_GAMEMODE() = GAMEMODE_CREATOR RETURN FALSE ENDIF IF NOT IS_BIT_SET(g_sMenuData.iRowIsGrayedOutBS[iArray], (iRow - (iArray*32))) RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC FUNC FLOAT RESIZE_MENU_BASED_ON_STRING_LENGTH(STRING paramLabel, INT iMaxLength) // Returns a small increment to be added to whatever the default size of the menu is INT iStringOverflow = 0 FLOAT fMenuExtension = 0.0 g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem] = paramLabel INT iMenuOptionStringLength = GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(paramLabel) IF iMenuOptionStringLength > iMaxLength iStringOverflow = iMenuOptionStringLength - iMaxLength fMenuExtension = iStringOverflow / 100.0 ENDIF PRINTLN("[MJL][RESIZE_MENU_BASED_ON_STRING_LENGTH] iMenuOptionStringLength : ", iMenuOptionStringLength, " iStringOverflow : ", iStringOverflow, " fMenuExtension : ", fMenuExtension) RETURN fMenuExtension ENDFUNC /// PURPOSE: Set the value of the next text item PROC ADD_MENU_ITEM_TEXT(INT paramRow, STRING paramLabel, INT paramNumberOfSubComponents = 0, BOOL bIsSelectable = TRUE, BOOL bIsDefault = FALSE, BOOL bAdjustRowHeight = FALSE, BOOL bForceCondensedFont = FALSE) // Already defined menu row IF (g_sMenuData.iCurrentRow > paramRow) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT: Row ", paramRow, " already defined. Make sure you have called CLEAR_MENU() before building new menu \"", paramLabel, "\".") #ENDIF EXIT ENDIF // Ran out of menu row IF (g_sMenuData.iCurrentRow >= MAX_MENU_ROWS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT: Menu row is out of range. If you need more rows tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored variables IF (g_sMenuData.iCurrentTextItem >= MAX_STORED_MENU_TEXT_LABELS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT: Stored text item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Expecting component item IF (g_sMenuData.iComponentCount < g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT: Expecting component item for text label.") #ENDIF EXIT ENDIF // Update expected item IF (g_sMenuData.iCurrentRow != paramRow) g_sMenuData.iCurrentRow = paramRow g_sMenuData.iCurrentColumn = 0 ENDIF MENU_ITEM_TYPE eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] // Item type not expected (optional item must have been skipped) IF (eNextItem != MENU_ITEM_TEXT) // Find next item that matches type WHILE (g_sMenuData.iCurrentColumn < MAX_MENU_COLUMNS-1) AND (eNextItem != MENU_ITEM_TEXT) g_sMenuData.iCurrentColumn++ eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] ENDWHILE // Unable to find matching type IF (eNextItem != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT: Unable to add item ", paramRow, " \"", paramLabel, "\". Check that this item has been specified in SET_MENU_LAYOUT().") #ENDIF EXIT ENDIF ENDIF // Store the value g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem] = paramLabel #IF IS_DEBUG_BUILD IF g_sMenuData.iCurrentColumn = 0 INT realNameLength = GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(paramLabel) IF realNameLength > 23 realNameLength = 23 ENDIF g_sMenuData.realNames[paramRow] = GET_FIRST_N_CHARACTERS_OF_STRING(paramLabel, realNameLength) ENDIF #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(paramLabel) AND NOT DOES_TEXT_LABEL_EXIST(paramLabel) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "Text label \"", paramLabel, "\"is not in the GXT, this will not work.") #ENDIF ENDIF g_sMenuData.bIsSelectable[g_sMenuData.iCurrentTextItem] = bIsSelectable g_sMenuData.bIsDefault[g_sMenuData.iCurrentTextItem] = bIsDefault g_sMenuData.bForceCondensedFont[g_sMenuData.iCurrentTextItem] = bForceCondensedFont g_sMenuData.iCurrentTextItem++ IF NOT (bIsSelectable) SetMenuRowAsGrayedOut(g_sMenuData.iCurrentRow, TRUE) ELSE SetMenuRowAsGrayedOut(g_sMenuData.iCurrentRow, FALSE) ENDIF // Update column offset IF paramNumberOfSubComponents = 0 FLOAT fWidth = GET_MENU_ITEM_TEXT_WIDTH(g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem]) // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF paramNumberOfSubComponents = 0 FLOAT fHeight = GET_MENU_ITEM_TEXT_HEIGHT(g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem]) IF fHeight > g_sMenuData.fRowHeight[paramRow] g_sMenuData.fRowHeight[paramRow] = fHeight ENDIF ENDIF ENDIF // Mark the item as set SET_BIT(g_sMenuData.iItemBitset[paramRow], g_sMenuData.iCurrentColumn) g_sMenuData.iCurrentColumn++ // Set the last item type g_sMenuData.eLastAddedItemType = MENU_ITEM_TEXT // Set up last text item incase we add sub components g_sMenuData.iLastTextItem = g_sMenuData.iCurrentTextItem-1 g_sMenuData.iComponentCount = 0 g_sMenuData.iComponentItems = paramNumberOfSubComponents ENDPROC /// PURPOSE: Set the value of the next text item using a text label PROC ADD_MENU_ITEM_TEXT_TL(INT paramRow, TEXT_LABEL_63 paramLabel, INT paramNumberOfSubComponents = 0, BOOL bIsSelectable = TRUE, BOOL bIsDefault = FALSE, BOOL bAdjustRowHeight = FALSE) STRING strTextLabel = Get_String_From_TextLabel(paramLabel) ADD_MENU_ITEM_TEXT(paramRow, strTextLabel, paramNumberOfSubComponents, bIsSelectable, bIsDefault, bAdjustRowHeight) ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_INT(INT paramInt, BOOL bAdjustRowHeight = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentIntItem >= MAX_STORED_MENU_INTS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_INT: Stored int item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_INT: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_INT: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_INT: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_sMenuData.iItem[g_sMenuData.iCurrentIntItem] = paramInt g_sMenuData.iCurrentIntItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_INT g_sMenuData.iComponentCount++ // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_FLOAT(FLOAT paramFloat, INT paramDecimalPlaces = 1, BOOL bAdjustRowHeight = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentFloatItem >= MAX_STORED_MENU_FLOATS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_FLOAT: Stored float item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_FLOAT: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_FLOAT: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_FLOAT: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_sMenuData.fItem[g_sMenuData.iCurrentFloatItem] = paramFloat g_sMenuData.iFloatDP[g_sMenuData.iCurrentFloatItem] = paramDecimalPlaces g_sMenuData.iCurrentFloatItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_FLOAT g_sMenuData.iComponentCount++ // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_STRING(STRING paramSubString, BOOL bAdjustRowHeight = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentTextItem >= MAX_STORED_MENU_TEXT_LABELS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_STRING: Stored text item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_STRING: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_STRING: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_STRING: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem] = paramSubString g_sMenuData.iCurrentTextItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_TEXT g_sMenuData.iComponentCount++ // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_PLAYER_NAME(STRING paramPlayerName, BOOL bAdjustRowHeight = FALSE, BOOL bReduceTextToFitColumn = FALSE, BOOL bSetWidth = TRUE) // Ran out of stored variables IF (g_sMenuData.iCurrentPlayerNameItem >= MAX_STORED_MENU_PLAYER_NAMES) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_PLAYER_NAME: Stored player name item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_PLAYER_NAME: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_PLAYER_NAME: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_PLAYER_NAME: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem] = paramPlayerName g_sMenuData.iCurrentPlayerNameItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_PLAYER_NAME g_sMenuData.iComponentCount++ FLOAT fWidth = 0.0 IF (bSetWidth) fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() ENDIF // Reduce the string if required... IF bReduceTextToFitColumn // Removing for now as it dosent work for us. // We will need to scale the text... /*INT iLen = GET_LENGTH_OF_LITERAL_STRING(paramPlayerName) // If bigger than width... WHILE fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] IF iLen > 1 // chop a character off using audio command... paramPlayerName = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(paramPlayerName, 0, iLen-1) g_sMenuData.tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-1] = paramPlayerName fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() iLen-- ELSE fWidth = -1.0 // Bail ENDIF ENDWHILE*/ ENDIF // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_VEHICLE_NAME(STRING paramVehicleName, BOOL bAdjustRowHeight = FALSE) // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_VEHICLE_NAME: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_VEHICLE_NAME: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_sMenuData.tl15Item[g_sMenuData.iCurrentTextItem] = paramVehicleName g_sMenuData.iCurrentTextItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_VEHICLE_NAME g_sMenuData.iComponentCount++ // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_RADIO_STATION(STRING paramRadioStation, BOOL bAdjustRowHeight = FALSE, BOOL bReduceTextToFitColumn = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentPlayerNameItem >= MAX_STORED_MENU_PLAYER_NAMES) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_RADIO_STATION: Stored player name item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_RADIO_STATION: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_RADIO_STATION: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_RADIO_STATION: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem] = paramRadioStation g_sMenuData.iCurrentPlayerNameItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_RADIO_STATION g_sMenuData.iComponentCount++ FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Reduce the string if required... IF bReduceTextToFitColumn // Removing for now as it dosent work for us. // We will need to scale the text... /*INT iLen = GET_LENGTH_OF_LITERAL_STRING(paramPlayerName) // If bigger than width... WHILE fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] IF iLen > 1 // chop a character off using audio command... paramPlayerName = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(paramPlayerName, 0, iLen-1) g_sMenuData.tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-1] = paramPlayerName fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() iLen-- ELSE fWidth = -1.0 // Bail ENDIF ENDWHILE*/ ENDIF // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(STRING paramLiteral, BOOL bAdjustRowHeight = FALSE, BOOL bReduceTextToFitColumn = FALSE, BOOL bCondensedFont = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentPlayerNameItem >= MAX_STORED_MENU_PLAYER_NAMES) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL: Stored literal item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_TUMenuGlobals_tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem] = paramLiteral g_sMenuData.iCurrentPlayerNameItem++ // Set the component type for the last text item IF bCondensedFont g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_CONDENSED_LITERAL ELSE g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_LITERAL ENDIF g_sMenuData.iComponentCount++ FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Reduce the string if required... IF bReduceTextToFitColumn // Removing for now as it dosent work for us. // We will need to scale the text... /*INT iLen = GET_LENGTH_OF_LITERAL_STRING(paramLiteral) // If bigger than width... WHILE fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] IF iLen > 1 // chop a character off using audio command... paramLiteral = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(paramLiteral, 0, iLen-1) g_sMenuData.tlPlayerNameItem[g_sMenuData.iCurrentPlayerNameItem-1] = paramLiteral fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() iLen-- ELSE fWidth = -1.0 // Bail ENDIF ENDWHILE*/ ENDIF // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the sub component value of the current text item PROC ADD_MENU_ITEM_TEXT_COMPONENT_ICON(MENU_ICON_TYPE paramIcon, BOOL bAdjustRowHeight = FALSE) // Ran out of stored variables IF (g_sMenuData.iCurrentIconItem >= MAX_STORED_MENU_ICONS) #IF IS_DEBUG_BUILD PRINTLN("ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Stored icon item limit reached. iCurrentIconItem:", g_sMenuData.iCurrentIconItem, " >= MAX_STORED_MENU_ICONS:", MAX_STORED_MENU_ICONS) CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Stored icon item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored components IF (g_sMenuData.iComponentCount >= MAX_STORED_TEXT_COMPS) #IF IS_DEBUG_BUILD PRINTLN("ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Stored text component limit reached. iComponentCount:", g_sMenuData.iComponentCount, " >= MAX_STORED_TEXT_COMPS:", MAX_STORED_TEXT_COMPS) CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Stored text component limit reached.") #ENDIF EXIT ENDIF // Last item was not a text label IF (g_sMenuData.eLastAddedItemType != MENU_ITEM_TEXT) #IF IS_DEBUG_BUILD PRINTLN("ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Last item was not a text item. eLastAddedItemType:", g_sMenuData.eLastAddedItemType, " != MENU_ITEM_TEXT:", MENU_ITEM_TEXT) CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Last item was not a text item.") #ENDIF EXIT ENDIF // Not expecting a component item IF (g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD PRINTLN("ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Not expecting a component item. iComponentCount:", g_sMenuData.iComponentCount, " >= iComponentItems:", g_sMenuData.iComponentItems) CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_TEXT_COMPONENT_ICON: Not expecting a component item.") #ENDIF EXIT ENDIF // Store the value g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem] = paramIcon g_sMenuData.iCurrentIconItem++ // Set the component type for the last text item g_sMenuData.eTextItemComps[g_sMenuData.iLastTextItem][g_sMenuData.iComponentCount] = MENU_TEXT_COMP_ICON g_sMenuData.iComponentCount++ // Update column offset (use -1 as we would have incremented this when adding the main text label) IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fWidth = GET_LAST_MENU_ITEM_TEXT_WIDTH() // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] AND g_sMenuData.iComponentCount = g_sMenuData.iComponentItems //Must be last item FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn-1] = fWidth ENDIF ENDIF // Update row offset IF bAdjustRowHeight IF g_sMenuData.iComponentCount >= g_sMenuData.iComponentItems FLOAT fHeight = GET_LAST_MENU_ITEM_TEXT_HEIGHT() IF fHeight > g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] g_sMenuData.fRowHeight[g_sMenuData.iCurrentRow] = fHeight ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: Set the value of the next int item PROC ADD_MENU_ITEM_INT(INT paramRow, INT paramInt, BOOL bAdjustRowHeight = FALSE) // Already defined menu row IF (g_sMenuData.iCurrentRow > paramRow) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_INT: Row ", paramRow, " already defined. Make sure you have called CLEAR_MENU() before building new menu \"", paramInt, "\".") #ENDIF EXIT ENDIF // Ran out of menu row IF (g_sMenuData.iCurrentRow >= MAX_MENU_ROWS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_INT: Menu row is out of range. If you need more rows tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored variables IF (g_sMenuData.iCurrentIntItem >= MAX_STORED_MENU_INTS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_INT: Stored int item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Expecting component item IF (g_sMenuData.iComponentCount < g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_INT: Expecting component item for text label.") #ENDIF EXIT ENDIF // Update expected item IF (g_sMenuData.iCurrentRow != paramRow) g_sMenuData.iCurrentRow = paramRow g_sMenuData.iCurrentColumn = 0 ENDIF MENU_ITEM_TYPE eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] // Item type not expected (optional item must have been skipped) IF (eNextItem != MENU_ITEM_INT) // Find next item that matches type WHILE (g_sMenuData.iCurrentColumn < MAX_MENU_COLUMNS-1) AND (eNextItem != MENU_ITEM_INT) g_sMenuData.iCurrentColumn++ eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] ENDWHILE // Unable to find matching type IF (eNextItem != MENU_ITEM_INT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_INT: Unable to add item. Check that this item has been specified in SET_MENU_LAYOUT().") #ENDIF EXIT ENDIF ENDIF // Store the value g_sMenuData.iItem[g_sMenuData.iCurrentIntItem] = paramInt g_sMenuData.iCurrentIntItem++ // Update column offset FLOAT fWidth = GET_MENU_ITEM_TEXT_WIDTH_WITH_INT("NUMBER", paramInt) // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] = fWidth ENDIF // Update row offset IF bAdjustRowHeight FLOAT fHeight = GET_MENU_ITEM_TEXT_HEIGHT_WITH_INT("NUMBER", paramInt) IF fHeight > g_sMenuData.fRowHeight[paramRow] g_sMenuData.fRowHeight[paramRow] = fHeight ENDIF ENDIF // Mark the item as set SET_BIT(g_sMenuData.iItemBitset[paramRow], g_sMenuData.iCurrentColumn) g_sMenuData.iCurrentColumn++ // Set the last item type g_sMenuData.eLastAddedItemType = MENU_ITEM_INT ENDPROC /// PURPOSE: Set the value of the next float item PROC ADD_MENU_ITEM_FLOAT(INT paramRow, FLOAT paramFloat, INT paramDecimalPlaces = 1, BOOL bAdjustRowHeight = FALSE) // Already defined menu row IF (g_sMenuData.iCurrentRow > paramRow) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_FLOAT: Row ", paramRow, " already defined. Make sure you have called CLEAR_MENU() before building new menu \"", GET_STRING_FROM_FLOAT(paramFloat), "\".") #ENDIF EXIT ENDIF // Ran out of menu rows IF (g_sMenuData.iCurrentRow >= MAX_MENU_ROWS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_FLOAT: Menu row is out of range. If you need more rows tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored variables IF (g_sMenuData.iCurrentFloatItem >= MAX_STORED_MENU_FLOATS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_FLOAT: Stored float item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Expecting component item IF (g_sMenuData.iComponentCount < g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_FLOAT: Expecting component item for text label.") #ENDIF EXIT ENDIF // Update expected item IF (g_sMenuData.iCurrentRow != paramRow) g_sMenuData.iCurrentRow = paramRow g_sMenuData.iCurrentColumn = 0 ENDIF MENU_ITEM_TYPE eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] // Item type not expected (optional item must have been skipped) IF (eNextItem != MENU_ITEM_FLOAT) // Find next item that matches type WHILE (g_sMenuData.iCurrentColumn < MAX_MENU_COLUMNS-1) AND (eNextItem != MENU_ITEM_FLOAT) g_sMenuData.iCurrentColumn++ eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] ENDWHILE // Unable to find matching type IF (eNextItem != MENU_ITEM_FLOAT) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_FLOAT: Unable to add item. Check that this item has been specified in SET_MENU_LAYOUT().") #ENDIF EXIT ENDIF ENDIF // Store the value g_sMenuData.fItem[g_sMenuData.iCurrentFloatItem] = paramFloat g_sMenuData.iFloatDP[g_sMenuData.iCurrentFloatItem] = paramDecimalPlaces g_sMenuData.iCurrentFloatItem++ // Update column offset FLOAT fWidth = GET_MENU_ITEM_TEXT_WIDTH_WITH_FLOAT("NUMBER", paramFloat, paramDecimalPlaces) // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] = fWidth ENDIF // Update row offset IF bAdjustRowHeight FLOAT fHeight = GET_MENU_ITEM_TEXT_HEIGHT_WITH_FLOAT("NUMBER", paramFloat, paramDecimalPlaces) IF fHeight > g_sMenuData.fRowHeight[paramRow] g_sMenuData.fRowHeight[paramRow] = fHeight ENDIF ENDIF // Mark the item as set SET_BIT(g_sMenuData.iItemBitset[paramRow], g_sMenuData.iCurrentColumn) g_sMenuData.iCurrentColumn++ // Set the last item type g_sMenuData.eLastAddedItemType = MENU_ITEM_FLOAT ENDPROC /// PURPOSE: Add a space between the current and next menu items PROC ADD_MENU_SPACER() // Ran out of menu rows IF (g_sMenuData.iCurrentRow >= MAX_MENU_ROWS-1) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_SPACER: Menu row is out of range. If you need more rows tell Kenneth R.") #ENDIF EXIT ENDIF g_sMenuData.bMenuRowHasSpacer[g_sMenuData.iCurrentRow+1] = TRUE ENDPROC /// PURPOSE: Set the value of the next icon item PROC ADD_MENU_ITEM_ICON(INT paramRow, MENU_ICON_TYPE paramIcon, BOOL bAdjustRowHeight = FALSE) // Already defined menu row IF (g_sMenuData.iCurrentRow > paramRow) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_ICON: Row ", paramRow, " already defined. Make sure you have called CLEAR_MENU() before building new menu \"", ENUM_TO_INT(paramIcon), "\".") #ENDIF EXIT ENDIF // Ran out of menu rows IF (g_sMenuData.iCurrentRow >= MAX_MENU_ROWS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_ICON: Menu row is out of range. If you need more rows tell Kenneth R.") #ENDIF EXIT ENDIF // Ran out of stored variables IF (g_sMenuData.iCurrentIconItem >= MAX_STORED_MENU_ICONS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_ICON: Stored icon item limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Expecting component item IF (g_sMenuData.iComponentCount < g_sMenuData.iComponentItems) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_ICON: Expecting component item for text label.") #ENDIF EXIT ENDIF // Update expected item IF (g_sMenuData.iCurrentRow != paramRow) g_sMenuData.iCurrentRow = paramRow g_sMenuData.iCurrentColumn = 0 ENDIF MENU_ITEM_TYPE eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] // Item type not expected (optional item must have been skipped) IF (eNextItem != MENU_ITEM_ICON) // Find next item that matches type WHILE (g_sMenuData.iCurrentColumn < MAX_MENU_COLUMNS-1) AND (eNextItem != MENU_ITEM_ICON) g_sMenuData.iCurrentColumn++ eNextItem = g_sMenuData.eItemLayout[g_sMenuData.iCurrentColumn] ENDWHILE // Unable to find matching type IF (eNextItem != MENU_ITEM_ICON) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_ITEM_ICON: Unable to add item. Check that this item has been specified in SET_MENU_LAYOUT().") #ENDIF EXIT ENDIF ENDIF // Store the value g_sMenuData.eIconItem[g_sMenuData.iCurrentIconItem] = paramIcon g_sMenuData.iCurrentIconItem++ // Update column offset IF paramIcon <> MENU_ICON_DUMMY FLOAT fWidth, fHeight GET_MENU_ICON_SCREEN_RESOLUTION(paramIcon, TRUE, FALSE, fWidth, fHeight) // Add toggle icons IF g_sMenuData.bItemToggleable[g_sMenuData.iCurrentColumn] FLOAT fIconWidth FLOAT fIconHeight GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fIconWidth, fIconHeight) fWidth += (fIconWidth*2) ENDIF IF fWidth > g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] g_sMenuData.fColumnWidth[g_sMenuData.iCurrentColumn] = fWidth ENDIF // If the icon is a shop logo, adjust the row height IF bAdjustRowHeight IF fHeight > g_sMenuData.fRowHeight[paramRow] g_sMenuData.fRowHeight[paramRow] = fHeight ENDIF ENDIF ENDIF // Mark the item as set SET_BIT(g_sMenuData.iItemBitset[paramRow], g_sMenuData.iCurrentColumn) g_sMenuData.iCurrentColumn++ // Set the last item type g_sMenuData.eLastAddedItemType = MENU_ITEM_ICON ENDPROC PROC ADD_MENU_ITEM_ICON_TICK_BOX(INT iParamRow, BOOL bIconState) MENU_ICON_TYPE menuIcon IF NOT bIconState menuIcon = MENU_ICON_BOX_EMPTY ELSE menuIcon = MENU_ICON_BOX_TICK ENDIF ADD_MENU_ITEM_ICON(iParamRow, menuIcon) ENDPROC /// PURPOSE: Adds a help key to the menu PROC ADD_MENU_HELP_KEY(STRING paramKey, STRING paramLabel, INT paramINT = -1) // Ran out of stored variables IF (g_sMenuData.iHelpCount >= MAX_STORED_HELP_KEYS) #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.eHelpKey = paramKey g_sMenuData_TU.tl15HelpText = paramLabel g_sMenuData_TU.iHelpTextINT = paramINT PRINTLN("ADD_MENU_HELP_KEY: Stored help limit reached. using overflow.") EXIT #ENDIF #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_HELP_KEY: Stored help limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Set non-clickable CLEAR_BIT(g_sMenuData.iHelpKeyIsClickableBits, g_sMenuData.iHelpCount) // Store the values g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = paramLabel g_sMenuData.iHelpTextINT[g_sMenuData.iHelpCount] = paramINT g_sMenuData.caHelpTextInput[g_sMenuData.iHelpCount] = MAX_INPUTS // Does not store either the input or inputgroup that the control is representing g_sMenuData.caHelpTextInputGroup[g_sMenuData.iHelpCount] = MAX_INPUTGROUPS // This means it will not update the string if the control method changes g_sMenuData.iHelpCount++ ENDPROC /// PURPOSE: Adds a help key to the menu PROC ADD_MENU_HELP_KEY_INPUT(CONTROL_ACTION paramInput, STRING paramLabel, INT paramINT = -1) STRING paramKey = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, paramInput) // Ran out of stored variables IF (g_sMenuData.iHelpCount >= MAX_STORED_HELP_KEYS) #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.eHelpKey = paramKey g_sMenuData_TU.tl15HelpText = paramLabel g_sMenuData_TU.iHelpTextINT = paramINT PRINTLN("ADD_MENU_HELP_KEY_INPUT: Stored help limit reached. using overflow.") EXIT #ENDIF #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_HELP_KEY_INPUT: Stored help limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Set non-clickable CLEAR_BIT(g_sMenuData.iHelpKeyIsClickableBits, g_sMenuData.iHelpCount) // Store the values g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = paramLabel g_sMenuData.iHelpTextINT[g_sMenuData.iHelpCount] = paramINT g_sMenuData.caHelpTextInput[g_sMenuData.iHelpCount] = paramInput // Stores the input that the control represents g_sMenuData.caHelpTextInputGroup[g_sMenuData.iHelpCount] = MAX_INPUTGROUPS // If the control method changes, the string will be recalculated from this g_sMenuData.iHelpCount++ ENDPROC /// PURPOSE: Checks if the chosen help key exists FUNC BOOL DOES_HELP_KEY_INPUT_EXIST(CONTROL_ACTION paramInput, STRING paramLabel) INT i BOOL bFound FOR i=0 TO g_sMenuData.iHelpCount IF g_sMenuData.caHelpTextInput[i] = paramInput IF ARE_STRINGS_EQUAL(g_sMenuData.tl15HelpText[i], paramLabel) bFound = TRUE ENDIF ENDIF ENDFOR RETURN bFound ENDFUNC /// PURPOSE: Adds a help key to the menu PROC ADD_MENU_HELP_KEY_GROUP(CONTROL_ACTION_GROUP paramGroupInput, STRING paramLabel, INT paramINT = -1) STRING paramKey = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, paramGroupInput) // Ran out of stored variables IF (g_sMenuData.iHelpCount >= MAX_STORED_HELP_KEYS) #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.eHelpKey = paramKey g_sMenuData_TU.tl15HelpText = paramLabel g_sMenuData_TU.iHelpTextINT = paramINT PRINTLN("ADD_MENU_HELP_KEY_INPUT: Stored help limit reached. using overflow.") EXIT #ENDIF #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_HELP_KEY_INPUT: Stored help limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Set non-clickable CLEAR_BIT(g_sMenuData.iHelpKeyIsClickableBits, g_sMenuData.iHelpCount) // Store the values g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = paramLabel g_sMenuData.iHelpTextINT[g_sMenuData.iHelpCount] = paramINT g_sMenuData.caHelpTextInput[g_sMenuData.iHelpCount] = MAX_INPUTS // Stores the inputgroup that the control represents g_sMenuData.caHelpTextInputGroup[g_sMenuData.iHelpCount] = paramGroupInput // If the control method changes, the string will be recalculated from this g_sMenuData.iHelpCount++ ENDPROC /// PURPOSE: Adds a help key to the menu, clickable with mouse on PC. PROC ADD_MENU_HELP_KEY_CLICKABLE(CONTROL_ACTION paramInput, STRING paramLabel, INT paramINT = -1, BOOL bIgnoreCursor = FALSE) STRING paramKey = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, paramInput) IF (g_sMenuData.iHelpCount >= MAX_STORED_HELP_KEYS) #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.eHelpKey = paramKey g_sMenuData_TU.tl15HelpText = paramLabel g_sMenuData_TU.iHelpTextINT = paramINT PRINTLN("ADD_MENU_HELP_KEY_CLICKABLE: Stored help limit reached. using overflow.") EXIT #ENDIF #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_HELP_KEY_CLICKABLE: Stored help limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF // Set clickable IF NOT bIgnoreCursor SET_BIT(g_sMenuData.iHelpKeyIsClickableBits, g_sMenuData.iHelpCount) ENDIF // Store the values g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = paramLabel g_sMenuData.iHelpTextINT[g_sMenuData.iHelpCount] = paramINT g_sMenuData.caHelpTextInput[g_sMenuData.iHelpCount] = paramInput // Stores the input that the control represents g_sMenuData.caHelpTextInputGroup[g_sMenuData.iHelpCount] = MAX_INPUTGROUPS // If the control method changes, the string will be recalculated from this g_sMenuData.iHelpCount++ ENDPROC /// PURPOSE: Adds a help key to the menu PROC ADD_MENU_HELP_KEY_WITH_MULTIPLE_BUTTONS(STRING paramLabel, STRING paramKey1, STRING paramKey2, STRING paramKey3 = NULL, STRING paramKey4 = NULL) // Ran out of stored variables IF (g_sMenuData.iHelpCount >= MAX_STORED_HELP_KEYS) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "ADD_MENU_HELP_KEY_WITH_MULTIPLE_BUTTONS: Stored help limit reached. Tell Kenneth R.") #ENDIF EXIT ENDIF PRINTLN( "ADD_MENU_HELP_KEY_WITH_MULTIPLE_BUTTONS(", paramLabel, ", ",paramKey1, ", ",paramKey2, ", ",paramKey3, ", ", paramKey4,")") // Sore the values g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey1 g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = paramLabel g_sMenuData.iHelpCount++ g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey2 g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = "PREV" g_sMenuData.iHelpCount++ IF NOT IS_STRING_NULL_OR_EMPTY(paramKey3) g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey3 g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = "PREV" g_sMenuData.iHelpCount++ ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(paramKey4) g_sMenuData.eHelpKey[g_sMenuData.iHelpCount] = paramKey4 g_sMenuData.tl15HelpText[g_sMenuData.iHelpCount] = "PREV" g_sMenuData.iHelpCount++ ENDIF ENDPROC /// PURPOSE: /// Draws the scroll box highlight when you mouse-over the scroll icons at the bottom of the menu. /// PARAMS: /// bIsWardrobe - TRUE if the wardrobe, as this needs to be rendered differently due to the difference in the scrollbox colour. PROC DRAW_CURSOR_SCROLL_HIGHLIGHT(BOOL bIsWardrobe = FALSE) FLOAT fMenuXMin FLOAT fMenuYMax FLOAT fScrollBoxTriggerAreaHeight = CUSTOM_MENU_ITEM_BAR_H / 2 INT iAlpha IF bIsWardrobe iAlpha = 48 ELSE iAlpha = 210 ENDIF fMenuXMin = CUSTOM_MENU_X // Default for shops - may have to be changed for other menus. fMenuYMax = g_sMenuData.fSetupFinalBodyY // Set up safe-zone adjust SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) // Highlight scroll up IF g_iMenuCursorItem = MENU_CURSOR_SCROLL_UP DRAW_RECT_FROM_CORNER(fMenuXMin, fMenuYMax,CUSTOM_MENU_W, fScrollBoxTriggerAreaHeight, 255, 255, 255, iAlpha ) // Highlight scroll down ELIF g_iMenuCursorItem = MENU_CURSOR_SCROLL_DOWN DRAW_RECT_FROM_CORNER(fMenuXMin, fMenuYMax + fScrollBoxTriggerAreaHeight, CUSTOM_MENU_W, fScrollBoxTriggerAreaHeight, 255, 255, 255, iAlpha ) ENDIF RESET_SCRIPT_GFX_ALIGN() ENDPROC PROC DISPLAY_DEBUG_FOR_HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS() FLOAT fMenuXMin FLOAT fMenuYMin FLOAT fMenuXMax FLOAT fMenuYMax fMenuXMin = CUSTOM_MENU_X // Default for shops - may have to be changed for other menus. fMenuXMax = fMenuXMin + CUSTOM_MENU_W fMenuYMax = g_sMenuData.fSetupFinalBodyY fMenuYMin = g_sMenuData.fSetupFinalBodyY - (g_sMenuData.iSetupTotalDisplayRows * CUSTOM_MENU_ITEM_BAR_H ) IF g_sMenuData.iSetupTotalDisplayRows < 1 fMenuYMin = g_sMenuData.fSetupFinalBodyY - CUSTOM_MENU_ITEM_BAR_H ENDIF SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.7, 0.40, "NUMBER", fMenuXMin, 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.8, 0.40, "NUMBER", fMenuYMin, 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.7, 0.45, "NUMBER", fMenuXMax, 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.8, 0.45, "NUMBER", fMenuYMax, 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.7, 0.50, "NUMBER", g_sMenuData.fSetupFinalBodyY, 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_NUMBER(0.7, 0.55, "NUMBER", g_sMenuData.iSetupTotalDisplayRows) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_NUMBER(0.7, 0.60, "NUMBER", g_sMenuData.iSetupTotalSelectableRows) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_NUMBER(0.7, 0.65, "NUMBER", g_iMenuCursorItem) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.7, 0.70, "NUMBER", GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X), 4) SET_TEXT_SCALE(0.4, 0.4) DISPLAY_TEXT_WITH_FLOAT(0.7, 0.75, "NUMBER", GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y), 4) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) ENDPROC /// PURPOSE: Adds mouse detection to the shop menu system. /// Used in combination with functions in menu_cursor.sch /// This fuinct /// /// There are three ways to override default behaviour: /// bIsGunShopWeaponSelection /// bDontHighlightFirstItem - This is used for one of the mp contact menus, that uses the first item as a descriptor, that should not be highlighted when hovered over. /// bShiftMenuPosDownByOneBar - When the user of a menu requests the menu system to automatically add an exit option, the system increments the item count correctly, but does not update the Y pos of the bottom of the menu body by one item. This means the highlights are drawn/detected with an offset of one item. Using this overrides shifts them down by one item to compensate. PROC HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS(BOOL bIsGunShopWeaponSelection = FALSE, BOOL bDontHighlightFirstItem = FALSE, BOOL bShiftMenuPosDownByOneBar = FALSE, BOOL bDrawHighlight = TRUE) CONST_INT HIGHLIGHT_ALPHA_MIN 32 CONST_INT HIGHLIGHT_ALPHA_MAX 180 FLOAT fMenuXMin FLOAT fMenuYMin FLOAT fMenuXMax FLOAT fMenuYMax FLOAT fMenuXMinUnAdjusted FLOAT fMenuYMinUnadjusted FLOAT fScrollBoxTriggerAreaHeight = CUSTOM_MENU_ITEM_BAR_H / 2 FLOAT fMouseX FLOAT fMouseY FLOAT fCursorYMenuCoord INT iAlpha INT iAlphaRange INT iAlphaStep INT iHighlightedItem = MENU_CURSOR_NO_ITEM IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) g_iMenuCursorItem = MENU_CURSOR_NO_ITEM EXIT ENDIF SET_USE_ADJUSTED_MOUSE_COORDS(TRUE) fMenuXMin = CUSTOM_MENU_X // Default for shops - may have to be changed for other menus. fMenuXMax = fMenuXMin + CUSTOM_MENU_W fMenuYMax = g_sMenuData.fSetupFinalBodyY fMenuYMin = g_sMenuData.fSetupFinalBodyY - (g_sMenuData.iSetupTotalDisplayRows * CUSTOM_MENU_ITEM_BAR_H ) IF bShiftMenuPosDownByOneBar fMenuYMax += CUSTOM_MENU_ITEM_BAR_H fMenuYMin += CUSTOM_MENU_ITEM_BAR_H ENDIF // Work-around for the golf menu which sets g_sMenuData.iSetupTotalDisplayRows to -1 when there's only one item to display! IF g_sMenuData.iSetupTotalDisplayRows < 1 fMenuYMin = g_sMenuData.fSetupFinalBodyY - CUSTOM_MENU_ITEM_BAR_H ENDIF // Set up safe-zone adjust SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) // Store highlight coords un-adjusted, as the safe-zone will automatically move the highlight to the correct coords. fMenuXMinUnadjusted = fMenuXMin fMenuYMinUnadjusted = fMenuYMin // Adjust menu coords for safe-zone, so the mouse detection works. GET_SCRIPT_GFX_ALIGN_POSITION( fMenuXMin, fMenuYMin, fMenuXMin, fMenuYMin ) GET_SCRIPT_GFX_ALIGN_POSITION( fMenuXMax, fMenuYMax, fMenuXMax, fMenuYMax ) // Reset the safe-zone for safety as we have multiple exit points later. RESET_SCRIPT_GFX_ALIGN() ////////////////////////////////////////////// // DEBUG - DRAW DEBUG LINES OVER MENU // // INT i // FLOAT fMenuItemY // // SET_TEXT_SCALE(0.2, 0.2) // // SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) // // DRAW_DEBUG_LINE_2D(<>,<>) // DRAW_DEBUG_LINE_2D(<>,<>) // DRAW_DEBUG_LINE_2D(<>,<>) // DRAW_DEBUG_LINE_2D(<>,<>) // // i = 0 // WHILE i < g_sMenuData.iSetupTotalDisplayRows // // fMenuItemY = fMenuYMin + (i * CUSTOM_MENU_ITEM_BAR_H) // DRAW_DEBUG_LINE_2D(<>,<>) // // ++ i // // ENDWHILE UPDATE_MENU_CURSOR_GLOBALS() IF g_iMenuCursorItem = MENU_CURSOR_DRAG_CAM EXIT ENDIF g_iMenuCursorItem = MENU_CURSOR_NO_ITEM /////////////////////////////////////////// //GET_MOUSE_POSITION(fMouseX, fMouseY) fMouseX = g_fMenuCursorX fMouseY = g_fMenuCursorY //PRINTLN("Mouse: ", fMouseX, " ", fMouseY) // Check scrolling - if we've got more items in the menu than on-screen then display the scroll icons, and return a value // to let the script know the scrolling icon has been highlighted. IF g_sMenuData.iSetupTotalSelectableRows > g_sMenuData.iSetupTotalDisplayRows // Scroll up IF g_fMenuCursorX >= fMenuXMin AND g_fMenuCursorX <= fMenuXMax AND g_fMenuCursorY >= fMenuYMax AND g_fMenuCursorY < fMenuYMax + fScrollBoxTriggerAreaHeight g_iMenuCursorItem = MENU_CURSOR_SCROLL_UP IF bDrawHighlight DRAW_CURSOR_SCROLL_HIGHLIGHT() ENDIF EXIT ENDIF // Scroll down IF g_fMenuCursorX >= fMenuXMin AND g_fMenuCursorX <= fMenuXMax AND g_fMenuCursorY >= fMenuYMax + fScrollBoxTriggerAreaHeight AND g_fMenuCursorY < fMenuYMax + CUSTOM_MENU_ITEM_BAR_H g_iMenuCursorItem = MENU_CURSOR_SCROLL_DOWN IF bDrawHighlight DRAW_CURSOR_SCROLL_HIGHLIGHT() ENDIF EXIT ENDIF ENDIF // Check if mouse is in the bounding box for the menu IF fMouseX >= fMenuXMin AND fMouseX <= fMenuXMax AND fMouseY >= fMenuYMin AND fMouseY <= fMenuYMax // Adjust relative Y coord so it's inside the menu detection box. fCursorYMenuCoord = fMouseY - fMenuYMin iHighlightedItem = FLOOR(fCursorYMenuCoord / CUSTOM_MENU_ITEM_BAR_H ) //DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.2, "NUMBER", iHighlightedItem ) //DISPLAY_TEXT_WITH_FLOAT( 0.5, 0.3, "NUMBER", fMouseYMenuCoord / CUSTOM_MENU_ITEM_BAR_H, 2) // Work-around for Golf which sets the number of menu items to -1 when only one option is available. IF g_sMenuData.iSetupTotalSelectableRows = -1 g_iMenuCursorItem = 0 iHighlightedItem = 0 EXIT ENDIF // Adjust alpha value of menu highlight to take account of the new background gradient. iAlphaRange = HIGHLIGHT_ALPHA_MAX - HIGHLIGHT_ALPHA_MIN iAlphaStep = iAlphaRange / g_sMenuData.iSetupTotalDisplayRows iAlpha = HIGHLIGHT_ALPHA_MIN + (iAlphaRange - (iAlphaStep * iHighlightedItem)) // Draw highlight with safe-zone adjust IF bDrawHighlight IF NOT bDontHighlightFirstItem OR iHighlightedItem != 0 SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) DRAW_RECT_FROM_CORNER(fMenuXMinUnadjusted, fMenuyMinUnadjusted + (iHighlightedItem * CUSTOM_MENU_ITEM_BAR_H ),CUSTOM_MENU_W, CUSTOM_MENU_ITEM_BAR_H - 0.0015, 255, 255, 255, iAlpha ) RESET_SCRIPT_GFX_ALIGN() ENDIF ENDIF // SET_TEXT_SCALE(0.8, 0.8) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.1, "NUMBER", g_sMenuData.iTopItem ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.2, "NUMBER", g_sMenuData.iLastDisplayItem ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.3, "NUMBER", g_sMenuData.iSetupTotalDisplayRows ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.4, "NUMBER", g_sMenuData.iSetupTotalSelectableRows ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.5, "NUMBER", iHighlightedItem ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.6, "NUMBER", g_sMenuData.iSetupTotalRows ) // DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", g_sMenuData.iDisplayRow[iHighlightedItem]) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.1, "NUMBER", iAlphaRange ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.2, "NUMBER", iAlphaStep ) // DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.3, "NUMBER", iAlpha ) g_iMenuCursorItem = g_sMenuData.iDisplayRow[iHighlightedItem] EXIT ENDIF // All shops except the gun shop prevent selection to the left of the menu. IF NOT bIsGunShopWeaponSelection // Cursor is on the menu side of the screen - needed for IF fMouseX < fMenuXMax g_iMenuCursorItem = MENU_CURSOR_NO_CAMERA_MOVE EXIT ENDIF // Disable mouse camera move over instructional buttons. // This is a temp fix. IF fMouseY > 0.9 g_iMenuCursorItem = MENU_CURSOR_INSTRUCTIONAL_BUTTONS EXIT ENDIF ELSE // Gun shop should allow selection below the menu, but not above. IF (fMouseX < fMenuXMax AND fMouseY < fMenuYMax + 0.25) g_iMenuCursorItem = MENU_CURSOR_NO_CAMERA_MOVE EXIT ENDIF ENDIF g_iMenuCursorItem = MENU_CURSOR_NO_ITEM ENDPROC /// PURPOSE: /// Handles shop style menu items with increment and decrement icons, such as the Darts and Tennis menus. /// PARAMS: /// fDecStart - Decrement arrow hit-box X start position /// fDecSize - Decrement arrow hit-box X width /// iMenuSelection - The menu item whose value is being changed /// RETURNS: /// 0 if no change, -1 for decrement, or +1 for increment. FUNC INT GET_CURSOR_MENU_ITEM_VALUE_CHANGE( FLOAT fLeftSideClickConfirmValue = 0.0 ) FLOAT fMenuXMin FLOAT fMenuYMin FLOAT fMenuXMax FLOAT fTemp FLOAT fIncStart FLOAT fAcceptEnd FLOAT fIncSize = 0.020 fMenuXMin = 0.05 // Default for shops - may have to be changed for other menus. fMenuXMax = fMenuXMin + CUSTOM_MENU_W //fMenuYMax = g_sMenuData.fSetupFinalBodyY fMenuYMin = g_sMenuData.fSetupFinalBodyY - (g_sMenuData.iSetupTotalDisplayRows * CUSTOM_MENU_ITEM_BAR_H ) fAcceptEnd = fMenuXMin + fLeftSideClickConfirmValue // Setup safe-zone SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) // Adjust menu coords for safe-zone, so the mouse detection works. GET_SCRIPT_GFX_ALIGN_POSITION( fMenuXMin, fMenuYMin, fMenuXMin, fMenuYMin ) GET_SCRIPT_GFX_ALIGN_POSITION( fMenuXMax, fTemp, fMenuXMax, fTemp ) // Reset the safe-zone for safety as we have multiple exit points later. RESET_SCRIPT_GFX_ALIGN() //DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.2, "NUMBER", iHighlightedItem ) //DISPLAY_TEXT_WITH_FLOAT( 0.5, 0.3, "NUMBER", fMouseYMenuCoord / CUSTOM_MENU_ITEM_BAR_H, 2) fIncStart = fMenuXMax - fIncSize // Debug rect to see if we've got the right click area. //DRAW_RECT_FROM_CORNER(fMenuXMin, fMenuYMin, fAcceptEnd, g_sMenuData.iSetupTotalDisplayRows * CUSTOM_MENU_ITEM_BAR_H, 0, 255,0,255) //DRAW_RECT_FROM_CORNER(fIncStart, fMenuYMin, fIncSize, g_sMenuData.iSetupTotalDisplayRows * CUSTOM_MENU_ITEM_BAR_H, 0, 255,0,255) // On Some menus clicking the left side accepts. IF fLeftSideClickConfirmValue > 0.0 IF g_fMenuCursorX >= fMenuXMin AND g_fMenuCursorX < fAcceptEnd RETURN -999 ENDIF ENDIF // Decrement IF g_fMenuCursorX >= fMenuXMin AND g_fMenuCursorX < fIncStart RETURN -1 // -1 ENDIF // Increment IF g_fMenuCursorX >= fIncStart AND g_fMenuCursorX <= fMenuXMax RETURN 1 // +1 ENDIF RETURN 0 // No change ENDFUNC FUNC BOOL GET_MENU_ID_FOR_THIS_SCRIPT(INT &iMenuID, BOOl bAssignNewID, INT iMenuType) IF iMenuType = -1 IF NETWORK_IS_GAME_IN_PROGRESS() AND NETWORK_GET_THIS_SCRIPT_IS_NETWORK_SCRIPT() iMenuType = NETWORK_GET_INSTANCE_ID_OF_THIS_SCRIPT() ENDIF ENDIF TEXT_LABEL_63 tlScriptName = GET_THIS_SCRIPT_NAME() tlScriptName += iMenuType INT iUniqueHash = GET_HASH_KEY(tlScriptName) INT iID INT iFreeSlot = -1 REPEAT MAX_MENU_IDS iID IF g_sMenuData.iScriptHash[iID] = iUniqueHash // Already assigned iMenuID = iID RETURN TRUE ELIF g_sMenuData.iScriptHash[iID] = 0 iFreeSlot = iID ENDIF ENDREPEAT IF bAssignNewID IF iFreeSlot != -1 PRINTLN("GET_MENU_ID_FOR_THIS_SCRIPT - Assigning slot ", iFreeSlot, " to ", GET_THIS_SCRIPT_NAME()) // Not assigned so use free slot g_sMenuData.iScriptHash[iFreeSlot] = iUniqueHash iMenuID = iFreeSlot RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: Loads the texture dictionary required for the menu FUNC BOOL LOAD_MENU_ASSETS(STRING sTextBlockName = NULL, INT iMenuType = -1, BOOL bStreamDiscountTextures = FALSE) INT iMenuID IF NOT GET_MENU_ID_FOR_THIS_SCRIPT(iMenuID, TRUE, iMenuType) #IF IS_DEBUG_BUILD PRINTLN("LOAD_MENU_ASSETS - Unable to assign id for this menu. Tell Kenneth R.") CASSERTLN(DEBUG_SYSTEM, "LOAD_MENU_ASSETS - Unable to assign id for this menu. Tell Kenneth R.") #ENDIF RETURN FALSE ENDIF BOOL bMenuLoaded = TRUE g_sMenuData.tlTextBlockName[iMenuID] = sTextBlockName IF NOT IS_STRING_NULL_OR_EMPTY(g_sMenuData.tlTextBlockName[iMenuID]) REQUEST_ADDITIONAL_TEXT(g_sMenuData.tlTextBlockName[iMenuID], MENU_TEXT_SLOT) g_sMenuData.bMenuTextRequested[iMenuID] = TRUE IF NOT HAS_THIS_ADDITIONAL_TEXT_LOADED(g_sMenuData.tlTextBlockName[iMenuID], MENU_TEXT_SLOT) bMenuLoaded = FALSE ENDIF ENDIF REQUEST_STREAMED_TEXTURE_DICT("CommonMenu") g_sMenuData.bMenuAssetsRequested[iMenuID] = TRUE IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("CommonMenu") bMenuLoaded = FALSE ENDIF IF bStreamDiscountTextures REQUEST_STREAMED_TEXTURE_DICT("MPShopSale") g_sMenuData.bShopDiscountAssetsRequested[iMenuID] = TRUE IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPShopSale") bMenuLoaded = FALSE ENDIF ENDIF BOOL bHelpLoaded = FALSE g_sMenuData.sMenuHelp[iMenuID].filename = "instructional_buttons" bHelpLoaded = SETUP_SCALEFORM_MOVIE(g_sMenuData.sMenuHelp[iMenuID]) IF NOT bMenuLoaded OR NOT bHelpLoaded PRINTLN("LOAD_MENU_ASSETS - LOADING FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) ENDIF RETURN (bMenuLoaded AND bHelpLoaded) ENDFUNC /// PURPOSE: Cleans up the texture dictionary required for the menu PROC CLEANUP_MENU_ASSETS(BOOL bCleanupScaleformMovie = TRUE, INT iMenuType = -1) INT iMenuID IF NOT GET_MENU_ID_FOR_THIS_SCRIPT(iMenuID, FALSE, iMenuType) EXIT ENDIF IF g_sMenuData.bSubtitlesMoved RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT) g_sMenuData.bSubtitlesMoved = FALSE ENDIF THEFEED_SET_SCRIPTED_MENU_HEIGHT(0.0) DEBUG_PRINTCALLSTACK() IF g_sMenuData.bMenuTextRequested[iMenuID] PRINTLN("CLEANUP_MENU_ASSETS - CLEANING UP TEXT FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) CLEAR_ADDITIONAL_TEXT(MENU_TEXT_SLOT, FALSE) g_sMenuData.bMenuTextRequested[iMenuID] = FALSE ENDIF IF g_sMenuData.bMenuAssetsRequested[iMenuID] PRINTLN("CLEANUP_MENU_ASSETS - CLEANING UP TXD CommonMenu FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("CommonMenu") g_sMenuData.bMenuAssetsRequested[iMenuID] = FALSE ENDIF IF g_sMenuData.bShopDiscountAssetsRequested[iMenuID] PRINTLN("CLEANUP_MENU_ASSETS - CLEANING UP TXD MPShopSale FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPShopSale") g_sMenuData.bShopDiscountAssetsRequested[iMenuID] = FALSE ENDIF IF bCleanupScaleformMovie PRINTLN("CLEANUP_MENU_ASSETS - CLEANING UP SCALEFORM FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) CLEANUP_SCALEFORM_MOVIE(g_sMenuData.sMenuHelp[iMenuID]) g_sMenuData.iScriptHash[iMenuID] = 0 ELSE PRINTLN("CLEANUP_MENU_ASSETS - NOT CLEARING SCALEFORM FOR - ", GET_THIS_SCRIPT_NAME(), ", menu_type=", iMenuType) g_sMenuData.iScriptHash[iMenuID] = 0 ENDIF ENDPROC /// PURPOSE: Removes all help keys PROC REMOVE_MENU_HELP_KEYS( INT iMenuType = -1 ) g_sMenuData.iHelpCount = 0 g_sMenuData.bHelpCreated = FALSE INT i REPEAT MAX_STORED_HELP_KEYS i g_sMenuData.tl15HelpText[i] = "" g_sMenuData.iHelpTextINT[i] = -1 g_sMenuData.caHelpTextInput[i] = MAX_INPUTS g_sMenuData.caHelpTextInputGroup[i] = MAX_INPUTGROUPS ENDREPEAT g_sMenuData.iHelpKeyIsClickableBits = 0 #IF USE_TU_CHANGES // HELP KEY OVERFLOW g_sMenuData_TU.tl15HelpText = "" g_sMenuData_TU.iHelpTextINT = -1 #ENDIF INT iMenuID IF IS_PC_VERSION() IF NOT GET_MENU_ID_FOR_THIS_SCRIPT(iMenuID, FALSE, iMenuType) EXIT ENDIF // PRINTLN("REMOVE_MENU_HELP_KEYS - Turning OFF mouse clickable buttons") IF HAS_SCALEFORM_MOVIE_LOADED(g_sMenuData.sMenuHelp[iMenuID].movieID) BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "TOGGLE_MOUSE_BUTTONS") SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF ENDPROC /// PURPOSE: Returns TRUE if the menu had been set to draw this frame. FUNC BOOL IS_CUSTOM_MENU_ON_SCREEN() RETURN (GET_GAME_TIMER() <= (g_sMenuData.iLastDrawTimer+100)) ENDFUNC /// PURPOSE: Returns the final Y coord that the menu was last drawn to FUNC FLOAT GET_CUSTOM_MENU_FINAL_Y_COORD() RETURN (g_sMenuData.fMenuFinalScreenY) ENDFUNC /// PURPOSE: Returns the Y coord that the current selected item is positioned at FUNC FLOAT GET_CUSTOM_MENU_CURRENT_ITEM_Y_COORD() RETURN (g_sMenuData.fCurrentItemScreenY) ENDFUNC /// PURPOSE: Returns the Y coord that the specified item is positioned at FUNC FLOAT GET_CUSTOM_MENU_ITEM_Y_COORD(INT paramMenuItem) RETURN (g_sMenuData.fMenuItemScreenY[paramMenuItem]) ENDFUNC /// PURPOSE: Blocks the menu from drawing PROC DISABLE_CUSTOM_MENU() #IF IS_DEBUG_BUILD PRINTSTRING("\n DISABLE_CUSTOM_MENU() called by '")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING("'")PRINTNL() #ENDIF g_sMenuData.bDisableMenu = TRUE ENDPROC PROC ENABLE_CUSTOM_MENU() #IF IS_DEBUG_BUILD PRINTSTRING("\n ENABLE_CUSTOM_MENU() called by '")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING("'")PRINTNL() #ENDIF g_sMenuData.bDisableMenu = FALSE ENDPROC FUNC BOOL IS_CUSTOM_MENU_SAFE_TO_DRAW(BOOL bAllowDuringPlayerSwitch = FALSE, BOOL bAllowDuringPause = FALSE) #IF IS_DEBUG_BUILD BOOL bOutputDebug IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT) OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) bOutputDebug = TRUE ENDIF #ENDIF // Exception for multiplayer if player is on killstrip IF MPGlobals.g_KillStrip.iState != STATE_KILL_STRIP_NULL #IF IS_DEBUG_BUILD IF bOutputDebug PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : kill strip running") ENDIF #ENDIF RETURN TRUE ENDIF IF NOT IS_SCREEN_FADED_IN() OR (IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) AND GET_CURRENT_TRANSITION_STATE() != TRANSITION_STATE_WAITING_FOR_EXTERNAL_TERMINATION_CALL) OR (GET_PAUSE_MENU_STATE() != PM_INACTIVE AND NOT bAllowDuringPause) OR (IS_PLAYER_SWITCH_IN_PROGRESS() AND NOT bAllowDuringPlayerSwitch) //MP Player Switch is happening. OR (IS_COMMERCE_STORE_OPEN()) OR (g_bResultScreenDisplaying) OR (g_sMenuData.bDisableMenu) OR (IS_WARNING_MESSAGE_ACTIVE()) OR (g_sShopSettings.bProcessStoreAlert) #IF IS_DEBUG_BUILD IF bOutputDebug IF NOT IS_SCREEN_FADED_IN() PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : screen not faded in") ELIF (IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) AND GET_CURRENT_TRANSITION_STATE() != TRANSITION_STATE_WAITING_FOR_EXTERNAL_TERMINATION_CALL) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : transition") ELIF (GET_PAUSE_MENU_STATE() != PM_INACTIVE AND NOT bAllowDuringPause) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : pause menu active") ELIF (IS_PLAYER_SWITCH_IN_PROGRESS() AND NOT bAllowDuringPlayerSwitch) //Player Switch is happening. PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : Player Switch is active") ELIF (IS_COMMERCE_STORE_OPEN()) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : commerce store open") ELIF (g_bResultScreenDisplaying) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : result screen displaying") ELIF (g_sMenuData.bDisableMenu) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : disabled") ELIF (IS_WARNING_MESSAGE_ACTIVE()) PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : warning message active") ELSE PRINTLN("IS_CUSTOM_MENU_SAFE_TO_DRAW - FALSE : some other reason") ENDIF ENDIF #ENDIF RETURN FALSE ENDIF RETURN TRUE ENDFUNC PROC DRAW_MENU_HELP_SCALEFORM(INT iScreenX, INT iMenuType = -1, INT iTimer = 0, BOOL bCheckIfSafeToDraw = TRUE, BOOL bAllowDuringPlayerSwitch = FALSE, BOOL bUseSubStringTime = FALSE, BOOL bPushSubtitlesUp = TRUE, BOOL bDrawForSCTV = TRUE, BOOL bAllowDuringPause = FALSE)//, BOOL bSetWidth = FALSE) INT iMenuID IF NOT GET_MENU_ID_FOR_THIS_SCRIPT(iMenuID, FALSE, iMenuType) #IF IS_DEBUG_BUILD PRINTLN("DRAW_MENU_HELP_SCALEFORM - LOAD_MENU_ASSETS not returned TRUE. Tell Kenneth R.") CASSERTLN(DEBUG_SYSTEM, "DRAW_MENU_HELP_SCALEFORM - LOAD_MENU_ASSETS not returned TRUE. Tell Kenneth R.") #ENDIF EXIT ENDIF iScreenX = iScreenX IF bCheckIfSafeToDraw AND NOT IS_CUSTOM_MENU_SAFE_TO_DRAW(bAllowDuringPlayerSwitch, bAllowDuringPause) EXIT ENDIF // Fix for bug 1592833 - Hide buttons when cellphone is rendering IF IS_PHONE_ACTIVE_OR_OVERLAPPING_HUD_ITEMS() EXIT ENDIF // Disable instructional buttons if text chat is active. B* 2302619 IF NETWORK_TEXT_CHAT_IS_TYPING() EXIT ENDIF IF bDrawForSCTV = FALSE IF IS_PLAYER_SCTV(PLAYER_ID()) EXIT ENDIF ENDIF // Don't render instructional buttons if keyboard is on-screen. B* 2212715 IF IS_PC_VERSION() IF UPDATE_ONSCREEN_KEYBOARD() = OSK_PENDING OR NETWORK_TEXT_CHAT_IS_TYPING() EXIT ENDIF ENDIF // // // 2079715 // IF bSetWidth // IF NOT GET_IS_WIDESCREEN() // BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_MAX_WIDTH") // SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(0.6) // PRINTLN("[2079715] SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(0.6) ") // END_SCALEFORM_MOVIE_METHOD() // ENDIF // ENDIF INT i, j IF g_sMenuData.iHelpCount != 0 // If control method has changed, refresh the button sprites IF HAVE_CONTROLS_CHANGED(FRONTEND_CONTROL) REPEAT g_sMenuData.iHelpCount i IF g_sMenuData.caHelpTextInput[i] != MAX_INPUTS g_sMenuData.eHelpKey[i] = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, g_sMenuData.caHelpTextInput[i]) ELIF g_sMenuData.caHelpTextInputGroup[i] != MAX_INPUTGROUPS g_sMenuData.eHelpKey[i] = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, g_sMenuData.caHelpTextInputGroup[i]) ENDIF ENDREPEAT g_sMenuData.bHelpCreated = FALSE ENDIF IF NOT g_sMenuData.bHelpCreated //PRINTLN("setting up menu help") BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "CLEAR_ALL") END_SCALEFORM_MOVIE_METHOD() BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_MAX_WIDTH") SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(1.0 - (g_sMenuData.fHelpKeyClearSpace / 100)) END_SCALEFORM_MOVIE_METHOD() // Clickable buttons for PC keyboard and mouse IF IS_PC_VERSION() // PRINTLN("DRAW_MENU_HELP_SCALEFORM - Turning ON mouse clickable buttons") BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "TOGGLE_MOUSE_BUTTONS") SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) END_SCALEFORM_MOVIE_METHOD() ENDIF /*BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_CLEAR_SPACE") SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT((iScreenX/100) * g_sMenuData.fHelpKeyClearSpace) END_SCALEFORM_MOVIE_METHOD()*/ REPEAT g_sMenuData.iHelpCount i IF GET_HASH_KEY(g_sMenuData.tl15HelpText[i]) != GET_HASH_KEY("PREV") // PRINTLN("SHOP MENU: PROCESSING INSTRUCTIONAL BUTTON ", i) BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(g_sMenuData.eHelpKey[i]) j = i+1 WHILE j < MAX_STORED_HELP_KEYS AND GET_HASH_KEY(g_sMenuData.tl15HelpText[j]) = GET_HASH_KEY("PREV") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(g_sMenuData.eHelpKey[j]) j++ ENDWHILE //If there is no sub string to add IF g_sMenuData.iHelpTextINT[i] = -1 SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(g_sMenuData.tl15HelpText[i]) ELSE INT iParam = g_sMenuData.iHelpTextINT[i] IF iTimer >= 0 iParam = iTimer ENDIF //There is a sub string to add! PRINTLN("IF g_sMenuData.iHelpTextINT[", i, "] = ", g_sMenuData.iHelpTextINT[i]) BEGIN_TEXT_COMMAND_SCALEFORM_STRING(g_sMenuData.tl15HelpText[i]) IF bUseSubStringTime ADD_TEXT_COMPONENT_SUBSTRING_TIME(iParam, TIME_FORMAT_MINUTES|TIME_FORMAT_SECONDS|TEXT_FORMAT_HIDE_LEADING_ZEROS_ON_LEADING_UNITS) ELSE ADD_TEXT_COMPONENT_INTEGER(iParam) ENDIF END_TEXT_COMMAND_SCALEFORM_STRING() ENDIF // Mouse Clickable buttons IF IS_PC_VERSION() // Store valid input IF g_sMenuData.caHelpTextInput[i] != MAX_INPUTS AND IS_BIT_SET(g_sMenuData.iHelpKeyIsClickableBits, i) //PRINTLN("SHOP MENU: ADDING MOUSE CLICK TO BUTTON ", i) SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) // CLICKABLE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(g_sMenuData.caHelpTextInput[i])) ELSE // Not clickable, default value //PRINTLN("SHOP MENU: NOT CLICKABLE BUTTON ", i) SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) // NOT CLICKABLE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(MAX_INPUTS)) ENDIF ENDIF END_SCALEFORM_MOVIE_METHOD() //PRINTLN("... adding label ", g_sMenuData.tl15HelpText[i]) ENDIF ENDREPEAT #IF USE_TU_CHANGES // HELP KEY OVERFLOW IF GET_HASH_KEY(g_sMenuData_TU.tl15HelpText) != GET_HASH_KEY("") BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(g_sMenuData.iHelpCount) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(g_sMenuData_TU.eHelpKey) //If there is no sub string to add IF g_sMenuData_TU.iHelpTextINT = -1 SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(g_sMenuData_TU.tl15HelpText) ELSE INT iParam = g_sMenuData.iHelpTextINT[i] IF iTimer >= 0 iParam = iTimer ENDIF //There is a sub string to add! PRINTLN("IF g_sMenuData_TU.iHelpTextINT = ", g_sMenuData_TU.iHelpTextINT) BEGIN_TEXT_COMMAND_SCALEFORM_STRING(g_sMenuData_TU.tl15HelpText) IF bUseSubStringTime ADD_TEXT_COMPONENT_SUBSTRING_TIME(iParam, TIME_FORMAT_MINUTES|TIME_FORMAT_SECONDS|TEXT_FORMAT_HIDE_LEADING_ZEROS_ON_LEADING_UNITS) ELSE ADD_TEXT_COMPONENT_INTEGER(iParam) ENDIF END_TEXT_COMMAND_SCALEFORM_STRING() ENDIF END_SCALEFORM_MOVIE_METHOD() //PRINTLN("... adding label ", g_sMenuData_TU.tl15HelpText) ENDIF #ENDIF BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "SET_BACKGROUND_COLOUR") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(80) END_SCALEFORM_MOVIE_METHOD() BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "DRAW_INSTRUCTIONAL_BUTTONS") IF g_sMenuData.bStackedKeys SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) ENDIF END_SCALEFORM_MOVIE_METHOD() g_sMenuData.bHelpCreated = TRUE ENDIF //PRINTLN("IF g_sMenuData.iHelpTextINT[", 0, "] = ", g_sMenuData.iHelpTextINT[0]) REPEAT g_sMenuData.iHelpCount i IF g_sMenuData.iHelpTextINT[i] != -1 // PRINTLN("IF g_sMenuData.iHelpTextINT[", i, "] = ", g_sMenuData.iHelpTextINT[i]) IF iTimer > 0 //PRINTLN("iTimer = ", iTimer) BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "OVERRIDE_RESPAWN_TEXT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i) BEGIN_TEXT_COMMAND_SCALEFORM_STRING(g_sMenuData.tl15HelpText[i]) IF bUseSubStringTime ADD_TEXT_COMPONENT_SUBSTRING_TIME(iTimer, TIME_FORMAT_MINUTES|TIME_FORMAT_SECONDS|TEXT_FORMAT_HIDE_LEADING_ZEROS_ON_LEADING_UNITS) ELSE ADD_TEXT_COMPONENT_INTEGER(iTimer) ENDIF END_TEXT_COMMAND_SCALEFORM_STRING() END_SCALEFORM_MOVIE_METHOD() //PRINTLN("END_SCALEFORM_MOVIE_METHOD") ENDIF ENDIF ENDREPEAT #IF USE_TU_CHANGES // HELP KEY OVERFLOW IF g_sMenuData_TU.iHelpTextINT != -1 IF iTimer > 0 BEGIN_SCALEFORM_MOVIE_METHOD(g_sMenuData.sMenuHelp[iMenuID].movieID, "OVERRIDE_RESPAWN_TEXT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i) BEGIN_TEXT_COMMAND_SCALEFORM_STRING(g_sMenuData_TU.tl15HelpText) IF bUseSubStringTime ADD_TEXT_COMPONENT_SUBSTRING_TIME(iTimer, TIME_FORMAT_MINUTES|TIME_FORMAT_SECONDS|TEXT_FORMAT_HIDE_LEADING_ZEROS_ON_LEADING_UNITS) ELSE ADD_TEXT_COMPONENT_INTEGER(iTimer) ENDIF END_TEXT_COMMAND_SCALEFORM_STRING() END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF #ENDIF SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_BOTTOM) SET_SCRIPT_GFX_ALIGN_PARAMS(0.0, 0.0, 0.0, 0.0) IF bPushSubtitlesUp IF NOT g_sMenuData.bSubtitlesMoved SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, 0, -0.0375) g_sMenuData.bSubtitlesMoved = TRUE ENDIF ELSE IF g_sMenuData.bSubtitlesMoved RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT) g_sMenuData.bSubtitlesMoved = FALSE ENDIF ENDIF RESET_SCRIPT_GFX_ALIGN() IF g_sMenuData.bUseTempKeyCoords SET_SCRIPT_GFX_ALIGN(UI_ALIGN_RIGHT, UI_ALIGN_BOTTOM) SET_SCRIPT_GFX_ALIGN_PARAMS(0.0, 0.0, 0.0, 0.0) DRAW_SCALEFORM_MOVIE(g_sMenuData.sMenuHelp[iMenuID].movieID, g_sMenuData.fHelpKeysX, g_sMenuData.fHelpKeysY, 1.0, 1.0, 255, 255, 255, 255) RESET_SCRIPT_GFX_ALIGN() ELSE //DRAW_SCALEFORM_MOVIE(g_sMenuData.sMenuHelp[iMenuID].movieID, 0.550, 0.569, 1.0, 1.0, 255, 255, 255, 255) // old x/y = 0.550, 0.546 DRAW_SCALEFORM_MOVIE_FULLSCREEN(g_sMenuData.sMenuHelp[iMenuID].movieID, 255, 255, 255, 255) ENDIF ENDIF ENDPROC /// PURPOSE: Render the menu to the screen /// NOTE: Use the iMenuType param to make sure the scaleform movie is loaded for the correct menu. PROC DRAW_MENU(BOOL bSetButtonsUnderHud = TRUE, INT iMenuType = -1, BOOL bHideHelpText = TRUE, BOOL bAddDefaultExitOption = FALSE, BOOL bPushSubtitlesUp = TRUE, FLOAT fCustomWidth = -1.0, BOOL bAllowDuringPause = FALSE, BOOL bUseActualRes = FALSE, INT iTimer = -1) INT iMenuID IF NOT GET_MENU_ID_FOR_THIS_SCRIPT(iMenuID, FALSE, iMenuType) #IF IS_DEBUG_BUILD CASSERTLN(DEBUG_SYSTEM, "DRAW_MENU - LOAD_MENU_ASSETS not returned TRUE. Tell Kenneth R.") #ENDIF PRINTLN("DRAW_MENU - LOAD_MENU_ASSETS not returned TRUE. Tell Kenneth R.") EXIT ENDIF IF iMenuID = -1 #IF IS_DEBUG_BUILD PRINTLN("DRAW_MENU() - Script '", GET_THIS_SCRIPT_NAME(), "' with menu_type=", iMenuType, " has not called LOAD_MENU_ASSETS()") CASSERTLN(DEBUG_SYSTEM, "LOAD_MENU_ASSETS() not called. Pass logs to Kenneth R.") EXIT #ENDIF ENDIF IF NOT IS_CUSTOM_MENU_SAFE_TO_DRAW(DEFAULT, bAllowDuringPause) PRINTLN("DRAW_MENU - Custom menu not safe to draw - EXIT") EXIT ENDIF #IF IS_DEBUG_BUILD // Do not display when we have debug options on screen IF (IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON)) OR (g_debugMenuControl.bDebugMenuOnScreen) IF IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON) PRINTLN("DRAW_MENU - IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON) - is TRUE") ENDIF IF g_debugMenuControl.bDebugMenuOnScreen PRINTLN("DRAW_MENU - g_debugMenuControl.bDebugMenuOnScreen - is TRUE") ENDIF PRINTLN("DRAW_MENU - Debug menu on screen - EXIT") EXIT ENDIF #ENDIF SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) INT iHudR, iHudG, iHudB, iHudA INT iPass, iRow, iRowLoop, iItem, iDisplayRow, iTotalRows, iTotalSelectableRows, iCurrentDisplaySpacer, iSpacerCount INT i, iIntParam, iFloatParam, iTextParam, iPlayerNameParam INT iTextCount, iIntCount, iFloatCount, iIconCount, iPlayerNameCount INT iThisTextItem, iTempTextCount, iTempIntCount, iTempFloatCount, iTempIconCount, iTempPlayerNameCount, iThisTextItemActual MENU_TEXT_COMP_TYPE eLastCompType BOOL bSelected, bDisplay FLOAT fTextX, fTextY FLOAT fWidth, fHeight VECTOR vTexture BOOL bItemAdded FLOAT fTempWidth, fTempTextWidth, fTempIconWidth, fTempToggleWidth, fTempColumnWidth INT iIconR, iIconG, iIconB, iIconA FLOAT fFinalPanelY BOOL bCondensed, bPlayerName BOOL bAddToggleItems BOOL bSetCarColour FLOAT fMenuItemBarHeight FLOAT fHeaderGraphicHeight = 0.0 FLOAT fHeaderGraphicAspectRatio IF g_sMenuData.bUseHeaderGraphic IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_HEADER, TRUE, TRUE, fWidth, fHeight, bUseActualRes) fHeaderGraphicAspectRatio = fHeight/fWidth ELSE g_sMenuData.bUseHeaderGraphic = FALSE ENDIF ENDIF IF fCustomWidth = -1.0 fCustomWidth = CUSTOM_MENU_W ENDIF //If we're overriding the header graphic width with fCutsomWidth we also need to make sure it's height is altered //to match and preserve the correct aspect ratio. fHeaderGraphicHeight = fCustomWidth*fHeaderGraphicAspectRatio FLOAT fBodyStartY IF GET_HASH_KEY(g_sMenuData.tl15Title) = GET_HASH_KEY("HIDE") fBodyStartY = (CUSTOM_MENU_Y) ELSE fBodyStartY = (CUSTOM_MENU_Y + fHeaderGraphicHeight + CUSTOM_MENU_HEADER_H + CUSTOM_MENU_WHITE_LINE_H) ENDIF // B* 2147964 - Gets the physical screen aspect and compares to fake aspect ratio to get a multiplier INT iScreenX, iScreenY FLOAT fAspectMulti = 1.0 GET_SCREEN_RESOLUTION_FOR_MENU(bUseActualRes, iScreenX, iScreenY, fAspectMulti) // Add a default row with Exit text whenever we have 1 item or less. IF bAddDefaultExitOption IF g_sMenuData.iCurrentRow <= 1 ADD_MENU_ITEM_TEXT(g_sMenuData.iCurrentRow+1, "DFLT_MNU_OPT") g_sMenuData.bDefaultOptionAdded = TRUE ENDIF ENDIF // We currently do 2 passes so we can draw the background before we draw text/icons. // To cut down processing we should do a one off setup and then just the 1 pass. REPEAT 2 iPass // Only draw the backgrounds when the initial set up has been done as // we need to work out the background size/footer offset. IF iPass = 1 AND g_sMenuData.bSetupComplete ////////////////////////////////////////////////////////////////////////////////////////// /// HEADER /// IF GET_HASH_KEY(g_sMenuData.tl15Title) = GET_HASH_KEY("HIDE") fFinalPanelY = (CUSTOM_MENU_Y) ELSE IF g_sMenuData.bUseHeaderGraphic TEXT_LABEL_63 tlTXD = GET_MENU_ICON_TXD(MENU_ICON_HEADER) TEXT_LABEL_63 tlName = GET_MENU_ICON_TEXTURE(MENU_ICON_HEADER, TRUE) // Crew logo? IF GET_HASH_KEY(g_sMenuData.sIconTextureOverride[MENU_ICON_HEADER]) = HASH("CREW_LOGO") DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, CUSTOM_MENU_Y, fCustomWidth, fHeaderGraphicHeight, 0, 0, 0, 255) // Black background DRAW_SPRITE(tlTXD, tlName, CUSTOM_MENU_X+(fCustomWidth*0.5), CUSTOM_MENU_Y+(fHeaderGraphicHeight*0.5), fCustomWidth, fHeaderGraphicHeight, 0.0, 255, 255, 255, 255) ELSE DRAW_SPRITE(tlTXD, tlName, CUSTOM_MENU_X+(fCustomWidth*0.5), CUSTOM_MENU_Y+(fHeaderGraphicHeight*0.5), fCustomWidth, fHeaderGraphicHeight, 0.0, 255, 255, 255, 255) ENDIF ENDIF IF g_sMenuData.bUseCustomHeaderColour iHudR = g_sMenuData.iHeaderR iHudG = g_sMenuData.iHeaderG iHudB = g_sMenuData.iHeaderB iHudA = g_sMenuData.iHeaderA ELSE iHudR = 0 iHudG = 0 iHudB = 0 iHudA = tiCOMMON_MENU_H_ALPHA ENDIF DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, CUSTOM_MENU_Y+fHeaderGraphicHeight, fCustomWidth, CUSTOM_MENU_HEADER_H, iHudR, iHudG, iHudB, iHudA) // Black panel //DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, CUSTOM_MENU_Y+fHeaderGraphicHeight+CUSTOM_MENU_HEADER_H, CUSTOM_MENU_W, CUSTOM_MENU_WHITE_LINE_H, 255, 255, 255, 255) // White line fFinalPanelY = (CUSTOM_MENU_Y) + (fHeaderGraphicHeight) + (CUSTOM_MENU_HEADER_H) + (CUSTOM_MENU_WHITE_LINE_H) IF GET_HASH_KEY(g_sMenuData.tl15Title) != 0 // Add text SETUP_MENU_HEADING_TEXT() BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData.tl15Title) iIntParam = 0 iFloatParam = 0 iTextParam = 0 iPlayerNameParam = 0 REPEAT g_sMenuData.iTitleTotalParams i IF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iTitleInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fTitleFloat[iFloatParam], g_sMenuData.iTitleFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15TitleText[iTextParam]) iTextParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ELIF g_sMenuData.eTitleComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tlTitlePlayerName[iPlayerNameParam]) iPlayerNameParam++ ENDIF ENDREPEAT END_TEXT_COMMAND_DISPLAY_TEXT(CUSTOM_MENU_X+CUSTOM_MENU_TITLE_TEXT_INDENT_X, CUSTOM_MENU_Y+fHeaderGraphicHeight+CUSTOM_MENU_TITLE_TEXT_INDENT_Y) ENDIF IF g_sMenuData.bOverrideTitleRowCounts SETUP_MENU_HEADING_TEXT() DISPLAY_TEXT_WITH_2_NUMBERS(CUSTOM_MENU_X+fCustomWidth-CUSTOM_MENU_TITLE_TEXT_INDENT_X-GET_MENU_ITEM_COUNT_WIDTH("CM_ITEM_COUNT", g_sMenuData.iTitleRowOverride1, g_sMenuData.iTitleRowOverride2), CUSTOM_MENU_Y+fHeaderGraphicHeight+CUSTOM_MENU_TITLE_TEXT_INDENT_Y, "CM_ITEM_COUNT", g_sMenuData.iTitleRowOverride1, g_sMenuData.iTitleRowOverride2) ELIF g_sMenuData.iSetupTotalRows > g_sMenuData.iMenuRows IF g_sMenuData.iSetupCurrentSelectableItem != 0 SETUP_MENU_HEADING_TEXT() DISPLAY_TEXT_WITH_2_NUMBERS(CUSTOM_MENU_X+fCustomWidth-CUSTOM_MENU_TITLE_TEXT_INDENT_X-GET_MENU_ITEM_COUNT_WIDTH("CM_ITEM_COUNT", g_sMenuData.iSetupCurrentSelectableItem, g_sMenuData.iSetupTotalSelectableRows), CUSTOM_MENU_Y+fHeaderGraphicHeight+CUSTOM_MENU_TITLE_TEXT_INDENT_Y, "CM_ITEM_COUNT", g_sMenuData.iSetupCurrentSelectableItem, g_sMenuData.iSetupTotalSelectableRows) ENDIF ENDIF ENDIF ////////////////////////////////////////////////////////////////////////////////////////// /// BODY /// iRow = g_sMenuData.iTopItem iDisplayRow = 0 // [TART UP] FLOAT fGradientYPos = fFinalPanelY IF g_sMenuData.bUseCustomBodyColour iHudR = g_sMenuData.iBodyR iHudG = g_sMenuData.iBodyG iHudB = g_sMenuData.iBodyB iHudA = g_sMenuData.iBodyA ELSE GET_HUD_COLOUR(HUD_COLOUR_INGAME_BG, iHudR, iHudG, iHudB, iHudA) ENDIF WHILE iDisplayRow < g_sMenuData.iMenuRows AND iRow <= g_sMenuData.iCurrentRow IF iRow >= 0 IF g_sMenuData.bMenuRowHasDisplayItems[iRow] IF g_sMenuData.bMenuRowHasSpacer[iRow] AND iRow != g_sMenuData.iTopItem fFinalPanelY += CUSTOM_MENU_SPACER_H ENDIF fMenuItemBarHeight = CUSTOM_MENU_ITEM_BAR_H IF g_sMenuData.fRowHeight[iRow] != 0.0 fMenuItemBarHeight = g_sMenuData.fRowHeight[iRow] ENDIF // [TART UP] //DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY, fCustomWidth, fMenuItemBarHeight, iHudR, iHudG, iHudB, iHudA) // Black panel fFinalPanelY += fMenuItemBarHeight iDisplayRow++ ENDIF ENDIF iRow++ ENDWHILE // [TART UP] DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+(fCustomWidth*0.5), fGradientYPos+((fFinalPanelY-fGradientYPos)*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT), fCustomWidth, (fFinalPanelY-fGradientYPos), 0.0, 255, 255, 255, 255) /*fWidth = (fCustomWidth / 6) fHeight = (fFinalPanelY-fGradientYPos) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*0)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*1)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*2)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*3)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*4)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*5)), fGradientYPos+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA)*/ ////////////////////////////////////////////////////////////////////////////////////////// /// FOOTER /// IF g_sMenuData.iSetupTotalRows > g_sMenuData.iMenuRows // or g_sMenuData.bForceFooter IF g_sMenuData.bUseCustomFooterColour iHudR = g_sMenuData.iFooterR iHudG = g_sMenuData.iFooterG iHudB = g_sMenuData.iFooterB iHudA = g_sMenuData.iFooterA ELSE iHudR = 0 iHudG = 0 iHudB = 0 iHudA = tiCOMMON_MENU_F_ALPHA ENDIF DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY+CUSTOM_MENU_WHITE_LINE_H, fCustomWidth, CUSTOM_MENU_FOOTER_H, iHudR, iHudG, iHudB, iHudA) // Black panel vTexture = GET_TEXTURE_RESOLUTION("CommonMenu", "shop_arrows_upANDdown") // Fix for bug # 1859693 - Reducing size as textures were doubled in size vTexture.x *= ( 0.5 / fAspectMulti ) vTexture.Y *= ( 0.5 / fAspectMulti ) IF g_sMenuData.bUseInvertedScrollColour iHudR = 0 iHudG = 0 iHudB = 0 iHudA = 255 ELSE GET_HUD_COLOUR(HUD_COLOUR_WHITE, iHudR, iHudG, iHudB, iHudA) ENDIF DRAW_SPRITE("CommonMenu", "shop_arrows_upANDdown", CUSTOM_MENU_X+(fCustomWidth*0.5), fFinalPanelY+CUSTOM_MENU_WHITE_LINE_H+(CUSTOM_MENU_FOOTER_H*0.5), (vTexture.X / 1280 * fAspectMulti), (vTexture.Y / 720 * fAspectMulti), 0.0, iHudR, iHudG, iHudB, iHudA) // DRAW_SPRITE("CommonMenu", "shop_arrows_upANDdown", CUSTOM_MENU_X+CUSTOM_MENU_W-CUSTOM_MENU_TITLE_TEXT_INDENT_X-((vTexture.X / iScreenX)*0.5), fFinalPanelY+CUSTOM_MENU_WHITE_LINE_H+(CUSTOM_MENU_FOOTER_H*0.5), (vTexture.X / iScreenX), (vTexture.Y / iScreenY), 0.0, 255, 255, 255, 255) // // IF g_sMenuData.iSetupCurrentSelectableItem != 0 // SETUP_MENU_ITEM_TEXT(FALSE) // DISPLAY_TEXT_WITH_2_NUMBERS(CUSTOM_MENU_X+CUSTOM_MENU_TITLE_TEXT_INDENT_X, fFinalPanelY+CUSTOM_MENU_WHITE_LINE_H+CUSTOM_MENU_TITLE_TEXT_INDENT_Y, "CM_ITEM_COUNT", g_sMenuData.iSetupCurrentSelectableItem, g_sMenuData.iSetupTotalSelectableRows) // ENDIF fFinalPanelY += (CUSTOM_MENU_WHITE_LINE_H) + (CUSTOM_MENU_FOOTER_H) ENDIF ////////////////////////////////////////////////////////////////////////////////////////// /// DESCRIPTION MESSAGE BOX /// IF GET_HASH_KEY(g_sMenuData.tl23Desc) != 0 AND g_sMenuData.iDescClearTimer != -1 // Add box offset fFinalPanelY += (CUSTOM_MENU_MESSAGE_OFFSET_Y*2) fTempWidth = CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X IF g_sMenuData.eDescIcon != MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eDescIcon, TRUE, TRUE, fWidth, fHeight, bUseActualRes) fTempWidth = CUSTOM_MENU_X+(fWidth)+(CUSTOM_MENU_PIXEL_WIDTH*4)-(CUSTOM_MENU_PIXEL_WIDTH*1) ENDIF // Draw description box SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(g_sMenuData.tl23Desc) iIntParam = 0 iFloatParam = 0 iTextParam = 0 REPEAT g_sMenuData.iDescTotalParams i IF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iDescInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fDescFloat[iFloatParam], g_sMenuData.iDescFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ENDIF ENDREPEAT iRow = END_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) // [TART UP] //GET_HUD_COLOUR(HUD_COLOUR_WHITE, iHudR, iHudG, iHudB, iHudA) GET_HUD_COLOUR(HUD_COLOUR_BLACK, iHudR, iHudG, iHudB, iHudA) DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY-CUSTOM_MENU_MESSAGE_OFFSET_Y, fCustomWidth, CUSTOM_MENU_MESSAGE_OFFSET_Y, iHudR, iHudG, iHudB, iHudA) IF g_sMenuData.bUseCustomHelpColour iHudR = g_sMenuData.iHelpR iHudG = g_sMenuData.iHelpG iHudB = g_sMenuData.iHelpB iHudA = g_sMenuData.iHelpA ELSE GET_HUD_COLOUR(HUD_COLOUR_INGAME_BG, iHudR, iHudG, iHudB, iHudA) ENDIF // [TART UP] //DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY, fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+(fCustomWidth*0.5), fFinalPanelY+(((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT), fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), 0.0, iHudR, iHudG, iHudB, iHudA) /*fWidth = (fCustomWidth / 6) fHeight = ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*0)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*1)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*2)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*3)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*4)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*5)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA)*/ // Add text SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData.tl23Desc) iIntParam = 0 iFloatParam = 0 iTextParam = 0 REPEAT g_sMenuData.iDescTotalParams i IF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iDescInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fDescFloat[iFloatParam], g_sMenuData.iDescFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ENDIF ENDREPEAT END_TEXT_COMMAND_DISPLAY_TEXT(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) IF g_sMenuData.eDescIcon != MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eDescIcon, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData.eDescIcon, TRUE, iIconR, iIconG, iIconB, iIconA) DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eDescIcon), GET_MENU_ICON_TEXTURE(g_sMenuData.eDescIcon, TRUE), CUSTOM_MENU_X+(fWidth*0.5)+(CUSTOM_MENU_PIXEL_WIDTH*2), fFinalPanelY+(fHeight*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT*4), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF fFinalPanelY += ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+(CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))) // Draw description box (EXTRA) IF NOT IS_STRING_NULL_OR_EMPTY(g_sMenuData.tl23DescExtra) fFinalPanelY += (CUSTOM_MENU_PIXEL_HEIGHT*6) SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(g_sMenuData.tl23DescExtra) iRow = END_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) GET_HUD_COLOUR(HUD_COLOUR_BLACK, iHudR, iHudG, iHudB, iHudA) DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY-CUSTOM_MENU_MESSAGE_OFFSET_Y, fCustomWidth, CUSTOM_MENU_MESSAGE_OFFSET_Y, iHudR, iHudG, iHudB, iHudA) IF g_sMenuData.bUseCustomHelpColour iHudR = g_sMenuData.iHelpR iHudG = g_sMenuData.iHelpG iHudB = g_sMenuData.iHelpB iHudA = g_sMenuData.iHelpA ELSE GET_HUD_COLOUR(HUD_COLOUR_INGAME_BG, iHudR, iHudG, iHudB, iHudA) ENDIF DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+(fCustomWidth*0.5), fFinalPanelY+(((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT), fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), 0.0, iHudR, iHudG, iHudB, iHudA) // Add text SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData.tl23DescExtra) END_TEXT_COMMAND_DISPLAY_TEXT(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) /*IF g_sMenuData.eDescIcon != MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eDescIcon, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData.eDescIcon, TRUE, iIconR, iIconG, iIconB, iIconA) DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eDescIcon), GET_MENU_ICON_TEXTURE(g_sMenuData.eDescIcon, TRUE), CUSTOM_MENU_X+(fWidth*0.5)+(CUSTOM_MENU_PIXEL_WIDTH*2), fFinalPanelY+(fHeight*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT*4), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF*/ fFinalPanelY += ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+(CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))) ENDIF // Clear description when time is up IF g_sMenuData.iDescClearTimer > 0 IF (GET_GAME_TIMER()-g_sMenuData.iDescStartTimer) > g_sMenuData.iDescClearTimer g_sMenuData.tl23Desc = "" g_sMenuData.iDescClearTimer = -1 ENDIF ENDIF ELIF NOT IS_STRING_NULL_OR_EMPTY(g_sMenuData.tl23DescExtra) fFinalPanelY += (CUSTOM_MENU_MESSAGE_OFFSET_Y*2) fTempWidth = CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X // Draw description box SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(g_sMenuData.tl23DescExtra) iIntParam = 0 iFloatParam = 0 iTextParam = 0 REPEAT g_sMenuData.iDescTotalParams i IF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iDescInt[iIntParam]) iIntParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fDescFloat[iFloatParam], g_sMenuData.iDescFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ELIF g_sMenuData.eDescComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData.tl15DescText[iTextParam]) iTextParam++ ENDIF ENDREPEAT iRow = END_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) GET_HUD_COLOUR(HUD_COLOUR_BLACK, iHudR, iHudG, iHudB, iHudA) DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY-CUSTOM_MENU_MESSAGE_OFFSET_Y, fCustomWidth, CUSTOM_MENU_MESSAGE_OFFSET_Y, iHudR, iHudG, iHudB, iHudA) IF g_sMenuData.bUseCustomHelpColour iHudR = g_sMenuData.iHelpR iHudG = g_sMenuData.iHelpG iHudB = g_sMenuData.iHelpB iHudA = g_sMenuData.iHelpA ELSE GET_HUD_COLOUR(HUD_COLOUR_INGAME_BG, iHudR, iHudG, iHudB, iHudA) ENDIF DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+(fCustomWidth*0.5), fFinalPanelY+(((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT), fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), 0.0, iHudR, iHudG, iHudB, iHudA) // Add text SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData.tl23DescExtra) END_TEXT_COMMAND_DISPLAY_TEXT(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) ENDIF #IF USE_TU_CHANGES ////////////////////////////////////////////////////////////////////////////////////////// /// DISCOUNT MESSAGE BOX /// IF GET_HASH_KEY(g_sMenuData_TU.tl15Discount) != 0 AND g_sMenuData_TU.iDiscountClearTimer != -1 // Add box offset fFinalPanelY += (CUSTOM_MENU_MESSAGE_OFFSET_Y*2) fTempWidth = CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X IF g_sMenuData_TU.eDiscountIcon != MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData_TU.eDiscountIcon, TRUE, TRUE, fWidth, fHeight, bUseActualRes) fTempWidth = CUSTOM_MENU_X+(fWidth)+(CUSTOM_MENU_PIXEL_WIDTH*4)-(CUSTOM_MENU_PIXEL_WIDTH*1) ENDIF // Draw Discount box SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(g_sMenuData_TU.tl15Discount) iIntParam = 0 iFloatParam = 0 iTextParam = 0 REPEAT g_sMenuData_TU.iDiscountTotalParams i IF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData_TU.iDiscountInt[iIntParam]) iIntParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData_TU.fDiscountFloat[iFloatParam], g_sMenuData_TU.iDiscountFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ENDIF ENDREPEAT iRow = END_TEXT_COMMAND_GET_NUMBER_OF_LINES_FOR_STRING(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) // [TART UP] //GET_HUD_COLOUR(HUD_COLOUR_WHITE, iHudR, iHudG, iHudB, iHudA) GET_HUD_COLOUR(HUD_COLOUR_BLACK, iHudR, iHudG, iHudB, iHudA) DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY-CUSTOM_MENU_MESSAGE_OFFSET_Y, fCustomWidth, CUSTOM_MENU_MESSAGE_OFFSET_Y, iHudR, iHudG, iHudB, iHudA) IF g_sMenuData.bUseCustomHelpColour iHudR = g_sMenuData.iHelpR iHudG = g_sMenuData.iHelpG iHudB = g_sMenuData.iHelpB iHudA = g_sMenuData.iHelpA ELSE GET_HUD_COLOUR(HUD_COLOUR_INGAME_BG, iHudR, iHudG, iHudB, iHudA) ENDIF // [TART UP] //DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fFinalPanelY, fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+(fCustomWidth*0.5), fFinalPanelY+(((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT), fCustomWidth, ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)), 0.0, iHudR, iHudG, iHudB, iHudA) /*fWidth = (fCustomWidth / 6) fHeight = ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1)) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*0)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*1)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*2)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*3)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*4)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA) DRAW_SPRITE("CommonMenu", "Gradient_Bgd", CUSTOM_MENU_X+((fWidth*0.5)+(fWidth*5)), fFinalPanelY+(fHeight*0.5), fWidth, fHeight, 0.0, iHudR, iHudG, iHudB, iHudA)*/ // Add text SETUP_MENU_ITEM_MESSAGE_TEXT(fTempWidth) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData_TU.tl15Discount) iIntParam = 0 iFloatParam = 0 iTextParam = 0 REPEAT g_sMenuData_TU.iDiscountTotalParams i IF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_INT ADD_TEXT_COMPONENT_INTEGER(g_sMenuData_TU.iDiscountInt[iIntParam]) iIntParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_FLOAT ADD_TEXT_COMPONENT_FLOAT(g_sMenuData_TU.fDiscountFloat[iFloatParam], g_sMenuData_TU.iDiscountFloatDP[iFloatParam]) iFloatParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_TEXT ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_VEHICLE_NAME ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_PLAYER_NAME ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_RADIO_STATION ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ELIF g_sMenuData_TU.eDiscountComps[i] = MENU_TEXT_COMP_CONDENSED_LITERAL ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_sMenuData_TU.tl15DiscountText[iTextParam]) iTextParam++ ENDIF ENDREPEAT END_TEXT_COMMAND_DISPLAY_TEXT(fTempWidth, fFinalPanelY+CUSTOM_MENU_TEXT_INDENT_Y) IF g_sMenuData_TU.eDiscountIcon != MENU_ICON_DUMMY GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData_TU.eDiscountIcon, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData_TU.eDiscountIcon, TRUE, iIconR, iIconG, iIconB, iIconA) DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData_TU.eDiscountIcon), GET_MENU_ICON_TEXTURE(g_sMenuData_TU.eDiscountIcon, TRUE), CUSTOM_MENU_X+(fWidth*0.5)+(CUSTOM_MENU_PIXEL_WIDTH*2), fFinalPanelY+(fHeight*0.5)-(CUSTOM_MENU_PIXEL_HEIGHT*4), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF fFinalPanelY += ((GET_RENDERED_CHARACTER_HEIGHT(CUSTOM_MENU_TEXT_SCALE_Y)*iRow)+(CUSTOM_MENU_PIXEL_HEIGHT*13)+(CUSTOM_MENU_PIXEL_HEIGHT*5*(iRow-1))) // Clear Discount when time is up IF g_sMenuData_TU.iDiscountClearTimer > 0 IF (GET_GAME_TIMER()-g_sMenuData_TU.iDiscountStartTimer) > g_sMenuData_TU.iDiscountClearTimer g_sMenuData_TU.tl15Discount = "" g_sMenuData_TU.iDiscountClearTimer = -1 ENDIF ENDIF ENDIF #ENDIF ////////////////////////////////////////////////////////////////////////////////////////// /// HELP KEYS /// DRAW_MENU_HELP_SCALEFORM(iScreenX, iMenuType, iTimer, FALSE, FALSE, FALSE, bPushSubtitlesUp) SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) ENDIF ////////////////////////////////////////////////////////////////////////////////////////// /// MENU ITEMS /// IF iPass = 1 OR NOT g_sMenuData.bSetupComplete iTextCount = 0 iPlayerNameCount = 0 iIntCount = 0 iFloatCount = 0 iIconCount = 0 iDisplayRow = 0 iTotalRows = 0 iTotalSelectableRows = 0 iCurrentDisplaySpacer = 0 iSpacerCount = 0 INT iRowTo = g_sMenuData.iCurrentRow IF g_sMenuData.bDisplayRowsDefined iRowTo = g_sMenuData.iSetupTotalDisplayRows-1 ENDIF FLOAT fHeightTrack = 0.0 FLOAT fSelectectedHeightTrack = 0.0 INT iColumnShift FOR iRowLoop = 0 TO iRowTo fMenuItemBarHeight = CUSTOM_MENU_ITEM_BAR_H IF g_sMenuData.fRowHeight[iRow] != 0.0 fMenuItemBarHeight = g_sMenuData.fRowHeight[iRow] ENDIF // Using display row lookup and item offsets? IF g_sMenuData.bDisplayRowsDefined iRow = g_sMenuData.iDisplayRow[iRowLoop] ELSE iRow = iRowLoop ENDIF iCurrentDisplaySpacer = iSpacerCount bDisplay = FALSE IF iRow >= g_sMenuData.iTopItem AND iDisplayRow < g_sMenuData.iMenuRows bDisplay = TRUE IF (g_sMenuData.iCurrentItem = iRow) fSelectectedHeightTrack = fHeightTrack ENDIF IF g_sMenuData.bMenuRowHasSpacer[iRow] iCurrentDisplaySpacer++ ENDIF // Only update the Y if we are displaying this row fTextY = fBodyStartY+(fHeightTrack)+(CUSTOM_MENU_SPACER_H*iCurrentDisplaySpacer)+CUSTOM_MENU_TEXT_INDENT_Y ENDIF // Track the Y pos g_sMenuData.fMenuItemScreenY[iRow] = fTextY fTextX = CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X bItemAdded = FALSE bSelected = (g_sMenuData.iCurrentItem = iRow) // Add the highlight bar? IF bSelected AND iPass = 1 AND bDisplay INT iR = 255 INT iG = 255 INT iB = 255 INT iA = 255 IF g_sMenuData.bUseCustomSelectionBarColour GET_HUD_COLOUR(g_sMenuData.eSelectionBarColour, iR, iG, iB, iA) ELSE GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA) ENDIF // [TART UP] //DRAW_RECT_FROM_CORNER(CUSTOM_MENU_X, fBodyStartY+(fSelectectedHeightTrack)+(CUSTOM_MENU_SPACER_H*iCurrentDisplaySpacer), fCustomWidth, fMenuItemBarHeight, iR, iG, iB, iA) // White highlight DRAW_SPRITE("CommonMenu", "Gradient_Nav", CUSTOM_MENU_X+(fCustomWidth*0.5), fBodyStartY+(fSelectectedHeightTrack)+(CUSTOM_MENU_SPACER_H*iCurrentDisplaySpacer)+(fMenuItemBarHeight*0.5), fCustomWidth, fMenuItemBarHeight, 0.0, iR, iG, iB, iA) g_sMenuData.fCurrentItemScreenY = fTextY ENDIF REPEAT g_sMenuData.iMenuColumns iItem IF IS_BIT_SET(g_sMenuData.iItemBitset[iRow], iItem) OR g_sMenuData.eItemLayout[iItem] = MENU_ITEM_TAB IF g_sMenuData.bDisplayRowsDefined iTextCount = g_sMenuData.iStoredTextCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] iIntCount = g_sMenuData.iStoredIntCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] iFloatCount = g_sMenuData.iStoredFloatCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] iIconCount = g_sMenuData.iStoredIconCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] iPlayerNameCount = g_sMenuData.iStoredPlayerNameCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ELSE g_sMenuData.iStoredTextCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = iTextCount g_sMenuData.iStoredIntCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = iIntCount g_sMenuData.iStoredFloatCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = iFloatCount g_sMenuData.iStoredIconCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = iIconCount g_sMenuData.iStoredPlayerNameCount[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = iPlayerNameCount ENDIF INT iArrayPos = 0 bSetCarColour = FALSE IF g_sMenuData.iCarColour[0] != -1 IF ((iRow*MAX_MENU_COLUMNS)+iItem) = g_sMenuData.iCarColourItem[0] bSetCarColour = TRUE iArrayPos = 0 ENDIF ENDIF IF g_sMenuData.iCarColour[1] != -1 IF ((iRow*MAX_MENU_COLUMNS)+iItem) = g_sMenuData.iCarColourItem[1] bSetCarColour = TRUE iArrayPos = 1 ENDIF ENDIF // Use offset explicitly set by the calling script IF g_sMenuData.fColumnXOffset[iItem] != -1 fTextX = CUSTOM_MENU_X+CUSTOM_MENU_TEXT_INDENT_X+g_sMenuData.fColumnXOffset[iItem] ENDIF // Work out the width of this column for text justification calculations IF iItem < MAX_MENU_COLUMNS-1 AND g_sMenuData.fColumnXOffset[iItem+1] != -1.0 AND fTextX < g_sMenuData.fColumnXOffset[iItem+1] fTempColumnWidth = (g_sMenuData.fColumnXOffset[iItem+1]-fTextX) ELSE fTempColumnWidth = (CUSTOM_MENU_X+CUSTOM_MENU_W-CUSTOM_MENU_TEXT_INDENT_X-fTextX) ENDIF IF g_sMenuData.bItemToggleable[iItem] AND g_sMenuData.bDisplayCurrentItemToggles AND bSelected bAddToggleItems = TRUE ELSE bAddToggleItems = FALSE ENDIF // Add the items SWITCH g_sMenuData.eItemLayout[iItem] CASE MENU_ITEM_DUMMY // Item not required BREAK CASE MENU_ITEM_TEXT iThisTextItem = iTextCount IF bDisplay // Work out width of this text item IF NOT g_sMenuData.bDisplayRowsDefined fTempTextWidth = 0 fTempIconWidth = 0 iTempTextCount = 0 iTempIntCount = 0 iTempFloatCount = 0 iTempIconCount = 0 iTempPlayerNameCount = 0 IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 bCondensed = FALSE bPlayerName = FALSE REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME OR g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME // we may want to change this to condensed, will leave until it gets bugged. bPlayerName = TRUE ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL bCondensed = TRUE ENDIF ENDREPEAT IF g_sMenuData.bForceCondensedFont[iThisTextItem] bPlayerName = TRUE ENDIF SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour, iArrayPos, bPlayerName, bCondensed) BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(g_sMenuData.tl15Item[iThisTextItem]) ENDIF REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_TEXT iTempTextCount++ IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[iThisTextItem+iTempTextCount]) ENDIF ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME iTempTextCount++ IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[iThisTextItem+iTempTextCount]) ENDIF ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_RADIO_STATION IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_INT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iItem[iIntCount+iTempIntCount]) ENDIF iTempIntCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_FLOAT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fItem[iFloatCount+iTempFloatCount], g_sMenuData.iFloatDP[iFloatCount+iTempFloatCount]) ENDIF iTempFloatCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_ICON iTempIconCount++ ENDIF ENDREPEAT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 fTempTextWidth = END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) ENDIF IF iTempIconCount > 0 REPEAT iTempIconCount i IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount+i], bSelected, FALSE, fWidth, fHeight, bUseActualRes) fTempIconWidth += (fWidth) IF i > 0 fTempIconWidth -= (CUSTOM_MENU_PIXEL_WIDTH*4) ENDIF IF (g_sMenuData.eIconItem[iIconCount+i] = MENU_ICON_LEFT_STAR) OR (g_sMenuData.eIconItem[iIconCount+i] = MENU_ICON_DISCOUNT) OR (g_sMenuData.eIconItem[iIconCount+i] = MENU_ICON_CHIPS) fTempIconWidth -= (CUSTOM_MENU_PIXEL_WIDTH*5) ENDIF ENDIF ENDREPEAT ENDIF // Use this to track x offset fTempWidth = 0 // Offset for text justification IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth += (fTempColumnWidth-(fTempTextWidth+fTempIconWidth))+(CUSTOM_MENU_PIXEL_WIDTH*1) ELIF g_sMenuData.eJustification[iItem] = FONT_CENTRE fTempWidth += (((fTempColumnWidth-fTextX)*0.5) - ((fTempTextWidth+fTempIconWidth)*0.5)) ENDIF g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempWidth g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempTextWidth g_sMenuData.fStoredTempIconWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempIconWidth // Fix up locations for previous column IF g_sMenuData.eJustification[iItem] = FONT_RIGHT FOR iColumnShift = iItem-1 TO 0 STEP -1 IF g_sMenuData.eJustification[iColumnShift] = FONT_RIGHT g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iColumnShift] -= g_sMenuData.fColumnWidth[iItem]// g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ENDIF ENDFOR ENDIF ELSE fTempWidth = g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] fTempTextWidth = g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] fTempIconWidth = g_sMenuData.fStoredTempIconWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ENDIF // Offset for toggle item IF bAddToggleItems IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fWidth, fHeight, bUseActualRes) IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth -= (fWidth*2) ENDIF fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_L, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_L), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_L, TRUE), fTextX+fTempWidth+fTempToggleWidth, fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth) fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_R, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_R), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_R, TRUE), fTextX+fTempWidth+fTempToggleWidth+(fTempTextWidth+fTempIconWidth), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF ENDIF // Display the menu item iTempTextCount = 0 iTempIntCount = 0 iTempFloatCount = 0 iTempIconCount = 0 iTempPlayerNameCount = 0 eLastCompType = MENU_TEXT_COMP_DUMMY IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 bCondensed = FALSE bPlayerName = FALSE REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME OR g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME bPlayerName = TRUE ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL bCondensed = TRUE ENDIF ENDREPEAT IF g_sMenuData.bForceCondensedFont[iThisTextItem] bPlayerName = TRUE ENDIF SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour, 0, bPlayerName, bCondensed) IF g_sMenuData.bUseCustomRowColour AND g_sMenuData.iCustomRowColour = iRow SETUP_MENU_CUSTOM_ITEM_TEXT_COLOUR(bSelected) ENDIF BEGIN_TEXT_COMMAND_DISPLAY_TEXT(g_sMenuData.tl15Item[iThisTextItem]) ENDIF REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_TEXT iTempTextCount++ IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[iThisTextItem+iTempTextCount]) ENDIF eLastCompType = MENU_TEXT_COMP_TEXT ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME iTempTextCount++ IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_sMenuData.tl15Item[iThisTextItem+iTempTextCount]) ENDIF eLastCompType = MENU_TEXT_COMP_VEHICLE_NAME ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ eLastCompType = MENU_TEXT_COMP_PLAYER_NAME ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_RADIO_STATION IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ eLastCompType = MENU_TEXT_COMP_RADIO_STATION ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ eLastCompType = MENU_TEXT_COMP_LITERAL ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(g_TUMenuGlobals_tlPlayerNameItem[iPlayerNameCount+iTempPlayerNameCount]) ENDIF iTempPlayerNameCount++ eLastCompType = MENU_TEXT_COMP_CONDENSED_LITERAL ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_INT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iItem[iIntCount+iTempIntCount]) ENDIF iTempIntCount++ eLastCompType = MENU_TEXT_COMP_INT ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_FLOAT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fItem[iFloatCount+iTempFloatCount], g_sMenuData.iFloatDP[iFloatCount+iTempFloatCount]) ENDIF iTempFloatCount++ eLastCompType = MENU_TEXT_COMP_FLOAT ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_ICON IF (g_sMenuData.eIconItem[iIconCount+iTempIconCount] = MENU_ICON_LEFT_STAR) OR (g_sMenuData.eIconItem[iIconCount+iTempIconCount] = MENU_ICON_DISCOUNT) OR (g_sMenuData.eIconItem[iIconCount+iTempIconCount] = MENU_ICON_CHIPS) IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount+iTempIconCount], bSelected, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount+iTempIconCount], bSelected, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData.eIconItem[iIconCount+iTempIconCount], bSelected, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 IF g_sMenuData.eJustification[iItem] = FONT_RIGHT DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount+iTempIconCount]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount+iTempIconCount], bSelected), fTextX+fTempWidth-(CUSTOM_MENU_PIXEL_WIDTH*8)+(CUSTOM_MENU_PIXEL_WIDTH*4), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ELSE DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount+iTempIconCount]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount+iTempIconCount], bSelected), fTextX+fTempWidth-(CUSTOM_MENU_PIXEL_WIDTH*8), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF fTempWidth += (CUSTOM_MENU_PIXEL_WIDTH*3) ENDIF ENDIF ENDIF iTempIconCount++ eLastCompType = MENU_TEXT_COMP_ICON ENDIF ENDREPEAT IF GET_HASH_KEY(g_sMenuData.tl15Item[iThisTextItem]) != 0 AND iPass = 1 IF eLastCompType = MENU_TEXT_COMP_ICON AND g_sMenuData.eJustification[iItem] = FONT_RIGHT END_TEXT_COMMAND_DISPLAY_TEXT(fTextX+fTempWidth+(CUSTOM_MENU_PIXEL_WIDTH*7), fTextY) ELSE END_TEXT_COMMAND_DISPLAY_TEXT(fTextX+fTempWidth, fTextY) IF IS_ROCKSTAR_DEV() AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("FM_MISSION_CREATOR")) > 0 IF iItem = 0 TEXT_LABEL_15 tl15b FLOAT fColour FLOAT fAlpha FLOAT fOffsetForNum FLOAT fOffsetY FLOAT fOffsetX IF g_sMenuData.bForceCondensedFont[iThisTextItem] bPlayerName = TRUE ENDIF SETUP_MENU_ITEM_TEXT(FALSE, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour, 0, bPlayerName, bCondensed) tl15b = "TEST_LABEL" fColour = 0 fAlpha = 55 fOffsetForNum = 0.0185 fOffsetY = 0.004 fOffsetX = 0.02 SET_TEXT_SCALE(0.0000, CUSTOM_MENU_TEXT_SCALE_Y*0.7) SET_TEXT_COLOUR(255, 255, 255, 150) DRAW_RECT(fTextX-(fOffsetX*0.6), fTextY+(fOffsetForNum*0.75), 0.0175, 0.035, FLOOR(fColour), FLOOR(fColour), FLOOR(fColour), FLOOR(fAlpha)) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(tl15b) // Items hiddens aren't incrementing the count. Fix it: url:bugstar:7930348 ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iTopItem+iThisTextItemActual) END_TEXT_COMMAND_DISPLAY_TEXT(fTextX-fOffsetX, fTextY+fOffsetY) iThisTextItemActual++ ENDIF ENDIF ENDIF ENDIF IF iTempIconCount > 0 fTempWidth += (6 * CUSTOM_MENU_PIXEL_WIDTH) REPEAT iTempIconCount i IF (g_sMenuData.eIconItem[iIconCount+i] != MENU_ICON_LEFT_STAR) AND (g_sMenuData.eIconItem[iIconCount+i] != MENU_ICON_DISCOUNT) AND (g_sMenuData.eIconItem[iIconCount+i] != MENU_ICON_CHIPS) IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount+i], bSelected, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth*0.5) IF iPass = 1 IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount+i], bSelected, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData.eIconItem[iIconCount+i], bSelected, iIconR, iIconG, iIconB, iIconA) IF g_sMenuData.eIconItem[iIconCount+i] = MENU_ICON_DLC_IMAGE DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount+i]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount+i], bSelected), CUSTOM_MENU_X+(fWidth*0.5), fTextY+CUSTOM_MENU_TEXT_INDENT_Y+(fHeight*0.5)-(CUSTOM_MENU_PIXEL_WIDTH*11), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ELIF g_sMenuData.eJustification[iItem] = FONT_RIGHT DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount+i]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount+i], bSelected), fTextX+fTempWidth+fTempTextWidth-(CUSTOM_MENU_PIXEL_WIDTH*8)+(CUSTOM_MENU_PIXEL_WIDTH*4), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ELSE DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount+i]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount+i], bSelected), fTextX+fTempWidth+fTempTextWidth-(CUSTOM_MENU_PIXEL_WIDTH*12), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF fTempWidth += (12 * CUSTOM_MENU_PIXEL_WIDTH) ENDIF ENDIF ENDREPEAT ENDIF ENDIF bItemAdded = TRUE iTextCount++ // Add the sub component items we just processed. REPEAT MAX_STORED_TEXT_COMPS i IF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_TEXT iTextCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_VEHICLE_NAME iTextCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_INT iIntCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_FLOAT iFloatCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_ICON iIconCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_PLAYER_NAME iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_RADIO_STATION iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_LITERAL iPlayerNameCount++ ELIF g_sMenuData.eTextItemComps[iThisTextItem][i] = MENU_TEXT_COMP_CONDENSED_LITERAL iPlayerNameCount++ ENDIF ENDREPEAT BREAK CASE MENU_ITEM_INT IF bDisplay // Work out width of this text item IF NOT g_sMenuData.bDisplayRowsDefined SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour) IF g_sMenuData.bUseCustomRowColour AND g_sMenuData.iCustomRowColour = iRow SETUP_MENU_CUSTOM_ITEM_TEXT_COLOUR(bSelected) ENDIF BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT("NUMBER") ADD_TEXT_COMPONENT_INTEGER(g_sMenuData.iItem[iIntCount]) fTempTextWidth = END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) // Use this to track x offsets fTempWidth = 0 // Offset for text justification IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth += (fTempColumnWidth-(fTempTextWidth))+(CUSTOM_MENU_PIXEL_WIDTH*1) ELIF g_sMenuData.eJustification[iItem] = FONT_CENTRE fTempWidth += (((fTempColumnWidth-fTextX)*0.5) - ((fTempTextWidth)*0.5)) ENDIF g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempWidth g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempTextWidth ELSE fTempWidth = g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] fTempTextWidth = g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ENDIF // Offset for toggle item IF bAddToggleItems IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fWidth, fHeight, bUseActualRes) IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth -= (fWidth*2) ENDIF fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_L, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_L), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_L, TRUE), fTextX+fTempWidth+fTempToggleWidth, fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth) fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_R, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_R), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_R, TRUE), fTextX+fTempWidth+fTempToggleWidth+(fTempTextWidth+fTempIconWidth), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF ENDIF // Display the menu item IF iPass = 1 SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour) DISPLAY_TEXT_WITH_NUMBER(fTextX+fTempWidth, fTextY, "NUMBER", g_sMenuData.iItem[iIntCount]) ENDIF ENDIF bItemAdded = TRUE iIntCount++ BREAK CASE MENU_ITEM_FLOAT IF bDisplay // Work out width of this text item IF NOT g_sMenuData.bDisplayRowsDefined SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour) IF g_sMenuData.bUseCustomRowColour AND g_sMenuData.iCustomRowColour = iRow SETUP_MENU_CUSTOM_ITEM_TEXT_COLOUR(bSelected) ENDIF BEGIN_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT("NUMBER") ADD_TEXT_COMPONENT_FLOAT(g_sMenuData.fItem[iFloatCount], g_sMenuData.iFloatDP[iFloatCount]) fTempTextWidth = END_TEXT_COMMAND_GET_SCREEN_WIDTH_OF_DISPLAY_TEXT(TRUE) // Use this to track x offsets fTempWidth = 0 // Offset for text justification IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth += (fTempColumnWidth-(fTempTextWidth))+(CUSTOM_MENU_PIXEL_WIDTH*1) ELIF g_sMenuData.eJustification[iItem] = FONT_CENTRE fTempWidth += (((fTempColumnWidth-fTextX)*0.5) - ((fTempTextWidth)*0.5)) ENDIF g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempWidth g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempTextWidth ELSE fTempWidth = g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] fTempTextWidth = g_sMenuData.fStoredTempTextWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ENDIF // Offset for toggle item IF bAddToggleItems IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fWidth, fHeight) IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth -= (fWidth*2) ENDIF fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_L, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_L), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_L, TRUE), fTextX+fTempWidth+fTempToggleWidth, fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth) fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_R, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_R), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_R, TRUE), fTextX+fTempWidth+fTempToggleWidth+(fTempTextWidth+fTempIconWidth), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF ENDIF // Display the menu item SETUP_MENU_ITEM_TEXT(bSelected, g_sMenuData.bIsSelectable[iThisTextItem], g_sMenuData.bIsDefault[iThisTextItem], bSetCarColour) DISPLAY_TEXT_WITH_FLOAT(fTextX+fTempWidth, fTextY, "NUMBER", g_sMenuData.fItem[iFloatCount], g_sMenuData.iFloatDP[iFloatCount]) ENDIF bItemAdded = TRUE iFloatCount++ BREAK CASE MENU_ITEM_ICON IF bDisplay IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount], bSelected, FALSE, fWidth, fHeight, bUseActualRes) // Work out width of this item IF NOT g_sMenuData.bDisplayRowsDefined fTempIconWidth = (fWidth) // Use this to track x offsets fTempWidth = 0 // Offset for text justification IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth += (fTempColumnWidth-(fTempIconWidth))+(CUSTOM_MENU_PIXEL_WIDTH*1) ELIF g_sMenuData.eJustification[iItem] = FONT_CENTRE fTempWidth += (((fTempColumnWidth-fTextX)*0.5) - ((fTempIconWidth)*0.5)) ENDIF g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempWidth g_sMenuData.fStoredTempIconWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] = fTempIconWidth ELSE fTempWidth = g_sMenuData.fStoredTempWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] fTempIconWidth = g_sMenuData.fStoredTempIconWidth[(iDisplayRow*g_sMenuData.iMenuColumns)+iItem] ENDIF // Offset for toggle item IF bAddToggleItems IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, FALSE, fWidth, fHeight, bUseActualRes) IF g_sMenuData.eJustification[iItem] = FONT_RIGHT fTempWidth -= (fWidth*2) ENDIF fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_L, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_L), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_L, TRUE), fTextX+fTempWidth+fTempToggleWidth, fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, FALSE, fWidth, fHeight, bUseActualRes) fTempWidth += (fWidth) fTempToggleWidth = (fWidth*0.5) IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_R, TRUE, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(MENU_ICON_ARROW_R, TRUE, iIconR, iIconG, iIconB, iIconA) IF iPass = 1 DRAW_SPRITE(GET_MENU_ICON_TXD(MENU_ICON_ARROW_R), GET_MENU_ICON_TEXTURE(MENU_ICON_ARROW_R, TRUE), fTextX+fTempWidth+fTempToggleWidth+(fTempTextWidth+fTempIconWidth), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth, fHeight, 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF ENDIF // Display the menu item IF iPass = 1 IF GET_MENU_ICON_SCREEN_RESOLUTION(g_sMenuData.eIconItem[iIconCount], bSelected, TRUE, fWidth, fHeight, bUseActualRes) GET_MENU_ICON_TEXTURE_RGB(g_sMenuData.eIconItem[iIconCount], bSelected, iIconR, iIconG, iIconB, iIconA) DRAW_SPRITE(GET_MENU_ICON_TXD(g_sMenuData.eIconItem[iIconCount]), GET_MENU_ICON_TEXTURE(g_sMenuData.eIconItem[iIconCount], bSelected), fTextX+fTempWidth+(fWidth*0.5), fTextY-CUSTOM_MENU_TEXT_INDENT_Y+(fMenuItemBarHeight*0.5), fWidth*GET_MENU_ICON_SCALE_MULTIPLIER(g_sMenuData.eIconItem[iIconCount]), fHeight*GET_MENU_ICON_SCALE_MULTIPLIER(g_sMenuData.eIconItem[iIconCount]), 0.0, iIconR, iIconG, iIconB, iIconA) ENDIF ENDIF ENDIF ENDIF bItemAdded = TRUE iIconCount++ BREAK CASE MENU_ITEM_TAB bItemAdded = TRUE BREAK ENDSWITCH // Add column width for the next item IF g_sMenuData.eItemLayout[iItem] = MENU_ITEM_TAB IF g_sMenuData.fColumnWidth[iItem] > 0.05 fTextX += g_sMenuData.fColumnWidth[iItem] ELSE fTextX += 0.05 ENDIF ELSE fTextX += g_sMenuData.fColumnWidth[iItem] // Remove the toggle item width we added at the start as this would have already been added to fColumnWidth IF g_sMenuData.bItemToggleable[iItem] IF GET_MENU_ICON_SCREEN_RESOLUTION(MENU_ICON_ARROW_L, TRUE, TRUE, fWidth, fHeight, bUseActualRes) fTextX -= fWidth ENDIF ENDIF ENDIF ELSE // No item added so add on default width fTextX += g_sMenuData.fColumnWidth[iItem] ENDIF ENDREPEAT // No more items to add in this row so update the final height IF bItemAdded IF bDisplay g_sMenuData.iDisplayRow[iDisplayRow] = iRow g_sMenuData.iLastDisplayItem = iRow iDisplayRow++ IF g_sMenuData.bMenuRowHasSpacer[iRow] iSpacerCount++ ENDIF IF g_sMenuData.fRowHeight[iRow] != 0.0 fHeightTrack += g_sMenuData.fRowHeight[iRow] ELSE fHeightTrack += CUSTOM_MENU_ITEM_BAR_H ENDIF ENDIF IF NOT g_sMenuData.bSetupComplete g_sMenuData.bMenuRowHasDisplayItems[iRow] = TRUE IF g_sMenuData.bMenuRowDoesntAddToCount[iRow] IF bSelected g_sMenuData.iSetupCurrentSelectableItem = 0 ENDIF ELSE iTotalSelectableRows++ IF bSelected g_sMenuData.iSetupCurrentSelectableItem = iTotalSelectableRows ENDIF ENDIF iTotalRows++ ENDIF ENDIF ENDFOR IF NOT g_sMenuData.bSetupComplete g_sMenuData.fSetupFinalBodyY = fBodyStartY+(fHeightTrack)+(CUSTOM_MENU_SPACER_H*iCurrentDisplaySpacer) g_sMenuData.iSetupTotalSelectableRows = iTotalSelectableRows g_sMenuData.iSetupTotalRows = iTotalRows g_sMenuData.bSetupComplete = TRUE ENDIF ENDIF IF NOT g_sMenuData.bDisplayRowsDefined g_sMenuData.iSetupTotalDisplayRows = iDisplayRow g_sMenuData.bDisplayRowsDefined = TRUE ENDIF ENDREPEAT g_sMenuData.fMenuFinalScreenY = fFinalPanelY g_sMenuData.iLastDrawTimer = GET_GAME_TIMER() THEFEED_SET_SCRIPTED_MENU_HEIGHT(g_sMenuData.fMenuFinalScreenY) // Block various game states IF NOT g_sMenuData.bKeepPhoneForNextDrawMenuCall DISABLE_CELLPHONE_THIS_FRAME_ONLY() ENDIF g_sMenuData.bKeepPhoneForNextDrawMenuCall = FALSE IF bHideHelpText HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_HELP_TEXT) ENDIF HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME) // Fix for bug #953251 - Spray booth menu is overlapped by the distance marker for Race to Point IF bSetButtonsUnderHud SET_INSTRUCTIONAL_BUTTONS_UNDER_HUD_THIS_FRAME() ENDIF RESET_SCRIPT_GFX_ALIGN() ENDPROC // This is used to delay control movement up/down FUNC BOOL ALLOW_ANALOGUE_MOVEMENT(TIME_DATATYPE &selectionIncrementTimer, INT &iIncrement,BOOL bVertical = TRUE) // up button BOOL bIncrement INT iTimerDelay = 150 IF bVertical IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) OR (GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y) < -0.3) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) //faster response IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP) iTimerDelay = 100 ENDIF IF ABSI(GET_TIME_DIFFERENCE(selectionIncrementTimer, GET_NETWORK_TIME())) > iTimerDelay selectionIncrementTimer = GET_NETWORK_TIME() bIncrement = TRUE iIncrement = 1 ENDIF ENDIF // down button IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) OR (GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y) > 0.3) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) //faster response IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN) iTimerDelay = 100 ENDIF IF ABSI(GET_TIME_DIFFERENCE(selectionIncrementTimer, GET_NETWORK_TIME())) > iTimerDelay selectionIncrementTimer = GET_NETWORK_TIME() bIncrement = TRUE iIncrement = -1 ENDIF ENDIF ELSE // right button press IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) OR (GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X) > 0.3) OR IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) IF ABSI(GET_TIME_DIFFERENCE(selectionIncrementTimer, GET_NETWORK_TIME())) > iTimerDelay selectionIncrementTimer = GET_NETWORK_TIME() bIncrement = TRUE iIncrement = 1 ENDIF ENDIF // left button press IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) OR (GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X) < -0.3) IF ABSI(GET_TIME_DIFFERENCE(selectionIncrementTimer, GET_NETWORK_TIME())) > iTimerDelay selectionIncrementTimer = GET_NETWORK_TIME() bIncrement = TRUE iIncrement = -1 ENDIF ENDIF ENDIF RETURN bIncrement ENDFUNC /// PURPOSE: /// Returns true if a menu option was selected OR the cancel button was pressed. FUNC BOOL HANDLE_CUSTOM_MENU_INPUT( TIME_DATATYPE& tLastScrollTime, BOOL& ref_bCancelled, BOOL& ref_bAccepted ) ref_bCancelled = FALSE ref_bAccepted = FALSE INT iSelectionChange = 0 IF IS_PC_VERSION() AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) IF GET_PAUSE_MENU_STATE() = PM_INACTIVE AND NOT IS_SYSTEM_UI_BEING_DISPLAYED() AND NOT IS_WARNING_MESSAGE_ACTIVE() AND NOT g_sShopSettings.bProcessStoreAlert AND NOT NETWORK_TEXT_CHAT_IS_TYPING() // Mouse control support IF IS_USING_CURSOR(FRONTEND_CONTROL) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD) DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE) ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_ACCEPT) ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_CANCEL) ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_UP) ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_CURSOR_SCROLL_DOWN) SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) HANDLE_CURSOR_HIGHLIGHTED_MENU_ITEMS() HANDLE_MENU_CURSOR(FALSE) ENDIF IF IS_MENU_CURSOR_ACCEPT_PRESSED() CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - Mouse accept just pressed.") IF g_sMenuData.iCurrentItem = g_iMenuCursorItem CDEBUG1LN(DEBUG_EXT_MENU, "HANDLE_CUSTOM_MENU_INPUT - Clicked selected option - accepting this menu option. (ACCEPT)") ref_bAccepted = TRUE ELSE iSelectionChange = g_sMenuData.iCurrentItem-g_iMenuCursorItem //(ALLOW_ANALOGUE_MOVEMENT returns the negative so we invert this too) CDEBUG1LN(DEBUG_EXT_MENU, "HANDLE_CUSTOM_MENU_INPUT - Clicked non-selected option - moving forward selection by ",iSelectionChange,".") ENDIF ELIF IS_MENU_CURSOR_CANCEL_PRESSED() OR IS_DISABLED_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - INPUT_FRONTEND_PAUSE_ALTERNATE (CANCEL)") ref_bCancelled = TRUE ELIF IS_MENU_CURSOR_SCROLL_UP_PRESSED() iSelectionChange = 1 ELIF IS_MENU_CURSOR_SCROLL_DOWN_PRESSED() iSelectionChange = -1 ENDIF ENDIF ENDIF IF NOT ref_bAccepted AND IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - INPUT_FRONTEND_ACCEPT (ACCEPT)") ref_bAccepted = TRUE ENDIF IF NOT ref_bCancelled AND IS_DISABLED_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) //Checking for released instead of pressed to prevent conflict with the pause menu CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - INPUT_FRONTEND_CANCEL (CANCEL)") ref_bCancelled = TRUE ENDIF IF iSelectionChange = 0 AND (NOT ALLOW_ANALOGUE_MOVEMENT( tLastScrollTime, iSelectionChange, TRUE) OR NOT (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) // Normal interior menus only accept dpad (no LStick) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN))) iSelectionChange = 0 //ALLOW_ANALOGUE_MOVEMENT does processing. Set back to 0 to be sure. ENDIF IF ref_bAccepted CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - ACCEPT just pressed. Option ", g_sMenuData.iCurrentItem) PLAY_SOUND_FRONTEND(-1, "SELECT", "HUD_FREEMODE_SOUNDSET") RETURN TRUE ELIF ref_bCancelled CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - CANCEL just pressed.") PLAY_SOUND_FRONTEND(-1, "BACK","HUD_FREEMODE_SOUNDSET") RETURN TRUE ENDIF IF iSelectionChange <> 0 PLAY_SOUND_FRONTEND(-1, "NAV_UP_DOWN", "HUD_FREEMODE_SOUNDSET") SET_CURRENT_MENU_ITEM_WITH_WRAP( g_sMenuData.iCurrentItem - iSelectionChange ) CDEBUG1LN(DEBUG_EXT_MENU, " HANDLE_CUSTOM_MENU_INPUT - Change selection just pressed. Option ", g_sMenuData.iCurrentItem) ENDIF RETURN FALSE ENDFUNC PROC APPLY_BASIC_CUSTOM_MENU_SETTINGS(BOOL bIncludeBackButton = TRUE, BOOL bIncludeSelectButton = TRUE) SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT) SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT) IF bIncludeSelectButton ADD_MENU_HELP_KEY_CLICKABLE(INPUT_FRONTEND_ACCEPT, "ITEM_SELECT") ENDIF IF bIncludeBackButton ADD_MENU_HELP_KEY_CLICKABLE(INPUT_FRONTEND_CANCEL, "ITEM_BACK") ENDIF ENDPROC PROC SETUP_MENU_WITH_TITLE(STRING sTitle) CLEAR_MENU_DATA() SET_MENU_TITLE(sTitle) SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT) SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT) ENDPROC