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