Explosion_der_Spiele/scripts/levels/farm.gd
copilot 1cc8aa9b9d Add village 3D wiring, voice lines, and 1.74 m world scale.
Houses ~8.5 m; chimps capped ~0.85 m with safer axis fitting. Large GLB/PBR packs stay local until Git LFS (Forgejo HTTP 413).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 12:02:57 +02:00

92 lines
3.1 KiB
GDScript

extends Node3D
## Bayerischer Hof: 3 Quests → Paywall-Joke → Exit zu Dressler. Urhahn-Schock.
var _fed_pigs: bool = false
var _milked: bool = false
var _chickens: bool = false
func _ready() -> void:
GameState.current_scene_id = "farm"
GameState.heal_full()
_fed_pigs = bool(GameState.get_flag("pigs_fed", false))
_milked = bool(GameState.get_flag("cows_milked", false))
_chickens = bool(GameState.get_flag("chickens_taken", false))
var mood := str(GameState.get_flag("farmer_mood", "direct"))
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
if mood == "detour":
ui.show_dialog_key("dialog_farmer_detour", 4.0)
else:
ui.show_dialog_key("dialog_farmer_direct", 3.5)
await get_tree().create_timer(1.2).timeout
ui.show_dialog_key("dialog_farmer_quest", 4.0)
var urhahn := get_node_or_null("Urhahn")
if urhahn:
urhahn.set("ai_enabled", true)
urhahn.set("invulnerable", true)
urhahn.set("instakill", true)
urhahn.set("move_speed", 4.2)
urhahn.set("attack_cooldown", 0.85)
urhahn.set("death_cause_key", "death_rooster")
urhahn.set("shout_key", "dialog_urhahn")
urhahn.set("shout_interval", 5.0)
urhahn.set("billboard_height", SpriteFit.WORLD_BOSS_HEIGHT)
if urhahn.has_signal("defeated"):
urhahn.defeated.connect(_on_urhahn_down)
var hazard := get_node_or_null("RoosterHazard")
if hazard:
hazard.set("damage", 99)
hazard.set("death_cause_key", "death_rooster")
if hazard.has_signal("body_entered") and not hazard.body_entered.is_connected(_on_rooster_touch):
hazard.body_entered.connect(_on_rooster_touch)
var exit := get_node_or_null("Exit")
if exit:
exit.set("require_flag", "paywall_cleared")
var ticket := get_node_or_null("TicketVendor")
if ticket and ticket.has_signal("interacted"):
ticket.interacted.connect(_on_ticket)
func _physics_process(_delta: float) -> void:
if GameState.get_flag("pigs_fed", false) and not _fed_pigs:
complete_pig()
if GameState.get_flag("cows_milked", false) and not _milked:
complete_cow()
if GameState.get_flag("chickens_taken", false) and not _chickens:
complete_chicken()
func complete_pig() -> void:
_fed_pigs = true
_check_quests()
func complete_cow() -> void:
_milked = true
_check_quests()
func complete_chicken() -> void:
_chickens = true
if not Inventory.has_item("lava_chicken"):
Inventory.add_item("lava_chicken", 1)
_check_quests()
func _check_quests() -> void:
if not (_fed_pigs and _milked and _chickens):
return
GameState.set_flag("farm_quests_done", true)
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
ui.show_dialog_key("dialog_paywall", 4.0)
Shop.purchase("continue_joke")
GameState.set_flag("paywall_cleared", true)
func _on_urhahn_down() -> void:
GameState.set_flag("urhahn_defeated", true)
func _on_rooster_touch(body: Node3D) -> void:
if body.is_in_group("player") and not GameState.get_flag("urhahn_defeated", false):
GameState.apply_shock(10.0)
func _on_ticket(_n: Node = null) -> void:
Inventory.add_item("death_ticket", 1)
var ui := get_node_or_null("/root/UIRoot")
if ui and ui.has_method("show_dialog"):
ui.show_dialog(Locale.tr_key("item_death_ticket"))