diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/base.gd | 1 | ||||
| -rw-r--r-- | scripts/builder.gd | 7 | ||||
| -rw-r--r-- | scripts/combinator.gd | 2 | ||||
| -rw-r--r-- | scripts/events.gd | 23 | ||||
| -rw-r--r-- | scripts/exporter.gd | 72 | ||||
| -rw-r--r-- | scripts/howto.gd | 8 | ||||
| -rw-r--r-- | scripts/incubator.gd | 29 | ||||
| -rw-r--r-- | scripts/life.gd | 34 | ||||
| -rw-r--r-- | scripts/messages.gd | 3 | ||||
| -rw-r--r-- | scripts/player.gd | 4 | ||||
| -rw-r--r-- | scripts/popup.gd | 40 | ||||
| -rw-r--r-- | scripts/template_combine.gd | 28 | ||||
| -rw-r--r-- | scripts/template_export.gd | 8 | ||||
| -rw-r--r-- | scripts/template_incubate.gd | 20 | ||||
| -rw-r--r-- | scripts/world.gd | 10 |
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 = [] |
