extends CanvasLayer enum MENUS{DEFAULT, BUILD, BACKPACK, ESC, BAIT, SHOP, DIALOGUE, EMOTE, UPGRADE, PROP, ARENA} const MINIGAMES = { "fishing": preload("res://Scenes/Minigames/Fishing/Fishing.tscn"), "fishing2": preload("res://Scenes/Minigames/Fishing2/fishing2.tscn"), "fishing3": preload("res://Scenes/Minigames/Fishing3/fishing3.tscn"), "shoveling": preload("res://Scenes/Minigames/Shoveling/shoveling.tscn"), "painting": preload("res://Scenes/HUD/PaintingScreen/painting_screen.tscn"), "guitar": preload("res://Scenes/Minigames/Guitar/guitar_minigame.tscn"), "scratch_off": preload("res://Scenes/Minigames/ScratchTicket/scratch_ticket.tscn"), } onready var overlay = $main / in_game onready var tab_container = $main / menu / TabContainer onready var esc_menu = $esc_menu onready var hotbar = $main / in_game / hotbar onready var gamechat = $main / in_game / gamechat / RichTextLabel onready var chat_root = $main / in_game / gamechat onready var chat = $main / in_game / gamechat / LineEdit onready var ui_anim = $main / ui_anim onready var backpack_anim = $main / backpack / Viewport / Spatial / backpack / AnimationPlayer onready var tacklebox_anim = $main / tacklebox / Viewport / Spatial / tacklebox / AnimationPlayer onready var buttons = $main / menu / buttons onready var tabs = $main / menu / tabs onready var build_ui = $main / build_ui onready var shop = $main / shop onready var dialogue = $main / dialogue onready var bait_show = $main / in_game / bait onready var emote_wheel = $main / emote_wheel onready var prop_menu = $main / prop_menu onready var arena_menu = $main / arena_menu var menu = MENUS.DEFAULT var prev_menu = MENUS.DEFAULT var using_chat = false var interact = false var popups = [] var player var current_tab = 0 var shop_id = "" var int_text = "" var dialogue_text = [] var show_bait = false var chat_timer = 0 var chat_local = false var hud_hidden = false var interact_timer = 0 var chat_hover = false var chat_expand = false var chat_hide = false var freecamming = false signal _items_chosen signal _minigame_finished signal _player_sit signal _menu_entered signal _play_emote signal _message_sent signal _freecam_toggle func _ready(): PlayerData.connect("_hotbar_refresh", self, "_refresh_hotbar") PlayerData.connect("_bait_update", self, "_bait_refresh") PlayerData.connect("_force_menu_close", self, "_abort") Network.connect("_chat_update", self, "_chat_update") esc_menu.connect("_close", self, "_change_menu", [0]) _refresh_hotbar() _change_tab(0) _change_menu(MENUS.DEFAULT) _toggle_chat(true) func _process(delta): var cash = (str(round(PlayerData.money))).pad_zeros(9) cash = cash.insert(cash.length() - str(PlayerData.money).length(), "[color=#1a231a]") $main / menu / Panel4 / cashlabel.bbcode_text = "[center][color=#1a231a]$ [color=#d5aa73]" + cash bait_show.visible = show_bait if Rect2(chat_root.rect_global_position, chat_root.rect_size).has_point(chat_root.get_global_mouse_position()) and chat_timer < 30: chat_timer = 30 if chat_timer > 0: chat_timer -= 1 chat_root.modulate.a = lerp(chat_root.modulate.a, max(0.4, float(chat_timer > 0 or using_chat)), 0.3) $main / in_game / gamechat / Panel.modulate.a = lerp($main / in_game / gamechat / Panel.modulate.a, float(chat_timer > 0 or using_chat), 0.3) $main / in_game / gamechat / Panel2.modulate.a = $main / in_game / gamechat / Panel.modulate.a gamechat.scroll_active = using_chat if popups == [] and not OptionsMenu.open: if Input.is_action_just_pressed("menu_open"): if hud_hidden: _show_hud() else : if menu == MENUS.DEFAULT: _change_menu(MENUS.BACKPACK) else : _change_menu(MENUS.DEFAULT) if Input.is_action_just_pressed("esc_menu"): if hud_hidden: _show_hud() else : if menu == MENUS.DEFAULT: _change_menu(MENUS.ESC) else : _change_menu(MENUS.DEFAULT) if Input.is_action_just_pressed("chat_enter") and menu == MENUS.DEFAULT: if not using_chat: using_chat = true chat.editable = true chat.selecting_enabled = true chat.focus_mode = Control.FOCUS_ALL chat.grab_focus() chat.placeholder_text = "Type to chat!" else : _send_message(chat.text) chat.text = "" _exit_chat() if not using_chat: if Input.is_action_just_released("bait_menu"): if menu == MENUS.DEFAULT: _change_menu(MENUS.BAIT) else : _change_menu(MENUS.DEFAULT) if Input.is_action_just_pressed("build"): if menu == MENUS.DEFAULT: _change_menu(MENUS.PROP) else : _change_menu(MENUS.PROP) if Input.is_action_just_released("emote_wheel"): if menu == MENUS.EMOTE: _change_menu(MENUS.DEFAULT) if Input.is_action_just_pressed("emote_wheel"): if menu == MENUS.DEFAULT: _change_menu(MENUS.EMOTE) if Input.is_action_just_pressed("interact"): if menu != MENUS.DEFAULT and menu != MENUS.BACKPACK: _change_menu(MENUS.DEFAULT) if menu == MENUS.BACKPACK: if Input.is_action_just_pressed("tab_next"): current_tab += 1 if current_tab > 4: current_tab = 0 _change_tab(current_tab) if Input.is_action_just_pressed("tab_prev"): current_tab -= 1 if current_tab < 0: current_tab = 4 _change_tab(current_tab) if Input.is_action_just_pressed("hide_hud"): _hide_hud() if Input.is_action_just_pressed("freecam"): _on_camera_pressed() if not is_instance_valid(player): queue_free() else : player.busy = menu != MENUS.DEFAULT or using_chat player.show_local = using_chat and chat_local $"%new_icon".visible = PlayerData.new_cosmetics.size() > 0 chat_root.anchor_top = lerp(chat_root.anchor_top, 0.66 if not chat_expand else 0.2, 0.2) chat_root.anchor_left = lerp(chat_root.anchor_left, 0.02 if not chat_hide else - 0.52, 0.2) chat_root.anchor_right = lerp(chat_root.anchor_right, 0.28 if not chat_hide else - 0.26, 0.2) $main / in_game / show_chat.visible = chat_hide $main / in_game / freecamwarning.visible = freecamming $main / in_game / freecamwarning.modulate.a = 0.6 + (sin(OS.get_ticks_msec() * 0.004) * 0.4) func _physics_process(delta): if interact: interact_timer += 2 elif interact_timer > 0: if interact_timer > 28: interact_timer = 28 interact_timer -= 2 var frame = floor(interact_timer / 7.0) if frame > 3: frame = 3 + ceil(sin(OS.get_ticks_msec() * 0.01)) $main / in_game / interact_notif / Label.visible = frame >= 3 $main / in_game / interact_notif / TextureRect.texture.set_current_frame(frame) $main / in_game / interact_notif.margin_bottom = 12 + sin(OS.get_ticks_msec() * 0.002) * 12 $main / in_game / interact_notif.visible = interact_timer > 0 $main / in_game / interact_notif / Label.text = "[E] " + str(int_text) func _hide_hud(): if not hud_hidden: hud_hidden = true overlay.modulate.a = 0.0 PlayerData._send_notification("press h, tab, or esc to show hud again") else : _show_hud() PlayerData.emit_signal("_hide_hud_toggle", hud_hidden) func _show_hud(): hud_hidden = false overlay.modulate.a = 1.0 func _change_menu(to): yield (get_tree(), "idle_frame") yield (get_tree(), "idle_frame") prev_menu = menu if menu == to: to = MENUS.DEFAULT if menu != to: var sfx = "menu_a" match to: MENUS.DEFAULT: sfx = "menu_b" MENUS.DIALOGUE: sfx = "" if sfx != "": PlayerData.emit_signal("_play_sfx", sfx) menu = to if menu == MENUS.BACKPACK: _open_menu(); else : _close_menu() if menu == MENUS.ESC: _open_esc_menu(); else : _close_esc_menu() if menu == MENUS.BAIT: _open_bait(); else : _close_bait() if menu == MENUS.BUILD: build_ui.show(); else : build_ui.hide() if menu == MENUS.DEFAULT: overlay.show(); else : overlay.hide() if menu == MENUS.SHOP: shop._open(shop_id); else : shop._close() if menu == MENUS.DIALOGUE: dialogue._open(dialogue_text); else : dialogue._close() if menu == MENUS.EMOTE: emote_wheel._open(); else : emote_wheel._close() if menu == MENUS.PROP: prop_menu._open(); else : prop_menu._close() if menu == MENUS.ARENA: arena_menu._open(); else : arena_menu._close() emit_signal("_menu_entered", menu) var rank_data = PlayerData._get_level_data(PlayerData.badge_level) $main / menu / Panel3 / badgelabel.text = str(rank_data["title"]) + "\nRANK " + str(PlayerData.badge_level) + "\n" + str(PlayerData.badge_xp) + "/" + str(PlayerData._get_xp_goal(PlayerData.badge_level)) + " xp" $main / menu / Panel5 / item_display.texture = rank_data["icon"] func _open_menu(): ui_anim.play("Open") overlay.hide() backpack_anim.play("intro", - 1, 2.0) _exit_chat() $main / menu / tabs / outfit._refresh() GlobalAudio._play_sound("backpack_open") func _close_menu(): if prev_menu == MENUS.BACKPACK: ui_anim.play_backwards("Open") backpack_anim.play("intro", - 1, - 2.0, true) player.call_deferred("_change_cosmetics") GlobalAudio._play_sound("backpack_close") overlay.show() func _change_tab(new): backpack_anim.stop(true) var anim = ["zip", "zip_b", "zip", "zip_b", "zip", "zip_b"][new] backpack_anim.play(anim, - 1, 2.0) current_tab = new for child in buttons.get_children(): child._update(new) for child in tabs.get_children(): child.visible = child.get_position_in_parent() == new if child.get_position_in_parent() == new: $"%bplabel".text = child.name if menu == MENUS.BACKPACK: PlayerData.emit_signal("_play_sfx", "zip") func _open_esc_menu(): esc_menu.show() esc_menu._open() _exit_chat() func _close_esc_menu(): esc_menu._close() esc_menu.hide() func _open_bait(): GlobalAudio._play_sound("tb_rustle") ui_anim.play("tacklebox_open") overlay.hide() tacklebox_anim.play("open", - 1, 2.0) _exit_chat() _bait_refresh() func _close_bait(): if prev_menu == MENUS.BAIT: GlobalAudio._play_sound("tb_rustle") ui_anim.play_backwards("tacklebox_open") tacklebox_anim.play("open", - 1, - 2.0, true) overlay.show() func _bait_refresh(): var bait_list = $"%bait_list" var lure_list = $"%lure_list" for child in bait_list.get_children(): child.queue_free() for child in lure_list.get_children(): child.queue_free() for bait in PlayerData.bait_inv.keys(): if not PlayerData.bait_unlocked.has(bait): continue var button = Button.new() button.set_script(preload("res://Scenes/Menus/Main Menu/ui_generic_button.gd")) button.icon = PlayerData.BAIT_DATA[bait].icon button.text = PlayerData.BAIT_DATA[bait].name button.disabled = PlayerData.bait_selected == bait if bait != "": button.text = button.text + " x" + str(PlayerData.bait_inv[bait]) if PlayerData.bait_inv[bait] <= 0: button.disabled = true if PlayerData.bait_selected == bait: button.text = button.text + " (selected)" button.expand_icon = true button.align = Button.ALIGN_LEFT button.connect("pressed", self, "_change_bait", [bait]) button.connect("mouse_entered", self, "_bait_hover", [bait]) bait_list.add_child(button) for lure in PlayerData.LURE_DATA.keys(): if not PlayerData.lure_unlocked.has(lure): continue var button = Button.new() button.set_script(preload("res://Scenes/Menus/Main Menu/ui_generic_button.gd")) button.icon = PlayerData.LURE_DATA[lure].icon button.text = PlayerData.LURE_DATA[lure].name button.disabled = PlayerData.lure_selected == lure if PlayerData.lure_selected == lure: button.text = button.text + " (selected)" button.expand_icon = true button.align = Button.ALIGN_LEFT button.connect("pressed", self, "_change_lure", [lure]) button.connect("mouse_entered", self, "_lure_hover", [lure]) lure_list.add_child(button) func _change_bait(bait): PlayerData.bait_selected = bait PlayerData.emit_signal("_bait_update") func _bait_hover(bait): var title = PlayerData.BAIT_DATA[bait].name var desc = PlayerData.BAIT_DATA[bait].desc $main / bait_menu / Panel3 / bait_info.bbcode_text = "[color=#6a4420]" + title + "[/color]\n" + desc func _change_lure(lure): PlayerData.lure_selected = lure PlayerData.emit_signal("_bait_update") func _lure_hover(lure): var title = PlayerData.LURE_DATA[lure].name var desc = PlayerData.LURE_DATA[lure].desc $main / bait_menu / Panel3 / bait_info.bbcode_text = "[color=#6a4420]" + title + "[/color]\n" + desc func _item_pressed(item): _change_menu(MENUS.DEFAULT) player._equip_item(item) func _exit_chat(): chat.focus_mode = Control.FOCUS_NONE chat.editable = false chat.selecting_enabled = false chat.placeholder_text = "ENTER to begin typing..." using_chat = false func _refresh_hotbar(): var index = 0 for child in hotbar.get_children(): child.disconnect("pressed", self, "_item_pressed") if not PlayerData.hotbar.keys().has(index): index += 1 continue var item = PlayerData._find_item_code(PlayerData.hotbar[index]) child._setup_item(item["ref"]) child.connect("pressed", self, "_item_pressed", [item]) index += 1 func _send_message(text): if text.replace(" ", "") == "": return var color = Globals.cosmetic_data[PlayerData.cosmetics_equipped["primary_color"]]["file"].main_color color = color.to_html() text = text.replace("[", "") text = text.replace("]", "") var breakdown = text.split(" ") var final_text = "" var spoken_text = "" var colon = true var current_effect = "none" var drunk_chance = 0.0 var drunk_max = 0 if is_instance_valid(player): drunk_chance = 0.13 * player.drunk_tier drunk_max = player.drunk_tier var line_index = 0 for line in breakdown: if line.begins_with("/"): match line: "/me": colon = false "/wag": PlayerData.emit_signal("_wag_toggle") elif line.begins_with("["): continue else : var spoken_add = line for i in drunk_max: var cont = true if randf() < drunk_chance and line.length() > 0: var d_effect = randi() % 5 match d_effect: 0, 1: var slot = randi() % line.length() line = line.insert(slot, line[slot]) spoken_add = line 2: var slot = randi() % line.length() line = line.insert(slot, "'") spoken_add = line 3: var slot = randi() % line.length() line = line.insert(slot, ",") spoken_add = line 4: var slot = randi() % line.length() spoken_add = line.insert(slot, " -*HICC*- ") line = line.insert(slot, "[color=#5a755a][font=res://Assets/Themes/main_font_tiny.tres] -*HICC*- [/font][color=#1a231a]") cont = false if not cont: break spoken_text = spoken_text + spoken_add match current_effect: "bold": line = "[b]" + line + "[/b]" final_text = final_text + line if breakdown.size() - 1 != line_index: spoken_text = spoken_text + " " final_text = final_text + " " line_index += 1 var prefix = "" var suffix = "" var endcap = "[color=#1a231a]: " if not colon: prefix = "[color=#1a231a](" suffix = ")" endcap = "[color=#1a231a] " var username = Network.STEAM_USERNAME username = username.replace("[", "") username = username.replace("]", "") var final_color = Color(color) * Color(0.95, 0.9, 0.9) var final = prefix + "[color=#" + str(final_color.to_html()) + "]" + username + endcap + final_text + suffix if final_text != "": Network._send_message(final, chat_local) if colon and spoken_text != "": emit_signal("_message_sent", spoken_text) func _chat_update(): chat_timer = 210 gamechat.bbcode_text = str(Network.GAMECHAT) if not chat_local else str(Network.LOCAL_GAMECHAT) func _button_message_send(): _send_message(chat.text) chat.text = "" _exit_chat() func _request_item_choice(filter_id = [], min_items = 1, max_items = 99, tag_filter = ""): if popups.has("CHOICE"): return popups.append("CHOICE") var ic = preload("res://Scenes/HUD/ItemSelect/item_select.tscn").instance() ic.tag_filter = tag_filter ic.filter = filter_id ic.min_items = min_items ic.max_items = max_items add_child(ic) ic.connect("_finished", self, "_select_finished") func _select_finished(items): popups.erase("CHOICE") emit_signal("_items_chosen", items) func _on_Button_pressed(): _request_item_choice() var items = yield (self, "_items_chosen") print("CHOSEN: ", items) func _on_inbox__create_letter(): popups.append("LETTER") var p = preload("res://Scenes/HUD/Inbox/letter_popup.tscn").instance() add_child(p) p.hud = self p.connect("_finished", self, "_letter_finished") func _letter_finished(): popups.erase("LETTER") func _on_inbox__read_letter(letter): popups.append("LETTER_READ") var p = preload("res://Scenes/HUD/Inbox/letter_view.tscn").instance() add_child(p) p._load_letter(letter) p.hud = self p.connect("_finished", self, "_letter_read_finished") func _letter_read_finished(): popups.erase("LETTER_READ") func _on_dialogue__finished(): _change_menu(MENUS.DEFAULT) func _open_minigame(minigame, params = {}, difficulty = 1.0): if not MINIGAMES.keys().has(minigame): return if popups.has("MINIGAME_" + str(minigame)): return _abort() popups.append("MINIGAME_" + str(minigame)) var m = MINIGAMES[minigame].instance() m.params = params m.difficulty = difficulty add_child(m) var success = yield (m, "_finished") emit_signal("_minigame_finished", success) popups.erase("MINIGAME_" + str(minigame)) func _abort(): _change_menu(MENUS.DEFAULT) _exit_chat() func _on_Button4_pressed(): emit_signal("_player_sit") func _play_emote(emote_id, emotion): emit_signal("_play_emote", emote_id, emotion) _change_menu(MENUS.DEFAULT) func _toggle_chat(extra_arg_0): chat_local = not extra_arg_0 _chat_update() $"%global_chat".modulate = Color(0.7, 0.7, 0.7) if not extra_arg_0 else Color(1.0, 1.0, 1.0) $"%local_chat".modulate = Color(0.7, 0.7, 0.7) if extra_arg_0 else Color(1.0, 1.0, 1.0) func _on_expand_pressed(): chat_expand = not chat_expand if chat_expand: $"%expand".icon = preload("res://Assets/Textures/UI/chat_arrow2.png") else : $"%expand".icon = preload("res://Assets/Textures/UI/chat_arrow1.png") func _on_hide_pressed(): chat_hide = true func _on_show_chat_pressed(): chat_hide = false func _quest_update(): for child in $"%questbox".get_children(): child.queue_free() for quest in PlayerData.current_quests.keys(): if PlayerData.current_quests[quest]["active"]: var entry = preload("res://Scenes/HUD/QuestEntry/quest_entry.tscn").instance() entry._setup(quest) $"%questbox".add_child(entry) func _quest_toggle(): $"%questbox".visible = not $"%questbox".visible $main / in_game / Label / Button.text = ">" if $"%questbox".visible else "<" func _on_tent_pressed(): _change_menu(MENUS.PROP) func _on_camera_pressed(): emit_signal("_freecam_toggle") func _on_status_update_timeout(): if not is_instance_valid(player): return var tier = 0 if player.boost_timer > 0 and player.boost_timer < 3600: tier = 1 elif player.boost_timer > 0: tier = 2 $main / in_game / static_effects / GridContainer / speedboost._setup(tier if player.boost_amt == 1.3 else 0, player.boost_timer) $main / in_game / static_effects / GridContainer / speedboost_burst._setup(tier if player.boost_amt == 4.0 else 0, player.boost_timer) tier = 0 if player.catch_drink_timer > 0 and player.catch_drink_timer < 3600: tier = 1 elif player.catch_drink_timer > 0: tier = 2 $main / in_game / static_effects / GridContainer / catchboost._setup(tier if player.catch_drink_tier == 1 else 0, player.catch_drink_timer) $main / in_game / static_effects / GridContainer / catchboost_big._setup(tier if player.catch_drink_tier == 2 else 0, player.catch_drink_timer) $main / in_game / static_effects / GridContainer / catchboost_deluxe._setup(tier if player.catch_drink_tier == 3 else 0, player.catch_drink_timer) tier = 0 if player.drunk_timer > 0 and player.drunk_timer < 3600: tier = 1 elif player.drunk_timer > 0: tier = 2 $main / in_game / static_effects / GridContainer / drunk_tipsy._setup(tier if player.drunk_tier == 1 else 0, player.drunk_timer) $main / in_game / static_effects / GridContainer / drunk_reg._setup(tier if player.drunk_tier == 2 else 0, player.drunk_timer) $main / in_game / static_effects / GridContainer / drunk_hammered._setup(tier if player.drunk_tier == 3 else 0, player.drunk_timer) func _tb_sound_play(): if menu == MENUS.BAIT: GlobalAudio._play_sound("tb_open") else : GlobalAudio._play_sound("tb_close")