Explosion_der_Spiele/scripts/levels/moon.gd

92 lines
2.9 KiB
GDScript3
Raw Permalink Normal View History

extends Node3D
## Mond: Käsekatapulte, Schwert, Sonnenbrille, Fake-Bowser Hammer-Fight.
@onready var hammer_ui: CanvasLayer = $HammerUI
var _correct_hammer: int = 1
var _hits_needed: int = 3
var _hits: int = 0
func _ready() -> void:
GameState.current_scene_id = "moon"
GameState.heal_full()
Achievements.unlock("moon_cheese")
hammer_ui.visible = false
_spawn_cheese_sellers()
var bowser := get_node_or_null("FakeBowser")
if bowser and bowser.has_signal("interacted"):
bowser.interacted.connect(_start_bowser_fight)
var sword := get_node_or_null("SwordStone")
if sword:
sword.give_item_id = "moon_sword"
sword.dialog_key = "dialog_cheese"
var shades := get_node_or_null("MoonResearcher")
if shades and shades.has_signal("interacted"):
shades.interacted.connect(_on_shades)
# Convert old CheeseSeller NPC if present into shooter
var old := get_node_or_null("CheeseSeller")
if old and not old.has_method("notify_cheese_destroyed"):
old.queue_free()
func _spawn_cheese_sellers() -> void:
var scene: PackedScene = load("res://scenes/prefabs/cheese_seller.tscn")
if scene == null:
return
for i in range(4):
var s: Node3D = scene.instantiate()
add_child(s)
s.global_position = Vector3(-6.0 + i * 4.0, 0.1, -2.0 - (i % 2) * 2.0)
func _on_shades(_n: Node = null) -> void:
Shop.purchase("sunglasses")
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
ui.show_dialog_key("dialog_sunglasses_free")
func _start_bowser_fight(_n: Node = null) -> void:
if GameState.get_flag("bowser_defeated", false):
Inventory.add_item("wedding_egg", 1)
return
hammer_ui.visible = true
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
_hits = 0
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
ui.show_dialog_key("dialog_bowser")
_refresh_hammers()
func _refresh_hammers() -> void:
_correct_hammer = randi_range(1, 3)
$HammerUI/Panel/Margin/VBox/Label.text = Locale.tr_key("dialog_bowser") + " [%d/%d]" % [_hits, _hits_needed]
$HammerUI/Panel/Margin/VBox/H1.text = Locale.tr_key("choice_hammer_1")
$HammerUI/Panel/Margin/VBox/H2.text = Locale.tr_key("choice_hammer_2")
$HammerUI/Panel/Margin/VBox/H3.text = Locale.tr_key("choice_hammer_3")
func _pick(hammer: int) -> void:
if hammer == _correct_hammer:
_hits += 1
AudioDirector.play_hit()
if _hits >= _hits_needed:
hammer_ui.visible = false
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
GameState.set_flag("bowser_defeated", true)
Achievements.unlock("beat_bowser")
Inventory.add_item("chicken", 1)
Inventory.add_item("wedding_egg", 1)
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
ui.show_dialog("Hochzeitsei! Im Inventar benutzen = Whiff zum Endboss.", 4.0)
else:
_refresh_hammers()
else:
hammer_ui.visible = false
GameState.die("death_bowser")
func _on_h1() -> void:
_pick(1)
func _on_h2() -> void:
_pick(2)
func _on_h3() -> void:
_pick(3)