113 lines
2.8 KiB
GDScript
113 lines
2.8 KiB
GDScript
extends Control
|
|
|
|
|
|
var DAY_PER_SEC = 0.02
|
|
|
|
|
|
func _ready():
|
|
# TODO set up calendar
|
|
|
|
# set up clock
|
|
call_deferred("_real_ready")
|
|
|
|
|
|
func _real_ready():
|
|
_set_up_postie_clock()
|
|
|
|
_start_schedule()
|
|
|
|
|
|
func _set_up_postie_clock():
|
|
for start_time in postie_times:
|
|
var end_time = start_time + postie_length
|
|
var start_segment = round(10 * start_time)
|
|
var end_segment = round(10 * end_time)
|
|
for i in range(start_segment, end_segment):
|
|
$Clock/PostieRegions.get_child(i % 10).visible = true
|
|
|
|
var days_on_this_level = 5
|
|
var postie_times = [0.1]
|
|
var postie_length = .3
|
|
|
|
var slug_o_clock = 0.7
|
|
var slug_chance_per_roll = 0.5
|
|
var slug_roll_rate = 10
|
|
var max_slugs_per_group = 3
|
|
|
|
var day_num = 0
|
|
var time_of_day = 0.0
|
|
|
|
signal ran_out_of_time
|
|
|
|
func _start_schedule():
|
|
# schedule all events for the day...
|
|
for day in range(days_on_this_level):
|
|
var days_left = days_on_this_level - day
|
|
$Calendar/LabelDays.text = "|".repeat(days_left)
|
|
|
|
var parent = find_parent("Level*").get_node("World/YSort")
|
|
for postie_time in postie_times:
|
|
# 5s early so the postie has time to drive there.
|
|
_postie_in(parent, (postie_time / DAY_PER_SEC) - 5.0, postie_length / DAY_PER_SEC)
|
|
_slug_spawner(parent)
|
|
|
|
$Timer.start(1 / DAY_PER_SEC)
|
|
yield($Timer, "timeout")
|
|
|
|
$Calendar/LabelDays.text = "end..."
|
|
|
|
$Timer.start(0.01 / DAY_PER_SEC)
|
|
yield($Timer, "timeout")
|
|
# Lose due to no time
|
|
emit_signal("ran_out_of_time")
|
|
|
|
|
|
func _postie_in(parent: Node2D, time: float, idling_time: float):
|
|
var timer = Timer.new()
|
|
timer.one_shot = true
|
|
$Timer.add_child(timer)
|
|
timer.start(time); yield(timer, "timeout")
|
|
$Timer.remove_child(timer)
|
|
var new_postie = preload("res://vehicles/Postie.tscn").instance()
|
|
new_postie.position = Vector2(-500, 0)
|
|
new_postie.idling_time = idling_time
|
|
parent.add_child(new_postie)
|
|
|
|
|
|
func _slug_spawner(parent: Node2D):
|
|
var timer = Timer.new()
|
|
timer.one_shot = true
|
|
$Timer.add_child(timer)
|
|
|
|
timer.start(slug_o_clock / DAY_PER_SEC); yield(timer, "timeout")
|
|
var num_rolls = ceil((1.0 - slug_o_clock) * slug_roll_rate)
|
|
print("num rolls = ", num_rolls)
|
|
var interval = 1 / (DAY_PER_SEC * slug_roll_rate)
|
|
print("interval = ", interval)
|
|
for _roll_num in range(num_rolls):
|
|
# wait for our next roll
|
|
timer.start(interval); yield(timer, "timeout")
|
|
|
|
if rand_range(0.0, 1.0) > slug_chance_per_roll:
|
|
print("miss.")
|
|
continue
|
|
|
|
var num_slugs = floor(rand_range(0.0, max_slugs_per_group)) + 1
|
|
print("lucky you! ", num_slugs)
|
|
for slug_num in num_slugs:
|
|
var y_coord = -5
|
|
if rand_range(0.0, 1.0) < 0.5:
|
|
y_coord = 910
|
|
var slug_pos = Vector2(rand_range(0.0, 1600.0), y_coord)
|
|
var new_slug = preload("res://characters/pests/Slug.tscn").instance()
|
|
new_slug.position = slug_pos
|
|
parent.add_child(new_slug)
|
|
pass
|
|
|
|
$Timer.remove_child(timer)
|
|
|
|
|
|
func _process(delta):
|
|
time_of_day += delta * DAY_PER_SEC
|
|
$Clock/ClockHand.rotation = 2 * PI * fmod(time_of_day, 1.0)
|