diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/base.gd | 13 | ||||
| -rw-r--r-- | scripts/builder.gd | 60 | ||||
| -rw-r--r-- | scripts/combinator.gd | 21 | ||||
| -rw-r--r-- | scripts/combinator_panel.gd | 72 | ||||
| -rw-r--r-- | scripts/howto.gd | 15 | ||||
| -rw-r--r-- | scripts/hud.gd | 51 | ||||
| -rw-r--r-- | scripts/items.gd | 53 | ||||
| -rw-r--r-- | scripts/messages.gd | 51 | ||||
| -rw-r--r-- | scripts/multiverse_shop.gd | 33 | ||||
| -rw-r--r-- | scripts/player.gd | 25 | ||||
| -rw-r--r-- | scripts/storage.gd | 66 | ||||
| -rw-r--r-- | scripts/template.gd | 30 | ||||
| -rw-r--r-- | scripts/template_combine.gd | 10 | ||||
| -rw-r--r-- | scripts/template_incubate.gd | 4 | ||||
| -rw-r--r-- | scripts/world.gd | 60 |
15 files changed, 446 insertions, 118 deletions
diff --git a/scripts/base.gd b/scripts/base.gd index 3d138d9..6b2bfd5 100644 --- a/scripts/base.gd +++ b/scripts/base.gd @@ -1,17 +1,15 @@ extends Node -var Game = preload("res://base.tscn") -var Wrld = preload("res://world.tscn") -var Incubator = preload("res://incubator.tscn") +const Wrld = preload("res://world.tscn") +const Builder = preload("res://scripts/builder.gd") var cam = null +var builder = null func _ready(): randomize() self.cam = get_node("Camera") - -func _process(delta): - pass + self.builder = Builder.new() func _input(event): if event.type == InputEvent.MOUSE_BUTTON: @@ -42,7 +40,8 @@ func _input(event): if s != null: get_node("Incubator").push_world(s) if event.scancode == KEY_N: - var w = Wrld.instance() + #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) get_node("Incubator").push_world(w) diff --git a/scripts/builder.gd b/scripts/builder.gd new file mode 100644 index 0000000..9a43437 --- /dev/null +++ b/scripts/builder.gd @@ -0,0 +1,60 @@ +extends Object + +const Wrld = preload("res://world.tscn") +const Items = preload("res://scripts/items.gd") + +var items = null + +func _init(): + self.items = Items.new() + +func build(where): + var w = Wrld.instance() + w.set_scale(Vector3(0.02, 0.02, 0.02)) + w.set_translation(where) + return w + +func can_combine(materials): + var has_solid = false + var has_gas = false + for id in materials: + var category = self.items.category(id) + if category == "solid": + has_solid = true + if category == "gas": + has_gas = true + return has_solid and has_gas + +func combine(where, materials): + var w = build(where) + var mass = 0 + var volume = 0 + 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) + + 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"] + var s = item.data["color"] + color = color.blend(Color(s)) + + if category == "gas": + gas_mass += item.data["mass"] + gas_volume += item.data["volume"] + var s = item.data["color"] + gas_color = gas_color.blend(Color(s)) + + w.materials = materials + w.mass = mass + w.volume = volume + w.color = color + w.gas_mass = gas_mass + w.gas_volume = gas_volume + w.gas_color = gas_color + w.call_deferred("build") + return w diff --git a/scripts/combinator.gd b/scripts/combinator.gd index 2bc7740..43ebe0b 100644 --- a/scripts/combinator.gd +++ b/scripts/combinator.gd @@ -1,11 +1,20 @@ extends Spatial +const Builder = preload("res://scripts/builder.gd") +const CombinatorTemplate = preload("res://scripts/template_combine.gd") + var prev_pos = null var panel = null +var world = null + +var templater = null +var builder = null func _ready(): get_node("Area/Quad").get_material_override().set_texture(SpatialMaterial.DIFFUSE_LAMBERT, get_node("Viewport").get_texture()) self.panel = get_node("Viewport/CombinatorPanel") + self.templater = CombinatorTemplate.new() + self.builder = Builder.new() set_process_input(true) func _on_Area_input_event( camera, event, click_pos, click_normal, shape_idx ): @@ -35,5 +44,17 @@ 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!" + get_tree().get_root().get_node("Game/HUD").display_message(message, 15) +
\ No newline at end of file diff --git a/scripts/combinator_panel.gd b/scripts/combinator_panel.gd index c4822e8..65ba69b 100644 --- a/scripts/combinator_panel.gd +++ b/scripts/combinator_panel.gd @@ -1,10 +1,22 @@ extends Panel -var Items = preload("res://scripts/items.gd") +const Items = preload("res://scripts/items.gd") + var items = null +var tree func _ready(): self.items = Items.new() + self.tree = get_node("tree") + self.tree.create_item() + self.tree.set_columns(2) + self.tree.set_column_title(0, "Item") + self.tree.set_column_title(1, "Amount") + self.tree.set_column_titles_visible(true) + self.tree.set_column_expand(1, false) + self.tree.set_column_min_width(1,60) + self.tree.set_hide_root(true) + self.tree.set_select_mode(Tree.SELECT_ROW) set_process_input(true) func _input(event): @@ -14,8 +26,26 @@ func _on_Tree_gui_input( ev ): #print(ev) pass -func get_items(): - pass +func get_ids(): + var ids = [] + var root = self.tree.get_root() + if root == null: + return ids + var node = root.get_children() + while node != null: + ids.append(node.get_metadata(0)["id"]) + node = node.get_next() + return ids + +func clear_all(): + var root = self.tree.get_root() + if root == null: + return + var node = root.get_children() + while node != null: + root.remove_child(node) + node = node.get_next() + self.tree.update() func _on_add_pressed(): var player = get_tree().get_root().get_node("Game/Player") @@ -24,13 +54,37 @@ func _on_add_pressed(): print(player.storage) print(storage.get_selected()) - if player.has_item(storage.get_selected()): - print("has") - player.remove_item(storage.get_selected(), 1) + var item = storage.get_selected() + if item != null and player.has_item(item["id"]): + var itm = player.get_item(item["id"]) + player.remove_item(item["id"], 1) + var root = self.tree.get_root() + var line = itm.insert_in_tree(tree, root) + line.set_text(1, "1") func _on_remove_pressed(): - pass # replace with function body - + 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() + player.add_item(item["id"], 1) func _on_storage_pressed(): - get_tree().get_root().get_node("Game/HUD").popup_storage() + get_tree().get_root().get_node("Game/HUD").popup("storage") + +func get_selected(): + var root = self.tree.get_root() + if root == null: + return null + var itm = root.get_children() + while itm != null: + if itm.is_selected(0): + return itm.get_metadata(0) + itm = itm.get_next() + return null
\ No newline at end of file diff --git a/scripts/howto.gd b/scripts/howto.gd new file mode 100644 index 0000000..1259174 --- /dev/null +++ b/scripts/howto.gd @@ -0,0 +1,15 @@ +extends Control + +var title +var text + +func _ready(): + var file = File.new() + file.open("res://assets/howto.json", File.READ) + var content = file.get_as_text() + file.close() + 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) + #get_node("panel/text").add_text(self.text)
\ No newline at end of file diff --git a/scripts/hud.gd b/scripts/hud.gd index 80c58a0..dcf4c88 100644 --- a/scripts/hud.gd +++ b/scripts/hud.gd @@ -4,32 +4,41 @@ func _ready(): pass func _on_ms_button_pressed(): - var visible = get_node("ms").is_visible() - if visible: - get_node("ms").set_visible(false) - else: - popup_shop() + _toggle("ms") func _on_storage_button_pressed(): - var visible = get_node("storage").is_visible() - if visible: - get_node("storage").set_visible(false) - else: - popup_storage() + popup("storage") + +func _on_help_button_pressed(): + popup("help") -func _popup(which): - var tabs = ["ms", "storage"] - for tab in tabs: - get_node(tab).set_visible(tab == which) +func _toggle(which): + var visible = get_node(which).is_visible() + get_node(which).set_visible(!visible) -func popup_storage(): - _popup("storage") +func popup(which): + var tabs = ["storage", "help"] + for tab in tabs: + var vis = false + if tab == which: + vis = !get_node(tab).is_visible() + get_node(tab).set_visible(vis) -func popup_shop(): - _popup("ms") - func set_funds(cash): get_node("funds/cash").set_text(str(cash)) -func update_storage(storage): - get_node("storage").update_storage(storage) +func update_storage(id, amount): + get_node("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 _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")) diff --git a/scripts/items.gd b/scripts/items.gd index a6ca8be..e2a1106 100644 --- a/scripts/items.gd +++ b/scripts/items.gd @@ -1,5 +1,9 @@ extends Object +const icon_triangle = preload("res://assets/triangle.png") +const icon_waves = preload("res://assets/waves.png") +const icon_triangles = preload("res://assets/triangles.png") + var data = null func _init(): @@ -9,9 +13,54 @@ func _init(): file.close() self.data = parse_json(content) +class Item: + extends Object + + var data + var category + var icon + + func _init(category, data, icon): + self.category = category + self.data = data + self.icon = icon + + func id(): + return data["id"] + + func insert_in_tree(tree, parent=null): + var item = tree.create_item(parent) + item.set_text(0, data["name"]) + item.set_tooltip(0, data["desc"]) + item.set_metadata(0, data) + item.set_icon_max_width(0, 20) + if self.icon != null: + item.set_icon(0, self.icon) + return item + + func insert_in_shop(tree, parent=null): + var item = self.insert_in_tree(tree, parent) + item.set_text(1, str(data["cost"])) + +func _get_icon(category): + if category == "solid": + return self.icon_triangle + elif category == "gas": + return self.icon_waves + elif category == "precursor": + pass + elif category == "life": + return self.icon_triangles + func get(id): for cat in self.data.keys(): for item in self.data[cat]: if item["id"] == id: - return item - return null
\ No newline at end of file + return Item.new(cat, item, self._get_icon(cat)) + return null + +func category(id): + for cat in self.data.keys(): + for item in self.data[cat]: + if item["id"] == id: + return cat
\ No newline at end of file diff --git a/scripts/messages.gd b/scripts/messages.gd new file mode 100644 index 0000000..236ebd1 --- /dev/null +++ b/scripts/messages.gd @@ -0,0 +1,51 @@ +extends Control + +var count = 0 +var labels = [] +var runs = [] +var lengths = [] + +func _ready(): + set_process(true) + +func _process(delta): + var to_remove = [] + for i in range(count): + var run = runs[i] + var len = lengths[i] + var label = labels[i] + var far = run + delta + if far >= (3*len/4): + label.set_modulate(Color(1,1,1,0.3)) + elif far >= len/2: + label.set_modulate(Color(1,1,1,0.5)) + if far >= len: + to_remove.append(i) + else: + runs[i] += 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): + var label = Label.new() + label.set_text(message) + add_child(label) + + if count > 0: + var offset = label.get_size().y + for i in range(count): + var lab = labels[i] + var lab_pos = lab.get_global_position() + lab_pos.y += offset + lab.set_global_position(lab_pos) + + labels.push_back(label) + runs.push_back(0) + lengths.push_back(time) + count+=1
\ No newline at end of file diff --git a/scripts/multiverse_shop.gd b/scripts/multiverse_shop.gd index 494ccd5..d4c32b0 100644 --- a/scripts/multiverse_shop.gd +++ b/scripts/multiverse_shop.gd @@ -1,16 +1,20 @@ extends Control -var Items = preload("res://scripts/items.gd") +const Items = preload("res://scripts/items.gd") func _ready(): - var map = {"1": get_node("tabs/*/items"), - "2": get_node("tabs/**/items"), - "3": get_node("tabs/***/items"), - "other": get_node("tabs/other/items")} + var map = {"solid": get_node("tabs/*/items"), + "gas": get_node("tabs/*/items"), + "precursor": get_node("tabs/**/items"), + "life": get_node("tabs/***/items")} var items = Items.new() for k in items.data.keys(): var tree = map[k] - var root = tree.create_item() + var root = null + if tree.get_root() == null: + root = tree.create_item() + else: + root = tree.get_root() tree.set_columns(2) tree.set_column_title(0, "Item") tree.set_column_title(1, "Cost") @@ -20,17 +24,10 @@ func _ready(): tree.set_hide_root(true) tree.set_select_mode(Tree.SELECT_ROW) for i in range(items.data[k].size()): - var item = items.data[k][i] - var itm = tree.create_item(root) - itm.set_text(0, item["name"]) - itm.set_text(1, str(item["cost"])) - itm.set_tooltip(0, item["desc"]) - itm.set_metadata(0, item) - itm.set_collapsed(true) - - var desc = tree.create_item(itm) - desc.set_text(0, item["desc"]) - desc.set_selectable(0, false) + var dict = items.data[k][i] + var id = dict["id"] + var item = items.get(id) + item.insert_in_shop(tree, root) func _on_buy_pressed(): var tab = get_node("tabs").get_current_tab_control() @@ -40,7 +37,7 @@ func _on_buy_pressed(): var item = itm.get_metadata(0) var player = get_tree().get_root().get_node("Game/Player") if player.cash >= item["cost"]: - player.add_item(item["id"], item, 1) + player.add_item(item["id"], 1) player.cash -= item["cost"] else: pass
\ No newline at end of file diff --git a/scripts/player.gd b/scripts/player.gd index c8c40eb..746d2d9 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -1,11 +1,15 @@ extends Node +const Items = preload("res://scripts/items.gd") +var items + var cash = 1000 setget set_cash, get_cash var storage = {} +var inventory = {} func _ready(): + self.items = Items.new() _update_funds() - _update_storage() func get_cash(): return cash @@ -14,24 +18,33 @@ func set_cash(csh): cash = csh _update_funds() -func add_item(id, item, amount): +func add_item(id, amount): if storage.has(id): storage[id] += amount else: storage[id] = amount - _update_storage() + inventory[id] = items.get(id) + _update_storage(id, storage[id]) func has_item(id, amount=1): return storage.has(id) and storage[id] >= amount +func get_item(id): + return inventory[id] + +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 - _update_storage() + print("new amount", storage[id]) + _update_storage(id, storage[id]) func _update_funds(): get_tree().get_root().get_node("Game/HUD").set_funds(cash) -func _update_storage(): - get_tree().get_root().get_node("Game/HUD").update_storage(storage) +func _update_storage(id, amount): + get_tree().get_root().get_node("Game/HUD").update_storage(id, amount)
\ No newline at end of file diff --git a/scripts/storage.gd b/scripts/storage.gd index bbac5e2..dd7d10e 100644 --- a/scripts/storage.gd +++ b/scripts/storage.gd @@ -1,13 +1,10 @@ extends Control -var Items = preload("res://scripts/items.gd") - +const Items = preload("res://scripts/items.gd") var items -var storage = {} var tree func _ready(): - self.items = Items.new() self.tree = get_node("panel/items") self.tree.create_item() self.tree.set_columns(2) @@ -15,47 +12,36 @@ func _ready(): self.tree.set_column_title(1, "Amount") self.tree.set_column_titles_visible(true) self.tree.set_column_expand(1, false) - self.tree.set_column_min_width(1,50) + self.tree.set_column_min_width(1,60) self.tree.set_hide_root(true) self.tree.set_select_mode(Tree.SELECT_ROW) + self.items = Items.new() -func _update_item(id, amount): - var child = self.tree.get_root().get_children() - while child != null: - var meta = child.get_metadata(0) - if meta == id: - if amount == 0: - self.tree.get_root().remove_child(child) - else: - child.set_text(1, str(amount)) - return - child = child.get_next() - - -func _add_item(id, amount): - var root = self.tree.get_root() - var item = self.tree.create_item(root) - item.set_text(0, self.items.get(id)["name"]) - item.set_text(1, str(amount)) - item.set_metadata(0, id) - -func update_storage(update): - for k in update.keys(): - print("key: ", k) - if self.storage.has(k): - if self.storage[k] != update[k]: - _update_item(k, update[k]) - if update[k] == 0: - self.storage.erase(k) - else: - self.storage[k] = update[k] - else: - self.storage[k] = update[k] - _add_item(k, update[k]) - - func get_selected(): var itm = self.tree.get_selected() if itm != null and itm.is_selected(0): return itm.get_metadata(0) return null + +func update_storage(id, amount): + var root = self.tree.get_root() + if root == null: + return + var node = root.get_children() + while node != null: + var meta = node.get_metadata(0) + if meta["id"] == id: + break + node = node.get_next() + + if amount == 0: + if node != null: + root.remove_child(node) + self.tree.update() + else: + if node == null: + var item = items.get(id) + node = item.insert_in_tree(tree, root) + node.set_text(1, str(amount)) + +
\ No newline at end of file diff --git a/scripts/template.gd b/scripts/template.gd new file mode 100644 index 0000000..6e1affc --- /dev/null +++ b/scripts/template.gd @@ -0,0 +1,30 @@ +extends Node + +var data = null +var regex = null + +func _init(path): + var file = File.new() + file.open(path, File.READ) + var content = file.get_as_text() + file.close() + self.data = parse_json(content) + self.regex = RegEx.new() + self.regex.compile("/(.*?)/") + +func replace_all(base, values): + var mtch = self.regex.search(base) + while mtch != null: + var key = mtch.get_string(1) + var replace = "" + if values.has(key): + var from = values[key] + if typeof(from) == TYPE_DICTIONARY: + replace = from[from.keys()[randi() % from.size()]] + elif typeof(from) == TYPE_ARRAY: + replace = from[randi() % from.size()] + else: + replace = str(from) + base = self.regex.sub(base, replace) + mtch = self.regex.search(base) + return base
\ No newline at end of file diff --git a/scripts/template_combine.gd b/scripts/template_combine.gd new file mode 100644 index 0000000..9791703 --- /dev/null +++ b/scripts/template_combine.gd @@ -0,0 +1,10 @@ +extends "res://scripts/template.gd" + +var bases = null + +func _init().("res://assets/combinator.json"): + self.bases = self.data["bases"] + +func template(world): + var base = self.bases[randi() % self.bases.size()] + return self.replace_all(base, self.data) diff --git a/scripts/template_incubate.gd b/scripts/template_incubate.gd new file mode 100644 index 0000000..f5c834c --- /dev/null +++ b/scripts/template_incubate.gd @@ -0,0 +1,4 @@ +extends "res://scripts/template.gd" + +func _init().("res://assets/incubator.json"): + pass diff --git a/scripts/world.gd b/scripts/world.gd index c871e81..e040524 100644 --- a/scripts/world.gd +++ b/scripts/world.gd @@ -1,23 +1,41 @@ extends Spatial -const SIZE = 15 +export var SIZE = 15 + +const Cube = preload("res://mesh/cube.obj") +const GrayMat = preload("res://gray_mat.tres") +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") + +var materials + +var mass +var volume +var color +var gas_mass +var gas_volume +var gas_color + +var material +var glass_material -var Cube = preload("res://mesh/cube.obj") -var House = preload("res://house.tscn") -var Pine = preload("res://tree_pine.tscn") -var Oak = preload("res://tree_oak.tscn") func _enter_tree(): - 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) + 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) + +func build(): _make_ball(SIZE, Vector3(0,0,0)) func _make_ball(size, center): @@ -37,8 +55,19 @@ 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) + + for i in range(Cube.get_surface_count()): + Cube.surface_set_material(i, self.material) var multi = MultiMesh.new() multi.set_transform_format(MultiMesh.TRANSFORM_3D) + multi.set_color_format(MultiMesh.COLOR_FLOAT) multi.set_mesh(Cube) multi.set_instance_count(count) var i = 0 @@ -56,6 +85,7 @@ 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) i += 1 var instance = MultiMeshInstance.new() instance.set_multimesh(multi) |
