diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/builder.gd | 2 | ||||
| -rw-r--r-- | scripts/combinator.gd | 39 | ||||
| -rw-r--r-- | scripts/combinator_panel.gd | 7 | ||||
| -rw-r--r-- | scripts/exporter.gd | 10 | ||||
| -rw-r--r-- | scripts/hud.gd | 39 | ||||
| -rw-r--r-- | scripts/incubator.gd | 73 | ||||
| -rw-r--r-- | scripts/life.gd | 37 | ||||
| -rw-r--r-- | scripts/player.gd | 2 | ||||
| -rw-r--r-- | scripts/template_combine.gd | 3 | ||||
| -rw-r--r-- | scripts/template_incubate.gd | 4 | ||||
| -rw-r--r-- | scripts/world.gd | 156 |
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(): |
