#include maps\mp\gametypes\_hud_util; #include maps\mp\_utility; #include common_scripts\utility; #include bots\menu\_button_monitoring; #include bots\menu\_permissions; #include bots\menu\_ui; #include bots\menu\_utils; #include bots\menu\_funcs; //menu types MENU_OPEN = 0; MENU_AUTO = 1; //auto regenerate.. only needed for players menu //types TYPE_EXEC = 0; //just execute like a regular function TYPE_MENU = 1; //this is a menu (aka submenu), just open it TYPE_BOOL = 2; //on or off... TYPE_MULT = 3; //array... multiple items.. "Low", "Medium", "High" TYPE_MOVE = 4; //movable slider.. not implemented yet. TYPE_DIAL = 5; //each exec changes value like a dial... up to "9" then resets to "1" //menu related stuff MENU_WIDTH = 480; MENU_MAX_ITEMS = 18; loadMenus() { if(self canAccessMenu()) { if(self canAccess(4)) { //host } self createMenu( 1, 0, "Bot Menu" ); //self addOption( 1, 0, "test #1", TYPE_EXEC, ::test, "test #1" ); if(self.menu_toggle == 0) { self addOption( 1, 0, "Spawn Bots", TYPE_EXEC, ::test2, "" ); self addOption( 1, 1, "Bot Settings", TYPE_MENU, ::open_Menu, 2); self addOption( 1, 2, "Extra Settings", TYPE_MENU, ::open_Menu, 3); self addOption( 1, 3, "Close Menu", TYPE_EXEC, ::test5, "" ); self createMenu( 2, 1, "Bot Settings" ); //self addOption( 2, 0, "test #2", TYPE_EXEC, ::test, "Test #2" ); self addOption( 2, 0, "Number of Allies", TYPE_DIAL, ::test6, level.bot_allies ); self addOption( 2, 1, "Number of Axis", TYPE_DIAL, ::test7, level.bot_axis ); if(level.teamBased) self addOption( 2, 2, "Bot Difficulty", TYPE_MULT, ::test4, level.bot_difficulty, "Recruit,Regular,Hardened,Veteran,Mixed,European Extreme" ); else self addOption( 2, 2, "Bot Difficulty", TYPE_MULT, ::test4, level.bot_difficulty, "Recruit,Regular,Hardened,Veteran,Mixed" ); self addOption( 2, 3, "Go Back", TYPE_EXEC, ::test5, "" ); self createMenu( 3, 1, "Extra Settings" ); self addOption( 3, 0, "Bots Use Nuke", TYPE_BOOL, ::test8, level.bot_nuke ); self addOption( 3, 1, "Bots Talk", TYPE_BOOL, ::test9, level.bot_talk ); self addOption( 3, 2, "Go Back", TYPE_EXEC, ::test5, "" ); } else { self addOption( 1, 0, "Kick Bots", TYPE_EXEC, ::test3, "" ); self addOption( 1, 1, "Close Menu", TYPE_EXEC, ::test5, "" ); } } else { self.menus = []; //empty out the array... } } createMenu( id, parent, title, type ) { self.menus[id] = spawnstruct(); self.menus[id].id = id; self.menus[id].parent = parent; self.menus[id].title = title; self.menus[id].items = []; self.menus[id].type = MENU_OPEN; if(isDefined(type)) self.menus[id].type = type; } addOption( menuid, index, title, type, function, argument, delimeters) { self.menus[menuid].items[index] = spawnstruct(); self.menus[menuid].items[index].title = title; self.menus[menuid].items[index].type = type; self.menus[menuid].items[index]._arg = ""; self.menus[menuid].items[index].func = ::test; self.menus[menuid].items[index].exec = self; if(isDefined(function)) self.menus[menuid].items[index].func = function; if(isDefined(argument)) self.menus[menuid].items[index]._arg = argument; if(isDefined(delimeters)) self.menus[menuid].items[index].delims = delimeters; //array (seperated by ',') which value has to fall in between } test( arg ) { if(!isDefined(arg)) arg = "test"; self iprintlnbold( arg ); } open_Menu( id ) { self notify("menu_enter"); self.menu_id = id; self.menu_mult_open = false; self updateMenuDisplay(); //update the bar position self.menu_scroll = 0; self.menu_hud["bar"] setPos( "left_adjustable", "top_adjustable", "left_adjustable", "top_adjustable", -15, (self.menu_scroll * 20) + 62 ); } createMenuHud() { self.menu_hud["bar"] = createShader( "left_adjustable", "top_adjustable", "left_adjustable", "top_adjustable", -15, 62, 326, 20, "menu_button_selection_bar", (0,0,0), 1, 1); self.menu_hud["bg"] = createShader( "left_adjustable", "FULLSCREEN", "left_adjustable", "FULLSCREEN", -15, 0, 280, 480, "gradient_fadein_fadebottom", (0,0,0), .7, 2); } destroyMenuHud() { self.menu_hud["bar"] destroy(); self.menu_hud["bg"] destroy(); self.menu_hud["title"] destroy(); for(i=0;i self.menus[self.menu_id].items.size - 1) self.menu_scroll = self.menus[self.menu_id].items.size - 1; self.menu_hud["bar"] setPos( "left_adjustable", "top_adjustable", "left_adjustable", "top_adjustable", -15, (self.menu_scroll * 20) + 62 ); self notify("menu_nav_down"); self.menu_didhint_down = true; } else if((isDefined(self.menu_return) && self.menu_return == 1) || level.gameEnded || !isAlive(self) || (isDefined(level.allowMovement) && !level.allowMovement)) { if(self.menus[self.menu_id].parent == 0) { self.menu_id = 0; self.menu_open = false; self destroyMenuHud(); if(isDefined(level.allowMovement) && level.allowMovement) { self notify("menu_control"); if( bots\includes::_gameFlag( "prematch_done" ) ) self freezeControls(false); } } else { self open_Menu( self.menus[self.menu_id].parent ); } self.menu_return = 0; } else if(self isButtonPressed("+gostand")) { self notify("menu_nav_select"); self.menu_didhint_select = true; switch( self.menus[self.menu_id].items[self.menu_scroll].type ) { case 1: //TYPE_MENU: self open_Menu( self.menus[self.menu_id].items[self.menu_scroll]._arg ); break; case 2: //TYPE_BOOL: self [[self.menus[self.menu_id].items[self.menu_scroll].func]](self.menus[self.menu_id].items[self.menu_scroll]._arg); //exec the func relating to bool... //this is the 'bool' actual value of toggled variable will be replaced in above function ^^ self.menus[self.menu_id].items[self.menu_scroll]._arg = !self.menus[self.menu_id].items[self.menu_scroll]._arg; //after swapping values from above function ^^^, update text. self notify("menu_update"); self.menu_hud["text_sub"][self.menu_scroll] setText( "[" + boolean(self.menus[self.menu_id].items[self.menu_scroll]._arg) + "]"); level.numTextCache++; break; case 3: //TYPE_MULT: delims = strTok( self.menus[self.menu_id].items[self.menu_scroll].delims, "," ); //create menu display + text self.menu_hud["text_sub"][self.menu_scroll].alpha = 0; self.menu_hud["mult_bg"] = createShader( "left_adjustable", "top_adjustable", "left", "top_adjustable", 287, (self.menu_scroll * 20) + 62, 145, delims.size * 20, "black", (0,0,0), .7, 3); self.menu_hud["mult_bar"] = createShader( "left_adjustable", "top_adjustable", "left", "top_adjustable", 287, (self.menu_scroll * 20) + 62, 145, 20, "black", (0,0,0), 1, 4); for( i = 0; i < delims.size; i++ ) { self.menu_hud["delims"][i] = self createFontString( "default", 1.6 ); self.menu_hud["delims"][i] setPos( "left_adjustable", "top_adjustable", "left", "top_adjustable", 290, (i * 20) + (self.menu_scroll * 20) + 62); self.menu_hud["delims"][i].sort = 3; self.menu_hud["delims"][i] setText( delims[i] ); self thread destroyOnAny( self.menu_hud["delims"][i], "mult_menu_exit" ); level.numTextCache++; } //get return value from mult menu returnVal = openMultMenu( self.menus[self.menu_id].items[self.menu_scroll]._arg, delims ); //update menu display of newly changed item. self.menu_hud["text_sub"][self.menu_scroll].alpha = 1; self.menu_hud["mult_bg"] destroy(); self.menu_hud["mult_bar"] destroy(); self.menu_hud["text_sub"][self.menu_scroll] setText( returnVal ); level.numTextCache++; self.menus[self.menu_id].items[self.menu_scroll]._arg = returnVal; self thread [[self.menus[self.menu_id].items[self.menu_scroll].func]](returnVal); break; case 4: //TYPE_MOVE: break; case 5: //TYPE_DIAL: self [[self.menus[self.menu_id].items[self.menu_scroll].func]](self.menus[self.menu_id].items[self.menu_scroll]._arg); //self.menus[self.menu_id].items[self.menu_scroll]._arg++; // generic if(self.menu_id == 2 && self.menu_scroll == 0) // allies count self.menus[self.menu_id].items[self.menu_scroll]._arg = level.bot_allies; else { if(self.menu_id == 2 && self.menu_scroll == 1) // axis count self.menus[self.menu_id].items[self.menu_scroll]._arg = level.bot_axis; } self notify("menu_update"); self.menu_hud["text_sub"][self.menu_scroll] setText( self.menus[self.menu_id].items[self.menu_scroll]._arg ); level.numTextCache++; break; case 0: //TYPE_EXEC: default: self thread [[self.menus[self.menu_id].items[self.menu_scroll].func]](self.menus[self.menu_id].items[self.menu_scroll]._arg); break; } } } else { self destroyMenuHud(); } waitframe(); } } openMultMenu(value, delims) { self.mult_menu_scroll = index_of( value, delims ); self.menu_hud["mult_bar"] setPos( "left_adjustable", "top_adjustable", "left", "top_adjustable", 287, (self.menu_scroll * 20) + (self.mult_menu_scroll * 20) + 62, 145, 20 ); while(1) { if(self isButtonPressed("+actionslot 1")) { self.mult_menu_scroll--; if(self.mult_menu_scroll < 0) self.mult_menu_scroll = 0; self.menu_hud["mult_bar"] setPos( "left_adjustable", "top_adjustable", "left", "top_adjustable", 287, (self.menu_scroll * 20) + (self.mult_menu_scroll * 20) + 62, 145, 20 ); } else if(self isButtonPressed("+actionslot 2")) { self.mult_menu_scroll++; if(self.mult_menu_scroll > delims.size - 1) self.mult_menu_scroll = delims.size - 1; self.menu_hud["mult_bar"] setPos( "left_adjustable", "top_adjustable", "left", "top_adjustable", 287, (self.menu_scroll * 20) + (self.mult_menu_scroll * 20) + 62, 145, 20 ); } else if(self isButtonPressed("+gostand")) { self notify("mult_menu_exit"); return delims[self.mult_menu_scroll]; } waitframe(); } }