168 lines
4.8 KiB
GDScript
168 lines
4.8 KiB
GDScript
extends Node2D
|
|
|
|
# Signals
|
|
signal player_action(action)
|
|
|
|
# Consts
|
|
const TIME_LIMIT = 60.0
|
|
const TimeLeftTooltipFormat = "Shearing in %fm%ds"
|
|
const FLOCK_SIZE = 18
|
|
const FLOCK_MIN_TIME = 5
|
|
const FLOCK_MAX_TIME = 20
|
|
const MIN_GRASS = 5
|
|
const MAX_GRASS = 9
|
|
const SUSPICION_AWAY_FROM_FLOCK = 0.015
|
|
# Member variables
|
|
#var screen_size
|
|
var time_to_shearing = TIME_LIMIT # Time left in seconds
|
|
var suspicion = 0
|
|
var max_suspicion = 100
|
|
var highest_suspicion = 0
|
|
var suspicion_loss = 1 # per second
|
|
var flock_timer = 0
|
|
var flock_destination = Vector2()
|
|
var process_logic = true
|
|
|
|
func _ready():
|
|
randomize()
|
|
get_node("HUD/TimeLeftBar").set_max(TIME_LIMIT)
|
|
get_node("HUD/TimeLeftBar").set_value(TIME_LIMIT)
|
|
get_node("HUD/SuspicionBar").set_max(max_suspicion)
|
|
get_node("HUD/SuspicionBar").set_value(suspicion)
|
|
get_node("HUD/ToolBar/RamButton").connect("pressed", self, "_on_ram_pressed")
|
|
get_node("HUD/ToolBar/EatButton").connect("pressed", self, "_on_eat_pressed")
|
|
var i = 0
|
|
|
|
var sheep = preload("res://sheep.tscn")
|
|
var grass = preload("res://grass.tscn")
|
|
var pen_tl = get_node("Level/Pen/Spawn-TL")
|
|
var pen_br = get_node("Level/Pen/Spawn-BR")
|
|
while i < FLOCK_SIZE:
|
|
var node = sheep.instance()
|
|
node.set_pos(spawn_in_area(pen_tl, pen_br))
|
|
node.add_to_group('flock')
|
|
get_node("Actors").add_child(node)
|
|
i += 1
|
|
i = 0
|
|
while i < int(rand_range(MIN_GRASS, MAX_GRASS)):
|
|
var node = grass.instance()
|
|
node.set_pos(spawn_in_area(pen_tl, pen_br))
|
|
node.add_to_group('grass')
|
|
get_node("Level").add_child(node)
|
|
i += 1
|
|
set_process(true)
|
|
|
|
func spawn_in_area(tl, br):
|
|
var min_x = tl.get_global_pos().x
|
|
var max_x = br.get_global_pos().x
|
|
var min_y = tl.get_global_pos().y
|
|
var max_y = br.get_global_pos().y
|
|
return Vector2(rand_range(min_x, max_x), rand_range(min_y, max_y))
|
|
|
|
func _process(delta):
|
|
if not process_logic:
|
|
return
|
|
time_to_shearing -= delta
|
|
var time_left = get_node("HUD/TimeLeftBar")
|
|
time_left.set_value(time_to_shearing)
|
|
var time_left_minute = floor(time_to_shearing / 60)
|
|
var time_left_second = time_to_shearing - (time_left_minute * 60)
|
|
var tooltip = TimeLeftTooltipFormat % [time_left_minute, time_left_second]
|
|
time_left.set_tooltip(tooltip)
|
|
if time_to_shearing < 0:
|
|
game_over("Too late : the shearing is upon us!")
|
|
|
|
var d_suspicion = -delta * suspicion_loss
|
|
if flock_timer > 0:
|
|
var suspicion_per_pixel = SUSPICION_AWAY_FROM_FLOCK
|
|
var d = get_node("Actors/player").get_global_pos().distance_to(flock_destination)
|
|
var flock_distance = get_node("Actors/player").get_global_pos().distance_to(avg_flock_location())
|
|
#print("Distance from point: ", d)
|
|
#print("Distance from flock center: ", flock_distance)
|
|
d_suspicion += suspicion_per_pixel * (flock_distance-200) * delta
|
|
update_suspicion(d_suspicion)
|
|
|
|
if flock_timer > 0:
|
|
flock_timer -= delta
|
|
if flock_timer < 0:
|
|
flock(false)
|
|
flock_timer = 0
|
|
|
|
if int(time_to_shearing) % 15 == 0 && flock_timer == 0:
|
|
#print("Starting flock")
|
|
flock(true)
|
|
|
|
func _on_ram_pressed():
|
|
emit_signal("player_action", "ram")
|
|
|
|
func _on_eat_pressed():
|
|
emit_signal("player_action", "eat")
|
|
|
|
func update_suspicion(amount):
|
|
suspicion += amount
|
|
var suspicion_bar = get_node('HUD/SuspicionBar')
|
|
suspicion_bar.set_value(suspicion)
|
|
if (suspicion > highest_suspicion):
|
|
highest_suspicion = suspicion
|
|
if suspicion < 0:
|
|
suspicion = 0
|
|
if (suspicion > max_suspicion):
|
|
game_over('You were too suspicious: the farmer came for you!')
|
|
|
|
func game_over(message, failure = true):
|
|
var n = get_node("HUD/Panel/PostGameMessage/Label")
|
|
if failure:
|
|
n.set_text("Oh no!\n%s" %[message])
|
|
else:
|
|
n.set_text("YEAH!!!\n%s" %[message])
|
|
get_node("HUD/Panel").show()
|
|
get_node("Actors/player").set_fixed_process(false)
|
|
process_logic = false
|
|
flock(false)
|
|
|
|
func avg_flock_location():
|
|
var p = null
|
|
for i in get_tree().get_nodes_in_group('flock'):
|
|
if p == null:
|
|
p = i.get_global_pos()
|
|
continue
|
|
p += i.get_global_pos()
|
|
return p / get_tree().get_nodes_in_group('flock').size()
|
|
|
|
func flock(enable = true):
|
|
if not enable:
|
|
#print("Flocking stopped")
|
|
for i in get_tree().get_nodes_in_group('flock'):
|
|
i.flock(null, false)
|
|
return
|
|
var p = randf()
|
|
var i = 0
|
|
var d = Vector2()
|
|
var points = get_node("Level/FlockPoints").get_children();
|
|
var point_count = get_node("Level/FlockPoints").get_child_count()
|
|
#print(p)
|
|
for point in points:
|
|
if p >= (float(i)/float(point_count)) and p <= (float((i+1)) / float(point_count)):
|
|
d = point.get_global_pos()
|
|
flock_destination = d
|
|
#print("Flocking to ", d)
|
|
i += 1
|
|
for i in get_tree().get_nodes_in_group('flock'):
|
|
i.flock(d)
|
|
flock_timer = rand_range(FLOCK_MIN_TIME, FLOCK_MAX_TIME)
|
|
|
|
func _on_Replay_released():
|
|
#print('replay pressed')
|
|
get_tree().change_scene("res://game.tscn")
|
|
|
|
func _on_Quit_released():
|
|
#print('quit pressed')
|
|
get_tree().quit()
|
|
|
|
|
|
func _on_Quit_pressed():
|
|
_on_Quit_released()
|
|
|
|
func _on_Replay_pressed():
|
|
_on_Replay_released()
|