Initial commit

This commit is contained in:
Kienan Stewart 2023-04-30 20:23:43 -04:00
commit 2b60269c1b
63 changed files with 2197 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*~
*.import
*.aup3-wal

Binary file not shown.

165
Blah.gd Normal file
View File

@ -0,0 +1,165 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
const camera_drag_threshold = 0.2
var camera_drag_start = null
# Called when the node enters the scene tree for the first time.
func _ready():
# For non-game PRNG, eg. sounds
randomize()
var c = get_tree().get_nodes_in_group("character")[0]
c.connect("character_movement", self, "_on_character_movement")
c.connect("storage_changed", self, "_on_character_storage")
get_node("UiLayer/PanelContainer/VBoxContainer/Capacity").set_text("Cargo %s" % c.capacity_str())
var g = get_node("Game")
g.connect("dropoff_score_changed", self, "_on_dropoff_score_changed")
g.connect("game_ended", self, "_on_game_ended")
var d = get_node("UiLayer/GameEndDialog")
d.find_node("Continue").connect("pressed", self, "_on_continue")
d.find_node("Restart").connect("pressed", self, "_on_restart")
d.find_node("New").connect("pressed", self, "_on_new")
d.find_node("Quit").connect("pressed", self, "_on_quit")
d.find_node("LevelCode").set_text(g.get_levelcode())
func _on_character_movement(value):
get_node("UiLayer/PanelContainer/VBoxContainer/Moved").set_text("Moved: %d" % value)
get_node("UiLayer/PanelContainer/VBoxContainer/Score").set_text("Total score: %d" % get_node("Game").get_score())
func _on_character_storage(value):
var c = get_tree().get_nodes_in_group("character")[0]
get_node("UiLayer/PanelContainer/VBoxContainer/Capacity").set_text("Cargo %s" % c.capacity_str())
func _on_dropoff_score_changed(value):
get_node("UiLayer/PanelContainer/VBoxContainer/Supplied").set_text("Supplied score: %d" % value[0])
get_node("UiLayer/PanelContainer/VBoxContainer/Delivered").set_text("Delivered: %d" % value[1])
get_node("UiLayer/PanelContainer/VBoxContainer/Score").set_text("Total score: %d" % get_node("Game").get_score())
func _on_game_ended():
get_tree().paused = true
var g = get_node("Game")
var d = get_node("UiLayer/GameEndDialog")
var score_data = g.get_supplied()
d.find_node("Score").set_bbcode("[center]Score: %d[/center]" % g.get_score())
d.find_node("Supplied").set_bbcode("%d / %d supplied\n%d points" % score_data.slice(0, 2))
d.find_node("Moved").set_bbcode("%d moves" % g.get_moves())
d.find_node("Delivered").set_bbcode("%d delivered" % score_data[3])
var path = ""
for n in g.get_node("Character").path_history:
path += "%s -> " % n.node_name
if path.length() > 4:
path = path.substr(0, path.length()-4)
d.find_node("Path").set_bbcode("[center]Path[/center]\n%s" % path)
d.find_node("Continue").set_visible(score_data[0] < score_data[1])
if !score_data[0] < score_data[1]:
get_node("UiAudio").set_stream(load("res://resources/untitled.wav"))
get_node("UiAudio").play()
d.find_node("LevelCode").set_text(g.get_levelcode())
d.set_exclusive(true)
d.popup_centered()
func _on_continue():
get_node("UiLayer/GameEndDialog").set_visible(false)
get_tree().paused = false
func _on_restart():
get_node("Game").restart(get_node("Game").params)
get_node("Camera2D").set_zoom(Vector2(1,1))
get_node("Camera2D").set_offset(Vector2(512, 300))
self._on_continue()
# Reset UI
_on_character_movement(0)
_on_character_storage(0)
_on_dropoff_score_changed([0, 0, 0])
# From _ready
var c = get_tree().get_nodes_in_group("character")[0]
c.connect("character_movement", self, "_on_character_movement")
c.connect("storage_changed", self, "_on_character_storage")
get_node("UiLayer/PanelContainer/VBoxContainer/Capacity").set_text("Cargo %s" % c.capacity_str())
var g = get_node("Game")
g.connect("dropoff_score_changed", self, "_on_dropoff_score_changed")
g.connect("game_ended", self, "_on_game_ended")
func _on_new():
# Show the level setting popup
get_node("UiLayer/GameEndDialog").set_visible(false)
get_node("UiLayer/NewLevelDialog").set_exclusive(true)
get_node("UiLayer/NewLevelDialog").popup_centered()
func _on_quit():
get_tree().quit()
func _unhandled_input(event):
if event is InputEventKey and event.pressed and !event.echo:
# Quit on Escape press.
if event.scancode == KEY_ESCAPE:
var data = get_node("Game").get_supplied()
var ended = data[0] >= data[1]
if get_node("UiLayer/GameEndDialog").visible && !ended:
self._on_continue()
else:
self._on_game_ended()
if event is InputEventMouseButton and event.pressed:
var zoom = get_node("Camera2D").get_zoom()
if event.button_index == BUTTON_WHEEL_UP:
zoom -= Vector2(.1, .1)
get_node("Camera2D").set_zoom(zoom)
elif event.button_index == BUTTON_WHEEL_DOWN:
zoom += Vector2(.1, .1)
get_node("Camera2D").set_zoom(zoom)
if event.button_index == BUTTON_RIGHT:
self.camera_drag_start = get_viewport().get_mouse_position()
if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT:
if !event.pressed and self.camera_drag_start != null:
self.camera_drag_start = null
func _process(delta):
if self.camera_drag_start != null:
var pos = get_viewport().get_mouse_position()
var pos_delta = self.camera_drag_start - pos
get_node("Camera2D").set_offset(
get_node("Camera2D").get_offset() + pos_delta
)
self.camera_drag_start = pos
func _on_NewLevelDialog_start_pressed(params):
get_node("UiLayer/NewLevelDialog").set_visible(false)
get_node("Camera2D").set_zoom(Vector2(1,1))
get_node("Camera2D").set_offset(Vector2(512, 300))
get_node("Game").restart(params)
self._on_continue()
# Reset UI
_on_character_movement(0)
_on_character_storage(0)
_on_dropoff_score_changed([0, 0, 0])
# From _ready
var c = get_tree().get_nodes_in_group("character")[0]
c.connect("character_movement", self, "_on_character_movement")
c.connect("storage_changed", self, "_on_character_storage")
get_node("UiLayer/PanelContainer/VBoxContainer/Capacity").set_text("Cargo %s" % c.capacity_str())
var g = get_node("Game")
g.connect("dropoff_score_changed", self, "_on_dropoff_score_changed")
g.connect("game_ended", self, "_on_game_ended")
func _on_Hide_toggled(button_pressed):
get_node("UiLayer/PanelContainer/VBoxContainer").set_visible(!button_pressed)
var size = get_node("UiLayer/PanelContainer").get_size()
if button_pressed:
size.y = 50
get_node("UiLayer/PanelContainer").set_size(size)
else:
size.y = 600
get_node("UiLayer/PanelContainer").set_size(size)
func _on_ResetCamera_pressed():
get_node("Camera2D").set_offset(Vector2(512, 300))
get_node("Camera2D").set_zoom(Vector2(1, 1))

130
Blah.tscn Normal file
View File

@ -0,0 +1,130 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Game.tscn" type="PackedScene" id=1]
[ext_resource path="res://Blah.gd" type="Script" id=2]
[ext_resource path="res://GameEnd.tscn" type="PackedScene" id=3]
[ext_resource path="res://resources/UI Theme.tres" type="Theme" id=4]
[ext_resource path="res://resources/NewLevel.tscn" type="PackedScene" id=5]
[ext_resource path="res://resources/Background.tscn" type="PackedScene" id=6]
[node name="Deliver" type="Node"]
pause_mode = 2
script = ExtResource( 2 )
[node name="Game" parent="." instance=ExtResource( 1 )]
pause_mode = 1
[node name="UiAudio" type="AudioStreamPlayer" parent="."]
pause_mode = 2
[node name="Camera2D" type="Camera2D" parent="."]
offset = Vector2( 512, 300 )
current = true
[node name="BgLayer" type="CanvasLayer" parent="."]
layer = -1
[node name="Background" parent="BgLayer" instance=ExtResource( 6 )]
[node name="UiLayer" type="CanvasLayer" parent="."]
[node name="PanelContainer" type="Panel" parent="UiLayer"]
margin_left = 808.0
margin_right = 1023.0
margin_bottom = 597.0
[node name="Hide" type="CheckButton" parent="UiLayer/PanelContainer"]
margin_left = 7.0
margin_top = 7.0
margin_right = 147.0
margin_bottom = 47.0
size_flags_horizontal = 0
size_flags_vertical = 0
text = "Minimize"
[node name="VBoxContainer" type="VBoxContainer" parent="UiLayer/PanelContainer"]
margin_left = 7.0
margin_top = 50.0
margin_right = 208.0
margin_bottom = 590.0
[node name="Delivered" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
modulate = Color( 0.576471, 1, 0.572549, 1 )
margin_right = 201.0
margin_bottom = 15.0
theme = ExtResource( 4 )
text = "Delivered: 0"
[node name="Supplied" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
modulate = Color( 0.576471, 1, 0.572549, 1 )
margin_top = 19.0
margin_right = 201.0
margin_bottom = 34.0
theme = ExtResource( 4 )
text = "Supplied score: 0"
[node name="Moved" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
modulate = Color( 1, 0.545098, 0.545098, 1 )
margin_top = 38.0
margin_right = 201.0
margin_bottom = 53.0
theme = ExtResource( 4 )
text = "Moved: 0"
[node name="Score" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 57.0
margin_right = 201.0
margin_bottom = 72.0
theme = ExtResource( 4 )
text = "Total score: 0"
[node name="HSeparator" type="HSeparator" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 76.0
margin_right = 201.0
margin_bottom = 80.0
[node name="Capacity" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 84.0
margin_right = 201.0
margin_bottom = 99.0
theme = ExtResource( 4 )
text = "Cargo: 0 / 10"
[node name="HSeparator2" type="HSeparator" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 103.0
margin_right = 201.0
margin_bottom = 107.0
[node name="Label" type="Label" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 111.0
margin_right = 201.0
margin_bottom = 486.0
theme = ExtResource( 4 )
text = "
Pick up cargo from uparrrow, and deliver to downarrow.
Paths have a cost to use them, try to minimize your movement cost to maximize your score.
Deliver cargo to all destinations to end game.
Move: double click on selected node
Move node: click and hold to drag
Hold right-click and drag to pan around.
Pan View: right-click + drag
Zoom: scroll wheel
Menu: Escape"
autowrap = true
[node name="ResetCamera" type="Button" parent="UiLayer/PanelContainer/VBoxContainer"]
margin_top = 490.0
margin_right = 201.0
margin_bottom = 510.0
text = "Reset Camera"
[node name="GameEndDialog" parent="UiLayer" instance=ExtResource( 3 )]
[node name="NewLevelDialog" parent="UiLayer" instance=ExtResource( 5 )]
[connection signal="toggled" from="UiLayer/PanelContainer/Hide" to="." method="_on_Hide_toggled"]
[connection signal="pressed" from="UiLayer/PanelContainer/VBoxContainer/ResetCamera" to="." method="_on_ResetCamera_pressed"]
[connection signal="start_pressed" from="UiLayer/NewLevelDialog" to="." method="_on_NewLevelDialog_start_pressed"]

121
Character.gd Normal file
View File

@ -0,0 +1,121 @@
extends Node2D
signal character_movement
signal arrived_at
signal storage_changed
var location = null
var offset = Vector2(0, 16)
var destination = null
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
var target = null
var links = {}
var capacity = 10
var stored = 0
var path_history = []
var movement_cost = 0
func capacity_str():
if is_inf(self.capacity):
return "%d / ∞" % self.stored
return "%d / %d" % [self.stored, self.capacity]
func set_location(n, teleport = false):
assert(n != null)
self.path_history.append(n)
if teleport:
self.position = n.get_position() + self.offset
else:
self.destination = n.get_position() + self.offset
if self.location != null:
self.movement_cost += self.links[n].weight
emit_signal("character_movement", self.movement_cost)
get_node("Audio").play()
self.location = n
self.clear_links()
self.clear_target()
self.target = null;
# Highlight links connected to this one that are traversable by the player
for link in get_tree().get_nodes_in_group("links"):
if link.start == n or link.end == n:
link.get_node("Line").set_default_color(Color("98f9ac"))
var target = link.start
if link.start == n:
target = link.end
self.links[target] = link
else:
link.get_node("Line").set_default_color(Color("98a8f9"))
# print("Links: ", self.links)
func clear_links():
for link in self.links:
self.links[self.target].get_node("Line").set_default_color(Color("98f9ac"))
self.links[self.target].get_node("Label").remove_color_override("default_color")
self.links[self.target].get_node("Label").set_scale(Vector2(1, 1))
self.links = {}
func clear_target():
if self.target != null && self.target in self.links:
self.links[self.target].get_node("Line").set_default_color(Color("98f9ac"))
self.links[self.target].get_node("Label").remove_color_override("default_color")
self.links[self.target].get_node("Label").set_scale(Vector2(1, 1))
self.target = null
func set_target(node):
self.clear_target()
self.target = node
self.links[self.target].get_node("Line").set_default_color(Color("0fff2c"))
self.links[self.target].get_node("Label").add_color_override("default_color", Color("ff00e0"))
self.links[self.target].get_node("Label").set_scale(Vector2(2, 2))
var audio = get_tree().get_current_scene().find_node("UiAudio")
if audio:
audio.set_stream(load("res://resources/Tap.wav"))
audio.play()
func can_move(to):
return self.destination == null && self.links.has(to)
func pickup(amount):
self.stored += amount
emit_signal("storage_changed", self.stored)
self._on_storage_changed(self.stored)
func dropoff(amount):
self.stored -= amount
emit_signal("storage_changed", self.stored)
self._on_storage_changed(self.stored)
func _on_storage_changed(value):
var ratio = float(self.stored) / float(self.capacity)
get_node("Box3").set_visible(ratio >= 0.75)
get_node("Box2").set_visible(ratio >= 0.50)
get_node("Box").set_visible(ratio > 0)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if destination != null:
var p = self.get_position().move_toward(self.destination, delta * 500)
self.set_position(p)
if p.distance_to(self.destination) < 5:
self.set_position(self.destination)
self.destination = null
get_node("Audio").stop()
emit_signal("arrived_at", self.location)
if destination == null and location != null:
var p = get_global_mouse_position()
var distance = null
var closest = null
for node in location.peers:
if !is_instance_valid(node):
continue
var d = node.get_position().distance_to(p)
if distance == null or d < distance:
distance = d
closest = node
if self.target != closest:
self.set_target(closest)

34
Character.tscn Normal file
View File

@ -0,0 +1,34 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://resources/character.png" type="Texture" id=1]
[ext_resource path="res://Character.gd" type="Script" id=2]
[ext_resource path="res://resources/box.png" type="Texture" id=3]
[ext_resource path="res://resources/Ratchet.wav" type="AudioStream" id=4]
[node name="Character" type="Node2D"]
script = ExtResource( 2 )
[node name="Sprite" type="Sprite" parent="."]
texture = ExtResource( 1 )
[node name="Box" type="Sprite" parent="."]
visible = false
position = Vector2( 15, 4 )
scale = Vector2( 0.5, 0.5 )
texture = ExtResource( 3 )
[node name="Box2" type="Sprite" parent="."]
visible = false
position = Vector2( 18, -2 )
scale = Vector2( 0.5, 0.5 )
texture = ExtResource( 3 )
[node name="Box3" type="Sprite" parent="."]
visible = false
position = Vector2( 15, -9 )
scale = Vector2( 0.5, 0.5 )
z_index = -1
texture = ExtResource( 3 )
[node name="Audio" type="AudioStreamPlayer" parent="."]
stream = ExtResource( 4 )

11
DetailFont.tres Normal file
View File

@ -0,0 +1,11 @@
[gd_resource type="DynamicFont" load_steps=2 format=2]
[sub_resource type="DynamicFontData" id=1]
hinting = 1
font_path = "res://Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf"
[resource]
size = 18
outline_size = 1
outline_color = Color( 0.262745, 0.227451, 0.227451, 1 )
font_data = SubResource( 1 )

6
DetailFontTheme.tres Normal file
View File

@ -0,0 +1,6 @@
[gd_resource type="Theme" load_steps=2 format=2]
[ext_resource path="res://DetailFont.tres" type="DynamicFont" id=1]
[resource]
default_font = ExtResource( 1 )

57
DropOff.gd Normal file
View File

@ -0,0 +1,57 @@
extends "res://Node.gd"
var full_sounds = [
preload("res://resources/Coins1.wav"),
preload("res://resources/Coins2.wav"),
preload("res://resources/Thanks.wav"),
preload("res://resources/YoureTheBest.wav"),
]
var dropoff_sounds = [
preload("res://resources/Items.wav"),
preload("res://resources/Thunk.wav"),
preload("res://resources/Scribble.wav"),
preload("res://resources/Paper2.wav"),
]
func _init():
self.capacity = 1
self.value = 1
self.texture_resource = "res://resources/dropoff.png"
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
self.add_to_group("dropoff")
func receive(amount):
if amount <= 0:
return
self.stored += amount
self.update_help(true)
func update_help(audio = false):
get_node("Help").set_text("{} / {}\n{}".format([self.stored, self.capacity, self.value], "{}"))
if self.stored < self.capacity:
get_node("Help").set_tooltip("Drop off {} more to satistify delivery requirements.\nWhen satisfied {} will be added to your score".format([self.capacity - self.stored, self.value], "{}"))
else:
get_node("Help").set_tooltip("Fully supplied")
if self.stored >= self.capacity:
get_node("Sprite").set_modulate(Color("00ea81"))
get_node("Help").set_self_modulate(Color("00ea81"))
if audio:
get_node("Audio").set_stream(
self.full_sounds[randi() % self.full_sounds.size()]
)
get_node("Audio").play()
else:
if audio:
get_node("Audio").set_stream(
self.dropoff_sounds[randi() % self.dropoff_sounds.size()]
)
get_node("Audio").play()
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

10
DropOff.tscn Normal file
View File

@ -0,0 +1,10 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Node.tscn" type="PackedScene" id=1]
[ext_resource path="res://DropOff.gd" type="Script" id=2]
[node name="DropOff" instance=ExtResource( 1 )]
script = ExtResource( 2 )
[node name="Sprite" parent="." index="0"]
texture = null

18
Empty.gd Normal file
View File

@ -0,0 +1,18 @@
extends "res://Node.gd"
func _init():
self.texture_resource = "res://resources/empty.png"
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
get_node("Help").set_tooltip("Empty spaces neither take nor give cargo")
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

7
Empty.tscn Normal file
View File

@ -0,0 +1,7 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Node.tscn" type="PackedScene" id=1]
[ext_resource path="res://Empty.gd" type="Script" id=2]
[node name="Empty" instance=ExtResource( 1 )]
script = ExtResource( 2 )

387
Game.gd Normal file
View File

@ -0,0 +1,387 @@
extends Node2D
signal dropoff_score_changed
signal game_ended
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
const Dropoff = preload("DropOff.tscn")
const Pickup = preload("Pickup.tscn")
const Start = preload("Start.tscn")
const Empty = preload("Empty.tscn")
const Link = preload("Link.tscn")
const Character = preload("Character.tscn")
# Configuration parameters
const default_params = {
'seed': 'ld53',
'node_count': 12,
'cargo_availability': 2.0,
'pickup_count_range': Vector2(1, 2),
'empty_node_chance': 15,
'dropoff_value_range': Vector2(1, 3),
'dropoff_capacity_range': Vector2(1, 3),
'link_cost_range': Vector2(1, 2),
}
static func easy_params():
var p = default_params.duplicate()
p.cargo_availability = INF;
p.pickup_count_range = Vector2(1, 1)
p.node_count = 6
p.dropoff_capacity_range = Vector2(1, 2)
p.link_cost_range = Vector2(1, 1)
return p
static func medium_params():
var p = default_params.duplicate()
return p
static func hard_params():
var p = default_params.duplicate()
p.pickup_count_range = Vector2(1, 3)
p.cargo_availability = 1.0
p.node_count = 24
p.dropoff_capacity_range = Vector2(1, 5)
p.link_cost_range = Vector2(1, 3)
return p
var params = null
var random = RandomNumberGenerator.new()
func get_levelcode():
return Marshalls.variant_to_base64(self.params)
static func parse_levelcode(code):
var p = Marshalls.base64_to_variant(code)
# Make sure we have the keys present in the default params
# Extraneous keys are ignored
if p != null and !p.has_all(default_params.keys()):
return null
return p
func restart(new_params = null):
if new_params:
self.params = new_params
for n in self.get_children():
n.free()
self._init(self.params['seed'])
self.params = new_params
self._ready()
func _init(random_seed: String = "ld53"):
self.random = RandomNumberGenerator.new()
print("Seed: %s" % random_seed)
self.random.set_seed(hash(random_seed))
func random_position():
var bottom = self.random.randi_range(0, 1)
var right = self.random.randi_range(0, 1)
var x_range = Vector2(
32 + (right * 512),
1024 + ((right - 1) * 512)
)
var y_range = Vector2(
32 + (bottom * 300),
600 + ((bottom - 1) * 300)
)
return Vector2(
self.random.randi_range(x_range.x, x_range.y),
self.random.randi_range(y_range.x, y_range.y)
)
func indexed_position(index):
# Positions are on a grid
var row_count = 3
var col_count = 4
if self.params.node_count == 24:
col_count = 6
row_count = 4
if self.params.node_count == 36:
col_count = 6
row_count = 6
var row = index % row_count
var col = index / row_count
var position = Vector2(
(1024 / col_count) * col,
(600 / row_count) * row
)
var jitter_value = 64
var jitter = Vector2(
self.random.randi_range(-jitter_value, jitter_value),
self.random.randi_range(-jitter_value, jitter_value)
)
return position + Vector2(64, 64) + jitter
func distance_to_closest_node(position, node):
var closest = 65000
for n in get_tree().get_nodes_in_group("nodes"):
if n == node:
continue
var distance = n.get_position().distance_to(position)
if distance < closest:
closest = distance
return closest
func link_nodes(n1, n2):
assert(n1 != null)
assert(n2 != null)
var n = Link.instance()
n.set_ends(n1, n2)
n1.peers.append(n2)
n2.peers.append(n1)
n1.remove_from_group("unlinked")
n2.remove_from_group("unlinked")
add_child(n)
# print("Linked ", n1, " to ", n2)
# print("\tN1 peers: ", n1.peers)
# print("\tN2 peers: ", n2.peers)
return n
func reconstruct_path(cameFrom, current):
var total_path = []
while cameFrom.has(current):
current = cameFrom[current]
total_path.push_front(current)
return total_path
func find_path(start, destination):
var openSet = [start]
var from = {}
var gScore = {}
var fScore = {}
fScore[start] = 1
while openSet.size() > 0:
print(openSet)
var current = null
for n in openSet:
if !fScore.has(n):
fScore[n] = INF
if current == null:
current = n
else:
if fScore[n] < fScore[current]:
current = n
if current == destination:
return reconstruct_path(from, current)
openSet.remove(openSet.find(current))
for n in current.peers:
if !gScore.has(current):
gScore[current] = INF
var tentative_score = gScore[current] + 1
if gScore.has(n) && tentative_score < gScore[n]:
from[n] = current
fScore[n] = tentative_score + 100
gScore[n] = tentative_score
if openSet.find(n) == -1:
openSet.append(n)
return null
func get_reachable_nodes(start):
var nodes_in_starting_graph = [start] + start.peers
var nodes_to_check = start.peers
var nodes_checked = [start]
while nodes_to_check.size() > 0:
var checking_node = nodes_to_check.pop_front()
#print("Checking: ", checking_node)
#print("\tPeers", checking_node.peers)
if nodes_checked.find(checking_node) != -1:
continue
for nx in checking_node.peers:
if nodes_checked.find(nx) == -1:
nodes_to_check.append(nx)
if nodes_in_starting_graph.find(checking_node) == -1:
nodes_in_starting_graph.append(checking_node)
nodes_checked.append(checking_node)
return nodes_in_starting_graph
# Called when the node enters the scene tree for the first time.
func _ready():
if self.params == null:
print("Resetting params")
self.params = easy_params()
var nodes = 0
var n = null
# Add start
n = Start.instance()
n.set_position(Vector2(512 - 32, 300-32))
n.add_to_group("unlinked")
n.name_from_index(nodes)
self.add_child(n)
var start = n
nodes += 1
# Add pickup(s)
var count = self.random.randi_range(self.params.pickup_count_range.x, self.params.pickup_count_range.y)
while count > 0:
n = Pickup.instance()
n.add_to_group("unlinked")
n.name_from_index(nodes)
self.add_child(n)
count -= 1
nodes += 1
# Add other node(s)
var total_to_dropoff = 0
while nodes < self.params.node_count + 1:
if self.random.randi_range(0, 99) < self.params.empty_node_chance:
n = Empty.instance()
else:
n = Dropoff.instance()
n.capacity = self.random.randi_range(self.params.dropoff_capacity_range.x, self.params.dropoff_capacity_range.y)
n.value = self.random.randi_range(self.params.dropoff_value_range.x, self.params.dropoff_value_range.y)
total_to_dropoff += n.capacity
n.add_to_group("unlinked")
n.name_from_index(nodes)
self.add_child(n)
print("Added node: ", n)
nodes += 1
# Distribute available cargo between dropoff points randomly when finite
# amount available.
if !is_inf(self.params.cargo_availability):
var cargo_available = total_to_dropoff * self.params.cargo_availability
for cargo_node in get_tree().get_nodes_in_group("pickup"):
var cargo_count = self.random.randi_range(1, cargo_available)
cargo_available -= cargo_count
cargo_node.set_stored(cargo_count)
if cargo_available > 0:
get_tree().get_nodes_in_group("pickup")[-1].add_stored(cargo_available)
# Each node should have at least one link
var unlinked_nodes = get_tree().get_nodes_in_group("unlinked")
while unlinked_nodes.size() > 0:
var source = unlinked_nodes.pop_front()
var targets = get_tree().get_nodes_in_group("nodes")
var target = targets[self.random.randi_range(0, targets.size()-1)]
while target == source:
target = targets[self.random.randi_range(0, targets.size()-1)]
var link = link_nodes(source, target)
link.set_weight(self.random.randi_range(
self.params.link_cost_range.x,
self.params.link_cost_range.y
))
unlinked_nodes = get_tree().get_nodes_in_group("unlinked")
# For each node, make sure we can reach the start node, merging
# any disjointed graphs
var nodes_in_starting_graph = get_reachable_nodes(start)
print("Starting graph nodes: ", nodes_in_starting_graph)
for node in get_tree().get_nodes_in_group("nodes"):
if nodes_in_starting_graph.find(node) == -1:
print(node, " can't be reached from start")
var target = nodes_in_starting_graph[self.random.randi_range(0, nodes_in_starting_graph.size()-1)]
link_nodes(node, target)
nodes_in_starting_graph = get_reachable_nodes(start)
# Set new node positions
# @TODO: Better (?) layout algorithm, eg. https://en.wikipedia.org/wiki/Graph_drawing
var x_range = Vector2(32, 1024-32)
var y_range = Vector2(32, 600-32)
var distance_threshold = 32
var idx = 0
for node in get_tree().get_nodes_in_group("nodes"):
if node.is_in_group("start"):
continue
var position = self.indexed_position(idx)
var tries = 0
var closest = distance_to_closest_node(position, node)
# While the position is within a distance of another node, rechoose
while closest <= distance_threshold:
if closest == 0:
closest = 65000
for n2 in get_tree().get_nodes_in_group("nodes"):
if n2 == node:
continue
var distance = n2.get_position().distance_to(position)
if distance < closest:
closest = distance
# print("Closest point to ", position, " ", closest)
tries += 1
if tries % 10 == 0:
distance_threshold /= 2
print("Reducing threshold for point ", node, " to ", distance_threshold)
position = self.random_position()
node.set_position(position)
# print("Placed node ", node, " after ", tries, " tries")
idx += 1
# Update link linepositions based on the node positions
for link in get_tree().get_nodes_in_group("links"):
link.redraw_line()
# @BUG It shouldn't be necessary to recalculate the peers
# For some reason, we lose the peer on the start node
if link.start == start:
start.peers.append(link.end)
if link.end == start:
start.peers.append(link.start)
# Add player
n = Character.instance()
add_child(n)
n.add_to_group("character")
n.set_location(start, true)
n.connect("arrived_at", self, "on_character_arrival")
func on_character_arrival(node):
if node.is_in_group("dropoff"):
var max_delivery = node.capacity - node.stored
var max_avail = get_node("Character").stored
var delta = min(max_avail, max_delivery)
print("Dropoff %d to %s" % [delta, node])
get_node("Character").dropoff(delta)
node.receive(delta)
# Recalculate dropoff score
var score = self.get_supplied()
var all_supplied = score[0] >= score[1]
emit_signal("dropoff_score_changed", [score[2], score[3]])
if all_supplied:
emit_signal("game_ended")
elif node.is_in_group("pickup"):
var max_pickup = get_node("Character").capacity - get_node("Character").stored
var min_avail = node.stored
var delta = min(min_avail, max_pickup)
print("Pickup up %d from %s" % [delta, node])
get_node("Character").pickup(delta)
node.drain(delta)
elif node.is_in_group("start"):
print("@TODO: Start")
func get_moves():
return get_node("Character").movement_cost
func get_score():
var data = get_supplied()
# Delivered + Supplied bonus - Movement
return data[2] + data[3] - get_moves()
func get_supplied():
# [nodes_done, nodes_total, earned_value, cargo_done, cargo_total]
var done = 0
var dropoff_score = 0
var cargo_done = 0
var cargo_total = 0
for n in get_tree().get_nodes_in_group("dropoff"):
cargo_total += n.capacity
cargo_done += n.stored
if n.stored >= n.capacity:
dropoff_score += n.value
done += 1
return [
done,
get_tree().get_nodes_in_group("dropoff").size(),
dropoff_score,
cargo_done,
cargo_total
]
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

8
Game.tscn Normal file
View File

@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://Game.gd" type="Script" id=1]
[node name="Game" type="Node2D"]
script = ExtResource( 1 )
[connection signal="game_ended" from="." to="." method="_on_Game_game_ended"]

193
GameEnd.tscn Normal file
View File

@ -0,0 +1,193 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://resources/building.png" type="Texture" id=1]
[ext_resource path="res://resources/moves.png" type="Texture" id=2]
[ext_resource path="res://DetailFontTheme.tres" type="Theme" id=3]
[ext_resource path="res://resources/UI Theme.tres" type="Theme" id=4]
[ext_resource path="res://resources/boxes.png" type="Texture" id=5]
[node name="GameEndDialog" type="PopupDialog"]
margin_right = 497.0
margin_bottom = 454.0
[node name="VBoxContainer" type="VBoxContainer" parent="."]
margin_left = 9.0
margin_top = 14.0
margin_right = 487.0
margin_bottom = 440.0
[node name="Score" type="RichTextLabel" parent="VBoxContainer"]
margin_right = 478.0
margin_bottom = 18.0
theme = ExtResource( 3 )
bbcode_enabled = true
bbcode_text = "[center]Score: {}[/center]"
text = "Score: {}"
fit_content_height = true
[node name="HSeparator2" type="HSeparator" parent="VBoxContainer"]
margin_top = 22.0
margin_right = 478.0
margin_bottom = 26.0
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 30.0
margin_right = 478.0
margin_bottom = 152.0
alignment = 1
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
margin_right = 151.0
margin_bottom = 122.0
size_flags_horizontal = 3
[node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer/VBoxContainer"]
margin_left = 43.0
margin_right = 107.0
margin_bottom = 64.0
size_flags_horizontal = 4
size_flags_vertical = 0
texture = ExtResource( 1 )
[node name="Supplied" type="RichTextLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer"]
margin_top = 68.0
margin_right = 151.0
margin_bottom = 122.0
theme = ExtResource( 3 )
bbcode_enabled = true
bbcode_text = "{} / {} supplied
{} points "
text = "{} / {} supplied
{} points "
fit_content_height = true
[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/HBoxContainer"]
margin_left = 155.0
margin_right = 159.0
margin_bottom = 122.0
[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
margin_left = 163.0
margin_right = 314.0
margin_bottom = 122.0
size_flags_horizontal = 3
[node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer/VBoxContainer2"]
margin_left = 43.0
margin_right = 107.0
margin_bottom = 64.0
size_flags_horizontal = 4
texture = ExtResource( 2 )
[node name="Moved" type="RichTextLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer2"]
margin_top = 68.0
margin_right = 151.0
margin_bottom = 86.0
theme = ExtResource( 3 )
bbcode_enabled = true
bbcode_text = "{} moves"
text = "{} moves"
fit_content_height = true
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"]
margin_left = 318.0
margin_right = 322.0
margin_bottom = 122.0
[node name="VBoxContainer3" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
margin_left = 326.0
margin_right = 478.0
margin_bottom = 122.0
size_flags_horizontal = 3
[node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer/VBoxContainer3"]
margin_left = 44.0
margin_right = 108.0
margin_bottom = 64.0
size_flags_horizontal = 4
texture = ExtResource( 5 )
[node name="Delivered" type="RichTextLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer3"]
margin_top = 68.0
margin_right = 152.0
margin_bottom = 86.0
theme = ExtResource( 3 )
bbcode_enabled = true
bbcode_text = "{} moves"
text = "{} moves"
fit_content_height = true
[node name="HSeparator3" type="HSeparator" parent="VBoxContainer"]
margin_top = 156.0
margin_right = 478.0
margin_bottom = 160.0
[node name="Path" type="RichTextLabel" parent="VBoxContainer"]
margin_top = 164.0
margin_right = 478.0
margin_bottom = 263.0
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource( 3 )
bbcode_enabled = true
fit_content_height = true
[node name="Label" type="Label" parent="VBoxContainer"]
margin_top = 267.0
margin_right = 478.0
margin_bottom = 282.0
theme = ExtResource( 4 )
text = "Level Code"
align = 1
[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
margin_top = 286.0
margin_right = 478.0
margin_bottom = 290.0
[node name="LevelCode" type="TextEdit" parent="VBoxContainer"]
margin_top = 294.0
margin_right = 478.0
margin_bottom = 394.0
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource( 4 )
readonly = true
wrap_enabled = true
[node name="HSeparator4" type="HSeparator" parent="VBoxContainer"]
margin_top = 398.0
margin_right = 478.0
margin_bottom = 402.0
[node name="VBoxContainer3" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 406.0
margin_right = 478.0
margin_bottom = 426.0
[node name="Continue" type="Button" parent="VBoxContainer/VBoxContainer3"]
visible = false
margin_right = 12.0
margin_bottom = 20.0
size_flags_horizontal = 3
text = "Continue"
[node name="Restart" type="Button" parent="VBoxContainer/VBoxContainer3"]
margin_right = 156.0
margin_bottom = 20.0
size_flags_horizontal = 3
text = "Restart"
[node name="New" type="Button" parent="VBoxContainer/VBoxContainer3"]
margin_left = 160.0
margin_right = 317.0
margin_bottom = 20.0
size_flags_horizontal = 3
text = "New"
[node name="Quit" type="Button" parent="VBoxContainer/VBoxContainer3"]
margin_left = 321.0
margin_right = 478.0
margin_bottom = 20.0
size_flags_horizontal = 3
text = "Quit"

47
Link.gd Normal file
View File

@ -0,0 +1,47 @@
extends Node2D
var start = null
var end = null
var weight = 1
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
add_to_group("links")
get_node("Label").set_text("%d" % self.weight)
get_node("Label").set_tooltip("Moving across this line costs {} energy".format([self.weight], "{}"))
func set_weight(value):
assert(value > 0)
self.weight = value
get_node("Label").set_text("%d" % self.weight)
get_node("Label").set_tooltip("Moving across this line costs {} energy".format([self.weight], "{}"))
if self.weight >= 2:
get_node("Label").set_modulate(Color("d7e65b"))
if self.weight >= 3:
get_node("Label").set_modulate(Color("e22c2c"))
func set_ends(a, b):
assert(a != null)
assert(b != null)
self.start = a
self.end = b
self.redraw_line()
func redraw_line():
get_node("Line").clear_points()
get_node("Label").set_position(Vector2(
abs(end.get_position().x + start.get_position().x) / 2,
abs(end.get_position().y + start.get_position().y) / 2
))
get_node("Line").add_point(self.start.get_position())
get_node("Line").add_point(self.end.get_position())
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

27
Link.tscn Normal file
View File

@ -0,0 +1,27 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://Link.gd" type="Script" id=1]
[ext_resource path="res://DetailFont.tres" type="DynamicFont" id=2]
[sub_resource type="Theme" id=1]
default_font = ExtResource( 2 )
[node name="Link" type="Node2D"]
script = ExtResource( 1 )
[node name="Line" type="Line2D" parent="."]
z_index = -1
width = 6.0
default_color = Color( 0.596078, 0.976471, 0.67451, 1 )
[node name="Label" type="Label" parent="."]
margin_left = -12.0
margin_top = -12.0
margin_right = 12.0
margin_bottom = 12.0
size_flags_horizontal = 0
size_flags_vertical = 0
theme = SubResource( 1 )
text = "1"
align = 1
valign = 1

93
Node.gd Normal file
View File

@ -0,0 +1,93 @@
extends Node2D
var stored = 0
var capacity = 0
var texture_resource = ""
var value = 0
var node_name = ''
var peers = []
const drag_threshold = 0.2
var drag = false
var drag_hold = 0
func name_from_index(index):
var n = char(index % 26 + 65)
if index > 26:
n += "%d" % index / 26
self.set_node_name(n)
func set_node_name(value):
self.node_name = value
get_node("Label").set_text(self.node_name)
func is_full():
return self.capacity >= self.stored
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
add_to_group("nodes")
if self.texture_resource != "":
get_node("Sprite").set_texture(load(self.texture_resource))
self.update_help()
func update_help():
get_node("Help").set_tooltip("")
get_node("Help").set_text("")
func path_to(destination):
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _process(delta):
if self.drag:
self.drag_hold += delta
func update_position(pos):
self.set_position(pos)
for link in get_tree().get_nodes_in_group("links"):
if link.end == self or link.start == self:
link.redraw_line()
var c = get_tree().get_nodes_in_group("character")[0]
if is_instance_valid(c):
if c.location == self:
c.set_position(self.get_position() + c.offset)
func _on_Help_gui_input(event):
if event is InputEventMouseMotion:
if self.drag and self.drag_hold > self.drag_threshold:
self.set_position(get_global_mouse_position())
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT and event.is_doubleclick():
if false:
print(self)
print("\tPeers: ", self.peers)
var links = []
for link in get_tree().get_nodes_in_group("links"):
if link.start == self or link.end == self:
links.append(link)
print("\tLinks: ")
for link in links:
print("\t\t", link, " ", link.start, " <---> ", link.end)
var c = get_tree().get_nodes_in_group("character")[0]
if c != null and c.can_move(self):
c.set_location(self)
if event.button_index == BUTTON_LEFT and !event.is_doubleclick():
if event.pressed:
self.drag = true
else:
if self.drag:
self.drag = false
if self.drag_hold > self.drag_threshold:
self.update_position(get_global_mouse_position())
self.drag_hold = 0

41
Node.tscn Normal file
View File

@ -0,0 +1,41 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://Node.gd" type="Script" id=1]
[ext_resource path="res://resources/dropoff.png" type="Texture" id=2]
[ext_resource path="res://DetailFontTheme.tres" type="Theme" id=3]
[ext_resource path="res://DetailFont.tres" type="DynamicFont" id=4]
[sub_resource type="Theme" id=1]
default_font = ExtResource( 4 )
[node name="Node" type="Node2D"]
script = ExtResource( 1 )
[node name="Sprite" type="Sprite" parent="."]
texture = ExtResource( 2 )
[node name="Help" type="RichTextLabel" parent="."]
margin_left = -32.0
margin_top = -32.0
margin_right = 32.0
margin_bottom = 32.0
hint_tooltip = "Drop off X more here to fully satisfy the delivery requirements.
When satisfied, Y will be added to your score."
theme = SubResource( 1 )
text = "0 / 0
0"
[node name="Label" type="Label" parent="."]
margin_left = -32.0
margin_top = -32.0
margin_right = 32.0
margin_bottom = 32.0
theme = ExtResource( 3 )
text = "XX"
align = 2
valign = 2
uppercase = true
[node name="Audio" type="AudioStreamPlayer" parent="."]
[connection signal="gui_input" from="Help" to="." method="_on_Help_gui_input"]

16
Node2D.gd Normal file
View File

@ -0,0 +1,16 @@
extends "res://Node.gd"
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

60
Pickup.gd Normal file
View File

@ -0,0 +1,60 @@
extends "res://Node.gd"
var empty_sounds = [
preload("res://resources/NoMore.wav"),
preload("res://resources/ThatsAll.wav"),
]
var load_sounds = [
preload("res://resources/Thunk.wav"),
]
func _init():
self.texture_resource = "res://resources/pickup.png"
self.stored = INF
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
self.add_to_group("pickup")
func stored_str():
if is_inf(self.stored):
return "\u221E"
return "{}".format([self.stored], "{}")
func add_stored(value):
self.stored += value
self.update_help()
func set_stored(value):
self.stored = value
self.update_help()
func drain(amount):
if amount <= 0:
return
self.stored -= amount
get_node("Audio").set_stream(self.load_sounds[randi() % self.load_sounds.size()])
get_node("Audio").play()
self.update_help()
func update_help():
get_node("Help").set_tooltip("Go here to replenish your stock\nThere are {} items available here".format([stored_str()], "{}"))
get_node("Help").set_text("{}".format([stored_str()], "{}"))
if self.stored <= 0:
get_node("Sprite").set_modulate(Color("da0000"))
get_node("Help").set_self_modulate(Color("da0000"))
var a = get_node("Audio")
a.set_stream(self.empty_sounds[randi() % self.empty_sounds.size()])
a.play()
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

7
Pickup.tscn Normal file
View File

@ -0,0 +1,7 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Node.tscn" type="PackedScene" id=1]
[ext_resource path="res://Pickup.gd" type="Script" id=2]
[node name="Pickup" instance=ExtResource( 1 )]
script = ExtResource( 2 )

17
Start.gd Normal file
View File

@ -0,0 +1,17 @@
extends "res://Node.gd"
func _init():
self.texture_resource = "res://resources/start.png"
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
self.add_to_group("start")
get_node("Help").set_tooltip("@TODO: Use an action here to end game early")
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

7
Start.tscn Normal file
View File

@ -0,0 +1,7 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Node.tscn" type="PackedScene" id=1]
[ext_resource path="res://Start.gd" type="Script" id=2]
[node name="Start" instance=ExtResource( 1 )]
script = ExtResource( 2 )

BIN
Super Bubble.ttf Normal file

Binary file not shown.

BIN
bg.xcf Normal file

Binary file not shown.

BIN
bg_desert.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 KiB

BIN
bg_desert2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 KiB

7
default_env.tres Normal file
View File

@ -0,0 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
[resource]
background_mode = 2
background_sky = SubResource( 1 )

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
icons.xcf Normal file

Binary file not shown.

29
project.godot Normal file
View File

@ -0,0 +1,29 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=4
[application]
config/name="LD53: Delivery"
config/description="Pickup and deliver in a nearby area. Minimize your movement to maximize your score."
run/main_scene="res://Blah.tscn"
boot_splash/show_image=false
config/icon="res://resources/boxes.png"
[gui]
common/drop_mouse_on_gui_input_disabled=true
[physics]
common/enable_pause_aware_picking=true
[rendering]
environment/default_environment="res://default_env.tres"

15
readme.md Normal file
View File

@ -0,0 +1,15 @@
# LD53: Delivery
Pickup and deliver things around an area, trying to minimize how far you travel.
# Tools
* Godot 3
* GIMP
* Audacity
# External Resources
* Super Bubble font: https://www.dafont.com/super-bubble.font
* Bitstream Vera Sans Nerd: https://github.com/ryanoasis/nerd-fonts
* Satellite shots from google, remixed for background

View File

@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://bg_desert2.png" type="Texture" id=1]
[node name="Background" type="Node2D"]
[node name="Base" type="Sprite" parent="."]
texture = ExtResource( 1 )
centered = false

BIN
resources/Coins1.wav Normal file

Binary file not shown.

BIN
resources/Coins2.wav Normal file

Binary file not shown.

BIN
resources/Comic Story.ttf Normal file

Binary file not shown.

BIN
resources/Items.wav Normal file

Binary file not shown.

85
resources/NewLevel.gd Normal file
View File

@ -0,0 +1,85 @@
extends Control
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
signal start_pressed
# Called when the node enters the scene tree for the first time.
func _ready():
#get_node(".").set_exclusive(true)
#get_node(".").popup_centered()
var Game = load("Game.gd")
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/ParameterTweaker").from_params(Game.medium_params())
func _on_difficulty_preset_pressed(button, value):
var Game = load("Game.gd")
var buttons = {
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Easy"): funcref(Game, "easy_params"),
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Medium"): funcref(Game, "medium_params"),
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Hard"): funcref(Game, "hard_params"),
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Custom"): null,
}
if value:
for b in buttons.keys():
if b != button:
b.set_pressed(false)
if buttons[button] != null:
get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/ParameterTweaker").from_params(buttons[button].call_func())
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _on_LevelCode_text_changed():
var p = load("Game.gd").parse_levelcode(find_node("LevelCode").text)
if p == null:
find_node("Valid").set_text("Invalid level code")
find_node("Valid").add_color_override("font_color", Color("ff0000"))
find_node("Reset").set_disabled(true)
else:
find_node("Valid").set_text("Valid level code")
find_node("Valid").add_color_override("font_color", Color("00ff00"))
find_node("Reset").set_disabled(false)
get_node("VBoxContainer/TabContainer/Import Level/ParameterTweaker").from_params(p)
func _on_Reset_pressed():
var p = load("Game.gd").parse_levelcode(find_node("LevelCode").text)
get_node("VBoxContainer/TabContainer/Import/ParameterTweaker").from_params(p)
func _on_Custom_toggled(button_pressed):
_on_difficulty_preset_pressed(get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Custom"), button_pressed)
func _on_Hard_toggled(button_pressed):
_on_difficulty_preset_pressed(get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Hard"), button_pressed)
func _on_Medium_toggled(button_pressed):
_on_difficulty_preset_pressed(get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Medium"), button_pressed)
func _on_Easy_toggled(button_pressed):
_on_difficulty_preset_pressed(get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Easy"), button_pressed)
func _on_ParameterTweaker_reset(params):
find_node("GeneratedLevelCode").set_text(Marshalls.variant_to_base64(params))
func _on_ParameterTweaker_changed(params):
find_node("GeneratedLevelCode").set_text(Marshalls.variant_to_base64(params))
var custom = get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Custom")
custom.set_pressed(true)
func _on_Start_pressed():
var params = get_node("VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/ParameterTweaker").to_params()
if get_node("VBoxContainer/TabContainer/Import Level").is_visible():
params = get_node("VBoxContainer/TabContainer/Import Level/ParameterTweaker").to_params()
emit_signal("start_pressed", params)

192
resources/NewLevel.tscn Normal file
View File

@ -0,0 +1,192 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://resources/UI Theme.tres" type="Theme" id=1]
[ext_resource path="res://resources/NewLevel.gd" type="Script" id=2]
[ext_resource path="res://resources/ParameterTweaker.tscn" type="PackedScene" id=3]
[node name="PopupPanel" type="PopupPanel"]
margin_right = 538.0
margin_bottom = 426.0
theme = ExtResource( 1 )
script = ExtResource( 2 )
[node name="VBoxContainer" type="VBoxContainer" parent="."]
margin_left = 4.0
margin_top = 4.0
margin_right = 534.0
margin_bottom = 422.0
theme = ExtResource( 1 )
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
margin_right = 530.0
margin_bottom = 380.0
grow_horizontal = 2
grow_vertical = 2
rect_min_size = Vector2( 0, 380 )
theme = ExtResource( 1 )
tab_align = 0
[node name="Select Difficulty" type="Tabs" parent="VBoxContainer/TabContainer"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
margin_top = 33.0
margin_right = -4.0
margin_bottom = -4.0
theme = ExtResource( 1 )
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Select Difficulty"]
margin_right = 522.0
margin_bottom = 340.0
theme = ExtResource( 1 )
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer"]
margin_right = 522.0
margin_bottom = 21.0
theme = ExtResource( 1 )
[node name="Easy" type="Button" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer"]
margin_right = 127.0
margin_bottom = 21.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
toggle_mode = true
text = "Short"
[node name="Medium" type="Button" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer"]
margin_left = 131.0
margin_right = 259.0
margin_bottom = 21.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
toggle_mode = true
pressed = true
text = "Medium"
[node name="Hard" type="Button" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer"]
margin_left = 263.0
margin_right = 390.0
margin_bottom = 21.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
toggle_mode = true
text = "Long"
[node name="Custom" type="Button" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer"]
margin_left = 394.0
margin_right = 522.0
margin_bottom = 21.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
toggle_mode = true
text = "Custom"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer"]
margin_top = 25.0
margin_right = 522.0
margin_bottom = 29.0
theme = ExtResource( 1 )
[node name="ParameterTweaker" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer" instance=ExtResource( 3 )]
anchor_right = 0.0
anchor_bottom = 0.0
margin_top = 33.0
margin_right = 522.0
margin_bottom = 233.0
rect_min_size = Vector2( 200, 200 )
[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer"]
margin_top = 237.0
margin_right = 522.0
margin_bottom = 241.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer"]
margin_top = 245.0
margin_right = 522.0
margin_bottom = 260.0
theme = ExtResource( 1 )
text = "Level Code - Copy to share with others"
align = 1
[node name="GeneratedLevelCode" type="TextEdit" parent="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer"]
margin_top = 264.0
margin_right = 522.0
margin_bottom = 344.0
rect_min_size = Vector2( 0, 80 )
theme = ExtResource( 1 )
readonly = true
wrap_enabled = true
[node name="Import Level" type="Tabs" parent="VBoxContainer/TabContainer"]
visible = false
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
margin_top = 33.0
margin_right = -4.0
margin_bottom = -4.0
theme = ExtResource( 1 )
[node name="LevelCode" type="TextEdit" parent="VBoxContainer/TabContainer/Import Level"]
margin_left = 2.0
margin_top = 20.0
margin_right = 518.0
margin_bottom = 112.0
hint_tooltip = "Enter the level code"
theme = ExtResource( 1 )
wrap_enabled = true
[node name="Valid" type="Label" parent="VBoxContainer/TabContainer/Import Level"]
margin_left = 13.0
margin_top = 123.0
margin_right = 55.0
margin_bottom = 138.0
theme = ExtResource( 1 )
text = "Valid level code"
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Import Level"]
margin_left = 7.0
margin_top = -3.0
margin_right = 516.0
margin_bottom = 12.0
theme = ExtResource( 1 )
text = "Level Code"
align = 1
[node name="Reset" type="Button" parent="VBoxContainer/TabContainer/Import Level"]
margin_left = 135.0
margin_top = 121.0
margin_right = 294.0
margin_bottom = 142.0
theme = ExtResource( 1 )
text = "Reset from level code"
[node name="ParameterTweaker" parent="VBoxContainer/TabContainer/Import Level" instance=ExtResource( 3 )]
margin_left = 9.0
margin_top = 149.0
margin_right = 421.0
margin_bottom = -6.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
margin_top = 384.0
margin_right = 530.0
margin_bottom = 388.0
theme = ExtResource( 1 )
[node name="Start" type="Button" parent="VBoxContainer"]
margin_top = 392.0
margin_right = 530.0
margin_bottom = 413.0
theme = ExtResource( 1 )
text = "Start"
[connection signal="toggled" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Easy" to="." method="_on_Easy_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Medium" to="." method="_on_Medium_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Hard" to="." method="_on_Hard_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/HBoxContainer/Custom" to="." method="_on_Custom_toggled"]
[connection signal="changed" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/ParameterTweaker" to="." method="_on_ParameterTweaker_changed"]
[connection signal="reset" from="VBoxContainer/TabContainer/Select Difficulty/VBoxContainer/ParameterTweaker" to="." method="_on_ParameterTweaker_reset"]
[connection signal="text_changed" from="VBoxContainer/TabContainer/Import Level/LevelCode" to="." method="_on_LevelCode_text_changed"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Import Level/Reset" to="." method="_on_Reset_pressed"]
[connection signal="pressed" from="VBoxContainer/Start" to="." method="_on_Start_pressed"]

BIN
resources/NoMore.wav Normal file

Binary file not shown.

BIN
resources/Paper2.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,116 @@
extends Control
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
signal changed
signal reset
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func to_params():
var params = {
'seed': find_node("Seed").get_text(),
'node_count': find_node("LocationCount").get_value(),
'cargo_availability': find_node("CargoAvailability").get_value(),
'pickup_count_range': Vector2(1, find_node("PickupCount").get_value()),
'empty_node_chance': find_node("EmptyNodeChance").get_value(),
'dropoff_value_range': Vector2(1, find_node("DropoffValue").get_value()),
'dropoff_capacity_range': Vector2(1, find_node("DropoffCapacity").get_value()),
'link_cost_range': Vector2(1, find_node("LinkWeight").get_value()),
}
if find_node("Infinite").is_pressed():
params.cargo_availability = INF
return params
func from_params(params):
self.set_block_signals(true)
find_node("Seed").set_text(params.seed)
find_node("LocationCount").set_value(params.node_count)
get_node("VBoxContainer/HBoxContainer2/Value").set_text("%d" % params.node_count)
if is_inf(params.cargo_availability):
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").set_editable(false)
get_node("VBoxContainer/HBoxContainer3/Value").set_text("INF")
get_node("VBoxContainer/HBoxContainer3/Infinite").set_pressed(true)
else:
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").set_editable(true)
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").set_value(params.cargo_availability)
get_node("VBoxContainer/HBoxContainer3/Value").set_text("%2.1f" % params.cargo_availability)
get_node("VBoxContainer/HBoxContainer3/Infinite").set_pressed(false)
get_node("VBoxContainer/HBoxContainer4/PickupCount").set_value(params.pickup_count_range.y)
get_node("VBoxContainer/HBoxContainer4/Value").set_text("%d" % params.pickup_count_range.y)
get_node("VBoxContainer/HBoxContainer5/EmptyNodeChance").set_value(params.empty_node_chance)
get_node("VBoxContainer/HBoxContainer5/Value").set_text("%d" % params.empty_node_chance)
get_node("VBoxContainer/HBoxContainer6/DropoffValue").set_value(params.dropoff_value_range.y)
get_node("VBoxContainer/HBoxContainer6/Value").set_text("%d" % params.dropoff_value_range.y)
get_node("VBoxContainer/HBoxContainer7/DropoffCapacity").set_value(params.dropoff_capacity_range.y)
get_node("VBoxContainer/HBoxContainer7/Value").set_text("%d" % params.dropoff_capacity_range.y)
get_node("VBoxContainer/HBoxContainer8/LinkWeight").set_value(params.link_cost_range.y)
get_node("VBoxContainer/HBoxContainer8/Value").set_text("%d" % params.link_cost_range.y)
self.set_block_signals(false)
emit_signal("reset", self.to_params())
func _on_RandomizeSeed_pressed():
# 33 - 126
var character_count = randi() % 29 + 4
var new_seed = ""
while character_count > 0:
new_seed += char(randi() % 94 + 33)
character_count -= 1
find_node("Seed").set_text(new_seed)
emit_signal("changed", self.to_params())
func _on_LocationCount_value_changed(value):
get_node("VBoxContainer/HBoxContainer2/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())
func _on_CargoAvailability_value_changed(value):
get_node("VBoxContainer/HBoxContainer3/Value").set_text("%2.1f" % value)
emit_signal("changed", self.to_params())
func _on_CheckBox_toggled(button_pressed):
if button_pressed:
get_node("VBoxContainer/HBoxContainer3/Value").set_text("INF")
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").set_editable(false)
else:
get_node("VBoxContainer/HBoxContainer3/Value").set_text("%2.1f" %
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").get_value()
)
get_node("VBoxContainer/HBoxContainer3/CargoAvailability").set_editable(true)
emit_signal("changed", self.to_params())
func _on_PickupCount_value_changed(value):
get_node("VBoxContainer/HBoxContainer4/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())
func _on_EmptyNodeChance_value_changed(value):
get_node("VBoxContainer/HBoxContainer5/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())
func _on_DropoffValue_value_changed(value):
get_node("VBoxContainer/HBoxContainer6/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())
func _on_DropoffCapacity_value_changed(value):
get_node("VBoxContainer/HBoxContainer7/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())
func _on_LinkWeight_value_changed(value):
get_node("VBoxContainer/HBoxContainer8/Value").set_text("%d" % value)
emit_signal("changed", self.to_params())

View File

@ -0,0 +1,269 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://resources/UI Theme.tres" type="Theme" id=1]
[ext_resource path="res://resources/ParameterTweaker.gd" type="Script" id=2]
[node name="ParameterTweaker" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
theme = ExtResource( 1 )
script = ExtResource( 2 )
[node name="VBoxContainer" type="VBoxContainer" parent="."]
margin_right = 375.0
margin_bottom = 52.0
theme = ExtResource( 1 )
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
margin_right = 375.0
margin_bottom = 16.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"]
margin_right = 98.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Location count"
[node name="LocationCount" type="HSlider" parent="VBoxContainer/HBoxContainer2"]
margin_left = 102.0
margin_right = 364.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
min_value = 6.0
max_value = 64.0
value = 6.0
rounded = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer2"]
margin_left = 368.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "6"
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 20.0
margin_right = 375.0
margin_bottom = 44.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer3"]
margin_top = 4.0
margin_right = 126.0
margin_bottom = 19.0
hint_tooltip = "How much cargo is available from pickup locations relative to the total number of requested cargo from dropoff locations."
mouse_filter = 1
text = "Cargo Availability"
[node name="CargoAvailability" type="HSlider" parent="VBoxContainer/HBoxContainer3"]
margin_left = 130.0
margin_right = 262.0
margin_bottom = 16.0
size_flags_horizontal = 3
min_value = 1.0
max_value = 3.0
step = 0.1
value = 1.0
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer3"]
margin_left = 266.0
margin_top = 4.0
margin_right = 287.0
margin_bottom = 19.0
text = "1.0"
[node name="Infinite" type="CheckBox" parent="VBoxContainer/HBoxContainer3"]
margin_left = 291.0
margin_right = 375.0
margin_bottom = 24.0
text = "Infinite"
[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 48.0
margin_right = 375.0
margin_bottom = 64.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer4"]
margin_right = 147.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Pickup Location Count"
[node name="PickupCount" type="HSlider" parent="VBoxContainer/HBoxContainer4"]
margin_left = 151.0
margin_right = 371.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
min_value = 1.0
max_value = 3.0
value = 1.0
rounded = true
tick_count = 3
ticks_on_borders = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer4"]
margin_left = 375.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 68.0
margin_right = 375.0
margin_bottom = 84.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer5"]
margin_right = 119.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Empty Node Chance"
[node name="EmptyNodeChance" type="HSlider" parent="VBoxContainer/HBoxContainer5"]
margin_left = 123.0
margin_right = 357.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
max_value = 90.0
value = 15.0
rounded = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer5"]
margin_left = 361.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "15"
[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 88.0
margin_right = 375.0
margin_bottom = 104.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer6"]
margin_right = 147.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Maximum Dropoff Value"
[node name="DropoffValue" type="HSlider" parent="VBoxContainer/HBoxContainer6"]
margin_left = 151.0
margin_right = 364.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
min_value = 1.0
max_value = 10.0
value = 3.0
rounded = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer6"]
margin_left = 368.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "3"
[node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 108.0
margin_right = 375.0
margin_bottom = 124.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer7"]
margin_right = 168.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Maximum Dropoff Capacity"
[node name="DropoffCapacity" type="HSlider" parent="VBoxContainer/HBoxContainer7"]
margin_left = 172.0
margin_right = 364.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
min_value = 1.0
max_value = 10.0
value = 3.0
rounded = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer7"]
margin_left = 368.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "3"
[node name="HBoxContainer8" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 128.0
margin_right = 375.0
margin_bottom = 144.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer8"]
margin_right = 133.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "Maximum Link Weight"
[node name="LinkWeight" type="HSlider" parent="VBoxContainer/HBoxContainer8"]
margin_left = 137.0
margin_right = 364.0
margin_bottom = 16.0
size_flags_horizontal = 3
theme = ExtResource( 1 )
min_value = 1.0
max_value = 10.0
value = 2.0
rounded = true
[node name="Value" type="Label" parent="VBoxContainer/HBoxContainer8"]
margin_left = 368.0
margin_right = 375.0
margin_bottom = 15.0
theme = ExtResource( 1 )
text = "2"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 148.0
margin_right = 375.0
margin_bottom = 180.0
theme = ExtResource( 1 )
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"]
margin_top = 8.0
margin_right = 28.0
margin_bottom = 23.0
theme = ExtResource( 1 )
text = "Seed"
[node name="Seed" type="TextEdit" parent="VBoxContainer/HBoxContainer"]
margin_left = 32.0
margin_right = 296.0
margin_bottom = 32.0
rect_min_size = Vector2( 64, 32 )
size_flags_horizontal = 3
theme = ExtResource( 1 )
[node name="RandomizeSeed" type="Button" parent="VBoxContainer/HBoxContainer"]
margin_left = 300.0
margin_right = 375.0
margin_bottom = 32.0
theme = ExtResource( 1 )
text = "Randomize"
[connection signal="value_changed" from="VBoxContainer/HBoxContainer2/LocationCount" to="." method="_on_LocationCount_value_changed"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer3/CargoAvailability" to="." method="_on_CargoAvailability_value_changed"]
[connection signal="toggled" from="VBoxContainer/HBoxContainer3/Infinite" to="." method="_on_CheckBox_toggled"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer4/PickupCount" to="." method="_on_PickupCount_value_changed"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer5/EmptyNodeChance" to="." method="_on_EmptyNodeChance_value_changed"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer6/DropoffValue" to="." method="_on_DropoffValue_value_changed"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer7/DropoffCapacity" to="." method="_on_DropoffCapacity_value_changed"]
[connection signal="value_changed" from="VBoxContainer/HBoxContainer8/LinkWeight" to="." method="_on_LinkWeight_value_changed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/RandomizeSeed" to="." method="_on_RandomizeSeed_pressed"]

BIN
resources/Ratchet.wav Normal file

Binary file not shown.

BIN
resources/Scribble.wav Normal file

Binary file not shown.

BIN
resources/Tap.wav Normal file

Binary file not shown.

BIN
resources/Thanks.wav Normal file

Binary file not shown.

BIN
resources/ThatsAll.wav Normal file

Binary file not shown.

BIN
resources/Thunk.wav Normal file

Binary file not shown.

10
resources/UI Theme.tres Normal file
View File

@ -0,0 +1,10 @@
[gd_resource type="Theme" load_steps=3 format=2]
[ext_resource path="res://Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf" type="DynamicFontData" id=1]
[sub_resource type="DynamicFont" id=1]
size = 12
font_data = ExtResource( 1 )
[resource]
default_font = SubResource( 1 )

BIN
resources/YoureTheBest.wav Normal file

Binary file not shown.

BIN
resources/box.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
resources/boxes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
resources/building.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
resources/character.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
resources/dropoff.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

BIN
resources/empty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
resources/moves.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
resources/pickup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

BIN
resources/start.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
resources/untitled.wav Normal file

Binary file not shown.

BIN
sounds.aup3 Normal file

Binary file not shown.