summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorJ08nY2017-04-25 01:04:37 +0200
committerJ08nY2017-04-25 01:04:37 +0200
commit379c2794c40bc2b212d29fa0e0847f76e3f3a870 (patch)
treeb00311bbbc2784981dd92b1e161c414c823bbe86 /scripts
parent146b302545b8cda8df456d105ac30ee961365056 (diff)
downloadld38-379c2794c40bc2b212d29fa0e0847f76e3f3a870.tar.gz
ld38-379c2794c40bc2b212d29fa0e0847f76e3f3a870.tar.zst
ld38-379c2794c40bc2b212d29fa0e0847f76e3f3a870.zip
Diffstat (limited to 'scripts')
-rw-r--r--scripts/base.gd1
-rw-r--r--scripts/builder.gd7
-rw-r--r--scripts/combinator.gd2
-rw-r--r--scripts/events.gd23
-rw-r--r--scripts/exporter.gd72
-rw-r--r--scripts/howto.gd8
-rw-r--r--scripts/incubator.gd29
-rw-r--r--scripts/life.gd34
-rw-r--r--scripts/messages.gd3
-rw-r--r--scripts/player.gd4
-rw-r--r--scripts/popup.gd40
-rw-r--r--scripts/template_combine.gd28
-rw-r--r--scripts/template_export.gd8
-rw-r--r--scripts/template_incubate.gd20
-rw-r--r--scripts/world.gd10
15 files changed, 262 insertions, 27 deletions
diff --git a/scripts/base.gd b/scripts/base.gd
index 6b2bfd5..39d171e 100644
--- a/scripts/base.gd
+++ b/scripts/base.gd
@@ -40,7 +40,6 @@ func _input(event):
if s != null:
get_node("Incubator").push_world(s)
if event.scancode == KEY_N:
- #var w = Wrld.instance()
var w = self.builder.combine(Vector3(0,0,0), [])
w.set_scale(Vector3(0.02, 0.02, 0.02))
add_child(w)
diff --git a/scripts/builder.gd b/scripts/builder.gd
index 74b8aaf..a37221a 100644
--- a/scripts/builder.gd
+++ b/scripts/builder.gd
@@ -33,13 +33,14 @@ func combine(where, materials):
var gas_mass = 0
var gas_volume = 0
var gas_color = Color(0.5,0.5,0.6,0.4)
+ var cost = 0
for mat in materials:
var item = self.items.get(mat)
var category = self.items.category(mat)
if category == "solid":
mass += item.data["mass"]
- #volume += item.data["volume"]
+ volume += item.data["volume"]
var s = item.data["color"]
color = color.blend(Color(s))
@@ -48,6 +49,7 @@ func combine(where, materials):
gas_volume += item.data["volume"]
var s = item.data["color"]
gas_color = gas_color.blend(Color(s))
+ cost += item.data["cost"]
w.materials = materials
w.mass = mass
@@ -56,5 +58,8 @@ func combine(where, materials):
w.gas_mass = gas_mass
w.gas_volume = gas_volume
w.gas_color = gas_color
+ w.total_mass = mass + gas_mass
+ w.total_volume = volume + gas_volume
+ w.cost = cost
w.call_deferred("build")
return w
diff --git a/scripts/combinator.gd b/scripts/combinator.gd
index cbabfe6..42bcc18 100644
--- a/scripts/combinator.gd
+++ b/scripts/combinator.gd
@@ -54,7 +54,7 @@ func _on_panel_input_event( camera, event, click_pos, click_normal, shape_idx ):
message = self.templater.template(self.world)
get_node("animation").play("click")
else:
- message = "Cannot combine!"
+ message = "Cannot combine! You need solid and gaseous material."
get_tree().get_root().get_node("Game/HUD").display_message(message, 15)
func _on_incubate_input_event( camera, event, click_pos, click_normal, shape_idx ):
diff --git a/scripts/events.gd b/scripts/events.gd
new file mode 100644
index 0000000..74f75be
--- /dev/null
+++ b/scripts/events.gd
@@ -0,0 +1,23 @@
+extends "res://scripts/template.gd"
+
+var choices
+
+func _init().("res://assets/events.json"):
+ self.choices = self.data["choice"]
+
+func get_rand_event(stage):
+ var avail = []
+ for i in range(self.choices.size()):
+ var choice = self.choices[i]
+ if stage in choice["stages"]:
+ avail.append(choice)
+ if avail.size() > 0:
+ return avail[randi() % avail.size()]
+ else:
+ return null
+
+func get_event(id):
+ for i in range(self.choices.size()):
+ var choice = self.choices[i]
+ if choice["id"] == id:
+ return choice
diff --git a/scripts/exporter.gd b/scripts/exporter.gd
index 712a10b..74f457e 100644
--- a/scripts/exporter.gd
+++ b/scripts/exporter.gd
@@ -1,10 +1,78 @@
extends Spatial
+const GrayMat = preload("res://gray_mat.tres")
+const ExporterTemplate = preload("res://scripts/template_export.gd")
+
+var worlds = []
+var selected_pos = null
+var selected = null
+
+var mat_selected = null
+var mat_unselected = null
+
+var template
+
func _ready():
- pass
+ for x in range(4):
+ self.worlds.append(null)
+ self.mat_selected = GrayMat.duplicate(true)
+ self.mat_selected.set_albedo(Color(0.2, 0.2, 0.2))
+ self.mat_unselected = GrayMat.duplicate(true)
+ self.template = ExporterTemplate.new()
+
+func set_world(i, world):
+ self.worlds[i] = world
+ var pos = get_node("spawns/" + str(i))
+ world.set_translation(pos.get_global_transform().origin)
+
+func push_world(world):
+ for x in range(4):
+ if self.worlds[x] == null:
+ set_world(x, world)
+ return true
+ return false
+
+func get_world(x):
+ return self.worlds[x]
func _on_body_input_event( camera, event, click_pos, click_normal, shape_idx ):
if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
print("body")
var cam = get_tree().get_root().get_camera()
- cam.select(self, get_node("point")) \ No newline at end of file
+ cam.select(self, get_node("point"))
+
+func _on_panel_input_event( camera, event, click_pos, click_normal, shape_idx ):
+ if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
+ print("sell")
+ var message = "Cannot sell, no world spot selected!"
+ if self.selected_pos != null:
+ var w = get_world(self.selected_pos.x)
+ if w != null:
+ get_node("animation").play("right")
+ get_tree().get_root().get_node("Game").remove_child(w)
+ var player = get_tree().get_root().get_node("Game/Player")
+ player.cash = player.cash + (w.cost * w.life.stage)
+ message = self.template.template(w)
+ self.worlds[self.selected_pos.x] = null
+ self.selected.set_material_override(self.mat_unselected)
+ self.selected_pos = null
+ self.selected = null
+ else:
+ message = "Cannot sell, no world!"
+ get_tree().get_root().get_node("Game/HUD").display_message(message, 15)
+
+func _on_cylinder_input_event( camera, event, click_pos, click_normal, shape_idx , node, pos):
+ if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
+ print("pos ",pos)
+ var new = get_node(node)
+ if self.selected != null:
+ self.selected.set_material_override(self.mat_unselected)
+
+ if self.selected == new:
+ self.selected.set_material_override(self.mat_unselected)
+ self.selected_pos = null
+ self.selected = null
+ else:
+ self.selected = new
+ self.selected_pos = pos
+ self.selected.set_material_override(self.mat_selected)
diff --git a/scripts/howto.gd b/scripts/howto.gd
index 1259174..94674aa 100644
--- a/scripts/howto.gd
+++ b/scripts/howto.gd
@@ -11,5 +11,11 @@ func _ready():
var data = parse_json(content)
self.title = data["title"]
self.text = data["text"]
- get_node("panel/text").set_bbcode("[b]" + self.title + "[/b]\n\n" + self.text)
+ var label = get_node("panel/text")
+ label.set_bbcode("[b]" + self.title + "[/b]\n\n" + self.text)
+ label.push_list(RichTextLabel.LIST_DOTS)
+ for life in data["list"]:
+ label.append_bbcode(life)
+ label.newline()
+
#get_node("panel/text").add_text(self.text) \ No newline at end of file
diff --git a/scripts/incubator.gd b/scripts/incubator.gd
index 245808e..3fd25cf 100644
--- a/scripts/incubator.gd
+++ b/scripts/incubator.gd
@@ -23,7 +23,7 @@ func _ready():
func set_world(i, world):
self.worlds[i] = world
var pos = get_node("spawns/" + str(i))
- world.set_translation(pos.global_transform.origin)
+ world.set_translation(pos.get_global_transform().origin)
func push_world(world):
for x in range(4):
@@ -34,7 +34,12 @@ func push_world(world):
func get_world(x):
return self.worlds[x]
-
+
+func display_life():
+ if self.selected_pos != null:
+ var w = self.get_world(self.selected_pos.x)
+ get_tree().get_root().get_node("Game/HUD").display_message(self.template.template(w), 15)
+
func _on_body_input_event( camera, event, click_pos, click_normal, shape_idx ):
if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
print("body")
@@ -48,17 +53,33 @@ func _on_right_input_event( camera, event, click_pos, click_normal, shape_idx ):
var w = get_world(self.selected_pos.x)
if w != null:
get_node("animation").play("right")
+ var exporter = get_tree().get_root().get_node("Game/Exporter")
+ exporter.push_world(w)
+ self.worlds[self.selected_pos.x] = null
+ self.selected.set_material_override(self.mat_unselected)
+ self.selected = null
+ self.selected_pos = null
+ var cam = get_tree().get_root().get_node("Game/Camera")
+ cam.select(exporter, exporter.get_node("point"))
func _on_left_input_event( camera, event, click_pos, click_normal, shape_idx ):
if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
print("evolve")
+ var message = "Cannot evolve, no world spot selected!"
if self.selected_pos != null:
var w = get_world(self.selected_pos.x)
if w != null:
get_node("animation").play("left")
+ var before = w.life.stage
w.evolve()
- get_tree().get_root().get_node("Game/HUD").display_message(self.template.get_stage(w.life.stage)["text"])
-
+ var after = w.life.stage
+ if before != after:
+ message = self.template.template(w)
+ else:
+ message = null
+ else:
+ message = "Cannot evolve, no world!"
+ get_tree().get_root().get_node("Game/HUD").display_message(message)
func _on_cylinder_input_event( camera, event, click_pos, click_normal, shape_idx, node, pos ):
if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
diff --git a/scripts/life.gd b/scripts/life.gd
index 8b842c3..4355e31 100644
--- a/scripts/life.gd
+++ b/scripts/life.gd
@@ -1,19 +1,25 @@
-extends Object
+extends Node
const Items = preload("res://scripts/items.gd")
+const Events = preload("res://scripts/events.gd")
var items
+var events
var stage
var materials
var age
+var event
+
func _init(stage, materials):
self.items = Items.new()
+ self.events = Events.new()
self.stage = stage
self.materials = materials
self.age = 0
func evolve():
+ print("life evolve", stage, materials)
var r = randf()
if r > 0.95:
print("destroy")
@@ -21,17 +27,37 @@ func evolve():
# destroy life
elif r > 0.7:
print("choice")
+ self.event = self.events.get_rand_event(self.stage)
+ var popup = get_tree().get_root().get_node("Game/HUD/popup")
+ popup.set_text(event["text"])
+ popup.set_options(event["options"])
+ popup.set_life(self)
+ popup.popup_centered()
# choice event
elif r > 0.5:
print("up")
- self.stage += 1
+ self.stage = int(min(self.stage + 1, 6))
# move up
elif r > 0.45:
print("down")
- self.stage = int(max(self.stage, 0))
+ self.stage = int(max(self.stage - 1, 0))
# move down
else:
print("none")
# none
- print("life evolve", stage, materials)
self.age += 1
+
+func choice(i):
+ if i == null:
+ return
+ var r = randf()
+ var result
+ if r > 0.4:
+ result = "correct"
+ self.stage = int(min(self.stage + 1, 6))
+ else:
+ result = "incorrect"
+ self.stage = int(max(self.stage - 1, 0))
+ get_tree().get_root().get_node("Game/HUD").display_message(self.event[result][i])
+ get_tree().get_root().get_node("Game/Incubator").display_life()
+ print(result) \ No newline at end of file
diff --git a/scripts/messages.gd b/scripts/messages.gd
index 236ebd1..c525fd2 100644
--- a/scripts/messages.gd
+++ b/scripts/messages.gd
@@ -26,13 +26,14 @@ func _process(delta):
for i in to_remove:
var label = labels[i]
remove_child(label)
- label.queue_free()
labels.remove(i)
runs.remove(i)
lengths.remove(i)
count -= 1
func display_message(message, time):
+ if message == null:
+ return
var label = Label.new()
label.set_text(message)
add_child(label)
diff --git a/scripts/player.gd b/scripts/player.gd
index 59ffb06..fee4836 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -3,10 +3,10 @@ extends Node
const Items = preload("res://scripts/items.gd")
var items
-var cash = 1000 setget set_cash, get_cash
+var cash = 100 setget set_cash, get_cash
var storage = {}
var inventory = {}
-
+
func _ready():
self.items = Items.new()
_update_funds()
diff --git a/scripts/popup.gd b/scripts/popup.gd
new file mode 100644
index 0000000..ce3e254
--- /dev/null
+++ b/scripts/popup.gd
@@ -0,0 +1,40 @@
+extends PopupPanel
+
+var life
+
+func _ready():
+ set_exclusive(true)
+
+func set_text(text):
+ var label = get_node("text")
+ label.clear()
+ label.push_align(RichTextLabel.ALIGN_CENTER)
+ label.append_bbcode("[b]A thing has happened![/b]")
+ label.newline()
+ label.pop()
+ label.add_text(text)
+ label.newline()
+
+func set_options(options):
+ var label = get_node("text")
+ var button = get_node("options")
+ print("item count = ", button.get_item_count())
+ for j in range(button.get_item_count()):
+ button.remove_item(0)
+ label.push_list(RichTextLabel.LIST_DOTS)
+ var i = 0
+ for opt in options:
+ print(opt)
+ button.add_item(opt)
+ button.set_item_metadata(i, i)
+ label.add_text(opt)
+ label.newline()
+ i += 1
+ label.pop()
+
+func set_life(life):
+ self.life = life
+
+func _on_ok_pressed():
+ self.life.choice(get_node("options").get_selected_metadata())
+ hide()
diff --git a/scripts/template_combine.gd b/scripts/template_combine.gd
index 2195e8a..7df3b69 100644
--- a/scripts/template_combine.gd
+++ b/scripts/template_combine.gd
@@ -6,8 +6,28 @@ func _init().("res://assets/combinator.json"):
self.bases = self.data["bases"]
func template(world):
- var base = self.bases[randi() % self.bases.size()]
- var d = Dictionary(self.data)
+ var base = str(self.bases[randi() % self.bases.size()])
+ var d = {}
d["mass"] = str(world.mass) + " sextillion tons"
- d["volume"] = str(world.volume)
- return self.replace_all(base, self.data)
+ d["volume"] = str(world.volume) + " trillion cubic metres"
+ if (world.gas_mass > world.mass):
+ d["type"] = "gaseous"
+ d["type_comment"] = self.data["type_comment"]["gaseous"]
+ else:
+ d["type"] = "solid"
+ d["type_comment"] = self.data["type_comment"]["solid"]
+
+ if world.total_mass < 0.3:
+ d["mass_comment"] = self.data["mass_comment"]["very_small"]
+ elif world.total_mass < 0.5:
+ d["mass_comment"] = self.data["mass_comment"]["small"]
+ elif world.total_mass < 2:
+ d["mass_comment"] = self.data["mass_comment"]["medium"]
+ elif world.total_mass < 8:
+ d["mass_comment"] = self.data["mass_comment"]["big"]
+ elif world.total_mass < 20:
+ d["mass_comment"] = self.data["mass_comment"]["huge"]
+ else:
+ d["mass_comment"] = self.data["mass_comment"]["yuge"]
+
+ return self.replace_all(base, d)
diff --git a/scripts/template_export.gd b/scripts/template_export.gd
new file mode 100644
index 0000000..038fbe4
--- /dev/null
+++ b/scripts/template_export.gd
@@ -0,0 +1,8 @@
+extends "res://scripts/template.gd"
+
+func _init().("res://assets/exporter.json"):
+ pass
+
+func template(world):
+ var reviews = self.data["feedback"]
+ return str(reviews[randi() % reviews.size()])
diff --git a/scripts/template_incubate.gd b/scripts/template_incubate.gd
index 867d15d..d85b710 100644
--- a/scripts/template_incubate.gd
+++ b/scripts/template_incubate.gd
@@ -1,8 +1,24 @@
extends "res://scripts/template.gd"
+const Items = preload("res://scripts/items.gd")
+
+var bases = null
+
func _init().("res://assets/incubator.json"):
- pass
+ self.bases = self.data["bases"]
+
+func template(world):
+ var base = str(self.bases[randi() % self.bases.size()])
+ var d = {}
+ d["stage"] = self.data["stage"][world.life.stage]["name"]
+ var misc = []
+ for mat in world.materials:
+ if mat in self.data["misc"]:
+ misc.append(self.data["misc"][mat])
+ d["misc"] = misc
+ print(d)
+ return self.replace_all(base, d)
func get_stage(stage):
- var stages = self.data["stages"]
+ var stages = self.data["stage"]
return stages[stage] \ No newline at end of file
diff --git a/scripts/world.gd b/scripts/world.gd
index 19b755e..5132cb9 100644
--- a/scripts/world.gd
+++ b/scripts/world.gd
@@ -19,6 +19,11 @@ var gas_mass
var gas_volume
var gas_color
+var total_mass
+var total_volume
+
+var cost
+
var surface_color
var mesh
@@ -58,11 +63,8 @@ func build():
self.level = 1
self.surface = _make_surface(SIZE, Vector3(0,0,0), self.level)
- var types = [House, Pine, Oak]
- for i in range(15):
- var type = types[randi() % 3]
- add_obj(type, int(rand_range(-SIZE/2, SIZE/2)), int(rand_range(-SIZE/2, SIZE/2)))
self.life = Life.new(0, self.materials)
+ add_child(self.life)
func _make_ball(size, center):
self.blocks = []