Connect bear-save, massage, farm paywall, cheese catapults, Dressler hijack, final boss phases, fat-stim UI, and scene fixes so the satire path plays through.
91 lines
2.9 KiB
GDScript
91 lines
2.9 KiB
GDScript
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(Locale.tr_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(Locale.tr_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)
|