57 lines
2.1 KiB
GDScript
57 lines
2.1 KiB
GDScript
extends "res://scripts/creatures/crow.gd"
|
|
## A gull (0.6.0, the Cove only): the Cove's crow, sent by thieves.gd by
|
|
## day. It comes for food left on the sand and for fish on a smoking rack
|
|
## that nobody's watching. Bolder and quicker than a crow: it lands, snatches
|
|
## one and is off with it, and another soon follows. Shoot it down while
|
|
## it's carrying and it drops what it took. Feathers.
|
|
|
|
const SNATCH_AFTER := 1.2 ## seconds on the ground before it grabs one
|
|
const GULL_SCARE := 6.0 ## (bolder than a crow)
|
|
|
|
var carry: Dictionary = {} ## {id, count, extra} once it has something
|
|
|
|
func display_name() -> String:
|
|
return "Gull"
|
|
|
|
func interact_prompt(_p: Node) -> String:
|
|
if is_dead():
|
|
return "Gull [E] Pluck"
|
|
if not carry.is_empty():
|
|
return "Gull (off with your %s!)" % ItemDB.item_name(String(carry.id)).to_lower()
|
|
return {"peck": "Gull (after your food!)", "fly": "Gull (circling your food)"}.get(state, "Gull")
|
|
|
|
func _think(dt: float) -> void:
|
|
match state:
|
|
"fly":
|
|
if not thieves.gull_still_there(food) or thieves.watched(thieves.spot(food), GULL_SCARE):
|
|
_leave()
|
|
return
|
|
_goal = thieves.spot(food)
|
|
var ground: float = terrain.sample_height(global_position.x, global_position.z)
|
|
if Vector2(_goal.x - global_position.x, _goal.z - global_position.z).length() < 0.35 and global_position.y - ground < 0.15:
|
|
state = "peck"
|
|
_state_t = SNATCH_AFTER
|
|
thieves.gull_landed(self, food)
|
|
"peck":
|
|
if not thieves.gull_still_there(food) or thieves.watched(global_position, GULL_SCARE):
|
|
_leave()
|
|
return
|
|
_state_t -= dt
|
|
if _state_t <= 0.0:
|
|
_peck_anim = 0.4
|
|
carry = thieves.snatch(self, food)
|
|
_leave()
|
|
"fly_off":
|
|
if thieves.out_of_sight(global_position):
|
|
thieves.gone(self)
|
|
_:
|
|
_leave()
|
|
|
|
## Shot down with something in its beak: it drops it where it falls.
|
|
func _die(from: Vector3) -> void:
|
|
super._die(from)
|
|
if not carry.is_empty() and not puppet:
|
|
var at := global_position + Vector3(0, 0.3, 0)
|
|
world.drop_item(String(carry.id), int(carry.count), Transform3D(Basis(), at), carry.get("extra", {}))
|
|
carry = {}
|