summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorJ08nY2017-04-24 18:19:14 +0200
committerJ08nY2017-04-24 18:19:14 +0200
commit146b302545b8cda8df456d105ac30ee961365056 (patch)
tree00d809d197ffdb2732cefb6a9722fda2cec0054c /scripts
parent8f1613ca0fab95fe837d9278e7829f70fb7bc934 (diff)
downloadld38-146b302545b8cda8df456d105ac30ee961365056.tar.gz
ld38-146b302545b8cda8df456d105ac30ee961365056.tar.zst
ld38-146b302545b8cda8df456d105ac30ee961365056.zip
Diffstat (limited to 'scripts')
-rw-r--r--scripts/builder.gd2
-rw-r--r--scripts/combinator.gd39
-rw-r--r--scripts/combinator_panel.gd7
-rw-r--r--scripts/exporter.gd10
-rw-r--r--scripts/hud.gd39
-rw-r--r--scripts/incubator.gd73
-rw-r--r--scripts/life.gd37
-rw-r--r--scripts/player.gd2
-rw-r--r--scripts/template_combine.gd3
-rw-r--r--scripts/template_incubate.gd4
-rw-r--r--scripts/world.gd156
11 files changed, 282 insertions, 90 deletions
diff --git a/scripts/builder.gd b/scripts/builder.gd
index 9a43437..74b8aaf 100644
--- a/scripts/builder.gd
+++ b/scripts/builder.gd
@@ -32,7 +32,7 @@ func combine(where, materials):
var color = Color(0.3,0.3,0.3)
var gas_mass = 0
var gas_volume = 0
- var gas_color = Color(0.5,0.5,0.6,0.35)
+ var gas_color = Color(0.5,0.5,0.6,0.4)
for mat in materials:
var item = self.items.get(mat)
diff --git a/scripts/combinator.gd b/scripts/combinator.gd
index 43ebe0b..cbabfe6 100644
--- a/scripts/combinator.gd
+++ b/scripts/combinator.gd
@@ -42,19 +42,28 @@ func _on_body_input_event( camera, event, click_pos, click_normal, shape_idx ):
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("panel")
- get_node("animation").play("click")
- var panel = get_node("Viewport/CombinatorPanel")
- var ids = panel.get_ids()
- var message = null
- if ids != null and ids.size() > 0 and self.builder.can_combine(ids):
- self.world = self.builder.combine(get_node("spawn").get_global_transform().origin, ids)
- get_tree().get_root().get_node("Game").add_child(self.world)
- panel.clear_all()
- message = self.templater.template(self.world)
- else:
- message = "Cannot combine!"
+ print("combine")
+ var message = ""
+ if self.world == null:
+ var panel = get_node("Viewport/CombinatorPanel")
+ var ids = panel.get_ids()
+ if ids != null and ids.size() > 0 and self.builder.can_combine(ids):
+ self.world = self.builder.combine(get_node("spawn").get_global_transform().origin, ids)
+ get_tree().get_root().get_node("Game").add_child(self.world)
+ panel.clear_all()
+ message = self.templater.template(self.world)
+ get_node("animation").play("click")
+ else:
+ message = "Cannot combine!"
get_tree().get_root().get_node("Game/HUD").display_message(message, 15)
-
-
- \ No newline at end of file
+
+func _on_incubate_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("incubate")
+ if self.world != null:
+ get_node("animation").play("incubate")
+ var incubator = get_tree().get_root().get_node("Game/Incubator")
+ incubator.push_world(self.world)
+ var cam = get_tree().get_root().get_node("Game/Camera")
+ cam.select(incubator, incubator.get_node("point"))
+ self.world = null
diff --git a/scripts/combinator_panel.gd b/scripts/combinator_panel.gd
index 65ba69b..18c91ca 100644
--- a/scripts/combinator_panel.gd
+++ b/scripts/combinator_panel.gd
@@ -49,10 +49,7 @@ func clear_all():
func _on_add_pressed():
var player = get_tree().get_root().get_node("Game/Player")
- var storage = get_tree().get_root().get_node("Game/HUD/storage")
-
- print(player.storage)
- print(storage.get_selected())
+ var storage = get_tree().get_root().get_node("Game/HUD/right/storage")
var item = storage.get_selected()
if item != null and player.has_item(item["id"]):
@@ -66,10 +63,8 @@ func _on_remove_pressed():
var player = get_tree().get_root().get_node("Game/Player")
var item = self.get_selected()
if item != null:
- print(item)
var node = self.tree.get_selected()
node.deselect(0)
- print(node)
var root = self.tree.get_root()
root.remove_child(node)
self.tree.update()
diff --git a/scripts/exporter.gd b/scripts/exporter.gd
new file mode 100644
index 0000000..712a10b
--- /dev/null
+++ b/scripts/exporter.gd
@@ -0,0 +1,10 @@
+extends Spatial
+
+func _ready():
+ pass
+
+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
diff --git a/scripts/hud.gd b/scripts/hud.gd
index dcf4c88..7a8e3cd 100644
--- a/scripts/hud.gd
+++ b/scripts/hud.gd
@@ -1,7 +1,8 @@
extends Node
func _ready():
- pass
+ var view = get_tree().get_root().get_viewport()
+ view.connect("size_changed", self, "_on_size_changed", [view])
func _on_ms_button_pressed():
_toggle("ms")
@@ -21,24 +22,38 @@ func popup(which):
for tab in tabs:
var vis = false
if tab == which:
- vis = !get_node(tab).is_visible()
- get_node(tab).set_visible(vis)
+ vis = !get_node("right/" + tab).is_visible()
+ get_node("right/" + tab).set_visible(vis)
func set_funds(cash):
- get_node("funds/cash").set_text(str(cash))
+ get_node("right/funds/cash").set_text(str(cash))
func update_storage(id, amount):
- get_node("storage").update_storage(id, amount)
+ get_node("right/storage").update_storage(id, amount)
func display_message(message, time=5):
get_node("messages").display_message(message, time)
-func _on_combibator_button_pressed():
- var cam = get_tree().get_root().get_node("Game/Camera")
- var combinator = get_tree().get_root().get_node("Game/Combinator")
- cam.select(combinator, combinator.get_node("point"))
+func _select_machine(machine):
+ var cam = get_tree().get_root().get_camera()
+ var node = get_tree().get_root().get_node("Game/" + machine)
+ cam.select(node, node.get_node("point"))
+
+func _on_combinator_button_pressed():
+ self._select_machine("Combinator")
func _on_incubator_button_pressed():
- var cam = get_tree().get_root().get_node("Game/Camera")
- var incubator = get_tree().get_root().get_node("Game/Incubator")
- cam.select(incubator, incubator.get_node("point"))
+ self._select_machine("Incubator")
+
+func _on_exporter_button_pressed():
+ self._select_machine("Exporter")
+
+func _on_size_changed(viewport):
+ var size = viewport.get_size()
+ var right = get_node("right")
+ right.set_position(Vector2(size.x, 0))
+
+ var left_bottom = get_node("left_bottom")
+ left_bottom.set_position(Vector2(0, size.y))
+
+
diff --git a/scripts/incubator.gd b/scripts/incubator.gd
index 7bf7593..245808e 100644
--- a/scripts/incubator.gd
+++ b/scripts/incubator.gd
@@ -1,31 +1,39 @@
extends Spatial
+const GrayMat = preload("res://gray_mat.tres")
+const IncubatorTemplate = preload("res://scripts/template_incubate.gd")
+
+var template
+
var worlds = []
var selected_pos = null
var selected = null
-func _enter_tree():
+var mat_selected = null
+var mat_unselected = null
+
+func _ready():
for x in range(4):
- var line = []
- self.worlds.append(line)
- for y in range(2):
- line.append(null)
+ 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 = IncubatorTemplate.new()
-func set_world(x, y, world):
- self.worlds[x][y] = world
- var pos = get_node("spawns/" + str(x) + "-" + str(y))
+func set_world(i, world):
+ self.worlds[i] = world
+ var pos = get_node("spawns/" + str(i))
world.set_translation(pos.global_transform.origin)
func push_world(world):
for x in range(4):
- for y in range(2):
- if self.worlds[x][y] == null:
- set_world(x, y, world)
- return true
+ if self.worlds[x] == null:
+ set_world(x, world)
+ return true
return false
-func get_world(x, y):
- return self.worlds[x][y]
+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():
@@ -33,20 +41,39 @@ func _on_body_input_event( camera, event, click_pos, click_normal, shape_idx ):
var cam = get_tree().get_root().get_camera()
cam.select(self, get_node("point"))
-func _on_panel_input_event( camera, event, click_pos, click_normal, shape_idx ):
+func _on_right_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("panel")
- get_node("animation").play("click")
+ print("export")
if self.selected_pos != null:
- var w = get_world(self.selected_pos.x, self.selected_pos.y)
+ var w = get_world(self.selected_pos.x)
if w != null:
- print(w)
+ get_node("animation").play("right")
+
+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")
+ if self.selected_pos != null:
+ var w = get_world(self.selected_pos.x)
+ if w != null:
+ get_node("animation").play("left")
+ w.evolve()
+ get_tree().get_root().get_node("Game/HUD").display_message(self.template.get_stage(w.life.stage)["text"])
+
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(node, pos, get_node(node))
- self.selected = get_node(node)
- self.selected_pos = pos
- self.selected.material_override.set_albedo(Color(0.8,0.3,0.3))
+ 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/life.gd b/scripts/life.gd
new file mode 100644
index 0000000..8b842c3
--- /dev/null
+++ b/scripts/life.gd
@@ -0,0 +1,37 @@
+extends Object
+
+const Items = preload("res://scripts/items.gd")
+var items
+
+var stage
+var materials
+var age
+
+func _init(stage, materials):
+ self.items = Items.new()
+ self.stage = stage
+ self.materials = materials
+ self.age = 0
+
+func evolve():
+ var r = randf()
+ if r > 0.95:
+ print("destroy")
+ self.stage = 0
+ # destroy life
+ elif r > 0.7:
+ print("choice")
+ # choice event
+ elif r > 0.5:
+ print("up")
+ self.stage += 1
+ # move up
+ elif r > 0.45:
+ print("down")
+ self.stage = int(max(self.stage, 0))
+ # move down
+ else:
+ print("none")
+ # none
+ print("life evolve", stage, materials)
+ self.age += 1
diff --git a/scripts/player.gd b/scripts/player.gd
index 746d2d9..59ffb06 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -36,10 +36,8 @@ func get_item_count(id):
return storage[id]
func remove_item(id, amount):
- print("remove", id, amount)
if storage.has(id) and storage[id] >= amount:
storage[id] -= amount
- print("new amount", storage[id])
_update_storage(id, storage[id])
func _update_funds():
diff --git a/scripts/template_combine.gd b/scripts/template_combine.gd
index 9791703..2195e8a 100644
--- a/scripts/template_combine.gd
+++ b/scripts/template_combine.gd
@@ -7,4 +7,7 @@ func _init().("res://assets/combinator.json"):
func template(world):
var base = self.bases[randi() % self.bases.size()]
+ var d = Dictionary(self.data)
+ d["mass"] = str(world.mass) + " sextillion tons"
+ d["volume"] = str(world.volume)
return self.replace_all(base, self.data)
diff --git a/scripts/template_incubate.gd b/scripts/template_incubate.gd
index f5c834c..867d15d 100644
--- a/scripts/template_incubate.gd
+++ b/scripts/template_incubate.gd
@@ -2,3 +2,7 @@ extends "res://scripts/template.gd"
func _init().("res://assets/incubator.json"):
pass
+
+func get_stage(stage):
+ var stages = self.data["stages"]
+ return stages[stage] \ No newline at end of file
diff --git a/scripts/world.gd b/scripts/world.gd
index e040524..19b755e 100644
--- a/scripts/world.gd
+++ b/scripts/world.gd
@@ -8,6 +8,7 @@ const GlassMat = preload("res://glass.tres")
const House = preload("res://house.tscn")
const Pine = preload("res://tree_pine.tscn")
const Oak = preload("res://tree_oak.tscn")
+const Life = preload("res://scripts/life.gd")
var materials
@@ -18,32 +19,63 @@ var gas_mass
var gas_volume
var gas_color
+var surface_color
+
+var mesh
+var surface_mesh
var material
var glass_material
+var surface_material
+
+var blocks
+var surface_blocks
+var heights
+var objects
+var ball
+var surface
-func _enter_tree():
- pass
-# var pn = Pine.instance()
-# pn.translate(Vector3(2,1,2))
-# add_child(pn)
-# var ok = Oak.instance()
-# ok.translate(Vector3(-2,1,2))
-# add_child(ok)
-# var hs = House.instance()
-# hs.translate(Vector3(0,1,2))
-# hs.rotate_y(PI/2)
-# add_child(hs)
+var level
+var life
func build():
- _make_ball(SIZE, Vector3(0,0,0))
+ self.surface_color= self.color
+ self.material = GrayMat.duplicate(true)
+ self.material.set_albedo(self.color)
+ self.glass_material = GlassMat.duplicate(true)
+ self.glass_material.set_albedo(self.gas_color)
+ self.surface_material = GrayMat.duplicate(true)
+ self.surface_material.set_albedo(self.surface_color)
+ get_node("CoverOther/Icosphere").set_material_override(self.glass_material)
+ self.mesh = Cube.duplicate(true)
+ for i in range(self.mesh.get_surface_count()):
+ self.mesh.surface_set_material(i, self.material)
+ self.surface_mesh = Cube.duplicate(true)
+ for i in range(self.surface_mesh.get_surface_count()):
+ self.surface_mesh.surface_set_material(i, self.surface_material)
+
+ self.ball = _make_ball(SIZE, Vector3(0,0,0))
+ 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)
func _make_ball(size, center):
- var blocks = []
+ self.blocks = []
+ self.heights = []
+ self.objects = []
var count = 0
for x in range(-size, size):
var line_x = []
- blocks.append(line_x)
+ var height_x = []
+ var obj_x = []
+ self.blocks.append(line_x)
+ self.heights.append(height_x)
+ self.objects.append(obj_x)
for y in range(0, -size, -1):
var line_y = []
line_x.append(line_y)
@@ -55,24 +87,57 @@ func _make_ball(size, center):
count += 1
else:
line_y.append(null)
-
-
- self.material = GrayMat.duplicate(true)
- self.material.set_albedo(self.color)
- self.glass_material = GlassMat.duplicate(true)
- self.glass_material.set_albedo(self.gas_color)
- get_node("CoverOther/Icosphere").set_material_override(self.glass_material)
+ if y == 0:
+ height_x.append(0)
+ obj_x.append(null)
+
+ var multi = _make_multi(self.blocks, count, self.mesh, self.color)
+ var instance = MultiMeshInstance.new()
+ instance.set_multimesh(multi)
+ add_child(instance)
+ return instance
- for i in range(Cube.get_surface_count()):
- Cube.surface_set_material(i, self.material)
+func _make_surface(size, center, level):
+ self.surface_blocks = []
+ if level == 0:
+ return
+ var count = 0
+ for x in range(-size, size):
+ var line_x = []
+ var height_x = self.heights[size + x]
+ self.surface_blocks.append(line_x)
+ for y in range(0, level):
+ var line_y = []
+ line_x.append(line_y)
+ for z in range(-size, size):
+ var relative = Vector3(x, y, z)
+ var len = relative.length()
+ var put = false
+ if floor(len) <= size/2 and y > 0:
+ if y == 1 or line_x[y-1][size + z] != null:
+ var r = randf()
+ if r > 0.6:
+ put = true
+ height_x[size + z] = y
+ line_y.append(relative*2 + center)
+ count += 1
+ if !put:
+ line_y.append(null)
+ var multi = _make_multi(self.surface_blocks, count, self.surface_mesh, self.surface_color)
+ var instance = MultiMeshInstance.new()
+ instance.set_multimesh(multi)
+ add_child(instance)
+ return instance
+
+func _make_multi(blcks, count, msh, clr):
var multi = MultiMesh.new()
multi.set_transform_format(MultiMesh.TRANSFORM_3D)
multi.set_color_format(MultiMesh.COLOR_FLOAT)
- multi.set_mesh(Cube)
+ multi.set_mesh(msh)
multi.set_instance_count(count)
var i = 0
- for x in range(blocks.size()):
- var line_x = blocks[x]
+ for x in range(blcks.size()):
+ var line_x = blcks[x]
if line_x == null:
continue
for y in range(line_x.size()):
@@ -85,11 +150,40 @@ func _make_ball(size, center):
var trans = Transform()
trans = trans.translated(pos)
multi.set_instance_transform(i, trans)
- multi.set_instance_color(i, self.color)
+ multi.set_instance_color(i, clr)
i += 1
- var instance = MultiMeshInstance.new()
- instance.set_multimesh(multi)
- add_child(instance)
+ return multi
+
+func add_obj(type, x, z):
+ var obj = type.instance()
+ var height = self.heights[x + SIZE][z + SIZE]
+ obj.set_translation(Vector3(x, height + 0.5, z) * 2)
+ add_child(obj)
+ self.objects[x + SIZE][z + SIZE] = obj
+
+func get_obj(x, z):
+ return self.objects[x + SIZE][z + SIZE]
+
+func clear_objects():
+ for x in range(self.objects.size()):
+ var line_x = self.objects[x]
+ for y in range(line_x.size()):
+ var obj = line_x[y]
+ if obj != null:
+ remove_child(obj)
+ line_x[y] = null
+
+func evolve():
+ self.level += 1
+ remove_child(self.surface)
+ self.surface = _make_surface(SIZE, Vector3(0,0,0), self.level)
+ self.recolor_surface(Color(randi()))
+ self.clear_objects()
+ self.life.evolve()
+
+func recolor_surface(new):
+ self.surface_color = new
+ self.surface_material.set_albedo(self.surface_color)
func _on_Area_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():