1var root 2var control_nodes 3 4var play_button 5var close_button 6var close_button_label 7var demo_button 8var quit_button 9var online_button 10 11var main_menu_animations 12var settings_animations 13var main_menu 14 15var settings 16var settings_title 17var settings_gfx 18var settings_sound 19var settings_game 20 21var settings_nav 22var settings_nav_gfx 23var settings_nav_sound 24var settings_nav_game 25var settings_nav_pad 26 27var menu_button 28var settings_button 29var campaign_button 30 31var label_completed 32var label_wins 33var label_maps_created 34var label_version 35 36var maps_sub_menu = preload("res://gui/menu_maps.xscn").instance() 37var maps_sub_menu_anchor 38var maps_close_button 39var workshop_button 40var workshop 41 42var overscan_group 43 44var sound_toggle_button 45var music_toggle_button 46var shake_toggle_button 47var camera_follow_button 48var camera_move_to_bunker_button 49var camera_zoom_in_button 50var camera_zoom_out_button 51var resolution_button 52var difficulty_button 53var overscan_toggle_button 54var language_cycle_button 55var gamepad_info 56var gamepad_info_button 57var tooltips_button 58 59var sound_toggle_label 60var music_toggle_label 61var shake_toggle_label 62var camera_follow_label 63var camera_move_to_bunker_label 64var camera_zoom_label 65var resolution_label 66var difficulty_label 67var overscan_toggle_label 68var language_cycle_label 69var root_tree 70var background_gradient 71var button_states = {true : 'LABEL_ON', false : 'LABEL_OFF'} 72var speed_states = ['>', '>>', '>>>', '>>>>', '>>>>>'] 73var ai_speed_button 74var ai_speed_label 75var camera_speed_button 76var camera_speed_label 77 78func _ready(): 79 self.control_nodes = [self.get_node("top"), self.get_node("middle"), self.get_node("bottom")] 80 81 workshop_button = get_node("bottom/center/workshop") 82 if !Globals.get('tof/enable_workshop'): 83 workshop_button.hide() 84 85 campaign_button = get_node("bottom/center/start_campaign") 86 self.background_gradient = self.get_node('vigette/center/sprite') 87 88 play_button = get_node("bottom/center/play") 89 close_button = get_node("top/center/close") 90 quit_button = get_node("top/center/quit") 91 demo_button = get_node("top/center/demo") 92 online_button = get_node("bottom/center/online") 93 94 if not Globals.get('tof/online'): 95 online_button.hide() 96 97 close_button_label = close_button.get_node('Label') 98 99 main_menu = get_node("middle/center/game_panel") 100 self.settings_button = get_node("top/center/settings") 101 102 # S E T T I N G S 103 self.settings = get_node("middle/center/settings_panel") 104 self.settings_title = self.settings.get_node("header/title") 105 self.settings_gfx = self.settings.get_node("body/tabs/gfx/") 106 self.settings_sound = self.settings.get_node("body/tabs/sound/") 107 self.settings_game = self.settings.get_node("body/tabs/game/") 108 109 self._settings_nav_button_pressed('game') 110 111 # settings navigation 112 self.settings_nav = self.settings.get_node("nav/tabs") 113 self.settings_nav_gfx = self.settings_nav.get_node("gfx") 114 self.settings_nav_sound = self.settings_nav.get_node("sound") 115 self.settings_nav_game = self.settings_nav.get_node("game") 116 self.settings_nav_pad = self.settings_nav.get_node("pad") 117 118 self.settings_nav_gfx.connect("pressed", self, "_settings_nav_button_pressed", ['gfx']) 119 self.settings_nav_sound.connect("pressed", self, "_settings_nav_button_pressed", ['sound']) 120 self.settings_nav_game.connect("pressed", self, "_settings_nav_button_pressed", ['game']) 121 122 # gfx 123 self.overscan_group = self.settings_gfx.get_node("overscan_button") 124 self.overscan_toggle_button = self.settings_gfx.get_node("overscan_button/buttons/center/first") 125 self.shake_toggle_button = self.settings_gfx.get_node("shake_toggle/buttons/center/first") 126 self.camera_follow_button = self.settings_gfx.get_node("camera_follow/buttons/center/first") 127 self.camera_move_to_bunker_button = self.settings_gfx.get_node("camera_move_to_bunker/buttons/center/first") 128 self.camera_zoom_in_button = self.settings_gfx.get_node("camera_zoom/buttons/center/first") 129 self.camera_zoom_out_button = self.settings_gfx.get_node("camera_zoom/buttons/center/second") 130 self.resolution_button = self.settings_gfx.get_node("display_mode_toggle/buttons/center/first") 131 132 self.shake_toggle_label = self.shake_toggle_button 133 self.camera_follow_label = self.camera_follow_button 134 self.camera_move_to_bunker_label = self.camera_move_to_bunker_button 135 self.resolution_label = self.resolution_button 136 self.overscan_toggle_label = self.overscan_toggle_button 137 138 #sound 139 self.sound_toggle_button = self.settings_sound.get_node("sound_toggle/buttons/center/first") 140 self.music_toggle_button = self.settings_sound.get_node("music_toggle/buttons/center/first") 141 self.sound_toggle_label = self.sound_toggle_button 142 self.music_toggle_label = self.music_toggle_button 143 144 # game 145 self.difficulty_button = self.settings_game.get_node("difficulty/buttons/center/first") 146 self.ai_speed_button = self.settings_game.get_node("ai_speed/buttons/center/first") 147 self.ai_speed_label = self.ai_speed_button 148 self.camera_speed_button = self.settings_game.get_node("camera_speed/buttons/center/first") 149 self.camera_speed_label = self.camera_speed_button 150 self.tooltips_button = self.settings_game.get_node("tooltips/buttons/center/first") 151 self.language_cycle_button = self.settings_game.get_node('language/buttons/center/first') 152 self.difficulty_label = self.difficulty_button 153 self.language_cycle_label = self.language_cycle_button 154 155 # BUTTON BINDINGS 156 __bind_pressed(campaign_button, ["play_menu_sound", "show_campaign_menu"]) 157 __bind_pressed(workshop_button, ["play_menu_sound", "__enter_workshop"]) 158 __bind_pressed(play_button, ["play_menu_sound", "show_maps_menu"]) 159 __bind_pressed(online_button, ["play_menu_sound", "show_online_menu"]) 160 __bind_pressed(sound_toggle_button, ["play_menu_sound", "__toggle_sound"]) 161 __bind_pressed(music_toggle_button, ["play_menu_sound", "__toggle_music"]) 162 __bind_pressed(shake_toggle_button, ["play_menu_sound", "__toggle_shake"]) 163 __bind_pressed(camera_follow_button, ["play_menu_sound", "__toggle_follow"]) 164 __bind_pressed(camera_move_to_bunker_button, ["play_menu_sound", "__toggle_camera_move_to_bunker"]) 165 __bind_pressed(camera_zoom_in_button, ["play_menu_sound", "__camera_zoom_in"]) 166 __bind_pressed(camera_zoom_out_button, ["play_menu_sound", "__camera_zoom_out"]) 167 __bind_pressed(quit_button, ["play_menu_sound", "quit_game"]) 168 __bind_pressed(demo_button, ["play_menu_sound", "start_demo_mode"]) 169 __bind_pressed(settings_button, ["play_menu_sound", "toggle_settings"]) 170 __bind_pressed(overscan_toggle_button, ["play_menu_sound", "__toggle_overscan"]) 171 __bind_pressed(ai_speed_button, ["play_menu_sound", "__toggle_ai_speed"]) 172 __bind_pressed(camera_speed_button, ["play_menu_sound", "__toggle_camera_speed"]) 173 __bind_pressed(tooltips_button, ["play_menu_sound", "__toggle_tooltips"]) 174 175 self.resolution_button.connect("pressed", self, "_resolution_button_pressed") 176 difficulty_button.connect("pressed", self, "_difficulty_button_pressed") 177 language_cycle_button.connect("pressed", self, "_language_cycle_button_pressed") 178 self.settings_nav_pad.connect("pressed", self.root.bag.gamepad_popup, "show") 179 if self.root.is_pandora: 180 self.settings_nav_pad.hide() 181 self.settings_nav_pad.set_disabled(true) 182 183 close_button.connect("pressed", self, "_close_button_pressed") 184 185 self.label_completed = self.get_node("bottom/center/completed") 186 self.label_maps_created = self.get_node("bottom/center/maps_created") 187 self.label_version = self.get_node("middle/center/game_panel/under_logo/copy") 188 189 self.refresh_buttons_labels() 190 self.load_maps_menu() 191 192 self.update_progress_labels() 193 self.update_version_label() 194 self.update_zoom_label() 195 self.root.bag.controllers.background_map_controller.load_background_map() 196 197func play_menu_sound(): 198 self.root.sound_controller.play('menu') 199 200func _language_cycle_button_pressed(): 201 self.root.sound_controller.play('menu') 202 self.root.bag.language.switch_to_next_language() 203 self.refresh_buttons_labels() 204 205func _close_button_pressed(): 206 self.root.sound_controller.play('menu') 207 if not self.root.is_map_loaded && self.root.bag.saving != null: 208 self.root.bag.saving.load_state() 209 else: 210 self.root.toggle_menu() 211 212func _maps_close_button_pressed(): 213 self.root.sound_controller.play('menu') 214 self.hide_maps_menu() 215 self.play_button.grab_focus() 216 217func _resolution_button_pressed(): 218 self.root.sound_controller.play('menu') 219 self.root.bag.resolution.toggle_resolution() 220 self.refresh_buttons_labels() 221 222func _difficulty_button_pressed(): 223 self.root.sound_controller.play('menu') 224 self.root.settings['easy_mode'] = not self.root.settings['easy_mode'] 225 self.refresh_buttons_labels() 226 self.root.write_settings_to_file() 227 228func _settings_nav_button_pressed(target): 229 self.settings_game.hide() 230 self.settings_gfx.hide() 231 self.settings_sound.hide() 232 233 if target == 'game': 234 self.settings_game.show() 235 self.set_settings_title('LABEL_GAME') 236 elif target == 'gfx': 237 self.settings_gfx.show() 238 self.set_settings_title('LABEL_GFX') 239 elif target == 'sound': 240 self.settings_sound.show() 241 self.set_settings_title('LABEL_SOUND') 242 243func set_settings_title(trans_key): 244 self.settings_title.set_trans_key(trans_key) 245 246func show_online_menu(): 247 self.root.bag.controllers.online_menu_controller.show() 248 self.hide_control_nodes() 249 if self.root.settings['online_player_id'] != null: 250 self.root.bag.controllers.online_menu_controller.multiplayer.refresh_button.grab_focus() 251 252func start_demo_mode(): 253 self.root.bag.demo_mode.start_demo_mode(false) 254 255func load_maps_menu(): 256 maps_sub_menu.hide() 257 self.add_child(maps_sub_menu) 258 259 maps_sub_menu_anchor = maps_sub_menu.get_node("middle") 260 maps_close_button = maps_sub_menu.get_node("bottom/control/menu_controls/close") 261 262 maps_close_button.connect("pressed", self, "_maps_close_button_pressed") 263 264func show_campaign_menu(): 265 self.root.bag.controllers.campaign_menu_controller.show_campaign_menu() 266 self.hide_control_nodes() 267 self.root.bag.controllers.campaign_menu_controller.start_button.grab_focus() 268 269func show_maps_menu(): 270 self.hide_control_nodes() 271 self.root.bag.map_picker.attach_panel(self.maps_sub_menu_anchor) 272 self.root.bag.map_picker.connect(self, "switch_to_skirmish_setup_panel") 273 self.root.bag.map_picker.lock_delete_mode_button() 274 self.maps_sub_menu.show() 275 if self.root.bag.map_picker.blocks_cache.size() > 0: 276 self.root.bag.map_picker.blocks_cache[0].get_node("TextureButton").grab_focus() 277 else: 278 self.maps_close_button.grab_focus() 279 280func switch_to_skirmish_setup_panel(selected_map_name, is_remote): 281 self.root.bag.map_picker.detach_panel() 282 self.root.bag.skirmish_setup.attach_panel(self.maps_sub_menu_anchor) 283 self.root.bag.skirmish_setup.set_map_name(selected_map_name, selected_map_name, is_remote) 284 self.root.bag.skirmish_setup.connect(self, "switch_to_map_selection_panel", "play_selected_skirmish_map") 285 self.root.bag.skirmish_setup.play_button.grab_focus() 286 287func switch_to_map_selection_panel(): 288 self.root.bag.map_picker.attach_panel(self.maps_sub_menu_anchor) 289 self.root.bag.map_picker.connect(self, "switch_to_skirmish_setup_panel") 290 self.root.bag.skirmish_setup.detach_panel() 291 self.root.bag.map_picker.blocks_cache[0].get_node("TextureButton").grab_focus() 292 293func play_selected_skirmish_map(map_name, is_remote): 294 self.load_map(map_name, true, is_remote) 295 296func show_control_nodes(): 297 for nod in self.control_nodes: 298 nod.show() 299 300func hide_control_nodes(): 301 for nod in self.control_nodes: 302 nod.hide() 303 304func hide_maps_menu(): 305 self.show_control_nodes() 306 maps_sub_menu.hide() 307 self.root.bag.map_picker.detach_panel() 308 self.root.bag.skirmish_setup.detach_panel() 309 310# SETTINGS 311func get_settings_visibility(): 312 return self.settings.is_visible() 313 314func toggle_settings(): 315 if self.get_settings_visibility(): 316 self.hide_settings() 317 else: 318 self.show_settings() 319 320func show_settings(): 321 self.settings.show() 322 323func hide_settings(): 324 self.settings.hide() 325 326func manage_close_button(): 327 if not self.close_button: 328 return 329 if self.root.is_map_loaded: 330 self.close_button.show() 331 self.close_button_label.set_text('< ' + tr('LABEL_GAME')) 332 elif self.root.bag.saving != null && self.root.bag.saving.is_save_available(): 333 self.close_button.show() 334 self.close_button_label.set_text('< ' + tr('LABEL_RESUME')) 335 else: 336 self.close_button.hide() 337 338func refresh_buttons_labels(): 339 get_tree().call_group(0, "translate_me", "refresh_label") 340 var items_for_refresh = [ 341 ['sound_enabled', 'sound_toggle_label'], 342 ['music_enabled', 'music_toggle_label'], 343 ['shake_enabled', 'shake_toggle_label'], 344 ['camera_follow', 'camera_follow_label'], 345 ['camera_move_to_bunker', 'camera_move_to_bunker_label'], 346 ['is_overscan', 'overscan_toggle_label'], 347 ['tooltips_enabled', 'tooltips_button'] 348 ] 349 for item in items_for_refresh: 350 __set_togglable_label(item[0], item[1]) 351 352 __set_togglable_label('easy_mode', 'difficulty_label', {false: tr('LABEL_NORMAL'), true : tr('LABEL_EASY')}) 353 __set_togglable_label('ai_speed', 'ai_speed_label', self.speed_states) 354 __set_togglable_label('camera_speed', 'camera_speed_label', self.speed_states) 355 356 357 language_cycle_label.set_trans_key(self.root.settings['language'].to_upper()) 358 359 if Globals.get('tof/hud_allow_overscan'): 360 self.overscan_group.show() 361 else: 362 self.overscan_group.hide() 363 364 if root.bag.resolution.override_resolution: 365 self.resolution_button.set_disabled(false) 366 if root.settings['resolution'] == root.bag.resolution.UNLOCKED: 367 resolution_label.set_trans_key('LABEL_ON') 368 else: 369 resolution_label.set_trans_key('LABEL_OFF') 370 else: 371 self.resolution_button.set_disabled(true) 372 self.resolution_label.hide() 373 374func quit_game(): 375 OS.get_main_loop().quit() 376 377func update_zoom_label(): 378 #self.camera_zoom_label.set_text(str(self.root.camera.get_camera_zoom().x)) 379 return true 380 381func update_progress_labels(): 382 self.update_custom_maps_count_label() 383 self.update_campaign_progress_label() 384 385func update_custom_maps_count_label(): 386 var maps_created = self.root.bag.map_list.maps.size() 387 if self.label_maps_created != null: 388 self.label_maps_created.set_text(tr('LABEL_MAPS_CREATED') + ': ' + str(maps_created)) 389 390func update_campaign_progress_label(): 391 var completed_maps = self.root.bag.campaign.get_completed_map_count() 392 var total_maps = self.root.bag.campaign.maps.size() 393 if self.label_completed != null: 394 self.label_completed.set_text(tr('LABEL_COMPLETED') + ": " + str(completed_maps) + "/" + str(total_maps)) 395 396func update_version_label(): 397 self.label_version.set_text(self.root.version_name) 398 399func load_map(name, from_workshop, is_remote = false): 400 if from_workshop: 401 root.load_map('workshop', name, false, is_remote, self, "post_load_map") 402 else: 403 root.load_map(name, false, false, false, self, "post_load_map") 404 405func post_load_map(): 406 root.toggle_menu() 407 self.hide_maps_menu() 408 self.root.bag.controllers.workshop_menu_controller.suspend_workshop() 409 410func init_root(root_node): 411 root = root_node 412 self.root_tree = self.root.get_tree() 413 414func __call_methods(method_names=[]): 415 for method in method_names: 416 call(method) 417 418func __bind_pressed(button, methods=[]): 419 button.connect("pressed", self, "__call_methods", [methods]) 420 421func __toggle_music(): 422 __toggle_button('music_enabled', 'music_toggle_label') 423 if root.settings['music_enabled']: 424 root.sound_controller.play_soundtrack() 425 else: 426 root.sound_controller.stop_soundtrack() 427 428func __camera_zoom_in(): 429 self.root.bag.camera.camera_zoom_in() 430 431func __camera_zoom_out(): 432 self.root.bag.camera.camera_zoom_out() 433 434func __enter_workshop(): 435 self.root.bag.controllers.workshop_menu_controller.enter_workshop() 436 437func __toggle_sound(): 438 __toggle_button('sound_enabled', 'sound_toggle_label') 439 440func __toggle_shake(): 441 __toggle_button('shake_enabled', 'shake_toggle_label') 442 443func __toggle_follow(): 444 __toggle_button('camera_follow', 'camera_follow_label') 445 446func __toggle_overscan(): 447 __toggle_button('is_overscan', 'overscan_toggle_label') 448 449func __toggle_camera_move_to_bunker(): 450 __toggle_button('camera_move_to_bunker', 'camera_move_to_bunker_label') 451 452func __toggle_ai_speed(): 453 __toggle_multioption_button('ai_speed', 'ai_speed_label', self.speed_states) 454 self.root.bag.perform.update_ai_speed() 455 456func __toggle_camera_speed(): 457 __toggle_multioption_button('camera_speed', 'camera_speed_label', self.speed_states) 458 self.root.bag.camera.update_camera_speed() 459 460func __toggle_tooltips(): 461 __toggle_button('tooltips_enabled', 'tooltips_button') 462 463 464func __toggle_multioption_button(setting_name, setting_label, button_states = self.button_states): 465 var count = button_states.size() 466 root.settings[setting_name] = (root.settings[setting_name] + 1) % count 467 __set_togglable_label(setting_name, setting_label, button_states) 468 root.write_settings_to_file() 469 470func __toggle_button(setting_name, setting_label, button_states = self.button_states): 471 root.settings[setting_name] = not root.settings[setting_name] 472 __set_togglable_label(setting_name, setting_label, button_states) 473 root.write_settings_to_file() 474 475func __set_togglable_label(setting_name, label_name, button_states = self.button_states): 476 self.get(label_name).set_trans_key(button_states[root.settings[setting_name]]) 477