summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/base.gd13
-rw-r--r--scripts/builder.gd60
-rw-r--r--scripts/combinator.gd21
-rw-r--r--scripts/combinator_panel.gd72
-rw-r--r--scripts/howto.gd15
-rw-r--r--scripts/hud.gd51
-rw-r--r--scripts/items.gd53
-rw-r--r--scripts/messages.gd51
-rw-r--r--scripts/multiverse_shop.gd33
-rw-r--r--scripts/player.gd25
-rw-r--r--scripts/storage.gd66
-rw-r--r--scripts/template.gd30
-rw-r--r--scripts/template_combine.gd10
-rw-r--r--scripts/template_incubate.gd4
-rw-r--r--scripts/world.gd60
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)