From 4f57ad7cb3a480ebbc07a4b211178c54708afff1 Mon Sep 17 00:00:00 2001 From: AiTechEye <40591179+AiTechEye@users.noreply.github.com> Date: Wed, 21 Jul 2021 20:12:59 +0200 Subject: [PATCH] Add files via upload --- addons/brackets/dock.tscn | 72 ++ addons/brackets/plugin.cfg | 7 + addons/brackets/script.gd | 33 + default_env.tres | 7 + engine/MainManu/MainManu.gd | 225 +++++ engine/MainManu/MainManu.tscn | 225 +++++ engine/WAEditor/WAEditor.gd | 721 ++++++++++++++++ engine/WAEditor/WAEditor.tscn | 158 ++++ engine/WAEditor/WAEngine.gd | 554 ++++++++++++ engine/WAEditor/texture.png | Bin 0 -> 573 bytes engine/WAEditor/texture.png.import | 36 + engine/chunk/chunk.gd | 169 ++++ engine/chunk/chunk.tscn | 7 + engine/core.gd | 792 ++++++++++++++++++ engine/gui.gd | 79 ++ engine/item_to_texture/item_to_texture.gd | 10 + engine/item_to_texture/item_to_texture.tscn | 32 + engine/loader/loader.gd | 21 + engine/loader/loader.tscn | 33 + engine/mapgen.gd | 88 ++ engine/mob/mob.gd | 3 + engine/mob/mob.tscn | 6 + engine/player/player.gd | 422 ++++++++++ engine/player/player.tscn | 149 ++++ engine/ui/ui.gd | 70 ++ engine/ui/ui.tscn | 123 +++ game/game_base.gd | 23 + game/game_items.gd | 71 ++ game/item_drop/item_drop.gd | 81 ++ game/item_drop/item_drop.tscn | 32 + game/textures/cobble.png | Bin 0 -> 2095 bytes game/textures/cobble.png.import | 36 + game/textures/crosshair.png | Bin 0 -> 602 bytes game/textures/crosshair.png.import | 34 + game/textures/default.png | Bin 0 -> 395 bytes game/textures/default.png.import | 36 + game/textures/default_axe_stone.png | Bin 0 -> 5528 bytes game/textures/default_axe_stone.png.import | 36 + game/textures/default_chest_front.png | Bin 0 -> 5331 bytes game/textures/default_chest_front.png.import | 36 + game/textures/default_chest_side.png | Bin 0 -> 5209 bytes game/textures/default_chest_side.png.import | 36 + game/textures/default_chest_top.png | Bin 0 -> 5221 bytes game/textures/default_chest_top.png.import | 36 + game/textures/default_glass.png | Bin 0 -> 1948 bytes game/textures/default_glass.png.import | 36 + game/textures/default_hoe_stone.png | Bin 0 -> 5433 bytes game/textures/default_hoe_stone.png.import | 36 + game/textures/default_pick_stone.png | Bin 0 -> 5528 bytes game/textures/default_pick_stone.png.import | 36 + game/textures/default_shovel_stone.png | Bin 0 -> 5444 bytes game/textures/default_shovel_stone.png.import | 36 + game/textures/default_stick.png | Bin 0 -> 5375 bytes game/textures/default_stick.png.import | 36 + game/textures/default_wood.png | Bin 0 -> 1354 bytes game/textures/default_wood.png.import | 36 + game/textures/dirt.png | Bin 0 -> 862 bytes game/textures/dirt.png.import | 36 + game/textures/grass.png | Bin 0 -> 676 bytes game/textures/grass.png.import | 36 + game/textures/grass_dirt.png | Bin 0 -> 6323 bytes game/textures/grass_dirt.png.import | 36 + game/textures/grass_side.png | Bin 0 -> 1838 bytes game/textures/grass_side.png.import | 36 + game/textures/hotbar.png | Bin 0 -> 7078 bytes game/textures/hotbar.png.import | 36 + game/textures/hotbar_select.png | Bin 0 -> 8278 bytes game/textures/hotbar_select.png.import | 36 + game/textures/hotbar_slot.png | Bin 0 -> 7503 bytes game/textures/hotbar_slot.png.import | 36 + game/textures/slot.png | Bin 0 -> 5157 bytes game/textures/slot.png.import | 36 + game/textures/stone.png | Bin 0 -> 1655 bytes game/textures/stone.png.import | 36 + game/textures/water.png | Bin 0 -> 7002 bytes game/textures/water.png.import | 34 + game/textures/wieldhand.png | Bin 0 -> 327 bytes game/textures/wieldhand.png.import | 36 + icon.png | Bin 0 -> 5824 bytes icon.png.import | 36 + main.gd | 7 + main.tscn | 80 ++ project.godot | 121 +++ 83 files changed, 5353 insertions(+) create mode 100644 addons/brackets/dock.tscn create mode 100644 addons/brackets/plugin.cfg create mode 100644 addons/brackets/script.gd create mode 100644 default_env.tres create mode 100644 engine/MainManu/MainManu.gd create mode 100644 engine/MainManu/MainManu.tscn create mode 100644 engine/WAEditor/WAEditor.gd create mode 100644 engine/WAEditor/WAEditor.tscn create mode 100644 engine/WAEditor/WAEngine.gd create mode 100644 engine/WAEditor/texture.png create mode 100644 engine/WAEditor/texture.png.import create mode 100644 engine/chunk/chunk.gd create mode 100644 engine/chunk/chunk.tscn create mode 100644 engine/core.gd create mode 100644 engine/gui.gd create mode 100644 engine/item_to_texture/item_to_texture.gd create mode 100644 engine/item_to_texture/item_to_texture.tscn create mode 100644 engine/loader/loader.gd create mode 100644 engine/loader/loader.tscn create mode 100644 engine/mapgen.gd create mode 100644 engine/mob/mob.gd create mode 100644 engine/mob/mob.tscn create mode 100644 engine/player/player.gd create mode 100644 engine/player/player.tscn create mode 100644 engine/ui/ui.gd create mode 100644 engine/ui/ui.tscn create mode 100644 game/game_base.gd create mode 100644 game/game_items.gd create mode 100644 game/item_drop/item_drop.gd create mode 100644 game/item_drop/item_drop.tscn create mode 100644 game/textures/cobble.png create mode 100644 game/textures/cobble.png.import create mode 100644 game/textures/crosshair.png create mode 100644 game/textures/crosshair.png.import create mode 100644 game/textures/default.png create mode 100644 game/textures/default.png.import create mode 100644 game/textures/default_axe_stone.png create mode 100644 game/textures/default_axe_stone.png.import create mode 100644 game/textures/default_chest_front.png create mode 100644 game/textures/default_chest_front.png.import create mode 100644 game/textures/default_chest_side.png create mode 100644 game/textures/default_chest_side.png.import create mode 100644 game/textures/default_chest_top.png create mode 100644 game/textures/default_chest_top.png.import create mode 100644 game/textures/default_glass.png create mode 100644 game/textures/default_glass.png.import create mode 100644 game/textures/default_hoe_stone.png create mode 100644 game/textures/default_hoe_stone.png.import create mode 100644 game/textures/default_pick_stone.png create mode 100644 game/textures/default_pick_stone.png.import create mode 100644 game/textures/default_shovel_stone.png create mode 100644 game/textures/default_shovel_stone.png.import create mode 100644 game/textures/default_stick.png create mode 100644 game/textures/default_stick.png.import create mode 100644 game/textures/default_wood.png create mode 100644 game/textures/default_wood.png.import create mode 100644 game/textures/dirt.png create mode 100644 game/textures/dirt.png.import create mode 100644 game/textures/grass.png create mode 100644 game/textures/grass.png.import create mode 100644 game/textures/grass_dirt.png create mode 100644 game/textures/grass_dirt.png.import create mode 100644 game/textures/grass_side.png create mode 100644 game/textures/grass_side.png.import create mode 100644 game/textures/hotbar.png create mode 100644 game/textures/hotbar.png.import create mode 100644 game/textures/hotbar_select.png create mode 100644 game/textures/hotbar_select.png.import create mode 100644 game/textures/hotbar_slot.png create mode 100644 game/textures/hotbar_slot.png.import create mode 100644 game/textures/slot.png create mode 100644 game/textures/slot.png.import create mode 100644 game/textures/stone.png create mode 100644 game/textures/stone.png.import create mode 100644 game/textures/water.png create mode 100644 game/textures/water.png.import create mode 100644 game/textures/wieldhand.png create mode 100644 game/textures/wieldhand.png.import create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 main.gd create mode 100644 main.tscn create mode 100644 project.godot diff --git a/addons/brackets/dock.tscn b/addons/brackets/dock.tscn new file mode 100644 index 0000000..3312b3a --- /dev/null +++ b/addons/brackets/dock.tscn @@ -0,0 +1,72 @@ +[gd_scene format=2] + +[node name="Brackets" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="[" type="Button" parent="."] +margin_right = 50.0 +margin_bottom = 50.0 +text = "[" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="]" type="Button" parent="."] +margin_left = 50.0 +margin_right = 100.0 +margin_bottom = 50.0 +text = "]" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="[]" type="Button" parent="."] +margin_left = 100.0 +margin_right = 150.0 +margin_bottom = 50.0 +text = "[]" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="{" type="Button" parent="."] +margin_top = 50.0 +margin_right = 50.0 +margin_bottom = 100.0 +text = "{" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="}" type="Button" parent="."] +margin_left = 50.0 +margin_top = 50.0 +margin_right = 100.0 +margin_bottom = 100.0 +text = "}" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="{}" type="Button" parent="."] +margin_left = 100.0 +margin_top = 50.0 +margin_right = 150.0 +margin_bottom = 100.0 +text = "{}" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="$" type="Button" parent="."] +margin_left = 150.0 +margin_right = 200.0 +margin_bottom = 50.0 +text = "$" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/addons/brackets/plugin.cfg b/addons/brackets/plugin.cfg new file mode 100644 index 0000000..47dcaea --- /dev/null +++ b/addons/brackets/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Brackets" +description="Gives brackets" +author="AiTechEye" +version="1.0" +script="script.gd" diff --git a/addons/brackets/script.gd b/addons/brackets/script.gd new file mode 100644 index 0000000..443cffc --- /dev/null +++ b/addons/brackets/script.gd @@ -0,0 +1,33 @@ +tool +extends EditorPlugin +var dock + +func _enter_tree(): + dock = preload("res://addons/brackets/dock.tscn").instance() + add_control_to_dock(EditorPlugin.DOCK_SLOT_LEFT_BR,dock) + dock.get_node("[").connect("button_down",self,"b1") + dock.get_node("]").connect("button_down",self,"b2") + dock.get_node("[]").connect("button_down",self,"b3") + dock.get_node("{").connect("button_down",self,"b4") + dock.get_node("}").connect("button_down",self,"b5") + dock.get_node("{}").connect("button_down",self,"b6") + dock.get_node("$").connect("button_down",self,"b7") +func _exit_tree(): + remove_control_from_docks(dock) +func b1(): + OS.set_clipboard("[") +func b2(): + OS.set_clipboard("]") +func b3(): + OS.set_clipboard("[]") +func b4(): + OS.set_clipboard("{") +func b5(): + OS.set_clipboard("}") +func b6(): + OS.set_clipboard("{}") +func b7(): + OS.set_clipboard("$") + + + diff --git a/default_env.tres b/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/engine/MainManu/MainManu.gd b/engine/MainManu/MainManu.gd new file mode 100644 index 0000000..1c06c10 --- /dev/null +++ b/engine/MainManu/MainManu.gd @@ -0,0 +1,225 @@ +extends Control + +var new_world = false +var del_world = false +var del_mod = false +var worlds = {} +var mods = {} +var selected = {mod=0,world=0} +func _ready(): + scan() + $Camera/mesh.mesh = core.item2mesh("default:grassy") + for i in mapgen.mapgens: + $panel/new/mapagens.add_item(i) + +func _process(delta): + delta *= 0.5 + $Camera/mesh.rotation += Vector3(randf()*delta,randf()*delta,randf()*delta) + +func scan(): + worlds.clear() + $panel/worlds.clear() + var DIR = "user://worlds" + var d = Directory.new() + d.open(DIR) + d.list_dir_begin() + var dir = d.get_next() + while dir != "": + if dir.begins_with(".") == false: + var cd = str(d.get_current_dir(),"/",dir) + if dir.get_extension() == "mworld": + load_world_properties(cd) + dir = d.get_next() + d.list_dir_end() + $panel/mods.clear() + mods = WaEngine.scan("user://mods",{},true) + $panel/worlds.select(0) + worlds_selected(0) + for i in $panel/mods.get_selected_items(): + var m = $panel/mods.get_item_text(i) + mod_info(m) + for ii in $panel/worlds.get_selected_items(): + var w = $panel/worlds.get_item_text(ii) + $panel/modding/enable.pressed = true if worlds[w].get(m) == true else false + break + break + if mods.size() == 0: + $panel/modding/DelMod.disabled = true +func mod_info(m): + var i = mods.get(m) + if i == null or i.get("broken"): + $panel/modding/enable.disabled = true + return + var w = $panel/worlds.get_item_text(selected.world) + $panel/modding/actor_info.text = i.actor + $panel/modding/version_info.text = str(i.mod_version) + $panel/modding/build_info.text = str(i.game_version) + $panel/modding/Description_text.text = i.description + $panel/modding/enable.pressed = true if worlds.get(w) != null and worlds[w].get(m) == true else false + $panel/modding/enable.disabled = false +func update_mod_list(w): + $panel/mods.clear() + var n = 0 + for i in mods: + if mods[i] == null or mods[i].get("broken"): + $panel/mods.add_item(str(i," (broken)")) + $panel/mods.set_item_custom_bg_color(n,Color(1,0,0,0.2)) + else: + $panel/mods.add_item(mods[i].name) + if w != "" and worlds[w].get(mods[i].name) == true: + $panel/mods.set_item_custom_bg_color(n,Color(0,1,0,0.2)) + n += 1 + +func load_world_properties(path): + var file = File.new() + file.open(path,file.READ) + var s = file.get_var() + file.close() + var name = path.get_file().replace(str(".",path.get_extension()),"") + worlds[name] = s.mods + $panel/worlds.add_item(name) + +func new_pressed(): + if new_world: + if $panel/new/name.text.is_valid_filename(): + core.world_name = $panel/new/name.text + core.world.mapgen = mapgen.mapgens[$panel/new/mapagens.selected] + core.save_data() + cancel() + scan() + else: + core.option_flash($panel/new/name,"Invalid name") + else: + $panel/new.text = "Create" + $panel/new/name.visible = true + $panel/play.text = "Cancel" + $panel/play.text = "Cancel" + $panel/new/mapagens.visible = true + var file = File.new() + var i = 1 + while file.file_exists(str("user://worlds/world",i,".mworld")): + i += 1 + $panel/new/name.text = str("world",i) + $panel/new/name.select_all() + new_world = true +func cancel(): + $panel/new.text = "New world" + $panel/new/name.visible = false + $panel/new/name.text = "" + $panel/play.text = "Play" + $panel/del.text = "Delete" + $panel/new.visible = true + $panel/modding/DelMod.text = "Delete mod" + $panel/modding/DelMod.rect_size = Vector2(1,1) + $panel/modding/OpenDir.text = "Game folder" + $panel/new/mapagens.visible = false + del_mod = false + new_world = false + del_world = false + +func play(): + if new_world or del_world: + cancel() + return + var name + for i in $panel/worlds.get_selected_items(): + name = $panel/worlds.get_item_text(i) + break + if name != null: + core.world_name = name + var file = File.new() + if not file.file_exists(str("user://worlds/",name,".mworld")): + core.world_name = "" + core.option_flash($panel/play,"The world doesn't exists anymore") + scan() + else: + core.world_main() + queue_free() +func delworld(): + var name + for i in $panel/worlds.get_selected_items(): + name = $panel/worlds.get_item_text(i) + break + if del_world: + $panel/del.text = "Delete" + core.delete_data(name) + cancel() + scan() + elif $panel/del.text != "": + $panel/del.text = str("Delete ",name," ?") + $panel/play.text = "Cancel" + $panel/new.visible = false + del_world = true + +func _input(event): + if Input.is_action_just_pressed("ui_cancel"): + get_tree().quit() +func _notification(what): + if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: + get_tree().quit() + +func OpenGF(): + if del_mod: + cancel() + return + OS.shell_open(ProjectSettings.globalize_path("user://")) + +func enable_mod(): + var w + var m + var mi + for i in $panel/worlds.get_selected_items(): + w = $panel/worlds.get_item_text(i) + break + for i in $panel/mods.get_selected_items(): + m = $panel/mods.get_item_text(i) + mi = i + break + if w != null and m != null: + worlds[w][m] = $panel/modding/enable.pressed + update_mod_list(w) + $panel/mods.select(mi) + + var file = File.new() + if file.file_exists(str("user://worlds/",w,".mworld")): + file.open(str("user://worlds/",w,".mworld"),file.READ) + var s = file.get_var() + file.close() + file.open(str("user://worlds/",w,".mworld"),file.WRITE_READ) + s.mods = worlds[w] + file.store_var(s) + file.close() + +func mods_selected(index): + var w + var m + for i in $panel/worlds.get_selected_items(): + w = $panel/worlds.get_item_text(i) + break + for i in $panel/mods.get_selected_items(): + m = $panel/mods.get_item_text(i) + break + if w != null and m != null: + $panel/modding/enable.pressed = true if worlds[w].get(m) == true else false + selected.mod = index + mod_info(m) + +func worlds_selected(index): + update_mod_list($panel/worlds.get_item_text(index)) + selected.world = index + if $panel/mods.get_item_count() > 0: + $panel/mods.select(selected.mod) + mod_info($panel/mods.get_item_text(selected.mod)) + +func DelMod(): + if del_mod: + selected.mod = 0 + cancel() + var d = Directory.new() + var p = mods[$panel/mods.get_item_text(selected.mod).replace(" (broken)","")].path + d.remove(p) + scan() + else: + del_mod = true + $panel/modding/OpenDir.text = "Cancel" + $panel/modding/DelMod.text = str("Delete ",$panel/mods.get_item_text(selected.mod)," ?") diff --git a/engine/MainManu/MainManu.tscn b/engine/MainManu/MainManu.tscn new file mode 100644 index 0000000..128d20e --- /dev/null +++ b/engine/MainManu/MainManu.tscn @@ -0,0 +1,225 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://engine/MainManu/MainManu.gd" type="Script" id=1] + +[node name="MainManu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="Camera" type="Camera" parent="."] +current = true + +[node name="mesh" type="MeshInstance" parent="Camera"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.47059 ) + +[node name="panel" type="ColorRect" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -237.0 +margin_top = -144.0 +margin_right = 237.0 +margin_bottom = 144.0 +color = Color( 0.145098, 0.145098, 0.145098, 0.145098 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="play" type="Button" parent="panel"] +margin_left = 205.0 +margin_top = 4.0 +margin_right = 286.0 +margin_bottom = 24.0 +text = "Play" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="del" type="Button" parent="panel"] +margin_left = 205.0 +margin_top = 26.0 +margin_right = 286.0 +margin_bottom = 46.0 +text = "Delete" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="new" type="Button" parent="panel"] +margin_left = 286.0 +margin_top = 4.0 +margin_right = 367.0 +margin_bottom = 24.0 +text = "New world" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="name" type="LineEdit" parent="panel/new"] +visible = false +margin_left = 83.0 +margin_top = -2.0 +margin_right = 188.0 +margin_bottom = 22.0 +hint_tooltip = "World name" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="mapagens" type="OptionButton" parent="panel/new"] +visible = false +margin_left = 83.0 +margin_top = 22.0 +margin_right = 188.0 +margin_bottom = 42.0 +text = "mapgen" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="worlds" type="ItemList" parent="panel"] +margin_right = 200.0 +margin_bottom = 130.0 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="mods" type="ItemList" parent="panel"] +margin_top = 130.0 +margin_right = 200.0 +margin_bottom = 288.0 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="modding" type="Control" parent="panel"] +margin_left = 200.0 +margin_top = 130.0 +margin_right = 424.0 +margin_bottom = 449.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="OpenDir" type="Button" parent="panel/modding"] +margin_left = 180.854 +margin_right = 271.854 +margin_bottom = 20.0 +text = "Game folder" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DelMod" type="Button" parent="panel/modding"] +margin_left = 180.854 +margin_top = 24.0 +margin_right = 271.854 +margin_bottom = 44.0 +text = "Delete mod" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="enable" type="CheckBox" parent="panel/modding"] +margin_left = 5.0 +margin_right = 83.0 +margin_bottom = 24.0 +text = "Enabled" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="actor_info" type="Label" parent="panel/modding"] +margin_left = 112.0 +margin_top = 24.0 +margin_right = 274.0 +margin_bottom = 38.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="actor" type="Label" parent="panel/modding"] +margin_left = 5.0 +margin_top = 24.0 +margin_right = 112.0 +margin_bottom = 38.0 +text = "Actor: " +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="version" type="Label" parent="panel/modding"] +margin_left = 5.0 +margin_top = 38.0 +margin_right = 112.0 +margin_bottom = 52.0 +text = "Version:" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="version_info" type="Label" parent="panel/modding"] +margin_left = 112.0 +margin_top = 38.0 +margin_right = 274.0 +margin_bottom = 52.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Build in version" type="Label" parent="panel/modding"] +margin_left = 5.0 +margin_top = 52.0 +margin_right = 112.0 +margin_bottom = 66.0 +text = "Build in version:" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="build_info" type="Label" parent="panel/modding"] +margin_left = 112.0 +margin_top = 52.0 +margin_right = 274.0 +margin_bottom = 66.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Description" type="Label" parent="panel/modding"] +margin_left = 5.0 +margin_top = 66.0 +margin_right = 112.0 +margin_bottom = 80.0 +text = "Description:" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Description_text" type="TextEdit" parent="panel/modding"] +margin_left = 5.0 +margin_top = 80.0 +margin_right = 274.0 +margin_bottom = 158.0 +readonly = true +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="panel/play" to="." method="play"] +[connection signal="pressed" from="panel/del" to="." method="delworld"] +[connection signal="pressed" from="panel/new" to="." method="new_pressed"] +[connection signal="item_selected" from="panel/worlds" to="." method="worlds_selected"] +[connection signal="item_selected" from="panel/mods" to="." method="mods_selected"] +[connection signal="pressed" from="panel/modding/OpenDir" to="." method="OpenGF"] +[connection signal="pressed" from="panel/modding/DelMod" to="." method="DelMod"] +[connection signal="pressed" from="panel/modding/enable" to="." method="enable_mod"] diff --git a/engine/WAEditor/WAEditor.gd b/engine/WAEditor/WAEditor.gd new file mode 100644 index 0000000..2f4b8bd --- /dev/null +++ b/engine/WAEditor/WAEditor.gd @@ -0,0 +1,721 @@ +extends Control +var paswc = WaEngine.paswc +var password +var mod_file = "" +var enabled = false setget enable +var nodes = {} +var lines = [] +var select = {object=null,output=null,value=null,del=false} +var del = [Color(0,0,0),Color(0.1,0.1,0.1)] + +var datatype_texture = { + "texture":load("res://engine/WAEditor/texture.png"), +} +var datatype_color = { + number=Color(0,0,1), + string=Color(1,1,0), + variant=Color(1,0,0.51), + "bool":Color(1,0,0), + "array":Color(0.7,0,1), + "tree":Color(0,1,1), + "vector3":Color(0,1,0.5), + "vector2":Color(0,0.5,1), + "object":Color(1,0.3,0), + "texture":Color(1,1,1), +} +var nodereg = { + "invalid":{ + label="Invalid", + color = Color(0.5,0.5,0.5), + op=[{type="label",text="",w=100,h=100}], + }, + "timer":{ + label="Timer", + color=Color(1,0.4,0.9), + op=[{type="number",w=100,tooltip="Value"},{type="checkbox",on_toggle=["timeout","interval"]}], + input={"Start":"variant","Stop":"variant","Set":"number"}, + output={Timeout="variant"}, + }, + "var":{ + label="Var", + color=Color(1,0,0.51), + input={In="variant",Set="variant"}, + output={Value="variant"}, + }, + string={ + label="String", + color=Color(0,0.3,0.9), + op=[{type="text",w=100,tooltip="Value"},{type="text",w=100,tooltip="Replace"}], + input={In="variant","Set (1)":"string","Set (2)":"string","Number to string (1)":"number",Replace="string","Add front":"string","Add back":"string"}, + output={Value="string"}, + }, + "number":{ + label="Number", + color=Color(0,0.3,0.9), + op=[{type="number",w=100,tooltip="Value"},{type="checkbox",on_toggle=["Int","Float"]}], + input={In="variant",Set="number","String to number":"string","+":"number","-":"number","*":"number","/":"number"}, + output={Value="number"}, + }, + world={ + init=true, + label="World", + color=Color(1,0,0), + output={Enter="variant",Quit="variant","Wolrd name":"string"}, + }, + gate={ + label="Gate", + color=Color(0.5,0,0.1), + op=[{type="checkbox",pressed=false,on_toggle=["Open","Closed"]}], + input={In="variant",Open="variant",Close="variant",Toggle="variant"}, + output={Opened="variant",Closed="variant"}, + }, + "counter":{ + label="Counter", + color=Color(1,0.5,0.5), + op=[{type="number",w=100,tooltip="Value1"},{type="number",w=100,tooltip="Value2"}], + input={In="variant",Reset="variant","Add (variant: 1, number: value)":"variant","Set (1)":"number","Set (2)":"number"}, + output={Value="number","<":"variant","<=":"variant","=":"variant",">":"variant",">=":"variant","~":"variant"}, + }, + texture={ + label="Texture", + color=Color(1,1,1), + op=[{type="text",w=100}], + input={"In":"variant","Set":"string"}, + output={"Value":"texture"} + }, + itemstack={ + label="Itemstack", + color=Color(0,0,1.1), + op=[{name="item_name",type="text",w=100},{name="count",type="number",w=100,step=1,min_value=1,default=1}], + input={"In":"variant","Item name":"string","Count":"number"}, + output={Stack="variant"}, + }, + player={ + label="Get player", + color=Color(0,1,0), + output={Player="object"}, + input={"In":"variant"}, + }, + vector={ + label="Vector", + color=Color(0,0.5,0.2), + op=[{type="text",w=100,tooltip="Vector3 = 0,2,1\nVector2 = 234.67,78",default="0,0,0"},], + input={"In":"variant"}, + output={"Vector2":"vector2","Vector3":"vector3"}, + }, + add_to_inventory={ + label="Add to inventory", + color=Color(0,1,0.1), + op=[{name="listname",type="text",w=100,default="main",tooltip="List name (eg main, craft, output)"},{name="label",type="label",w=100,h=100,text="Object\nVector3 (node)"}], + input={"Stack input":"variant","Listname":"string","Set object":"object","Set position":"vector3"}, + output={Leftover="variant"}, + }, + change_world={ + label="Change world", + color=Color(0,0,0), + size = 300, + op=[ + {name="name",type="text",w=200,tooltip="World name"},{type="label",text="name",w=100}, + {name="mapgen",type="manu",w=200,manu=mapgen.mapgens},{type="label",text="Mapgen",w=100}, + ], + input={"Change":"variant"}, + }, + delay={ + label="Delay", + color=Color(1,0.3,0), + op=[{type="number",w=100,default=0.1,min_value=0.001}], + input={"In:":"variant"}, + output={"Out":"variant"}, + }, + default_chest_inventory={ + label="Show Default chest inventory", + color=Color(0.1,0,1), + input={"In:":"vector3"}, + }, + distribute={ + output_labels = true, + label="Distribute", + color=Color(1,0,0.51), + input={"Input":"variant"}, + output={ + "Variant":"variant", + "String":"string", + "Number":"number", + "Bool":"bool", + "Array":"array", + "Tree":"tree", + "Vector3":"vector3", + "Vector2":"vector2", + "Object":"object", + "Mob":"variant", + "Player":"variant", + "Texture":"variant", + "Itemstack":"variant", + }, + }, + set_node={ + label="Set node", + color=Color(1,0,0), + input={"set":"vector3","node":"string"}, + op=[{name="node",type="text",w=100,default="air",tooltip="node name, eg default:grassy"}], + }, + register_item={ + init=true, + size = 250, + label="Register item", + color=Color(1,0,0), + output={"on_use":"variant"}, + op=[ + {name="name",type="text",w=100,default="piackaxe"},{type="label",text="name",w=150}, + {name="inv_image",type="text",w=100,default="res://game/textures/default_axe_stone.png",text="item texture (URL)"},{type="label",w=150}, + {name="max_count",type="number",w=100,step=1,allow_lesser=false,default=100,min_value=1,tooltip="Will be 1 if tool"},{type="label",text="max count",w=150}, + {name="item_groups",type="text",w=100,default="",tooltip="group1=n, group2=n...\nUsed to determined item in groups\n eg Useful with craft recipes"},{type="label",text="groups",w=150}, + {type="label",text="item capabilities",w=150},{type="checkbox",w=100,pressed=true,on_toggle=["Tool","Item"],tooltip="Enable/disable item capabilities (The properties below)",name="capabilities"}, + {name="punch_interval",type="number",w=100,default=1,allow_lesser=false,allow_greater=false,max_value=60},{type="label",text="punch interval",w=150}, + {name="damage",type="number",w=100,default=1,allow_lesser=false},{type="label",text="damage",w=150}, + {name="durability",type="number",w=100,allow_lesser=false,default=100},{type="label",text="durability",w=150}, + {name="groups",type="text",w=100,default="cracky=1",tooltip="group1=n, group2=n...\nUsed to determine nodes that is breakable with this tool"},{type="label",text="groups",w=150}, + ], + }, + register_node={ + init=true, + size = 250, + label="Register node", + color=Color(1,0,0), + output={"on_register":"variant","pos":"vector3","on_touch":"object","on_untouch":"object","on_activate":"object"}, + op=[ + {name="name",type="text",w=100,tooltip="eg stone"},{type="label",text="name",w=150}, + {name="max_count",type="number",w=100,step=1,allow_lesser=false,default=100,min_value=1},{type="label",text="max count",w=150}, + {name="groups",type="text",w=100,default="cracky=1",tooltip="group1=n, group2=n...\nUsed to determined item in groups\n eg Useful with craft recipes"},{type="label",text="groups",w=150}, + {name="drawtype",type="manu",w=100,manu=["default","none","liquid"]},{type="label",text="Drawtype",w=150}, + {name="replaceable",type="checkbox",pressed=false,tooltip="Replaceable (Replace while you placing a node on it)"}, + {name="collidable",type="checkbox",pressed=true,tooltip="Collidable (Has collision)"}, + {name="transparent",type="checkbox",pressed=false,tooltip="Transparent"}, + {name="solid_surface",type="checkbox",pressed=false,tooltip="Solid surface (Visible from inside from blocks, usefull for transparent nodes)"}, + {name="touchable",type="checkbox",pressed=false,tooltip="Touchable (enables touch signals), activated after the node is rendered"}, + {name="activatable",type="checkbox",w=150,pressed=false,tooltip="activatable (activated instead of showing the players inventory)"}, + {name="drops",type="text",w=100,tooltip="You can ignore this field for a default drop\nmod:name=1 sets a drop (Required)\nchance=10 chance to drop (Optional)\n+=false if added, this drop will not be overwrited by other drops (Optional)\n ; for new drops\n\ndefault:grassy=1, chance=10, +=false; default:cobble=4..."},{type="label",text="drops",w=150}, + {name="tile1",type="text",w=100,default="res://game/textures/stone.png"},{type="label",text="tile 1 (URL/textures)",w=150}, + {name="tile2",type="text",w=100},{type="label",text="tile 2",w=150}, + {name="tile3",type="text",w=100},{type="label",text="tile 3",w=150}, + {name="tile4",type="text",w=100},{type="label",text="tile 4",w=150}, + {name="tile5",type="text",w=100},{type="label",text="tile 5",w=150}, + {name="tile6",type="text",w=100},{type="label",text="tile 6",w=150}, + ], + }, +} + +func enable(v:bool): + enabled = v + visible = v +func _ready(): + core.WaEditor = self + var n = 0 + for i in nodereg: + $manu/nodes.add_item(i) + var c = nodereg[i].color + c.a = 0.1 + $manu/nodes.set_item_custom_bg_color(n,c) + n += 1 + $manu/nodes.remove_item(0) +func new_node(name,def={id=0,options={},connections={}}): + var id = def.id + while nodes.get(id) != null: + id += 1 + + var y = 0 + var next_y = 0 + var x = 0 + var w = 25 + var h = 25 + var h2 = 25 + + var b = ColorRect.new() + var frame = ReferenceRect.new() + var label = Label.new() +#system + var a = nodereg.get(name) + if a == null: + a = nodereg["invalid"] + a.op[0].text = name + name = "Invalid" + def.connections = {} + + var s = 100 if a.get("size") == null else a.size + var n = { + node=b, + input={}, + output={}, + name=name, + id=id, + options=def.options, + connections=def.connections + } + +#set basics + b.rect_position = Vector2() if def.get("pos") == null else def.pos + b.rect_size = Vector2(s,s) + b.color = Color(0.3,0.3,0.3,0.7) + + frame.rect_size = Vector2(s,s) + frame.border_color = Color(1,0,0) if a.get("color") == null else a.color + frame.border_width = 2 + frame.editor_only = false + b.add_child(frame) + label.text = a.label + label.align = Label.ALIGN_CENTER + label.valign = Label.VALIGN_CENTER + label.rect_size.y = 20 + label.rect_position = Vector2((b.rect_size.x/2)-(label.rect_size.x/2),-20) + b.add_child(label) +#conntections + if a.get("input"): + for i in a.input: + var p + var c = datatype_color[a.input[i]] + var t = datatype_texture.get(a.input[i]) + if t == null: + p = ColorRect.new() + p.color = datatype_color[a.input[i]] + else: + p = TextureRect.new() + p.texture = t + p.hint_tooltip = i + p.rect_size = Vector2(10,10) + p.rect_position = Vector2(-10,y) + y+= 15 + b.add_child(p) + n.input[i] = {node=p,color=c,name=i,type=a.input[i]} + if y > h2: + h2 = y + y = 0 + if a.get("output"): + for i in a.output: + var p + var c = datatype_color[a.output[i]] + var t = datatype_texture.get(a.output[i]) + if t == null: + p = ColorRect.new() + p.color = c + else: + p = TextureRect.new() + p.texture = t + p.hint_tooltip = i + p.rect_size = Vector2(10,10) + p.rect_position = Vector2(s,y) + y+= 15 + b.add_child(p) + n.output[i] = {node=p,color=c,name=i,type=a.output[i]} + + if a.get("output_labels"): + var l = Label.new() + l.text = i + l.rect_size = Vector2(s,5) + l.rect_position = Vector2(-l.rect_size.x,0) + l.align = Label.ALIGN_CENTER + l.valign = Label.VALIGN_CENTER + p.add_child(l) + if y > h2: + h2 = y + y = 0 +#options + if a.get("op"): + var opn = {} + for i in a.op: + opn[i.type] = 1 if opn.get(i.type) == null else opn[i.type] +1 + var p + var opname = str(i.type,opn[i.type]) if i.get("name") == null else i.name + var W = w if i.get("w") == null else i.w + var H = h if i.get("h") == null else i.h + var v = def.options.get(opname) if def.options.get(opname) != null else i.get("default") + var sv + var connect_type + var connect_input + if i.type == "text": + p = LineEdit.new() + p.rect_size = Vector2(W,h) + p.rect_position = Vector2(x,y) + p.text = "" if v == null else v + sv = p.text + connect_type = "text_changed" + connect_input = "text" + elif i.type == "number": + p = SpinBox.new() + p.rect_size = Vector2(W,H) + p.rect_position = Vector2(x,y) + p.allow_greater = true if i.get("allow_greater") == null else i.allow_greater + p.allow_lesser = true if i.get("allow_lesser") == null else i.allow_lesser + p.min_value = 0 if i.get("min_value") == null else i.min_value + p.max_value = 100 if i.get("max_value") == null else i.max_value + p.align = LineEdit.ALIGN_CENTER + p.step = 0.001 if i.get("step") == null else i.step + p.value = 0 if v == null else v + sv = p.value + connect_type = "value_changed" + connect_input = "value" + elif i.type == "checkbox": + p = CheckBox.new() + p.rect_size = Vector2(W,H) + p.rect_position = Vector2(x,y) + p.pressed = v if v != null else i.get("pressed") == true + p.text = "" if i.get("on_toggle") == null else i.on_toggle[0 if p.pressed == true else 1] + sv = p.pressed + connect_type = "toggled" + connect_input = "pressed" + elif i.type == "button": + p = Button.new() + p.rect_size = Vector2(W,H) + p.rect_position = Vector2(x,y) + p.text = "OK" if i.get("text") == null else i.text + elif i.type == "label": + p = Label.new() + p.text = i.text + p.rect_size = Vector2(W,H) + p.rect_position = Vector2(x,y) + p.align = Label.ALIGN_CENTER + p.valign = Label.VALIGN_CENTER + elif i.type == "manu": + p = OptionButton.new() + for o in i.manu: + p.add_item(o) + p.rect_size = Vector2(W,H) + p.rect_position = Vector2(x,y) + p.selected = 0 if v == null else v + sv = p.selected + connect_type = "item_selected" + connect_input = "selected" + + if i.get("tooltip") != null: + p.hint_tooltip = i.tooltip + p.name = opname if i.get("name") == null else i.name + frame.add_child(p) + n.options[p.name] = {node=p,type=i.type,value=sv,method=connect_input} + if i.type == "button": + p.connect("pressed",self,"button_pressed",[i.ref,i.get("value")],name,i) + elif connect_type != null: + p.connect(connect_type,self,"option_value_changed",[{option=n.options[p.name],method=connect_input,opreg=i}]) + x += W + if H != h and H > next_y: + next_y = H + + if x >= s: + x = 0 + y += h if next_y == 0 else next_y + next_y = 0 + if y > h2: + h2 = y + b.rect_size = Vector2(s,h2) + frame.rect_size = Vector2(s,h2) + +#add + add_child(b) + nodes[id] = n + return n + +func run_mod(): + WaEngine.reload_mod(save_data(true),self) + +func button_pressed(ref,v,opreg): + if ref != null: + ref.call_func(v,opreg) + +func option_value_changed(a=null,b=null): + var op = a if b == null else b + op.option.value = op.option.node.get(op.method) + if op.option.type == "checkbox": + if op.opreg.get("on_toggle") != null: + op.option.node.text = op.opreg.on_toggle[0 if op.option.value else 1] + +func _input(event): + if core.game == null: + return + elif Input.is_action_just_pressed("actioneditor"): + if core.player.object.gui == null and enabled == false: + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + core.player.object.gui = {} + enable(true) + else: + var pos = get_viewport().get_mouse_position() + for i in nodes: + var ob = nodes[i] + var s = ob.node.rect_size + var p = ob.node.rect_position + if pos.x >= p.x-10 and pos.x <= p.x+s.x+10 and pos.y >= p.y-10 and pos.y <= p.y+s.y+10: + return + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + core.player.object.gui = null + enable(false) + return + elif enabled == false: + return + elif Input.is_key_pressed(KEY_CONTROL) and Input.is_key_pressed(KEY_S): + save_data() + elif event is InputEventMouseButton: + var pos = event.position + var relessed = Input.is_action_just_released("LMB") + var pressed = Input.is_action_just_pressed("LMB") + + if pressed: + for l in lines: + var a = (l.pos2-l.pos1).normalized().dot((event.position-l.pos2).normalized()) + var b = (l.pos1-l.pos2).normalized().dot((event.position-l.pos1).normalized()) + if floor(a*10000)*0.0001 == -1 and floor(b*10000)*0.0001 == -1: + nodes[l.id1].connections[l.output].erase(str(l.input,l.id2)) + update_lines() + break + + if (relessed or pressed) and select.object == null: + for i in nodes: + var ob = nodes[i] + var s = ob.node.rect_size + var p = ob.node.rect_position + + if pos.x >= p.x-10 and pos.x <= p.x+s.x+10 and pos.y >= p.y-10 and pos.y <= p.y+s.y+10: + if pressed and pos.x >= p.x and pos.x <= p.x+s.x and pos.y >= p.y and pos.y <= p.y+s.y: + select.object = ob + select.pos = ob.node.rect_position-pos + return + elif pressed: + for put in ob.output: + var o = ob.output[put] + var os = o.node.rect_size + var op = o.node.rect_global_position + if pos.x >= op.x and pos.x <= op.x+os.x and pos.y >= op.y and pos.y <= op.y+os.y: + select.output = {ob=ob,output=o,name=o.name,pos=op+os/2,type=o.type} + return + elif relessed and select.output != null:#not same node + for put in ob.input: + var o = ob.input[put] + var os = o.node.rect_size + var op = o.node.rect_global_position + if pos.x >= op.x and pos.x <= op.x+os.x and pos.y >= op.y and pos.y <= op.y+os.y: + if o.type == "variant" or o.type == select.output.type: + var sob = select.output.ob + sob.connections[select.output.name] = {} if sob.connections.get(select.output.name) == null else sob.connections[select.output.name] + sob.connections[select.output.name][str(o.name,ob.id)] = {id=ob.id,name=o.name} + select.output = null + update_lines() + return + if lines.size() > 0 and lines[0].node.name == "tmp": + lines[0].node.free() + lines.remove(0) + select.output = null + elif Input.is_action_just_released("LMB"): + if select.del: + $manu/del.color = del[0] + select.del = false + del_node(select.object) + select.object = null + elif event is InputEventMouseMotion: +#remove select.object + if select.object != null: + var pos = event.position + select.object.node.rect_position = event.position+select.pos + update_lines() + if pos.y >= 550 and pos.x <= 50: + if select.del == false: + select.del = true + $manu/del.color = del[1] + elif select.del: + select.del = false + $manu/del.color = del[0] + elif select.output != null: +#tmp line + if lines.size() > 0 and lines[0].node.name == "tmp": + lines[0].node.points=[select.output.pos,event.position] + else: + var l = Line2D.new() + l.default_color = datatype_color[select.output.type] + l.points=[select.output.pos,event.position] + l.width = 2 + l.z_index = 1000 + l.name = "tmp" + add_child(l) + lines.push_front({node=l}) + elif Input.is_action_pressed("LMB"): +#remove line + for l in lines: + var a = (l.pos2-l.pos1).normalized().dot((event.position-l.pos2).normalized()) + var b = (l.pos1-l.pos2).normalized().dot((event.position-l.pos1).normalized()) + if floor(a*10000)*0.0001 == -1 and floor(b*10000)*0.0001 == -1: + nodes[l.id1].connections[l.output].erase(str(l.input,l.id2)) + update_lines() + break + +func update_lines(): + var new_lines = [] + for id1 in nodes: + var ob1 = nodes[id1] + for output in ob1.connections: + var list = ob1.connections[output] + var op1 = ob1.output.get(output) + if op1 == null: + continue + var p1 = op1.node.rect_global_position + var s1 = op1.node.rect_size/2 + for ci in list: + var c = list[ci] + var ob2 = nodes.get(c.id) + if ob2 == null: + continue + var inp = nodes[c.id].input.get(c.name) + if inp == null: + ob1.connections[output].erase(str(c.name,c.id)) + continue + var c2 = inp.node + var p2 = c2.rect_global_position + var s2 = c2.rect_size/2 + var l = Line2D.new() + + l.default_color = datatype_color[ob1.output[output].type] + l.points=[p1+s1,p2+s2] + l.width = 2 + l.z_index = 1000 + add_child(l) + new_lines.push_back({node=l,output=output,input=c.name,id1=id1,id2=ob2.id,pos1=p1+s1,pos2=p2+s2}) + for l in lines: + l.node.free() + lines = new_lines + +func del_node(ob1): + var id = ob1.id + for ob2 in nodes: + for k in nodes[ob2].connections: + var output = nodes[ob2].connections[k] + for c in output: + if output[c].id == id: + output.erase(c) + ob1.node.free() + nodes.erase(id) + update_lines() + +func load_data(): + var file_mmode = str("user://mods/",$manu/name.text,".mmode") + var file_mmodt = str("user://mods/",$manu/name.text,".mmodt") + var file = File.new() + if file.file_exists(file_mmode): + file_mmodt = null + elif file.file_exists(file_mmodt): + file_mmode = null + + else: + core.option_flash($manu/name,"File doesn't exists",Color(1,1,0),true) + return + var s + if file_mmode != null: + file.open_encrypted_with_pass(file_mmode,File.READ,paswc) + s = file.get_var() + else: + file.open(file_mmodt,File.READ) + s = str2var(file.get_as_text()) + if s is String: + file.close() + core.option_flash($manu/name,"File is broken",Color(1,1,0),true) + return + file.close() + + if s != null and s.password != "" and s.password != $manu/password.text: + core.option_flash($manu/password/passerr,"Wrong password",Color(1,0,0)) + return + elif s == null: + core.option_flash($manu/password/passerr,"Broken file",Color(1,0,0)) + return + + password = null if s == null else s.get("password") + mod_file = file_mmode if file_mmodt == null else file_mmodt + $manu/password.text = password if password != null else "" + for id in nodes: + nodes[id].node.free() + nodes.clear() + + for id in s.data: + var ob = s.data[id] + new_node(ob.name,ob) + + update_lines() + core.option_flash($manu/name,"Loaded",Color(0,1,0),true) +func save_data(test:bool=false): + + if $manu/name.text == "": + core.option_flash($manu/name,"Name it!",Color(1,1,0),true) + return + + var s = {} + for id in nodes: + var ob = nodes[id] + var options = {} + for o in ob.options: + var op = ob.options[o] + options[op.node.name] = op.value + s[ob.id] = { + pos = ob.node.rect_position, + name=ob.name, + id=ob.id, + connections = ob.connections, + options = options, + } + var save = { + actor=$manu/more/morei/actor.text, + description=$manu/more/morei/description.text, + name=$manu/name.text, + game_version = core.version, + mod_version = $manu/more/morei/version.value, + password=password, + data=s, + } + if test: + return save + + var D = Directory.new() + var file_mmode = str("user://mods/",$manu/name.text,".mmode") + var file_mmodt = str("user://mods/",$manu/name.text,".mmodt") + if D.dir_exists("user://mods") == false: + D.make_dir("user://mods") + + if D.file_exists(file_mmode) and file_mmode != mod_file: + var passw_file = File.new() + passw_file.open_encrypted_with_pass(file_mmode,File.READ,paswc) + var ls = passw_file.get_var() + passw_file.close() + if ls != null and ls.password != "" and ls.password != password: + core.option_flash($manu/password/passerr,"Load before overwrite",Color(1,0,0)) + return + save.password = $manu/password.text + + var file = File.new() + if save.password != "": + if mod_file != null and mod_file.get_extension() == "mmodt": + var rnf = Directory.new() + rnf.rename(mod_file,renpath(mod_file,"mmode")) + + file.open_encrypted_with_pass(file_mmode,File.WRITE,paswc) + file.store_var(save) + mod_file = file_mmode + else: + if mod_file != null and mod_file.get_extension() == "mmode": + var rnf = Directory.new() + rnf.rename(mod_file,renpath(mod_file,"mmodt")) + + file.open(file_mmodt,file.WRITE_READ) + file.store_string(var2str(save)) + mod_file = file_mmodt + file.close() + core.option_flash($manu/name,"Saved",Color(0,1,0),true) + +func renpath(p,n): + var filex = p.get_file() + var fname = filex.substr(0,filex.find(".")) + return p.replace(filex,str(fname,".",n)) + + +func _on_nodes_manu_selected(i): + var name = $manu/nodes.get_item_text(i) + var ob = new_node(name) + ob.node.rect_position = get_viewport().get_mouse_position()-(ob.node.rect_size/2) + select.object = ob + select.pos = -ob.node.rect_size/2 + + + +func more(): + $manu/more/morei.visible = $manu/more/morei.visible == false diff --git a/engine/WAEditor/WAEditor.tscn b/engine/WAEditor/WAEditor.tscn new file mode 100644 index 0000000..74deb40 --- /dev/null +++ b/engine/WAEditor/WAEditor.tscn @@ -0,0 +1,158 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://engine/WAEditor/WAEditor.gd" type="Script" id=1] + +[node name="Editor" type="ColorRect"] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0, 0, 0, 0.0784314 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="manu" type="Panel" parent="."] +margin_right = 100.0 +margin_bottom = 600.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="name" type="LineEdit" parent="manu"] +margin_right = 100.0 +margin_bottom = 24.0 +custom_colors/font_color = Color( 1, 1, 1, 1 ) +text = "Unamed" +align = 1 +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "Mod name" +} + +[node name="nodes" type="ItemList" parent="manu"] +margin_top = 88.0 +margin_right = 100.0 +margin_bottom = 550.0 +allow_reselect = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="save" type="Button" parent="manu"] +margin_top = 48.0 +margin_right = 50.0 +margin_bottom = 68.0 +text = "Save" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="run" type="Button" parent="manu"] +margin_top = 68.0 +margin_right = 50.0 +margin_bottom = 88.0 +text = "Run" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="more" type="Button" parent="manu"] +margin_left = 50.0 +margin_top = 68.0 +margin_right = 100.0 +margin_bottom = 88.0 +text = "More" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="morei" type="ColorRect" parent="manu/more"] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = 25.0 +margin_top = -10.0 +margin_right = 225.0 +margin_bottom = 118.0 +color = Color( 0.3, 0.3, 0.3, 0.7 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="description" type="TextEdit" parent="manu/more/morei"] +margin_top = 24.0 +margin_right = 200.0 +margin_bottom = 128.0 +hint_tooltip = "Description" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="actor" type="LineEdit" parent="manu/more/morei"] +margin_right = 124.0 +margin_bottom = 24.0 +hint_tooltip = "Actor" +align = 1 + +[node name="version" type="SpinBox" parent="manu/more/morei"] +margin_left = 124.3 +margin_right = 198.3 +margin_bottom = 24.0 +hint_tooltip = "Version" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="password" type="LineEdit" parent="manu"] +margin_top = 24.0 +margin_right = 100.0 +margin_bottom = 48.0 +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "Add a password if you want to prevent people to open and or edit your mod" +} + +[node name="passerr" type="ColorRect" parent="manu/password"] +visible = false +margin_right = 100.0 +margin_bottom = 24.0 +color = Color( 1, 0, 0, 0.396078 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="manu/password/passerr"] +margin_right = 100.0 +margin_bottom = 24.0 +custom_colors/font_color = Color( 1, 0, 0, 1 ) +text = "Password" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="load" type="Button" parent="manu"] +margin_left = 50.0 +margin_top = 48.0 +margin_right = 100.0 +margin_bottom = 68.0 +text = "Load" + +[node name="del" type="ColorRect" parent="manu"] +margin_top = 550.0 +margin_right = 50.0 +margin_bottom = 600.0 +color = Color( 0, 0, 0, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="item_selected" from="manu/nodes" to="." method="_on_nodes_manu_selected"] +[connection signal="pressed" from="manu/save" to="." method="save_data"] +[connection signal="pressed" from="manu/run" to="." method="run_mod"] +[connection signal="pressed" from="manu/more" to="." method="more"] +[connection signal="pressed" from="manu/load" to="." method="load_data"] diff --git a/engine/WAEditor/WAEngine.gd b/engine/WAEditor/WAEngine.gd new file mode 100644 index 0000000..c7d22c7 --- /dev/null +++ b/engine/WAEditor/WAEngine.gd @@ -0,0 +1,554 @@ +extends Control +var paswc = "9n#3d!fnDSFP¤&(=)90&¤/TVba+v89H)(¤Hpo0F?)" +var nodes = {} +var tmpnodes = {} +var nodereg +var timer = 0 +var events = 0 +var stackoverflow = 400 +var editor +func _ready(): + var e = load("res://engine/WAEditor/WAEditor.gd").new() + nodereg = e.nodereg + +func _process(delta): + timer += delta + if timer > 0.01: + timer = 0 + events = 0 + +func scan(DIR="user://mods",getlist={},get=false): + var d = Directory.new() + d.open(DIR) + d.list_dir_begin() + var dir = d.get_next() + while dir != "": + if dir.begins_with(".") == false: + var cd = str(d.get_current_dir(),"/",dir) + var ex = dir.get_extension() + if d.current_is_dir(): + getlist = scan(cd,getlist,get) + elif ex == "mmode" or ex == "mmodt": + getlist = load_mod(cd,getlist,get) + dir = d.get_next() + d.list_dir_end() + return getlist + +func reload_mod(s,edit=null): + editor = edit + var l = s.name.length() + for id in nodes: + if id.substr(0,l) == s.name: + nodes.erase(id) + if tmpnodes.get(s.name): + for node in tmpnodes[s.name]: + if is_instance_valid(node): + node.free() + tmpnodes[s.name] = null + + for id in s.data: + var d = s.data[id] + if nodereg.get(d.name) == null: + core.Error(str("ERROR: invalid node: ",d.name)) + return + d.mod_name = s.name + d.mod_idname = str(s.name,":",id) + nodes[d.mod_idname] = d + + for idname in nodes: + var ob = nodes[idname] + var def = nodereg.get(ob.name) + if def.get("init") != null and idname.substr(0,l) == s.name: + node_actions(ob,"init",null) + +func load_mod(path,getlist,get=false): + var file = File.new() + var ex = path.get_extension() + var s + if ex == "mmodt": + file.open(path,File.READ) + s = str2var(file.get_as_text()) + file.close() + if s is String: + core.Error(str("ERROR: modfile not valid: ",path)) + return + elif ex == "mmode": + file.open_encrypted_with_pass(path,File.READ,paswc) + s = file.get_var() + file.close() + if s != null: + if get: + s.path = path + getlist[s.name] = s + return getlist + elif core.save.mods.get(s.name) != true: + return + for id in s.data: + var d = s.data[id] + if nodereg.get(d.name) == null: + core.Error(str('A fatal error occorpted:\nMod "',s.name,'" is outdated (invalid node: "',d.name,'")\nCurrent game version: ',core.version,"\nBuild in version: ",s.game_version)) + return + d.mod_name = s.name + d.mod_idname = str(s.name,":",id) + nodes[d.mod_idname] = d + elif getlist != null: + var fn = path.get_file() + getlist[fn.replace(str(".",fn.get_extension()),"")] = {path=path,broken=true} + return getlist +func init(): + for idname in nodes: + var ob = nodes[idname] + var def = nodereg.get(ob.name) + if def.get("init") != null: + node_actions(ob,"init",null) + +func connection_flash(n): + var u = ColorRect.new() + u.rect_size = Vector2(10,10) + u.rect_position = n.rect_global_position + u.color = Color(1,1,1) + core.add_child(u) + yield(get_tree().create_timer(0.1),"timeout") + u.free() + +func next_connection(ob1,output:String,value=null): + events += 1 + if events > stackoverflow: + return + + if is_by_editor(ob1): + var edob = editor.nodes[ob1.id] + var edop = edob.options + for op1name in ob1.options: + var op1value = ob1.options[op1name] + if op1value != null: + var op2 = edop[op1name] + op2.node.set(op2.method,op1value) + #op2.node[op2.method] = op1value + var out = edob.output.get(output) + if out != null: + connection_flash(out.node) + + var c = ob1.connections.get(output) + if c != null: + var outputs = c + for ob2_input_key in outputs: + var ob2_input = outputs[ob2_input_key] + var ob2 = nodes[str(ob1.mod_name,":",ob2_input.id)] + node_actions(ob2,ob2_input.name,value) + +func tempnodes(ob,node): + tmpnodes[ob.mod_name] = [] if tmpnodes.get(ob.mod_name) == null else tmpnodes[ob.mod_name] + tmpnodes[ob.mod_name].push_back(node) + +func text_to_groups(a): + a = a.replace(" ","") + var g = {} + for i in a.split(",",false): + var l = i.find("=") + if l == -1: + return str("invalid input: ",i) + var name = i.substr(0,l) + var n = i.substr(l+1,-1) + var I = n.is_valid_integer() + if name.is_valid_identifier() == false: + return str("invalid name: ",name) + elif I == false and n.is_valid_float() == false: + return str("invalid value: ",n) + var intn = int(n) + g[name] = intn if I else float(n) + return g +func text_to_drop(a): + a = a.replace(" ","") + var g = {} + for d in a.split(";",false): + + var count = 1 + var additional = true + var item = "" + var chance = 10 + + for i in d.split(",",false): + var l = i.find("=") + if l == -1: + return str("invalid input: ",i) + var name = i.substr(0,l) + var n = i.substr(l+1,-1) + var I = n.is_valid_integer() + #var p = false + #if I == false: + # return str("invalid value: ",n) + + if name == "+" and not (n == "false" or n == "true"): + return str("invalid + value: ",n) + elif name == "+" and n == "false": + additional = false + + elif (name == "chance" and I == false): + return str("invalid chance value: ",n) + elif name == "chance": + chance = int(n) + + elif name.find(":") > 0: + var ndef = name.split(":") + if ndef.size() != 2 or not (ndef[0].is_valid_identifier() and ndef[1].is_valid_identifier()): + return str("invalid item name: ",name) + elif I == false: + return str("invalid item count: ",name) + else: + count = int(n) + item = name + else: + return str("invalid option: ",name) + if item == "": + return str("invalid drop: no item") + g[item] = {chance=chance,count=count,additional=additional} + return g +func is_valid_itemstack(s): + if s is Dictionary: + if s.get("name") is String: + return core.get_item_reg(s.name) != null + return false + +func is_by_editor(ob): + return editor != null and editor.get_node("manu/name").text == ob.mod_name +func editor_error(ob,opname,message): + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options[opname].node,message) + +func get_opmanu_value(nodedef,name,i): + for op in nodereg[nodedef].op: + if op.get("name") == name: + return op.manu[i] + +# ================================================================== +# functions ======================================================== +# ================================================================== + +func node_actions(ob,input:String="",value=null): + + if is_by_editor(ob): + var inp = editor.nodes[ob.id].input.get(input) + if inp != null: + connection_flash(inp.node) + + var name = ob.name + match name: + "print": + print(value) + "world": + if input == "init": + next_connection(ob,"Enter") + next_connection(ob,"Wolrd name",core.world.name) + else: + next_connection(ob,"Quit") + "string": + match input: + "Set (1)": + ob.options.text1 = value + "Set (2)": + ob.options.text2 = value + "Number to string (1)": + ob.options.text2 = str(value) + "Replace": + next_connection(ob,"Value",value.replace(ob.options.text1,ob.options.text2)) + "Add front": + ob.options.text1 = str(value,ob.options.text1) + "Add back": + ob.options.text1 = str(ob.options.text1,value) + next_connection(ob,"Value",ob.options.text1) + "gate": + match input: + "In": + if ob.options.checkbox1: + next_connection(ob,"Opened",value) + else: + next_connection(ob,"Closed",value) + "Open": + ob.options.checkbox1 = true + "Close": + ob.options.checkbox1 = false + "Toggle": + ob.options.checkbox1 = ob.options.checkbox1 == false + "number": + if input == "In": + next_connection(ob,"Value",ob.options.number1) + return + elif ob.options.checkbox1: + value = int(value) + elif ob.options.checkbox1 == false: + value = float(value) + ob.options.number1 = 0 if ob.options.number1 == null else ob.options.number1 + match input: + #"In": + "Set": + ob.options.number1 = value + "String to number": + ob.options.number1 = value + "+": + ob.options.number1 += value + "-": + ob.options.number1 -= value + "*": + ob.options.number1 *= value + "/": + ob.options.number1 /= value + next_connection(ob,"Value",ob.options.number1) + "timer": + match input: + "Start": + var t + ob.options.number1 = 0 if ob.options.number1 == null else ob.options.number1 + if ob.get("timer") == null: + t = Timer.new() + ob.timer = t + tempnodes(ob,t) + core.add_child(t) + else: + t = ob.timer + t.disconnect("timeout",self,"node_actions") + t.one_shot = false if ob.options.checkbox1 != true else true + t.connect("timeout",self,"node_actions",[ob,"Timeout",value]) + t.wait_time = ob.options.number1 + ob.timer.start() + "Stop": + if ob.get("timer") != null: + ob.timer.stop() + "Set": + ob.options.number1 = value + ob.timer.wait_time = value + "Timeout": + next_connection(ob,"Timeout",value) + "delay": + yield(get_tree().create_timer(ob.options.number1),"timeout") + next_connection(ob,"Out",value) + "set_node": + if input == "node": + ob.options.text1 = input + else: + var r = core.get_node_reg(ob.options.node) + if r == null: + editor_error(ob,"text1",str("invalid node")) + else: + core.set_node({name=ob.options.node,pos=value}) + "vector": + ob.options.text1 = ob.options.text1.replace(" ","") + var s = ob.options.text1.split(",",false) + var msg + var n = s.size() + if n < 2 or n > 3: + msg = "2 or 3 numbers allowed" + else: + for i in s: + if i.is_valid_integer() == false and i.is_valid_float() == false: + msg = "Invalid vector\n(only numbers allowed)" + if msg != null and is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["text1"].node,msg) + return + if n == 2: + value = str2var(str("Vector2(",s[0],",",s[1],")")) + else: + value = str2var(str("Vector3(",s[0],",",s[1],",",s[2],")")) + next_connection(ob,str("Vector",n),value) + +# "get_player_by_name": +# if input == "Player name": +# ob.options.playername = value +# else: +# var p = core.players.get(ob.options.playername) +# if p != null: +# next_connection(ob,"Player",core.player.object) + "player": + next_connection(ob,"Player",core.player.object) + "add_to_inventory": + match input: + "Stack input": + if is_valid_itemstack(value) and ob.options.get("object_var") != null: + var stack2 + if ob.options.object_var is Vector3: + stack2 = core.add_to_inventory(ob.options.object_var,ob.options.listname,value) + elif is_instance_valid(ob.options.object_var): + # wrong ob.options.listname will crash + var o = ob.options.object_var + if o.get("player"): + o = o.player + elif o.get("mob"): + o = o.mob + elif o.get("object"): + o = o.object + else: + return + stack2 = core.add_to_inventory(o,ob.options.listname,value) + if ob.options.object_var.get("player"): + ob.options.object_var.update_player() + if stack2.count > 0: + next_connection(ob,"Leftover",stack2) + "listname": + ob.options.listname = value + "Set object": + if value is KinematicBody and (value.get("player") != null or value.get("mob") != null): + ob.options.object_var = value + elif is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["label"].node,"Not valid") + return + "Set position": + ob.options.object_var = value + "itemstack": + match input: + "In": + if ob.options.item_name != null and core.get_item_reg(ob.options.item_name) != null: + next_connection(ob,"Stack",core.itemstack(ob.options.item_name,{count=ob.options.count})) + "Item name": + if core.get_item_reg(value) == null: + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["item_name"].node,"Invalid item") + return + ob.options.item_name = value + "Count": + ob.options.count = value + "distribute": + var v = typeof(value) + if v == TYPE_INT or v == TYPE_REAL: + next_connection(ob,"Number",value) + elif v == TYPE_STRING: + next_connection(ob,"String",value) + elif v == TYPE_BOOL: + next_connection(ob,"Bool",value) + elif v == TYPE_ARRAY: + next_connection(ob,"Array",value) + elif v == TYPE_DICTIONARY: + next_connection(ob,"Tree",value) + elif v == TYPE_VECTOR3: + next_connection(ob,"Vector3",value) + elif v == TYPE_VECTOR2: + next_connection(ob,"Vector2",value) + elif is_instance_valid(value) and value.get("player") != null: + next_connection(ob,"Player",value) + elif is_instance_valid(value) and value.get("mob") != null: + next_connection(ob,"Mob",value) + elif value is StreamTexture: + next_connection(ob,"Texture",value) + elif is_instance_valid(value): + next_connection(ob,"Object",value) + else: + next_connection(ob,"Variant",value) + "counter": + if ob.options.number1 == null: + ob.options.number1 = 1 + match input: + "In": + next_connection(ob,"Value",ob.options.number1) + "Reset": + ob.options.number1 = 0 + "Add (variant: 1, number: value)": + ob.options.number1 += 1 if typeof(value) != TYPE_REAL and typeof(value) != TYPE_INT else value + "Set (1)": + ob.options.number1 = value + "Set (2)": + ob.options.number2 = value + var a = 0 if ob.options.number1 == null else ob.options.number1 + var b = 0 if ob.options.number2 == null else ob.options.number2 + if a < b: + next_connection(ob,"<",value) + elif a <= b: + next_connection(ob,"<=",value) + if a > b: + next_connection(ob,">",value) + elif a >= b: + next_connection(ob,">=",value) + if a == b: + next_connection(ob,"==",value) + elif a != b: + next_connection(ob,"~",value) + "texture": + if input == "In": + var l = load(ob.options.text1) + if l is StreamTexture: + next_connection(ob,"Value", l) + else: + ob.options.text1 = value if value != null else "" + + "default_chest_inventory": + if core.existsMeta(value) == false: + core.create_node_inventory(value,"main") + GUI.show(core.player,"background[8;8.5]inventory[player:player1;main;0;4.5;8;4]inventory[node:"+var2str(value)+";main;0;0;8;4]") + "change_world": + if ob.options.name != "": + core.world.name = ob.options.name + core.world.mapgen = get_opmanu_value("change_world","mapgen",ob.options.mapgen) + core.world_main(true) + "register_item": + var o = ob.options + var inv_image = load(ob.options.inv_image) + var groups = text_to_groups(ob.options.groups) + var item_groups = text_to_groups(ob.options.item_groups) + if o.name.is_valid_filename() == false: + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["name"].node,"Invalid name") + return + elif not inv_image is StreamTexture: + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["inv_image"].node,"Texture not found") + return + elif groups is String: + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["groups"].node,groups) + return + elif item_groups is String: + if is_by_editor(ob): + core.option_flash(editor.nodes[ob.id].options["item_groups"].node,item_groups) + return + var reg_item_name = str(ob.mod_name,":",o.name) + core.register.items[reg_item_name] = { + name = reg_item_name, + type = "item", + inv_image = inv_image, + max_count = o.max_count, + groups = o.item_groups, + } + if o.capabilities: + core.register.items[reg_item_name].item_capabilities = { + punch_interval = o.punch_interval, + damage = o.damage, + durability = o.durability, + groups = groups, + } + "register_node": + var groups = text_to_groups(ob.options.groups) + var drops = text_to_drop(ob.options.drops) + var tiles = [] + if ob.options.name.is_valid_identifier() == false: + editor_error(ob,"name","invalid name") + elif groups is String: + editor_error(ob,"groups",groups) + return + elif ob.options.drops != "" and drops is String: + editor_error(ob,"drops",drops) + return + if ob.options.drops == "": + drops = null + + for i in range(1,6): + var t = ob.options[str("tile",i)] + if t != "": + var l = load(t) + if l is StreamTexture: + tiles.push_back(l) + else: + editor_error(ob,str("tile",i),str("not found")) + return + core.register_node({ + name = str(ob.mod_name,":",ob.options.name), + drop = drops, + drawtype = get_opmanu_value("register_node","drawtype",ob.options.drawtype), + groups=groups, + max_count = ob.options.max_count, + replaceable = ob.options.replaceable, + collidable = ob.options.collidable, + transparent = ob.options.transparent, + solid_surface = ob.options.solid_surface, + touchable = ob.options.touchable, + activatable = ob.options.activatable, + tiles = tiles, + }) + next_connection(ob,"on_register") diff --git a/engine/WAEditor/texture.png b/engine/WAEditor/texture.png new file mode 100644 index 0000000000000000000000000000000000000000..097aaa4b9e4a15e37cb0242ae36f3c4113786788 GIT binary patch literal 573 zcmV-D0>b@?P)EX>4Tx04R}tkv&MmKpe$iQ>9ue4ptCx$WWcEh>AE$6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`@MF8Chq90=tGxbDzAp_6xbq^n3@1i`*``n+SN6DKE@QK8;OgAjzb>itw zOXs{#9A+g+AwDM_HRyuGk6f2se&bwpSm2pqBa@mV4ik&THkR9%l?;`5ia4UE8s!UF zmle)ioYiubHSft^7|LtQX|B^8LL7@oAPEsNs@Omo7NWFjq?kz2e$2x^==hW5lF79J zMvi$@ph9x|;D7MDTeC1Z;U+5!g*8J core.settings.unload_chunk_distance: + unload_chunk(id,chunk_pos) + +func to_chunk_pos(pos): + var c = core.chunk_size + var s = core.chunk_size/2 + return ((pos+Vector3(s,s,s))/c).floor()*c + +func chunk_loaded_at_pos(pos): + var c = core.chunk_size + var s = core.chunk_size/2 + var c_pos = ((pos+Vector3(s,s,s))/c).floor() + return core.chunks.get(c_pos) != null + +func get_chunk_at_pos(pos): + var c = core.chunk_size + var s = core.chunk_size/2 + var c_pos = ((pos+Vector3(s,s,s))/c).floor() + return core.chunks.get(c_pos) + +func pos_to_chunkid(pos): + var c = core.chunk_size + var s = core.chunk_size/2 + return ((pos+Vector3(s,s,s))/c).floor() + +func get_chunk(id): + return core.chunks.get(id) + +func _process(delta): + timer += delta + if timer > 0.0: + timer = 0 + + for i in progress2del: + chunks_in_progress.erase(i) + progress2del.clear() + var max_nodes = core.settings.max_update_nodes + for di in chunks_in_progress: + var data = chunks_in_progress.get(di) + var chunk_mesh = get_chunk(data.chunkid) + if chunk_mesh == null: + data = chunks_in_progress.erase(di) + continue + for x in range(data.range_x.a,data.range_x.b): + for y in range(data.range_y.a,data.range_y.b): + for z in range(data.range_z.a,data.range_z.b): + var lpos = Vector3(x,y,z) + var id = core.map.get(lpos+data.chunk_pos) + var n = core.register.id.get(id)# if id != null else "default" + if n == null: + core.map.erase(data.chunk_pos) + core.save.map.erase(data.chunk_pos) + unload_chunk(pos_to_chunkid(data.chunk_pos),data.chunk_pos) + update(data.chunk_pos) + return + core.node_set(id,lpos+data.chunk_pos) + max_nodes -= 1 + if max_nodes < 0: + data.range_x.a = x + data.range_y.a = y + data.range_z.a = z + return + + var reg = core.register.nodes.get(n) + var tile = "" if reg.tiles.size() < 1 else reg.tiles[0] + if reg.drawtype != "none": + for f in core.default_node.faces.size(): + var neighbour_id = core.map.get(lpos+core.default_node.dir[f]+data.chunk_pos) + var neighbour_name = core.register.id.get(neighbour_id) if neighbour_id != null else "default" + var neighbour_reg = core.register.nodes.get(neighbour_name) + + if neighbour_reg == null: + core.map.erase(lpos+core.default_node.dir[f]+data.chunk_pos) + core.save.map.erase(lpos+core.default_node.dir[f]+data.chunk_pos) + continue + elif neighbour_id != id and neighbour_reg.get("solid_surface") == false: + data.st.begin(Mesh.PRIMITIVE_TRIANGLE_FAN) + var mat = SpatialMaterial.new() + var transparent = reg.get("transparent") == true + if f < reg.tiles.size(): + tile = reg.tiles[f] + mat.albedo_texture = tile + mat.flags_transparent = transparent + data.st.set_material(mat) + #data.st.add_color(Color(0,1,1)) + var cmf = [] + for v in range(0,4): + data.st.add_uv(core.default_node.uv[v]) + data.st.add_vertex(core.default_node.faces[f][v]+lpos) + cmf.push_back(core.default_node.faces[f][v]+lpos) + + data.st.commit(data.mesh) + if reg.get("collidable") != false: + data.cst.begin(Mesh.PRIMITIVE_TRIANGLES) + data.cst.add_triangle_fan(cmf) + data.cst.commit(data.collision_mesh) + data.st.clear() + data.cst.clear() + chunk_mesh.mesh = data.mesh + chunk_mesh.get_node_or_null("body/collision").shape = data.collision_mesh.create_trimesh_shape() + chunks_in_progress.erase(di) + progress2del[di] = di + +func update(pos): + if get_chunk_at_pos(pos) == null: + new_chunk(pos) + core.current_mapgen.call_func(to_chunk_pos(pos)) + return + + var chunkid = pos_to_chunkid(pos) + var data = { + vertex = {}, + mesh = Mesh.new(), + collision_mesh = Mesh.new(), + chunkid = chunkid, + chunk_pos = get_chunk(chunkid).transform.origin, + st = SurfaceTool.new(), + cst = SurfaceTool.new(), + range_x = {a=-core.chunk_size/2,b=core.chunk_size/2}, + range_y = {a=-core.chunk_size/2,b=core.chunk_size/2}, + range_z = {a=-core.chunk_size/2,b=core.chunk_size/2}, + } + chunks_in_progress[chunkid] = data diff --git a/engine/chunk/chunk.tscn b/engine/chunk/chunk.tscn new file mode 100644 index 0000000..5a06a58 --- /dev/null +++ b/engine/chunk/chunk.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://engine/chunk/chunk.gd" type="Script" id=1] + +[node name="chunks" type="Spatial"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.5, -0.5 ) +script = ExtResource( 1 ) diff --git a/engine/core.gd b/engine/core.gd new file mode 100644 index 0000000..1254db0 --- /dev/null +++ b/engine/core.gd @@ -0,0 +1,792 @@ +extends Node + +#woody +#cracky +#elastic +#crumbly +var error = false +var version = 0.1 +var save = {player={}, objects={}, mods={},map={}} +var save_timer = 0 +var chunk #noderef functions +var main #noderef functions +var WaEditor #noderef functions +var ui #noderef functions +var Loader #noderef functions +var chunks = {} +var chunk_size=8#16 +var player +var objects = {} +var viewport_items = {} +var game_paused = true +var world_name = "" + +var world = {name="earth",mapgen="super_flatland",meta={}} +var game +var map = {} +var meta = {} +var settings = { + update_chunk_rules=[Vector3(-1,0,0),Vector3(1,0,0),Vector3(0,0,-1),Vector3(0,0,1),Vector3(0,-1,0),Vector3(0,1,0)], + ganerate_chunk_range = 4, + max_update_nodes = 512, + save_timeout = 5, + unload_chunk_distance = 100, + item_drop_timeout = 300, + } + +var default_node_id = 7 +var current_mapgen # funcref +var register = { + items = { + max_count = 1, + "wieldhand":{name="wieldhand", + type = "item", + max_count = 1, + inv_image=load("res://game/textures/wieldhand.png"), + item_capabilities = { + punch_interval = 1, + damage = 1, + groups = {crumbly=1}, + }, + }, + "default:stone_pick":{name="default:stone_pick", + max_count = 1, + type = "item", + inv_image=load("res://game/textures/default_pick_stone.png"), + item_capabilities = { + punch_interval = 1, + damage = 1, + durability = 100, + groups = {cracky=1}, + }, + }, + "default:stone_hoe":{name="default:stone_hoe", + max_count = 1, + type = "item", + inv_image=load("res://game/textures/default_hoe_stone.png"), + item_capabilities = { + punch_interval = 1, + damage = 1, + durability = 100, + groups = {crumbly=1}, + } + }, + "default:stone_shovel":{name="default:stone_shovel", + max_count = 1, + type = "item", + inv_image=load("res://game/textures/default_shovel_stone.png"), + item_capabilities = { + punch_interval = 1, + damage = 1, + durability = 100, + groups = {crumbly=2}, + } + }, + "default:axe_stone":{name="default:axe_stone", + max_count = 1, + type = "item", + inv_image=load("res://game/textures/default_axe_stone.png"), + item_capabilities = { + punch_interval = 1, + damage = 1, + durability = 100, + groups = {woody=1}, + } + }, + "default:stick":{name="default:stick", + max_count = 100, + type = "item", + inv_image=load("res://game/textures/default_stick.png"), + groups = {"stick":1}, + }, + }, + nodes = { + none={id=0,name="none",drawtype="none",tiles=[],type="node",groups={},max_count=100,}, + air={id=1,name="air",drawtype="none",tiles=[],collidable=false,solid_surface=false,type="node",groups={},max_count=100,}, + default={id=2,name="default",drawtype="default",tiles=[load("res://game/textures/default.png")],type="node",groups={cracky=1},max_count=100,}, + }, + id = {0:"none",1:"air",2:"default"} +} +var default_node = { + texture = load("res://game/textures/default.png"), + uv = [Vector2(0,0),Vector2(0,1),Vector2(1,1),Vector2(1,0)], + dir = [Vector3(0,1,0),Vector3(0,-1,0),Vector3(1,0,0),Vector3(-1,0,0),Vector3(0,0,-1),Vector3(0,0,1)], + faces = [ + [Vector3(1,0,0),Vector3(1,0,1),Vector3(0,0,1),Vector3(0,0,0)], #up y+ + [Vector3(0,-1,0),Vector3(0,-1,1),Vector3(1,-1,1),Vector3(1,-1,0)], #down y- + [Vector3(1,0,0),Vector3(1,-1,0),Vector3(1,-1,1),Vector3(1,0,1)], #north x+ + [Vector3(0,0,1),Vector3(0,-1,1),Vector3(0,-1,0),Vector3(0,0,0)], #south x- + [Vector3(0,0,0),Vector3(0,-1,0),Vector3(1,-1,0),Vector3(1,0,0)], #east z+ + [Vector3(1,0,1),Vector3(1,-1,1),Vector3(0,-1,1),Vector3(0,0,1)], #west z- + ] +} + +func _init(): + set_process(false) + +func register_node(def): + var id = register.id.size() + if def.get("tiles") != null: + for i in range(0,def.tiles.size()): + var t = def.tiles[i] + if t is String: + var l = load(t) + if l is StreamTexture: + def.tiles[i] = l + + def.id = id + def.type = "node" + def.drop = def.get("drops") + def.drawtype = "normal" if def.get("drawtype") == null else def.drawtype + def.groups = {} if def.get("groups") == null else def.groups + def.max_count = 100 if def.get("max_count") == null else def.max_count + def.replaceable = false if def.get("replaceable") == null else def.replaceable + def.collidable = true if def.get("collidable") == null else def.collidable + def.transparent = false if def.get("transparent") == null else def.transparent + def.solid_surface = false if def.get("solid_surface") == null else def.solid_surface + def.touchable = false if def.get("touchable") == null else def.touchable + def.activatable = false if def.get("activatable") == null else def.activatable + def.tiles = [] if def.get("tiles") == null else def.tiles + #on_activate func ref + + + register.id[id] = def.name + register.nodes[def.name] = def + +func world_main(change=false): + Loader.start(100,{0:"World",1:"Saves",2:"Mods",3:"Preparing the map"}) + if change: + save_data() + world_quit(false,false) + world.meta = {} + game = Spatial.new() + main.add_child(core.game) + var w = load("res://engine/chunk/chunk.tscn").instance() + game.add_child(w) + Loader.setprogress(1) + load_data() + load_player() + Loader.setprogress(2) + WaEngine.scan() + if core.error: + Loader.end() + return + WaEngine.init() + Loader.setprogress(3) + current_mapgen = funcref(mapgen,world.mapgen) + set_process(true) + mapgen.set_process(true) + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + ui.visible = true + game_paused = false + get_tree().paused = false + yield(get_tree().create_timer(1),"timeout") + var l = chunk.chunks_in_progress.size() + var s = l + Loader.start(l,{0:"loading map"}) + while l > 0: + l = chunk.chunks_in_progress.size() + Loader.setprogress(s-l) + yield(get_tree().create_timer(0),"timeout") + +func world_quit(quit=false,to_mainmanu=true): + core.save_data() + if quit: + get_tree().quit() + return + ui.visible = false + WaEditor.visible = false + set_process(false) + mapgen.set_process(false) + chunk.queue_free() + game.queue_free() + game = null + player.object.queue_free() + player = null + map.clear() + meta.clear() + chunks.clear() + objects.clear() + WaEngine.nodes.clear() + chunk.chunks_in_progress.clear() + if to_mainmanu: + var manu = load("res://engine/MainManu/MainManu.tscn").instance() + main.add_child(manu) + +func game_pause(): + game_paused = game_paused == false + get_tree().paused = game_paused + if game_paused: + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + ui.get_node("manu").visible = true + else: + Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) + ui.get_node("manu").visible = false +func add_object(ob,type="",url=null): + var id = 0 + while objects.get(id) != null: + id += 1 + objects[id] = { + name = str(id), + id = id, + type = type, + inventory = {main=new_inventory(1)}, + object = ob, + meta = {}, + url = url, + } + return objects[id] + +func load_objects(): + for i in save.objects: + var s = save.objects[i] + objects[s.id] = {} + var o = objects[s.id] + o.id = s.id + o.name = s.name + o.type = s.type + o.inventory = s.inventory + o.url = s.url + o.meta = s.meta + o.object = load(o.url).instance() + o.object.transform.origin = s.pos + o.object.rotation = s.rotation + o.object.scale = s.scale + inv_remove_invalid_items(s.inventory) + game.add_child(o.object) + if o.object.has_method("on_load"): + o.object.on_load(o) + +func load_player(name:String="player"): + player = { + player=true, + name = name, + id = 0, + right_item = null, + left_item = null, + inventory = { + main=new_inventory(32), + craft=new_inventory(9), + craftoutput=new_inventory(1) + }, + slot_index = 0, + hotbar_count = 8, + right_slot = 4, + left_slot = 0, + object = load("res://engine/player/player.tscn").instance(), + meta = {} + } + var s = save.player + player.object.player = player + + if s != null and s.size() > 0: + player.object.transform.origin = s.pos + player.object.rotation = s.rotation + for i in s: + player[i] = s[i] + inv_remove_invalid_items(player.inventory) + else: + player.object.transform.origin = Vector3(0,2,0) + player.inventory={ + main=core.new_inventory(32,[ + core.itemstack("default:chest",{count=10}), + core.itemstack("default:stone_pick"), + ]), + + craft=core.new_inventory(9), + craftoutput=core.new_inventory(1) + } + game.add_child(player.object) + +func save_player_objects(): + if player != null: + var sp = {} + sp.slot_index = player.slot_index + sp.right_slot = player.right_slot + sp.left_slot = player.left_slot + sp.pos = player.object.transform.origin + sp.inventory = player.inventory + sp.rotation = player.object.rotation + sp.meta = player.meta + save.player = sp + + var ob2s = {} + for i in objects: + var o = objects[i] + if o.get("object") != null and o.url != null and is_instance_valid(o.object): + var s = {} + s.id = o.id + s.name = o.name + s.type = o.type + s.inventory = o.inventory + s.url = o.url + s.meta = o.meta + s.pos = o.object.global_transform.origin + s.rotation = o.object.rotation + s.scale = o.object.scale + ob2s[i] = s + else: + objects.erase(i) + save.objects = ob2s + +func load_file(path): + var file = File.new() + if not file.file_exists(path): + return + file.open(path,file.READ) + var l = file.get_var() + file.close() + return l + +func save_file(path,s): + var D = Directory.new() + var dir = path.get_base_dir().get_file() + if D.dir_exists(str("user://",dir)) == false: + D.make_dir(str("user://",dir)) + var file = File.new() + file.open(str(path),file.WRITE_READ) + file.store_var(s) + file.close() + +func load_data(): + var s = load_file(str("user://worlds/",world_name,".mworld")) + save.mods = s.mods + save.player = s.player + if s.get(world.name): + world = s[world.name].world + save.objects = s[world.name].objects + save.map = s[world.name].map.duplicate() + meta = s[world.name].meta.duplicate() + load_objects() + else: + world = world + save.objects = {} + save.map = {} + meta = {} + return true + +func save_data(): + if world_name == "": + return + save_player_objects() + var s = load_file(str("user://worlds/",world_name,".mworld")) + if s == null: + s = {} + s.player = save.player + s.mods = save.mods + s[world.name] = { + world=world, + objects=save.objects, + meta=meta, + map=save.map, + } + save_file(str("user://worlds/",world_name,".mworld"),s) + +func delete_data(wn=world_name): + var d = Directory.new() + d.remove(str("user://worlds/",wn,".mworld")) + +func _process(delta): + save_timer += delta + if save_timer > settings.save_timeout: + save_timer = 0 + save_data() + +func get_pointed_pos(): + var pos = player.object.get_translation() + var aim = player.object.get_node("head/Camera").get_global_transform().basis + var hpos = player.object.get_node("head").get_translation() + #var lpos = (pos + hpos+aim.z).round() + for i in range(-1,-500,-1): + var p = (pos + hpos+(aim.z*Vector3(i*0.01,i*0.01,i*0.01)))#.round() + var rp = p.round() + var id = map.get(rp) + var reg = get_node_reg(id) + if reg != null and reg.get("drawtype") != "none" and reg.get("collidable") != false: + if (p.x >= rp.x-0.5 and p.x <= rp.x+0.5) and (p.y >= rp.y-0.5 and p.y <= rp.y+0.5) and (p.z >= rp.z-0.5 and p.z <= rp.z+0.5): + return {inside=rp,outside=p} + #lpos = rp + return {inside=null,outside=null} + +func place_node(node,inside:bool=false): + var pos = player.object.get_translation() + var aim = player.object.get_node("head/Camera").get_global_transform().basis + var hpos = player.object.get_node("head").get_translation() + var lpos = (pos + hpos+aim.z).round() + + for i in range(-1,-500,-1): + var p = (pos + hpos+(aim.z*Vector3(i*0.01,i*0.01,i*0.01)))#.round() + var rp = p.round() + var id = map.get(rp) + var reg = get_node_reg(id) + if reg != null and reg.get("drawtype") != "none" and reg.get("collidable") != false and chunk.get_chunk_at_pos(rp): + if (p.x >= rp.x-0.5 and p.x <= rp.x+0.5) and (p.y >= rp.y-0.5 and p.y <= rp.y+0.5) and (p.z >= rp.z-0.5 and p.z <= rp.z+0.5): + if get_node_reg(node).get("collidable") == false or (pos-hpos).distance_to(p) > 0.9 and (pos+hpos).distance_to(p) > 1: + var pp = rp if inside == true or reg.get("replaceable") == true else lpos + set_node({name=node,pos=pp}) + return true + return false + lpos = rp + return false + +func get_item_reg(v): + var it = register.items.get(v) + if it: + return it + elif v is Vector3: + v = v.round() + v = map.get(v) + elif v is String: + return register.nodes.get(v) + var n = register.id.get(v) + return register.nodes.get(n) + +func get_node_reg(v): + if v is Vector3: + v = v.round() + v = map.get(v) + elif v is String: + return register.nodes.get(v) + var n = register.id.get(v) + return register.nodes.get(n) + +func set_node(def:Dictionary):# set node + assert(typeof(def.get("pos")) == TYPE_VECTOR3 and typeof(def.get("name")) == TYPE_STRING,"ERROR: set_node: def.pos & def.name required!") + var n = register.nodes.get(def.name) + assert(n != null,str('ERROR: set_node: "',def.name,'"', " doesn't exists")) + var rpos = def.pos.round() + var reg = get_node_reg(def.name) + node_removed(map[rpos],rpos) + map[rpos] = reg.id + save.map[rpos] = reg.id + var cid = chunk.pos_to_chunkid(rpos) + for r in settings.update_chunk_rules.size(): + var near_chunk = rpos+settings.update_chunk_rules[r] + if chunk.pos_to_chunkid(near_chunk) != cid: + chunk.update(near_chunk) + chunk.update(rpos) + +func inset_map_node_id(id,pos): + map[pos] = id + +func item2mesh(item, priority_render:bool = false): + var reg = get_item_reg(item) + var mesh = Mesh.new() + var st = SurfaceTool.new() + + if reg.type == "node": + var tiles = reg.tiles + var tile + if reg.drawtype == "none": + return mesh + for f in default_node.faces.size()+1: + st.begin(Mesh.PRIMITIVE_TRIANGLE_FAN) + var mat = SpatialMaterial.new() + if tiles.size() >= f: + tile = tiles[f-1] + mat.flags_transparent = (reg.get("transparent") == true) + mat.albedo_texture = tile + st.set_material(mat) + for v in range(0,4): + st.add_uv(default_node.uv[v]) + st.add_vertex(default_node.faces[f-1][v]-Vector3(0.5,-0.5,0.5))#-Vector3(0,0,0.5) + st.commit(mesh) + st.clear() + else: + var texture = reg.inv_image + var faces = default_node.faces + var img = texture.get_data() + var s = img.get_size() + img.decompress() + img.flip_y() + img.flip_x() + img.lock() + var size = Vector3(0.075,0.075,0.075) + for y in s.y: + for x in s.x: + var c = img.get_pixel(x,y) + if c.a != 0: + var f = [4,5] + var mat = SpatialMaterial.new() + mat.albedo_color = c + mat.flags_no_depth_test = priority_render + if y == s.y-1 or img.get_pixel(x,y+1).a == 0: + f.push_back(0) + if y == 0 or img.get_pixel(x,y-1).a == 0: + f.push_back(1) + if x == s.x-1 or img.get_pixel(x+1,y).a == 0: + f.push_back(2) + if x == 0 or img.get_pixel(x-1,y).a == 0: + f.push_back(3) + for n in f: + st.begin(Mesh.PRIMITIVE_TRIANGLE_FAN) + st.set_material(mat) + for v in 4: + st.add_vertex((faces[n][v]+Vector3(x-7,y-7,0))*size) + st.commit(mesh) + st.clear() + img.unlock() + return mesh + +func new_inventory(size:int = 32,items:Array=[]): + items.resize(size) + return items + +func itemstack(item:String,def:Dictionary={}): + var reg = get_item_reg(item) + if reg == null: + return null + var durability = 0 if reg.get("item_capabilities") == null or reg.item_capabilities.get("durability") == null else reg.item_capabilities.durability + return { + name = item if def.get("item") == null else def.get("item"), + count = def.get("count") if def.get("count") != null and def.get("count") <= reg.max_count else reg.max_count, + durability = durability if def.get("durability") == null else def.get("durability"), + meta = {} if def.get("meta") == null else def.get("meta"), + } +func item_groups(item): + var it = register.items.get(item) + var nu = register.nodes.get(item) + if it: + var cap = it.get("item_capabilities") + if cap != null: + return cap.groups + elif nu: + return nu.groups + +func stack_2invitem(stack): + var t = TextureRect.new() + var reg = get_item_reg(stack.name) + t.texture = item3Dimg(stack.name) + #t.texture = reg.get("inv_image") if reg.type == "item" else reg.tiles[0] + t.expand = true + t.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + t.rect_size = Vector2(100,100) + t.rect_clip_content = true + t.name = "item" + var d = Node2D.new() + d.add_child(t) + + var c = reg.get("item_capabilities") + if c != null and c.get("durability") != null: + var bar1 = ColorRect.new() + bar1.rect_size = Vector2(100,3) + bar1.rect_position = Vector2(0,96) + bar1.color = Color(255,0,0) + t.add_child(bar1) + var bar2 = ColorRect.new() + var d1 = float(stack.durability)/float(c.durability) + bar2.rect_size = Vector2(100*d1,3) + bar2.color = Color(0,255,0) + bar1.add_child(bar2) + else: + var p = Label.new() + p.text = str(stack.count) + p.rect_size = Vector2(50,5) + p.rect_position = Vector2(0,70) + p.rect_scale = Vector2(2,2) + p.align = HALIGN_RIGHT + p.name = "text" + t.add_child(p) + return d + +func setMeta(pos:Vector3,label,set=null): + if label == null: + meta.erase(pos) + return + meta[pos] = {} if meta.get(pos) == null else meta[pos] + var lab = meta[pos].get(label) + meta[pos][label] = {} if lab == null else meta[pos][label] + if lab == null: + meta[pos].erase(pos) + else: + meta[pos][label] = set +func getMeta(pos:Vector3,label=null): + if meta.get(pos) == null or label == null: + return + return meta[pos].get(label) + +func existsMeta(pos): + return meta.get(pos) != null + +func create_node_inventory(pos:Vector3,name,size:int=32,add_to_stack=null): + meta[pos] = {} if meta.get(pos) == null else meta[pos] + meta[pos].inventory = {} if meta[pos].get("inventory") == null else meta[pos].inventory + meta[pos].inventory[name] = new_inventory(size,add_to_stack) + +func get_inventory(ref,name): + var inv + if ref is Vector3: + if meta.get(ref): + if meta[ref].get("inventory") != null and meta[ref].inventory.get(name): + inv = meta[ref].inventory[name] + elif ref.get("player"): + inv = ref.inventory[name] + elif objects.get(ref.id): + inv = ref.inventory[name] + return inv + +func get_inventory_stack(ref,name,i): + var inv = get_inventory(ref,name) + var stack = inv[i] + if stack != null: + var reg = get_item_reg(stack.name) + if reg == null: + inv[i] = null + else: + return stack + +func add_to_inventory(ref,name,stack): + var inv + var reg = get_item_reg(stack.name) + var stack2 = stack.duplicate() + if reg == null: + return stack2 + elif ref is Vector3: + if meta.get(ref): + if meta[ref].get("inventory") != null and meta[ref].inventory.get(name): + inv = meta[ref].inventory[name] + elif player.get(ref.name): + inv = ref.inventory[name] + elif objects.get(ref.id): + inv = ref.inventory[name] + else: + return stack2 + var c = stack.count + var m = reg.max_count + + for i in inv.size(): + var slot = inv[i] + if slot != null and slot.name == stack.name: + var can_add = m - slot.count + if can_add <= c: + slot.count += can_add + c -= can_add + else: + slot.count += c + c = 0 + stack2.count = c + if c <= 0: + return stack2 + for i in inv.size(): + var slot = inv[i] + if slot == null: + if m <= c: + inv[i] = itemstack(reg.name,{count=m}) + c -= m + else: + inv[i] = itemstack(reg.name,{count=c}) + c = 0 + stack2.count = c + if c <= 0: + return stack2 + return stack2 + +func get_drop(name_pos_id): + var reg = get_item_reg(name_pos_id) + var drop = reg.get("drop") + var drops = {} + var a = {} + if drop == null: + drops[reg.name] = 1 + elif drop is String: + drops[drop] = 1 + elif drop is Dictionary: + for i in drop: + var d = drop[i] + if d.get("chance") == null or round(rand_range(0,d.chance)) == d.chance: + var count = 1 if d.get("count") == null else d.count + drops[i] = count if drops.get(i) == null else drops[i]+count + if d.get("additional") == false: + drops = {} + drops[i] = count + break + for i in drops: + a[i]=itemstack(i,{count=drops[i]}) + return a + +func item3Dimg(item): + var texture = viewport_items.get(item) + if texture == null: + var tex = load("res://engine/item_to_texture/item_to_texture.tscn").instance() + add_child(tex) + texture = tex.texture(item) + viewport_items[item] = texture + return texture + +func spawn_drop_item(pos,stack,droper=null): + var d = load("res://game/item_drop/item_drop.tscn").instance() + var ob = add_object(d,"item_drop",d.filename) + if d.has_method("on_spawn"): + d.on_spawn(ob) + d.spawn(pos,stack,droper,ob) + add_child(d) + return d + +func inv_remove_invalid_items(inv): + for list in inv: + var i = 0 + for stack in inv[list]: + if stack != null and get_item_reg(stack.name) == null: + inv[list][i] = null + i += 1 +func Error(msg): + error = true + world_quit() + main.get_node("exitmsg/center/text").text = msg + main.move_child(main.get_node("exitmsg"),main.get_child_count()) + main.get_node("exitmsg").visible = true + yield(get_tree().create_timer(0.01),"timeout") + error = false +func option_flash(o,text="",color=Color(1,0,0,0.8),blacktext=false): + var b = Node2D.new() + b.z_index = 1000 + add_child(b) + var u = ColorRect.new() + u.rect_size = o.rect_size + u.rect_position = o.rect_global_position + u.color = color + b.add_child(u) + var l = Label.new() + l.text = text + l.align = Label.ALIGN_CENTER + l.valign = Label.VALIGN_CENTER + l.rect_size = o.rect_size + u.add_child(l) + u.rect_size.x = l.rect_size.x + l.add_color_override("font_color",Color(0,0,0) if blacktext else Color(1,1,1)) + yield(get_tree().create_timer(1),"timeout") + u.free() + +func node_set(id,pos): + var reg = get_node_reg(id) + if reg.get("touchable"): + var c = chunk.get_chunk_at_pos(pos) + var a = Area.new() + var col = CollisionShape.new() + col.shape = BoxShape.new() + col.scale = Vector3(0.51,0.51,0.51) + c.add_child(a) + a.add_child(col) + a.name = str(var2str(pos),"touchable") + a.global_transform.origin = pos + a.connect("body_entered",self,"node_touch",[id,pos,true]) + a.connect("body_exited",self,"node_touch",[id,pos,false]) +func node_removed(id,pos): + var reg = get_node_reg(id) + if reg.get("touchable"): + var c = chunk.get_chunk_at_pos(pos) + var n = str(var2str(pos),"touchable") + if c.has_node(n): + c.get_node(n).queue_free() +func node_touch(body,id,pos,touch): + if not body is StaticBody: + var reg = get_node_reg(id) + for i in WaEngine.nodes: + var ob = WaEngine.nodes[i] + if ob.name == "register_node" and ob.options.touchable and ob.options.name == reg.name: + if touch: + WaEngine.next_connection(ob,"on_touch",body) + else: + WaEngine.next_connection(ob,"on_untouch",body) + yield(get_tree().create_timer(0.1),"timeout") + WaEngine.next_connection(ob,"pos",pos) diff --git a/engine/gui.gd b/engine/gui.gd new file mode 100644 index 0000000..3f3bbbe --- /dev/null +++ b/engine/gui.gd @@ -0,0 +1,79 @@ +extends Node + +func show(player:Dictionary,text:String): + var s = text.split("]",false) + var Gui = {player=player,player_object=player.object} + assert(s[0].substr(0,10) == "background","ERROR: GUI.create: first element must be background!") + for v in s: + var n = v.find("[") + var ob = v.substr(0,n) + var op = [Gui] + var ops = v.substr(n+1,-1).split(";",false) + for i in ops: + op.push_back(i) + var S = ops.size() + if ob == "background" and GUI.get("background") == null: + callv("background",op) + elif ob == "inventory" and S >= 3: + callv("inventory",op) + player.object.add_child(Gui.background.object) + player.object.gui = Gui + Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED) + +func background(Gui,x="8",y="4",color="Color(0.1,0.1,0.1,0.9)"): + x = float(x)*50 + y = float(y)*50 + color = str2var(color) + var size = Vector2(x,y) + var vs = core.ui.get_viewport_rect().size + var pos = (vs/2) - (size/2) + var back = ColorRect.new() + back.rect_size = size + back.rect_position = pos + back.color = color + Gui.background = {size=size,pos=pos,object=back} + return Gui + +func inventory(Gui,inv,name,x,y,w="1",h="1",size="50"): + x = float(x)*50 + y = float(y)*50 + w = int(w) + h = int(h) + size = int(size) + var X = 0 + var Y = 0 + + if inv.substr(0,7) == "player:": + inv = core.player.inventory[name] + elif inv.substr(0,7) == "object:": + inv = core.objects[inv.substr(7)].inventory[name] + elif inv.substr(0,5) == "node:": + + inv = core.meta[str2var(inv.substr(5))].inventory[name] + + Gui.inventory = {ref={},selected=null} if Gui.get("inventory") == null else Gui.inventory + var lab = str(Gui.inventory.ref.size()) + Gui.inventory.ref[lab] = {inv=inv,slots={},name=name} + + for i in w*h: + var it = inv[i] + var slot = TextureRect.new() + slot.texture = load("res://game/textures/slot.png") + slot.rect_size = Vector2(size,size) + slot.rect_position = Vector2(x+X,y+Y) + slot.name = str(i) + Gui.inventory.ref[lab].slots[slot.name]={slot=slot} + X += size + + if X >= w*size: + X = 0 + Y += size + if it != null: + var item = core.stack_2invitem(it) + item.get_node("item").rect_scale = item.get_node("item").rect_scale/2 + Gui.inventory.ref[lab].slots[slot.name].item = item + slot.add_child(item) + else: + Gui.inventory.ref[lab].slots[slot.name].item = null + Gui.background.object.add_child(slot) + return Gui diff --git a/engine/item_to_texture/item_to_texture.gd b/engine/item_to_texture/item_to_texture.gd new file mode 100644 index 0000000..0e2a147 --- /dev/null +++ b/engine/item_to_texture/item_to_texture.gd @@ -0,0 +1,10 @@ +extends Spatial + +func texture(a): + $viewport/mesh.mesh = core.item2mesh(a) + var reg = core.get_item_reg(a) + if reg.type == "item": + $viewport/mesh.transform.origin = Vector3(0.3,-0.1,0) + $viewport/mesh.scale = Vector3(1.2,1.2,1.2) + $viewport/mesh.rotation = Vector3(0,3.5,0) + return $viewport.get_texture() diff --git a/engine/item_to_texture/item_to_texture.tscn b/engine/item_to_texture/item_to_texture.tscn new file mode 100644 index 0000000..41dfce9 --- /dev/null +++ b/engine/item_to_texture/item_to_texture.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://engine/item_to_texture/item_to_texture.gd" type="Script" id=1] +[ext_resource path="res://default_env.tres" type="Environment" id=2] + +[sub_resource type="World" id=1] +environment = ExtResource( 2 ) + +[sub_resource type="CubeMesh" id=2] + +[node name="viewport" type="Spatial"] +script = ExtResource( 1 ) + +[node name="viewport" type="Viewport" parent="."] +size = Vector2( 100, 100 ) +own_world = true +world = SubResource( 1 ) +transparent_bg = true +render_target_v_flip = true +render_target_update_mode = 1 + +[node name="light" type="OmniLight" parent="viewport"] +transform = Transform( 1, 2.98023e-08, -2.98023e-08, -2.98023e-08, 1, 1.49012e-08, 2.98023e-08, -1.49012e-08, 1, 1, 0.5, 2 ) + +[node name="mesh" type="MeshInstance" parent="viewport"] +transform = Transform( 0.699393, 0.0190852, -0.714482, -0.453154, 0.784886, -0.422618, 0.552721, 0.619347, 0.557592, 0, 0, 0 ) +mesh = SubResource( 2 ) +material/0 = null + +[node name="cam" type="Camera" parent="viewport"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.15, 1.2 ) +current = true diff --git a/engine/loader/loader.gd b/engine/loader/loader.gd new file mode 100644 index 0000000..da33867 --- /dev/null +++ b/engine/loader/loader.gd @@ -0,0 +1,21 @@ +extends Control + +var progressions = {0:"loading..."} +func _ready(): + core.Loader = self + +func setprogress(v): + $progressbar.value = v + for i in progressions: + if v >= i: + $progressbar/label.text = progressions[i] + if v >= $progressbar.max_value: + visible = false +func end(): + visible = false +func start(end,p=null): + #core.main.move_child(core.main.get_node("loader"),core.main.get_child_count()) + progressions = p + $progressbar.value = 0 + $progressbar.max_value = end + visible = true diff --git a/engine/loader/loader.tscn b/engine/loader/loader.tscn new file mode 100644 index 0000000..e147748 --- /dev/null +++ b/engine/loader/loader.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://engine/loader/loader.gd" type="Script" id=1] +[ext_resource path="res://game/textures/stone.png" type="Texture" id=2] + +[node name="loader" type="TextureRect"] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 2 ) +expand = true +stretch_mode = 7 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="progressbar" type="ProgressBar" parent="."] +margin_top = 560.0 +margin_right = 1024.0 +margin_bottom = 600.0 +step = 0.1 + +[node name="label" type="Label" parent="progressbar"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_top = -14.0 +margin_bottom = -40.0 +text = "Loading..." +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/engine/mapgen.gd b/engine/mapgen.gd new file mode 100644 index 0000000..02886b7 --- /dev/null +++ b/engine/mapgen.gd @@ -0,0 +1,88 @@ +extends Node + +var timer = 1 +var n2gc_timer = -0.01 +var n2gc_time = 0 +var mapgens = ["super_flatland","none","super_flatstoneland"] + +func _ready(): + set_process(false) + + +func _process(delta): + timer += delta + if timer > n2gc_time and core.player != null: + if n2gc_timer >= 1: + n2gc_timer = 0 + n2gc_time = 1 + else: + n2gc_timer += timer + timer = 0 + + var player = core.player + var ppos = player.object.global_transform.origin + var pos = core.chunk.to_chunk_pos(ppos) + if core.chunk.get_chunk_at_pos(pos) == null: + core.chunk.new_chunk(pos) + core.current_mapgen.call_func(pos) + n2gc_time = 0 + n2gc_timer = 0 + for i in range(1,core.settings.ganerate_chunk_range): + var r = core.chunk_size*i + var s = core.chunk_size + for x in range(-r,r,s): + for y in range(-r,r,s): + for z in range(-r,r,s): + pos = Vector3(x,y,z) + core.chunk.to_chunk_pos(ppos) + if core.chunk.get_chunk_at_pos(pos) == null: + core.chunk.new_chunk(pos) + core.current_mapgen.call_func(pos) + n2gc_time = 0 + n2gc_timer = 0 + +func none(pos): + pass + +func super_flatland(pos): + var id + var grassy = core.get_node_reg("default:grassy").id + var dirt = core.get_node_reg("default:dirt").id + var stone = core.get_node_reg("default:stone").id + var air = core.get_node_reg("air").id + var Y + for x in range(-core.chunk_size/2,core.chunk_size/2): + for y in range(-core.chunk_size/2,core.chunk_size/2): + for z in range(-core.chunk_size/2,core.chunk_size/2): + var p = Vector3(x,y,z)+pos + Y = pos.y+y + if core.map.get(p) != 0: + continue + elif Y == 0: + id = grassy + elif Y < -3: + id = stone + elif Y < 0: + id = dirt + else: + id = air + core.inset_map_node_id(id,p) + core.chunk.update(pos) + +func super_flatstoneland(pos): + var id + var stone = core.get_node_reg("default:cobble").id + var air = core.get_node_reg("air").id + var Y + for x in range(-core.chunk_size/2,core.chunk_size/2): + for y in range(-core.chunk_size/2,core.chunk_size/2): + for z in range(-core.chunk_size/2,core.chunk_size/2): + var p = Vector3(x,y,z)+pos + Y = pos.y+y + if core.map.get(p) != 0: + continue + elif Y <= 0: + id = stone + else: + id = air + core.inset_map_node_id(id,p) + core.chunk.update(pos) diff --git a/engine/mob/mob.gd b/engine/mob/mob.gd new file mode 100644 index 0000000..018174a --- /dev/null +++ b/engine/mob/mob.gd @@ -0,0 +1,3 @@ +extends KinematicBody + +var mob = {} diff --git a/engine/mob/mob.tscn b/engine/mob/mob.tscn new file mode 100644 index 0000000..bc396ce --- /dev/null +++ b/engine/mob/mob.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://engine/mob/mob.gd" type="Script" id=1] + +[node name="mob" type="KinematicBody"] +script = ExtResource( 1 ) diff --git a/engine/player/player.gd b/engine/player/player.gd new file mode 100644 index 0000000..312a97b --- /dev/null +++ b/engine/player/player.gd @@ -0,0 +1,422 @@ +extends KinematicBody + +var direction = Vector3() +var velocity = Vector3() + +var gravity = -27 +var phys_object = {right=null,left=null} +onready var phys_ray = $head/Camera/phys_ray +var jump_height = 10 +var walk_speed = 10 +var player +var using = {time=0,wear=0,right_time=0,left_time=0,right=false,left=false,pos=Vector3()} +var cam_mode = 1 +var gui +var fpv_camera_angle = 0 +var fpv_mouse_sensitivity = 0.3 +var tpv_camera_speed = 0.001 +var fly_mode = false +var item_drop_timer = 0.1 +onready var last_pos_before_fall = transform.origin + +func _ready(): + update_player() + core.ui.slot_index(player.right_slot) + core.ui.slot_index(player.left_slot) + core.ui.slot_index(player.slot_index) +func _input(event): + if Input.is_action_just_pressed("SCREENSHOT"): + var img = get_viewport().get_texture().get_data() + img.flip_y() + var d = Directory.new() + var i = 1 + var saved = false + while saved == false: + var s = str("screenshots/screenshot",i,".png") + if d.file_exists(s): + i += 1 + else: + if d.dir_exists("screenshots") == false: + d.make_dir("screenshots") + var file = File.new() + file.open("screenshots/.gdignore",file.WRITE_READ) + file.store_string("") + file.close() + img.save_png(s) + saved = true + elif core.WaEditor.enabled: + return + elif Input.is_action_just_pressed("use"): + if gui != null: + gui.background.object.queue_free() + gui = null + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + update_player() + else: + var pointed = core.get_pointed_pos() + if pointed.inside != null: + var reg = core.get_node_reg(pointed.inside) + var activated = false + if reg.get("activatable") == true: + for i in WaEngine.nodes: + var ob = WaEngine.nodes[i] + if ob.name == "register_node" and ob.options.activatable and str(ob.mod_name,":",ob.options.name) == reg.name: + activated = true + WaEngine.next_connection(ob,"on_activate",self) + yield(get_tree().create_timer(0.1),"timeout") + WaEngine.next_connection(ob,"pos",pointed.inside) + elif reg.get("on_activate"): + reg.on_activate.call_func(pointed.inside,reg) + return + elif activated: + return + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + GUI.show(player,"background[8;8]inventory[player:player1;main;0;4;8;4]inventory[player:player1;craft;3;0.5;3;3]inventory[player:player1;craftoutput;6.5;1.5]") + + if gui != null: + if gui.get("inventory") != null: + if event is InputEventMouseButton: + var key_pressed = Input.is_action_just_pressed("LMB") + var key_released = Input.is_action_just_released("LMB") + var p = event.position + var inv# = player.inventory + var slot + var index + var stack + var stack_reg + var cur_ref + + for ref in gui.inventory.ref: + cur_ref = gui.inventory.ref[ref] + for i in cur_ref.slots: + var s = cur_ref.slots[i] + var pos = s.slot.rect_global_position + var size = s.slot.rect_size + var a = pos+size/2 + if p.distance_to(a) <= s.slot.rect_size.x/2: + inv = cur_ref.inv + slot = s + index = int(i) + stack = cur_ref.inv[index] + stack_reg = core.get_item_reg(stack.name) if stack != null else null + if key_pressed: + gui.inventory.selected = {ref=cur_ref,slot=s,index=index,stack=stack,name=s.slot.name} + break + if slot != null: + break + + if gui.inventory.get("selected") == null: + return + elif key_pressed: + if gui.inventory.selected.slot.item != null: + gui.inventory.selected.slot.item.z_index = 1000 + elif key_released: + if gui.inventory.selected.slot.item != null: + gui.inventory.selected.slot.item.z_index = 100 + var b = gui.background + if p.x < b.pos.x or p.x > b.size.x+b.pos.x or p.y < b.pos.y or p.y > b.size.y+b.pos.y: +#del item outside + core.spawn_drop_item(transform.origin,gui.inventory.selected.stack,player.name) + gui.inventory.selected.slot.item.queue_free() + gui.inventory.selected.slot.item = null + gui.inventory.selected.ref.inv[gui.inventory.selected.index] = null + gui.inventory.selected = null + update_player() + elif index != null and gui.inventory.selected.index != index and stack == null: +#drop on empty slot + gui.inventory.selected.slot.item.get_node("item").rect_global_position = slot.slot.rect_global_position + inv[index] = gui.inventory.selected.stack + gui.inventory.selected.ref.inv[gui.inventory.selected.index] = null + slot.item = gui.inventory.selected.slot.item + gui.inventory.selected.slot.item = null + gui.inventory.selected = null + update_player() + elif index != null and gui.inventory.selected.index != index and gui.inventory.selected.stack.name == stack.name and stack.count < stack_reg.max_count: +#drop on stack + var can_add = stack_reg.max_count - stack.count + if can_add >= gui.inventory.selected.stack.count: + inv[index].count += gui.inventory.selected.stack.count + inv[gui.inventory.selected.index] = null + slot.item.get_node("item/text").text = str(inv[index].count) + gui.inventory.selected.slot.item.free() + gui.inventory.selected.slot.item = null + gui.inventory.selected = null + else: + inv[index].count += can_add + gui.inventory.selected.ref.inv[gui.inventory.selected.index].count -= can_add + slot.item.get_node("item/text").text = str(inv[index].count) + gui.inventory.selected.slot.item.get_node("item/text").text = str(gui.inventory.selected.ref.inv[gui.inventory.selected.index].count) + gui.inventory.selected.slot.item.get_node("item").rect_global_position = gui.inventory.selected.slot.slot.rect_global_position + gui.inventory.selected = null + update_player() + else: + gui.inventory.selected.slot.item.get_node("item").rect_global_position = gui.inventory.selected.slot.slot.rect_global_position + gui.inventory.selected = null + elif event is InputEventMouseMotion and gui.inventory.get("selected") != null and gui.inventory.selected.slot.get("item") != null: + gui.inventory.selected.slot.item.get_node("item").rect_global_position = event.position-gui.inventory.selected.slot.item.get_node("item").rect_size/3 + return + elif Input.is_action_just_pressed("switch_index_side"): + var i = player.slot_index + var r = player.right_slot + var l = player.left_slot + player.slot_index = l if i == r else r + core.ui.slot_index(player.slot_index) + change_wield_item() + elif Input.is_action_just_pressed("throw_item"): + var inv = core.get_inventory(player,"main") + var stack = inv[player.slot_index] + if stack != null: + var pos = transform.origin + var aim = -$head/Camera.get_global_transform().basis.z*15 + var stack2 = stack.duplicate() + if Input.is_key_pressed(KEY_SHIFT): + stack.count -= 1 + stack2.count = 1 + else: + inv[player.slot_index] = null + + var d = core.spawn_drop_item($head.transform.origin+pos,stack2,player.name) + d.set_linear_velocity(aim) + update_player() + + elif Input.is_key_pressed(KEY_G) and cam_mode == 2: + cam_mode = 1 + $head/Camera.current = true + $head/tpv/Camera.current = false + $mesh.visible = false + #$head/tpv/Camera.set_cull_mask(1) + elif Input.is_key_pressed(KEY_H) and cam_mode == 1: +# == fps + cam_mode = 2 + $head/Camera.current = false + $head/tpv/Camera.current = true + $mesh.visible = true + elif event is InputEventMouseMotion: + if cam_mode == 1: +# == First player view + rotate_y(deg2rad(-event.relative.x * fpv_mouse_sensitivity)) + var change = -event.relative.y * fpv_mouse_sensitivity + if change + fpv_camera_angle < 90 and change + fpv_camera_angle > -90: + $head/Camera.rotate_x(deg2rad(change)) + fpv_camera_angle += change + elif cam_mode == 2: +# == Third player view + rotate_y(-event.relative.x * tpv_camera_speed) + $head/tpv.rotate_x(-event.relative.y * tpv_camera_speed) + elif event is InputEventMouseButton: + if Input.is_action_just_pressed("RMB"): + phys_pickingup() + using.right = true + $head/Camera/right/anim.play("pick") + $head/Camera/right/anim.get_animation("pick").set_loop(true) + elif Input.is_action_just_released("RMB"): + phys_pickingup(null,null,true) + using.right = false + using.right_time = 0 + $head/Camera/right/anim.get_animation("pick").set_loop(false) + elif Input.is_action_just_pressed("LMB"): + phys_pickingup() + using.left = true + $head/Camera/left/anim.play("pick") + $head/Camera/left/anim.get_animation("pick").set_loop(true) + elif Input.is_action_just_released("LMB"): + phys_pickingup(null,null,true) + using.left = false + using.left_time = 0 + $head/Camera/left/anim.get_animation("pick").set_loop(false) + if Input.is_action_just_pressed("WHEEL_DOWN"): + player.slot_index += 1 + if player.slot_index >= player.hotbar_count: + player.slot_index = 0 + core.ui.slot_index(player.slot_index) + change_wield_item() + elif Input.is_action_just_pressed("WHEEL_UP"): + player.slot_index -= 1 + if player.slot_index < 0: + player.slot_index = player.hotbar_count-1 + core.ui.slot_index(player.slot_index) + change_wield_item() + + +func change_wield_item(inx:int = player.slot_index): + var stack = player.inventory["main"][inx] + stack = stack if stack != null else core.itemstack("wieldhand") + var mesh = core.item2mesh(stack.name,true) + if inx >= 4: + player.right_slot = inx + $head/Camera/right/anim.get_animation("pick").set_loop(false) + $head/Camera/right/hand/item.mesh = mesh + using.right_time = 0 + else: + player.left_slot = inx + $head/Camera/left/hand/item.mesh = mesh + $head/Camera/left/anim.get_animation("pick").set_loop(false) + $head/Camera/left/hand/item.mesh = mesh + using.left_time = 0 + +func hand(right): + var stack = player.inventory["main"][player.right_slot] if right else player.inventory["main"][player.left_slot] + var pos = core.get_pointed_pos() + stack = core.itemstack("wieldhand") if stack == null else stack + var stack_reg = core.get_item_reg(stack.name) + if stack_reg.type == "node" and core.place_node(stack.name): + stack.count -= 1 + if stack.count <= 0: + if right: + player.inventory["main"][player.right_slot] = null + $head/Camera/right/hand/item.mesh = null + change_wield_item() + else: + player.inventory["main"][player.left_slot] = null + $head/Camera/left/hand/item.mesh = null + change_wield_item() + elif stack_reg.type == "item": + var dur = stack_reg.get("item_capabilities") + if dur != null and pos.inside != null: + var node_reg = core.get_node_reg(pos.inside) + var ngroups = core.item_groups(node_reg.name) + var igroups = dur.groups + for ig in igroups: + for ng in ngroups: + if ig == ng: + if using.time <= 0: + using.wear = ngroups[ng] + using.pos = pos.inside + using.time = ngroups[ng] + if right: + using.right_time = igroups[ig] + else: + using.left_time = igroups[ig] + break + break + if using.time > 0 and (right and using.right_time > 0 or right == false and using.left_time > 0): + var t = using.right_time + using.left_time + if t == 0 or pos.inside != using.pos: + using.time = 0 + else: + using.time -= t + if using.time <= 0: + var wear = using.wear/2 if using.right_time > 0 and using.left_time > 0 else using.wear + if using.right_time > 0: + var s = player.inventory["main"][player.right_slot] + if s != null and s.get("durability") != null: + s.durability -= wear + if s.durability <= 0: + player.inventory["main"][player.right_slot] = null + $head/Camera/right/hand/item.mesh = null + change_wield_item() + if using.left_time > 0: + var s = player.inventory["main"][player.left_slot] + if s != null and s.get("durability") != null: + s.durability -= wear + if s.durability <= 0: + player.inventory["main"][player.left_slot] = null + $head/Camera/left/hand/item.mesh = null + change_wield_item() + using.right_time = 0 + using.left_time = 0 + var drops = core.get_drop(using.pos) + for i in drops: + var stack2 = core.add_to_inventory(player,"main",drops[i]) + if stack2.count > 0: + core.spawn_drop_item(transform.origin,stack2,player.name) + + core.set_node({name="air",pos=using.pos}) + core.ui.update_hotbar(player.inventory["main"]) + +func update_player(): + core.ui.update_hotbar(player.inventory["main"]) + change_wield_item(player.right_slot) + change_wield_item(player.left_slot) + +func _process(delta): + if gui != null: + return +# == walking + direction = Vector3() + var aim = $head/Camera.get_global_transform().basis + var pos = transform.origin + var con = Vector3() + + if phys_ray.enabled: + phys_pickingup(pos,aim) + if Input.is_key_pressed(KEY_W): + con -= aim.z + if Input.is_key_pressed(KEY_S): + con += aim.z + if Input.is_key_pressed(KEY_A): + con -= aim.x + if Input.is_key_pressed(KEY_D): + con += aim.x + if Input.is_action_just_pressed("fly_mode"): + fly_mode = fly_mode == false + $Collision.disabled = fly_mode + velocity = Vector3(0,0,0) + + if fly_mode: + if Input.is_key_pressed(KEY_SHIFT): + con*=0.1 + transform.origin += con*0.2 + else: + var on_floor = is_on_floor() + direction = con + direction = direction.normalized() + if on_floor: + velocity.y = 0 + elif core.chunk.chunk_loaded_at_pos(pos) == false: + velocity.y = 0 + return + else: + #if player is inside a collidable block, freeze the movement to prevent falling through the ground + var reg = core.get_node_reg(pos) + if reg == null or reg.get("collidable") != false or reg.name == "none": + if last_pos_before_fall != Vector3(): + last_pos_before_fall.y += 1 + transform.origin = last_pos_before_fall + last_pos_before_fall = Vector3() + return + last_pos_before_fall = pos + velocity.y += gravity * delta + var tv = velocity + tv = velocity.linear_interpolate(direction * walk_speed,15 * delta) + velocity.x = tv.x + velocity.z = tv.z + velocity = move_and_slide(velocity,Vector3(0,1,0)) + # == jumping + if on_floor and Input.is_key_pressed(KEY_SPACE): + velocity.y = jump_height + +func phys_pickingup(pos=null,aim=null,disable=false): + var r = phys_object.right + var l = phys_object.left + var ur = using.right + var ul = using.left + + if (r != null or l != null) and pos != null: + if r != null and (is_instance_valid(r) == false or ur == false): + phys_object.right = null + return + if l != null and (is_instance_valid(l) == false or ul == false): + phys_object.left = null + return + if r != null and l != null: + r.set_linear_velocity(((pos+$head.transform.origin+((-aim.z*3)+aim.x*1.2))-r.global_transform.origin)*10) + l.set_linear_velocity(((pos+$head.transform.origin+((-aim.z*3)-aim.x*1.2))-l.global_transform.origin)*10) + else: + var ob = r if l == null else l + ob.set_linear_velocity(((pos+$head.transform.origin+(-aim.z*3))-ob.global_transform.origin)*10) + if r == null and l == null and disable: + phys_ray.enabled = false + else: + phys_ray.enabled = true + if phys_ray.is_colliding(): + var inv = player.inventory["main"] + if using.right and inv[player.right_slot] == null or using.left and inv[player.left_slot] == null: + var ob = phys_ray.get_collider() + if ob is RigidBody: + if using.right and phys_object.right == null: + $head/Camera/right/anim.get_animation("pick").set_loop(false) + phys_object.right = ob + elif using.left and phys_object.left == null: + $head/Camera/left/anim.get_animation("pick").set_loop(false) + phys_object.left = ob diff --git a/engine/player/player.tscn b/engine/player/player.tscn new file mode 100644 index 0000000..307fd6d --- /dev/null +++ b/engine/player/player.tscn @@ -0,0 +1,149 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://engine/player/player.gd" type="Script" id=1] + +[sub_resource type="CubeMesh" id=1] + +[sub_resource type="SpatialMaterial" id=2] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="BoxShape" id=3] + +[sub_resource type="Animation" id=4] +length = 0.6 +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath("hand:translation") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 0, -0.291107 ), Vector3( 0, -0.211775, -0.445232 ), Vector3( 0, -0.372039, -0.250472 ), Vector3( 0, 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("hand:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.2, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 90, -45 ), Vector3( 0, 90, -135 ), Vector3( 0, 90, -45 ) ] +} +tracks/2/type = "method" +tracks/2/path = NodePath("../../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0.19 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ true ], +"method": "hand" +} ] +} + +[sub_resource type="Animation" id=5] +length = 0.6 +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath("hand:translation") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.4, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 0, -0.291107 ), Vector3( 0, -0.211775, -0.445232 ), Vector3( 0, -0.372039, -0.250472 ), Vector3( 0, 0, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("hand:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.2, 0.6 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector3( 0, 90, -45 ), Vector3( 0, 90, -135 ), Vector3( 0, 90, -45 ) ] +} +tracks/2/type = "method" +tracks/2/path = NodePath("../../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0.2 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ false ], +"method": "hand" +} ] +} + +[node name="player" type="KinematicBody"] +pause_mode = 1 +script = ExtResource( 1 ) + +[node name="mesh" type="MeshInstance" parent="."] +transform = Transform( 0.4, 0, 0, 0, 1, 0, 0, 0, 0.4, 0, 0, 0 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) + +[node name="Collision" type="CollisionShape" parent="."] +transform = Transform( 0.4, 0, 0, 0, 1, 0, 0, 0, 0.4, 0, 0, 0 ) +shape = SubResource( 3 ) + +[node name="head" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.8, 0 ) + +[node name="Camera" type="Camera" parent="head"] +cull_mask = 524289 +current = true + +[node name="right" type="Spatial" parent="head/Camera"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, -0.1, -0.3 ) + +[node name="anim" type="AnimationPlayer" parent="head/Camera/right"] +anims/pick = SubResource( 4 ) + +[node name="hand" type="Spatial" parent="head/Camera/right"] +transform = Transform( -3.09086e-08, -3.09086e-08, 1, -0.707107, 0.707107, 0, -0.707107, -0.707107, -4.37114e-08, 0, 0, 0 ) + +[node name="item" type="MeshInstance" parent="head/Camera/right/hand"] +transform = Transform( 0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 0, 0 ) +layers = 524288 + +[node name="left" type="Spatial" parent="head/Camera"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, -0.1, -0.3 ) + +[node name="anim" type="AnimationPlayer" parent="head/Camera/left"] +anims/pick = SubResource( 5 ) + +[node name="hand" type="Spatial" parent="head/Camera/left"] +transform = Transform( -3.09086e-08, -3.09086e-08, 1, -0.707107, 0.707107, 0, -0.707107, -0.707107, -4.37114e-08, 0, 0, 0 ) + +[node name="item" type="MeshInstance" parent="head/Camera/left/hand"] +transform = Transform( 0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 0, 0 ) +layers = 524288 + +[node name="phys_ray" type="RayCast" parent="head/Camera"] +cast_to = Vector3( 0, 0, -4 ) + +[node name="tpv" type="Spatial" parent="head"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.8, 0, 2 ) + +[node name="Camera" type="Camera" parent="head/tpv"] +cull_mask = 1048573 diff --git a/engine/ui/ui.gd b/engine/ui/ui.gd new file mode 100644 index 0000000..56cfc63 --- /dev/null +++ b/engine/ui/ui.gd @@ -0,0 +1,70 @@ +extends Control + +func center(node): + var s = get_viewport_rect().size/2 + var c = node.rect_size / 2 + node.rect_position = s - c +func buttom(node): + var s = get_viewport_rect().size + node.rect_position = Vector2(node.rect_position.x,s.y-node.rect_size.y) +func slot_index(i): + if i > 3: + $hotbar/slotr.rect_position.x = (($hotbar/slotr.rect_size.x))*i + $hotbar/slotr/active.visible = true + $hotbar/slotl/active.visible = false + else: + $hotbar/slotl.rect_position.x = (($hotbar/slotl.rect_size.x))*i + $hotbar/slotl/active.visible = true + $hotbar/slotr/active.visible = false +func update_hotbar(inv): + var s = $hotbar/slotr.rect_size + var l = 8 if inv.size() >= 8 else inv.size() + for i in l: + var c = $hotbar.get_node_or_null(str(i)) + if c != null: + c.free() + for i in l: + var it = inv[i] + if it != null: + var t = core.stack_2invitem(it) + t.get_node("item").rect_position = Vector2((s.x*i)+4,4) + #t.rect_size = Vector2(s.x-8,s.x-8) + t.get_node("item").rect_scale = Vector2(s.x*0.0091,s.x*0.0091) + t.name = str(i) + $hotbar.add_child(t) + +func _ready(): + core.ui = self + center($crosshair) + center($hotbar) + buttom($hotbar) + + var p = OS.get_screen_size()/2 + var s = OS.window_size/2 + var winpos = p-s + winpos.y = 0 #now we can see the output + OS.set_window_position(winpos) + #yield(get_tree().create_timer(0.1),"timeout") + #OS.window_size = Vector2(700,700) + #OS.window_maximized = true + #OS.window_fullscreen = true + + +func pause(): + core.game_pause() + $manu.visible = core.game_paused + +func quit_to_main(): + $manu.visible = false + core.world_quit() +func quit_game(): + core.world_quit(true) + +func _input(event): + if core.game != null and core.player.object.gui == null and Input.is_action_just_pressed("ui_cancel"): + if core.game_paused: + core.game_pause() + $manu.visible = false + else: + core.game_pause() + $manu.visible = true diff --git a/engine/ui/ui.tscn b/engine/ui/ui.tscn new file mode 100644 index 0000000..1b88a4e --- /dev/null +++ b/engine/ui/ui.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://engine/ui/ui.gd" type="Script" id=1] +[ext_resource path="res://game/textures/crosshair.png" type="Texture" id=2] +[ext_resource path="res://game/textures/hotbar.png" type="Texture" id=3] +[ext_resource path="res://game/textures/hotbar_slot.png" type="Texture" id=4] +[ext_resource path="res://game/textures/hotbar_select.png" type="Texture" id=5] + +[node name="ui" type="Control"] +pause_mode = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="crosshair" type="TextureRect" parent="."] +margin_left = 60.1041 +margin_top = 207.182 +margin_right = 80.1041 +margin_bottom = 227.182 +texture = ExtResource( 2 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="hotbar" type="TextureRect" parent="."] +margin_left = 247.0 +margin_top = 514.0 +margin_right = 871.0 +margin_bottom = 592.0 +texture = ExtResource( 3 ) +stretch_mode = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="slotl" type="TextureRect" parent="hotbar"] +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="active" type="TextureRect" parent="hotbar/slotl"] +visible = false +margin_right = 78.0 +margin_bottom = 78.0 +texture = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="slotr" type="TextureRect" parent="hotbar"] +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="active" type="TextureRect" parent="hotbar/slotr"] +visible = false +margin_right = 78.0 +margin_bottom = 78.0 +texture = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="manu" type="ColorRect" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = 1024.0 +margin_bottom = 600.0 +color = Color( 0.2, 0.2, 0.2, 0.5 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="back" type="ColorRect" parent="manu"] +anchor_left = 0.5 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -128.0 +margin_top = 106.0 +margin_right = 128.0 +margin_bottom = -86.0 +color = Color( 0.2, 0.2, 0.2, 0.4 ) + +[node name="main" type="Button" parent="manu/back"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -64.0 +margin_top = -118.0 +margin_right = 65.0 +margin_bottom = -68.0 +text = "Quit to main manu" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="quit" type="Button" parent="manu/back"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -64.0 +margin_top = 10.0 +margin_right = 65.0 +margin_bottom = 60.0 +text = "Quit Game" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="manu/back/main" to="." method="quit_to_main"] +[connection signal="pressed" from="manu/back/quit" to="." method="quit_game"] diff --git a/game/game_base.gd b/game/game_base.gd new file mode 100644 index 0000000..a686bc5 --- /dev/null +++ b/game/game_base.gd @@ -0,0 +1,23 @@ +extends Node + +func chest(pos,reg): + if reg.name == "default:chest": + if core.existsMeta(pos) == false: + core.create_node_inventory(pos,"main",32,[ + core.itemstack("default:chest",{count=10}), + core.itemstack("default:stone_pick",{count=100}), + core.itemstack("default:grassy",{count=100}), + core.itemstack("default:stone_hoe"), + core.itemstack("default:stone_shovel"), + core.itemstack("default:axe_stone"), + core.itemstack("default:stone_pick"), + core.itemstack("default:stick",{count=100}), + core.itemstack("default",{count=100}), + core.itemstack("default:stone",{count=100}), + core.itemstack("default:cobble",{count=1000}), + core.itemstack("default:dirt",{count=100}), + core.itemstack("default:water_source",{count=100}), + core.itemstack("default:glass",{count=100}), + core.itemstack("default:wood",{count=100}) + ]) + GUI.show(core.player,"background[8;8.5]inventory[player:player1;main;0;4.5;8;4]inventory[node:"+var2str(pos)+";main;0;0;8;4]") diff --git a/game/game_items.gd b/game/game_items.gd new file mode 100644 index 0000000..b7983e5 --- /dev/null +++ b/game/game_items.gd @@ -0,0 +1,71 @@ +extends Node + +func _ready(): + core.register_node({ + name = "default:chest", + groups={woody=3}, + on_activate=funcref(GameBase,"chest"), + tiles = [ + "res://game/textures/default_chest_top.png", + "res://game/textures/default_chest_top.png" + ,"res://game/textures/default_chest_front.png" + ,"res://game/textures/default_chest_side.png" + ,"res://game/textures/default_chest_side.png" + ,"res://game/textures/default_chest_side.png" + ] + }) + core.register_node({ + name="default:stone", + tiles=["res://game/textures/stone.png"], + groups={cracky=3}, + max_count=100, + drop={"default:cobble":{count=1},"default:stone":{count=1,chance=10,additional=false}} + }) + core.register_node({ + name="default:cobble", + tiles=["res://game/textures/cobble.png"], + groups={cracky=3}, + max_count=1000, + }) + core.register_node({ + name="default:grassy", + groups={crumbly=3}, + drop={"default:dirt":{count=1},"default:grassy":{count=1,chance=10,additional=false}}, + tiles=[ + "res://game/textures/grass.png", + "res://game/textures/dirt.png", + "res://game/textures/grass_dirt.png", + "res://game/textures/grass_dirt.png", + "res://game/textures/grass_dirt.png", + "res://game/textures/grass_dirt.png" + ] + }) + core.register_node({ + name="default:dirt", + tiles=["res://game/textures/dirt.png"], + groups={crumbly=3}, + }) + core.register_node({ + name="default:water_source", + replaceable=true, + drawtype="liquid", + collidable=false, + transparent=true, + solid_surface=false, + tiles=["res://game/textures/water.png"], + max_count=100 + }) + core.register_node({ + name="default:glass", + transparent=true, + solid_surface=false, + tiles=["res://game/textures/default_glass.png"], + groups={cracky=3} + }) + core.register_node({ + name="default:wood", + tiles=["res://game/textures/default_wood.png"], + groups={woody=3} + }) + + diff --git a/game/item_drop/item_drop.gd b/game/item_drop/item_drop.gd new file mode 100644 index 0000000..3f1709f --- /dev/null +++ b/game/item_drop/item_drop.gd @@ -0,0 +1,81 @@ +extends RigidBody + +var object +var timer = 300 +var droper +var sleep = false +var last_pos = Vector3() + +func spawn(pos,stack,der=null,ob=null): + object = ob + droper = der + last_pos = pos + transform.origin = pos + $mesh.mesh = core.item2mesh(stack.name) + var reg = core.get_item_reg(stack.name) + if reg.type == "item": + $collision.scale = Vector3(0.62,0.65,0.1) + core.add_to_inventory(object,"main",stack) + item() +func _process(delta): + timer -= delta + var pos = transform.origin.round() + if core.map.get(pos) == null: + sleep = true + sleeping = true + elif sleep: + sleeping = false + sleep = false + var reg = core.get_node_reg(pos) + if reg != null and reg.drawtype == "default": + transform.origin = last_pos + else: + last_pos = pos + if timer < 0: + set_process(false) + queue_free() + +func _ready(): + timer = core.settings.item_drop_timeout + +func item(): + var stack = core.get_inventory(object,"main")[0] + if stack == null: + set_process(false) + queue_free() + return + $mesh.mesh = core.item2mesh(stack.name) + var reg = core.get_item_reg(stack.name) + if reg.type == "item": + $collision.scale = Vector3(0.62,0.65,0.1) +func on_spawn(ob): + object = ob +func on_load(ob): + object = ob + sleeping = true + item() + +func _on_area_body_entered(body): + var ob = body.get("player") + var itemdrop = false + if body.get("object") != null and body.object.type == "item_drop" and body.object.id != object.id: + ob = body.object + var inv1 = core.get_inventory(object,"main")[0] + var inv2 = core.get_inventory(ob,"main")[0] + if inv1.name == inv2.name and (inv1.count < core.get_item_reg(inv2.name).max_count): + itemdrop = true + + if ob != null and droper != ob.name or itemdrop: + var stack = core.get_inventory(object,"main")[0] + var leftover = core.add_to_inventory(ob,"main",stack) + if body.get("player") != null: + body.update_player() + if leftover.count > 0: + stack.count = leftover.count + else: + queue_free() + return + +func _on_Timer_timeout(): + droper = null + $collision.disabled = false diff --git a/game/item_drop/item_drop.tscn b/game/item_drop/item_drop.tscn new file mode 100644 index 0000000..4376cf2 --- /dev/null +++ b/game/item_drop/item_drop.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://game/item_drop/item_drop.gd" type="Script" id=1] + +[sub_resource type="BoxShape" id=1] + +[sub_resource type="SphereShape" id=2] + +[node name="item" type="RigidBody"] +transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0 ) +script = ExtResource( 1 ) + +[node name="collision" type="CollisionShape" parent="."] +transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0 ) +shape = SubResource( 1 ) +disabled = true + +[node name="mesh" type="MeshInstance" parent="."] + +[node name="area" type="Area" parent="."] + +[node name="CollisionShape" type="CollisionShape" parent="area"] +transform = Transform( 0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0 ) +shape = SubResource( 2 ) + +[node name="Timer" type="Timer" parent="."] +wait_time = 0.1 +one_shot = true +autostart = true + +[connection signal="body_entered" from="area" to="." method="_on_area_body_entered"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/game/textures/cobble.png b/game/textures/cobble.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbde7236c64bfce4433c8e526ac9482122bcd4a GIT binary patch literal 2095 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 literal 0 HcmV?d00001 diff --git a/game/textures/crosshair.png.import b/game/textures/crosshair.png.import new file mode 100644 index 0000000..8137e31 --- /dev/null +++ b/game/textures/crosshair.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/crosshair.png-a632d3a8fde0361a0a6a457a1d905efb.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://game/textures/crosshair.png" +dest_files=[ "res://.import/crosshair.png-a632d3a8fde0361a0a6a457a1d905efb.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/textures/default.png b/game/textures/default.png new file mode 100644 index 0000000000000000000000000000000000000000..078a0fc268684bc0dbdd4cb54f8647fecb5b00d0 GIT binary patch literal 395 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 literal 0 HcmV?d00001 diff --git a/game/textures/default_axe_stone.png.import b/game/textures/default_axe_stone.png.import new file mode 100644 index 0000000..b882f96 --- /dev/null +++ b/game/textures/default_axe_stone.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_axe_stone.png-f56c343a82f31ecb8acd0d9eb04a7ed4.s3tc.stex" +path.etc2="res://.import/default_axe_stone.png-f56c343a82f31ecb8acd0d9eb04a7ed4.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_axe_stone.png" +dest_files=[ "res://.import/default_axe_stone.png-f56c343a82f31ecb8acd0d9eb04a7ed4.s3tc.stex", "res://.import/default_axe_stone.png-f56c343a82f31ecb8acd0d9eb04a7ed4.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_chest_front.png b/game/textures/default_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..17e51a25ba47712a2b689a95561586b14b356a10 GIT binary patch literal 5331 zcmeHKX;f3!7LI_R2$7+TqQrm|teNMO5FtdF0+c}!P`F8M;A$q4Kp0fS3W8`AR1^zV ztqQc_fFcMYP6#Mbsn}LULOvYlZY7LxcXLiSADpQPVN6*HH=azPb1rI%)XE>>I|2I<`PL98M*5l~r zf8MTm_Uo?N`iFUbg)Lc$X{VOvC7g(wnM&^K>T!t4GN^cZ?~-3TYSE92*=4-HcBQ#6 z)mP#kQ?|aylMO$YxOTlPiJNV9M|~;*6TWf14Z3pps%KY-iF(nm;IpUsF3ZOQ^iqfL zb9@`920z{SLA-1&>j`2WAe}y=tO$9&g?)&KkGHhQ$*X_n0*-DIw$7T9W9xrljv|#| zD)X3wS`dH7YFHd7Xus1_-jegENPwXgNMo=K;blhS^vLOb=Fju4V(Y$ob>i&LLtD4G zH+HvW_M6qOj6KV3y?8ofwXkB?K2@eHkH4K5@4=Ar_Oe_Lin4{?jyCG6zIRhI2> zConP9_K{}a&0uERI;a()t|7(LC!UkdX3~%)1=GSE%co#1Z0rha2JL$toPBmok+}?5 zrSA%yPafteYdp=@L{B9Z?A>&%bCpK&h}Lhzt=+O~cKP5*EBW9+$~oKS%@!vXOc?@0 z@GA~wKPLbEjFe@CFS*%lZq%H3H%#oiQ`Xdx>{Zv9khq0loZz}P`&gx(iDzT(khAX| zaSYPyn81K-*J!@>Os=cfFHz}vMOj9SEWM|jDd{~?i`(lP_nl*V_g+ez!lzezghV@>j}EXG18$vXfB1 zJ^0$6WRCK3?`YS+_1>uUsj7n*o2tNgZVqnWr99swQT3q)iXlpCc!*}ReN^e` zLz>DPd_Ro3Dq?3}b>e-_7S_AipvCnc(vrjC{q3rR>_An3l9ff=l+`;&3)gRk`o=+AYR)qDwtnotp>Z`@6&Qr#pI= z)&x4V&7U5vAIZoP(0{LNuz$5;eVmlvF|Gcni{aSFl(Uvg)!mKPDyy6N`|<}%l{VEq z8v*CTJMm8`9`#=_omWxUIH%{?0Vls@u6HZ5dB)2&TrR-*w_1NaY`iVGoc2WA zp}t|{4)zuK{Z@XMS#@QH-Qo6>jJu4TkrA5c>@B#Bh|;!{{<~Y{Gs{$6*9lDG_Hh@- zU6sUR#lTyv%6DH8s>aYSF0P*k?H+u}+=j zt%=tA+p}fb0@;Q}*@_o#`yO(P>yBu~(=Ik9zaghQM<6C;Kpakx4~O$^k%E_|!qvGf z?~4l@>Z3y{xbu+KR`HENMf1I_;;hOk7u{vOKq#wU!PJ?D*D5D?~44~P276_#IV0>_Zx8r zoYr|{7o@mV?8^g%uFXw8|s z_ix{=i;Wl?Llj{ZRqoPE2Y5HJh2UKyoafIJ$Rt=mDC2|JB#9i}RS*a_c9I+rtOQjk zJ{Sv0S?KJrYPA}xCShfYSR8@DVBqjX9Fd5D5g28%R0Skqq)I0(#aj+9P$^JAaup<# zqO_ay){{;OmcO4i;@pw!xnIJ*isgD;6t&Nu{lnEdq zQ+F#M5<#*^2w+HL5&=Wz)9@HRg+|9P_#(W3PA4!xKH(!OAE{CWNClvl3MR)wFb`dT z2WfZ$0Yf3ssTeYm4`Kk2K*Nv-1S*}u04N}d@exI!0)nd&5Puw%mP!ay(Lg+fz@YOn z0uWEakO?#fh7SN_3{40KMMQuoAdo3KD(yHhJ%W5#Xd)K>!4f0}R3e!|0+%`@70T4g z53W#10*0snt!xA;kxV8r@MJ2LN~Y6DA3%#ig%U0~Eh_p@6v%<^Fp#CLpm1Z(V{oKpG3eGkl_?-r1pl7%m2t z2GT%21w#QCba=Q#6byqV;$x_Ef>0n3QAH$@=u>v3Or%l+3eY1K&J@lDE+JhuD3=M9 zT|dRE<3O#1cp?FVr(%etPy&I8Co}O>G;ShUoOVvX%hnC|KYF<703R&^aJ#oQcyWQ( zD%|_UYCP|#^+m4FQsA?|U#jc>CYSMt z*Bwv_pMccx%gkdk%MX4LGUWR$@ezh!* zhdjT)Hq$Zf*1}_3`+D_|9foTxb{DseW%fZbFuD4==FPB#CoX8HHT;T z+Vnm$|MT3cg);{_XKgeH-Maj7L*$tJ0h&Y1d}X;BM52%9nAE8~4Bhhq3x~wOEcR{N mF$$8n3#o|uqc7(D%a0_>AelMIX!iO8+b;L7f-G2cimlsC> literal 0 HcmV?d00001 diff --git a/game/textures/default_chest_front.png.import b/game/textures/default_chest_front.png.import new file mode 100644 index 0000000..efe0bf6 --- /dev/null +++ b/game/textures/default_chest_front.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_chest_front.png-3838fcd9fb13d8e6d4257a46b45e2cbf.s3tc.stex" +path.etc2="res://.import/default_chest_front.png-3838fcd9fb13d8e6d4257a46b45e2cbf.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_chest_front.png" +dest_files=[ "res://.import/default_chest_front.png-3838fcd9fb13d8e6d4257a46b45e2cbf.s3tc.stex", "res://.import/default_chest_front.png-3838fcd9fb13d8e6d4257a46b45e2cbf.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_chest_side.png b/game/textures/default_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..326498356a035e40f5451d9bbf994b9c14fb290e GIT binary patch literal 5209 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 R2MbLb6Tn^QQ|T3(_Fq*lP}?Y^W;=D2NIw z3ijR*)U^Oo)`H7tL0Lg8D2ON)K)*@A_I&%t=lS-Z$ur5!x$k|?IqyAl=FZBHU_UDh zCkp@otOES`q3FMj;TVWPe_cC1fdF6{l@K1G4Fz>rm0Br5WH446uY$3#9+3cm{?754 zky%Y1mfeqsYfMMlt!xx#z5RgEbeoe-Xo^N1-BZ?T>b7LK$H+p)iwEBI-Ak5_-P7(% z+vR|F*|zYZrSFT6vZJF~q{Wy{o7UIO-RDEtuNAJN=X}6$#j_fZM=UAc>k>D_J_Q*7KEYpOxD{*dTnHs`qtPZ`PiAxwF^c0 zPnkiw)Zy`S&8gYK)rTG~tbWnJY}=53->=#xk_!!p@;u@~!f19}o?tUE@$&H1IgTQZ zNn)3!=obe|YSk($N%4!(CwyiqPG9IK{J6O8Zpjt@XOzV@7j%F_#yY>D>jn+4usCYt zw$@@1W!(-S-aTx^#0HCu=UdXSX48QO5$?3d>W1Ie+#JR?%_v%&(?ltM<%LbW)L0ng zWoEx{pc}^ADYX3hu(j+yfH+SzI{|?)M-xGv~v24qFG_pYn(!h-rLQR z-8fc|^=s(<;?@OE4o|7un&1^Vd*A(|o#prH_FWgP88fXWFMR{OP+&cbwsr%FWdc1n zUtK8#%&V7B_cn0{H#5T5Tqs$xXP{*UxGoGKVK9mA)?0#G3C&(j)%u*vzbKtG?#2KG_M#f&9eRo3ezLq6f1%pecyf6J&T{rA1VWHl$=!3qqK7nIi1EH(zu;bp$1*r>7L@dGCRTZ z_@-qo@6Ie=eozN)eYB|c&+EIJ0x^32L-wu_cI}w z1C`e2VhFUzhHPK=ExBW?ho+@kXZ^a#)+$qh z#~!%pEU=ui!oA-R${vq=%R%5QdT8KC#QWJpSLDO6ru7xm`@5I*9~a_A?`cSSSv;HS zZ5y+`|FpcW%O||A01pV)3U7D5JuGJi18r1Q!SS9<4yh|3VgLTrwTnN>8y=q7U$Nl) zBWqIk&MC`kGtSad7rN-ZcPOv+H#zCkmUDCVeAnHBeR9ssD(z=&o!s6ZK3IJA?t|NR z&q-(X^Z;83>Qi2dWzOgW!2v-Ve?(9q2U5xjpjat_33|B-eJ}ukr?*}OLi1rQRs>5C z1sB&=d=7_2#9Z7=dJri{#e<^}{{%H0mJl2cCCrD|Vw|^^g{Pi_63AgKh}Fww3Jpik z#Tj`y=()j6#9@sP?R+jSA}9pQQ>tMsjX)!i@B%#&N5OenU_I4h2`7|4sgDA^;^LyU zS`~*#)ai5t9hIO|ONnGQn@uE9h!hGQMc_5@3N5I|D>Uu~ie3&rtbx>sN{c8JSOX_0 zQpRezI2<~T{T!cM6%_P^UZLqz0o8-32USEefkc$ciQmr9Xa#X7Nnb$!I71VTK0k?} zutpiHhG0P)tkAlDOW_v~6!L|^kdhRUtBgsZ;(g~#41K|=V%0JuMhp>Q87xOhHE4X~ z@9Q(wVl#{w)A=?K)ZG{U@6exfH-b@AP!NZ&gklX&1NdB=AzqGH2_a%m?E@6f_zd3yp>$ z!h;eTjEBS^!~|(#Hj^PTQW@5P;~Nsd#Zd^oE_1TX6!*WsSAc-nwlkf}% zgNCQkMKnA}hUj=YgGPoRkU^ocdeivAu2D*~I#3P!O3_TwY|s)iW`p(UQ+e$7(deRK zgM=gs8Bb#1Db#Q>nM0y+=yV*hFIl4Dp8lMzC-Hyu@H7IxX#(iHUK`q6&|XFS(yaRQ zGD!F@e)`toU-W=d|8(+0`u>#br(8dzzz>0cR@YCten^2I0{^V8|C?MEUtf1%1-b*$ zp)WHbjc1;qFG3j66hA)j$?(l9*}Va^n5+CFH2^SZnBnLL?IxtYn<_9*C30N*#9RS9LJr@#Nxr=JiM z3WX7Kv1v1hj2J_l5!2Q=-^S$KQdl+bT5O-)Wt{=4mb6o5(nu!vh@h|8v1<#U)eczkHg+jly>y+vyVQPzb0>+Q&B?o!~$shYWNW aTU`UpY4a1iAkt50>_C7Zn15iRFy+6zO6zz4 literal 0 HcmV?d00001 diff --git a/game/textures/default_chest_top.png.import b/game/textures/default_chest_top.png.import new file mode 100644 index 0000000..f39d315 --- /dev/null +++ b/game/textures/default_chest_top.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_chest_top.png-d4c495f2f2693cdf8ca9c47ce92d6b82.s3tc.stex" +path.etc2="res://.import/default_chest_top.png-d4c495f2f2693cdf8ca9c47ce92d6b82.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_chest_top.png" +dest_files=[ "res://.import/default_chest_top.png-d4c495f2f2693cdf8ca9c47ce92d6b82.s3tc.stex", "res://.import/default_chest_top.png-d4c495f2f2693cdf8ca9c47ce92d6b82.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_glass.png b/game/textures/default_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..93f0fed967c15afb51ef4018f4caeeac758f0c26 GIT binary patch literal 1948 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 literal 0 HcmV?d00001 diff --git a/game/textures/default_hoe_stone.png.import b/game/textures/default_hoe_stone.png.import new file mode 100644 index 0000000..6db8960 --- /dev/null +++ b/game/textures/default_hoe_stone.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_hoe_stone.png-f6474afbb06978fb1364473148aec872.s3tc.stex" +path.etc2="res://.import/default_hoe_stone.png-f6474afbb06978fb1364473148aec872.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_hoe_stone.png" +dest_files=[ "res://.import/default_hoe_stone.png-f6474afbb06978fb1364473148aec872.s3tc.stex", "res://.import/default_hoe_stone.png-f6474afbb06978fb1364473148aec872.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_pick_stone.png b/game/textures/default_pick_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..05e193984350df52e7a635de30ce8365e747adb9 GIT binary patch literal 5528 zcmeHKeK?c*8y^-?M2-+;MpWAS#6D`Al%L+H93-7o=#+5u@_ROVyME`NuIqRHYuEK`&+hN%`?>G?^S!@sseu7L zrY6%(U@({|+n2c%`Zd=+6AhtnhnMdG7;J)BA~#I66i_4N3YkzG4I)$tau5N=i-j;) zd|TDB@MGPxC%<|8of7VkfY$>%{^8jMJWXCxy4qtR|uFIXP@v5M7ofX_W+>dYc#Wx{E!d zJ$*`uL-Uk%WESnIywW;d=@_ne7XEmc3l7&^+ese~KF!)2_vVUAHF+(as8~Q%DM+Agt1bNX zWorC|%yj);uJStp_cCIt!NY*`xwCq23YQ-|&#K>Hg;MJEGNx%*-TJ$YMGtW|!}Zoz z>A`1rY)jdPStV-Q(Xyfl)*iai#d4a{x)^#-(tzvrM(?v3xsKEeR&K+WoF;W%UMQ_8 zny~O-|33X70%LJ#VgGuAut{)mGiCLrCk;`l^HdMBW{@+US=0K$S~(Fz`V%dpC*?X$ zf}1T_*3eSaAsFZ!Wf$)Uyz{@Z(v5peNgjp2xK zMXu!ypYO39fm7WAm^BCCsXJ>1oi5gddR~<;Jrck=d)RPC&PG$T?|>I$BCfchdHQZ~ zYD2vZZ~L6zL>I0auW}U?@21>)c1%z}+G4MqTeu{KwG9*DojNO|{5IEFF&Gkc@aTa> zrrb5l^$f)@$r;`P|IU9Hpq1n-u>fWqRG=$5V+{ zQztiRZ075CQO#jR39IAaigY7|Z8%@vhj2^oESW5yYg(r%jH>(3lM8*D?{7I}Yn_yA z=jjw_s9JA8Ar!9l?z1{MCGf~Y>}<=U*(pN9!3y8nUdt_Y)tk=EU{ifMOR73=DqDFm zaY~W?)mzJodXw$fxMc|K%bq7J`XQe#nHX>}`}Cvkrq+>`I1GHQ#J@SJ(bTux_~{n^ zty}U}zHVu(38|S;<|y_fY0UXsO;YZblY%bK&mvn77n2I+Xewi06}#HXQ{1FAKkOmg zwYHB*$lDZkN&n)ZyFsVql{FU!)?AA;>Gus><~q0{dZ;z0@_+(;>P+s7+)=TGV0#7AYz_cGrY9*TyoyX z%m!CsB`(U~xUCDpzjhU2!UhVVYxb&%P45%zW1AgLA6x!1xJf>e*5kPg?%exZhpjOT zrk5gSFap^O#)p*=S`Tx7$fWyTTxfr3Rd5v&g`8#)(-4?9Z|gR)pHj@0o|p?9qrgGA^cswg@#j1!1p$P^%gh$f=3 zC|0~U4v$=5f}kk`Lh4fHqHzl79~~)DspM1)My*z()daLm5sAT3C=?79kHO6YxLc1mZw} z&JomatcfoIq>&&r!^cbNgI)X&!{ttbrXPUgp$KFgq_Ge$K=D8U35BDOad?3{0iY1a zH2%o0lnGU8KmmG1LYYF@KqaKh1~GeF63 zWHH(~{UKW#=702{=>VTC0#Ls(8??AUYZd0>Vl}RpR>FVrGd>Rgq6dijo0G57_nTbb z!CMexo@}<217e(AHDbz&p60vq+)YeMvn|ljcknie5UP!Otvakn2I5jXiv>B-BAt{ zAk<=&2%$a7g>EpjhVH~THq(nsZrrnzF4f1GrxZjAXE^V+EY?e5z>Qg5`roP2;GvBD z8WR)r!px9UaAV(UuhXlavGrW$iS}L#jYyKUzp+_?vo{N2cH|mZc!hW|5yBrrRXXg6CU+E#(k(xe6qyoSD5Be zqB@|dX?4$Es8?;KoaEIh*yR$%dY_*&6Z_LFiyvg^Yvw20y_m)2+QO1K=-0D$U8!?s zE27NZ49+9(Wu5plx6zJyv|`SV89}#d9WUP<%;8QgIBDT#2U{?^M^^CubU?2<=WuCx jn&Gm|_8E15%m}lnZL?ips|KHwwPV6&1u)CKS8x0;t`c-N literal 0 HcmV?d00001 diff --git a/game/textures/default_pick_stone.png.import b/game/textures/default_pick_stone.png.import new file mode 100644 index 0000000..5ae16ea --- /dev/null +++ b/game/textures/default_pick_stone.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_pick_stone.png-cb4cb36b47782f7c0f0124c43a8305eb.s3tc.stex" +path.etc2="res://.import/default_pick_stone.png-cb4cb36b47782f7c0f0124c43a8305eb.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_pick_stone.png" +dest_files=[ "res://.import/default_pick_stone.png-cb4cb36b47782f7c0f0124c43a8305eb.s3tc.stex", "res://.import/default_pick_stone.png-cb4cb36b47782f7c0f0124c43a8305eb.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_shovel_stone.png b/game/textures/default_shovel_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..eb8ad277b98653f171e9199d764a9bf1644c53a2 GIT binary patch literal 5444 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/game/textures/default_shovel_stone.png.import b/game/textures/default_shovel_stone.png.import new file mode 100644 index 0000000..0022feb --- /dev/null +++ b/game/textures/default_shovel_stone.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_shovel_stone.png-842bb2b831e95260b723894265efd907.s3tc.stex" +path.etc2="res://.import/default_shovel_stone.png-842bb2b831e95260b723894265efd907.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_shovel_stone.png" +dest_files=[ "res://.import/default_shovel_stone.png-842bb2b831e95260b723894265efd907.s3tc.stex", "res://.import/default_shovel_stone.png-842bb2b831e95260b723894265efd907.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/default_stick.png b/game/textures/default_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..8252b8d355fa83d548e7ae2062ea1bac9994bead GIT binary patch literal 5375 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 M07*qoM6N<$f)Z$h3jhEB literal 0 HcmV?d00001 diff --git a/game/textures/default_wood.png.import b/game/textures/default_wood.png.import new file mode 100644 index 0000000..abb6f25 --- /dev/null +++ b/game/textures/default_wood.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/default_wood.png-6246b07c17ae4801cdf76b04324b58f3.s3tc.stex" +path.etc2="res://.import/default_wood.png-6246b07c17ae4801cdf76b04324b58f3.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/default_wood.png" +dest_files=[ "res://.import/default_wood.png-6246b07c17ae4801cdf76b04324b58f3.s3tc.stex", "res://.import/default_wood.png-6246b07c17ae4801cdf76b04324b58f3.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/dirt.png b/game/textures/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..9c46f6e3bddf8c20dbc645ed3a91010f9c2fd096 GIT binary patch literal 862 zcmV-k1EKthP)6EHu3$RSEzA03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00P2EL_t(I%RQ3WZrerx zMb8X}oZ%vx+AQ00Y}#~=(Dar=*-AeIE8T zy&VXR!`0lUs5;(UhJ4Lhs>Wgm&`J@9--ds`%}^(iOL}NoB$As&$ZsE0irONC;9?RW zq`-KR?-v1^v?ecln$B`H^9g;0N)IhRU5)r-mDBbE#*@5WM!dbtDXNaL8Mrz1dH?x{ z?+IRAgsjt=)vm;K1k!WmGyL5m;O5ll?Ol%V39e5=v@6J~4($pSiQ(NUXJiz~{~F5I z4(DTy6apy)t4+Z$42&bgHmkXu2Kb)jU6ymZDKMU-w*!GzC?!!zpx8XsOk+*kTdvPS z%DU&DZ3)1k>=^kD+7%erVH|nfJ(OI}eg1u{P+y*E=CS7S(9m?2uX)YQX#l`9b^+LB zEdW*1krf?pE+hW@eEg;`kM;A<=VQY|TJv#TFpXVCMj-^mMp1VIb=TuLlCri;W0ynO zq4KIF2|PX(C7XT4B+>{0+pK1nHUwJYDM?!NoCFSK-E*vZUY-Z+(gu|mJ;$niZrcv9 z+7`HuKnOu#6iJ|fhP>=~wTuAE?WW|1^AM>Vuoiy4i4g*JS;g$cqwNP?%nZ}WV_$U4 oMw%BhpKVt2;l9AQ5^D$k10oe#Gkk9o_y7O^07*qoM6N<$f^eXOx&QzG literal 0 HcmV?d00001 diff --git a/game/textures/dirt.png.import b/game/textures/dirt.png.import new file mode 100644 index 0000000..5df8b07 --- /dev/null +++ b/game/textures/dirt.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/dirt.png-d0b014972030e6906ac5b43dcf4dcb32.s3tc.stex" +path.etc2="res://.import/dirt.png-d0b014972030e6906ac5b43dcf4dcb32.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/dirt.png" +dest_files=[ "res://.import/dirt.png-d0b014972030e6906ac5b43dcf4dcb32.s3tc.stex", "res://.import/dirt.png-d0b014972030e6906ac5b43dcf4dcb32.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/grass.png b/game/textures/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1d09a9795ea81fb8e2d241bfbb5415520e6da3 GIT binary patch literal 676 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 KTU<8Veds>|02AH- literal 0 HcmV?d00001 diff --git a/game/textures/grass_dirt.png.import b/game/textures/grass_dirt.png.import new file mode 100644 index 0000000..e31664a --- /dev/null +++ b/game/textures/grass_dirt.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/grass_dirt.png-318396c70c7e341ec3ae884703ae263c.s3tc.stex" +path.etc2="res://.import/grass_dirt.png-318396c70c7e341ec3ae884703ae263c.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/grass_dirt.png" +dest_files=[ "res://.import/grass_dirt.png-318396c70c7e341ec3ae884703ae263c.s3tc.stex", "res://.import/grass_dirt.png-318396c70c7e341ec3ae884703ae263c.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/grass_side.png b/game/textures/grass_side.png new file mode 100644 index 0000000000000000000000000000000000000000..12e8a43ec47aa719100b84b08036f8786766c8b1 GIT binary patch literal 1838 zcmV+}2hsS6P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|avfMTd{O2ih1Ogzq9EWRFZjj@rxoPH&6PKO% z(^8E{fe@B%fYO-$*Pp}ufrBYp<1|E{ytg=9a)~o0(e5L!D_OU$=f>X27rA*B7$U(a z`!@O`?~pU}`N-?BlOfkPL#dyI@^v8}LmZET>+v`e+79e7Z1OQAd_22-Uv^s7rx@N- zs7HUC^#ucdW?q~G_Ub7(TpimGe8N1kbpg1w8K{Ki|8ewrZ>}mMChkIFadk67LHLp+ zV|2I@)~A#)mvtpMDT6IGHejAEuHQet7rD8iAIiT_`poEG^xHTC#jptnnABjwAND|XTVQwoM6v0 z;f!dB3OXB#tl+Gah(Y5ZM~yNK>T9f25u)SH0V8u|p=uzEAR}>Ibh~-d-~i&AM9^GO z4gx7ZvCwjxmb;2Hn{5;gs)JyRR)zeJ)BK3i7_*^>Y<#dnTs$iqQB3BDj3uan5gG?n zT>#(n^O(E}7}N!GM1t9tX#w;XrB`vuB3huR7Rh5juC5L))iN>`Nazt{z*@ zQVKh#8bQo{GAFO;20=b%vpx7H`JE`jE*l1H<1hc=z+lUAfnBBC)Xl{M`ZsX@fg0=| z%roA}+dg!7$A;a1reG!vHn(NXN1<(($=01|tVJ%&a$UupLE%`ozIVov+sn-rZrcey z-SkmC=|rdT!tcV(OfJ1-j)=~v`676@1?KIniU0S2oH_8$+M-((d=U2+OEh}AL4;4& zn>_QiP|DW#-n}q7{sFW>Qd@kx)vr@6tuH9G2 zZrtj?R_nIoKCo+1Kb;rwZI}AN1pwhyx}Wa&)T$vLF7WT72Yg4(8v`G5OJ!t&6uWFc z+oJ21_0l%Z7FF7iWz3FZv8kV@ z1n-w2_RZp>qw)n_^N#PQ!Jiq;e|_+`q2Gpn8+tYIXvzEyHx>#`WB(~i00006VoOIv z0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;{*&8APo~piAMkc z02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DkUL_t(I%k7a(Zrd;r zg+G!*N|x;w%_^4(k|X5^T4w2u7d=dX0EW?vcoA=uwvJ>;{Of{ofEMk#n>=8EA?7`j z?~S^-zs{}}{1ln{2!L%gen=RrsMnV9$Rot zX57*sl|q~*jDhJ*V;haQr9qr#CSn(c6f#%^0iD!1x;QMwR)p@cfVvTN(Op zrdkQpYd~qxM!kPE`b_kZY9+*wFjcuEjEUuyL(gLo&3!~_jcW=KV0q;LSbVnRoJl@o zD+39nE_vwWGp-R#r7)t&`Hck3WASna?HiTc=GJG#}?r6;m}I0X}(y77mq9yj}M1dX*homWlK`5 z?YGBvJbA=84e+$z9`7z|99}%%z8>3~`|B2X+HIciE}{A%vD+Np&j7dlj@v(qzs&!o c{lI_0FReSl5mWxWKmY&$07*qoM6N<$f*`_YCjbBd literal 0 HcmV?d00001 diff --git a/game/textures/grass_side.png.import b/game/textures/grass_side.png.import new file mode 100644 index 0000000..59ae9f8 --- /dev/null +++ b/game/textures/grass_side.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/grass_side.png-6ba854bc112263ee9b0fe367b051939c.s3tc.stex" +path.etc2="res://.import/grass_side.png-6ba854bc112263ee9b0fe367b051939c.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/grass_side.png" +dest_files=[ "res://.import/grass_side.png-6ba854bc112263ee9b0fe367b051939c.s3tc.stex", "res://.import/grass_side.png-6ba854bc112263ee9b0fe367b051939c.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/hotbar.png b/game/textures/hotbar.png new file mode 100644 index 0000000000000000000000000000000000000000..8015c20515854680d7dc75b1455e4aa7fc7921e8 GIT binary patch literal 7078 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 literal 0 HcmV?d00001 diff --git a/game/textures/hotbar.png.import b/game/textures/hotbar.png.import new file mode 100644 index 0000000..3b985d3 --- /dev/null +++ b/game/textures/hotbar.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/hotbar.png-5f886928fc446ebdf51b5902264666c7.s3tc.stex" +path.etc2="res://.import/hotbar.png-5f886928fc446ebdf51b5902264666c7.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/hotbar.png" +dest_files=[ "res://.import/hotbar.png-5f886928fc446ebdf51b5902264666c7.s3tc.stex", "res://.import/hotbar.png-5f886928fc446ebdf51b5902264666c7.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/hotbar_select.png b/game/textures/hotbar_select.png new file mode 100644 index 0000000000000000000000000000000000000000..4afd4c50e0d52aac79facd30338891d96f790b5f GIT binary patch literal 8278 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 literal 0 HcmV?d00001 diff --git a/game/textures/hotbar_slot.png.import b/game/textures/hotbar_slot.png.import new file mode 100644 index 0000000..c1ffacf --- /dev/null +++ b/game/textures/hotbar_slot.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/hotbar_slot.png-4ffbecdbac11b2c0cc20530198258acc.s3tc.stex" +path.etc2="res://.import/hotbar_slot.png-4ffbecdbac11b2c0cc20530198258acc.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/hotbar_slot.png" +dest_files=[ "res://.import/hotbar_slot.png-4ffbecdbac11b2c0cc20530198258acc.s3tc.stex", "res://.import/hotbar_slot.png-4ffbecdbac11b2c0cc20530198258acc.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/slot.png b/game/textures/slot.png new file mode 100644 index 0000000000000000000000000000000000000000..34d1419db17c9a67c559b202ee6f6715f27dd411 GIT binary patch literal 5157 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 literal 0 HcmV?d00001 diff --git a/game/textures/slot.png.import b/game/textures/slot.png.import new file mode 100644 index 0000000..423323b --- /dev/null +++ b/game/textures/slot.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/slot.png-898b36c05433cdcbd0afe264ec28a28a.s3tc.stex" +path.etc2="res://.import/slot.png-898b36c05433cdcbd0afe264ec28a28a.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/slot.png" +dest_files=[ "res://.import/slot.png-898b36c05433cdcbd0afe264ec28a28a.s3tc.stex", "res://.import/slot.png-898b36c05433cdcbd0afe264ec28a28a.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/textures/stone.png b/game/textures/stone.png new file mode 100644 index 0000000000000000000000000000000000000000..add1d94d2ff80855798ada515fd3a4443829e10d GIT binary patch literal 1655 zcmV--28j8IP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Yw667Wf{MRXR1SHOX%s`U{V!XvkO}Ty#$1G0{Xx7zFis()ng(&iD9GbMPgnH6ajb^!oD| z+>lqu1^P1NdF+!Qx3`UA9TUg*L>e1O7zU=rVMz1GfEpW98XIXDmd)q;__(E94F2vy z9{O#}pJBj{`pal9&N}u6ZzIZk7cmZ^j7Qu`2img4zRn(FqwSlfssNKz&067YIzkQj zI_iYp;4Khl;I^j$KLf-NECF^)5?KYxCPoF?=^`4^>Y#4qw2({u)OPUwvxxB4H- z*z(&L_~;V_9Zayn1s_6)Aw`KA71u`OV+=9I zlwdSr=Y-V>3Mn0O=))ZLaECv_5s#FGvd$*k?6S`x$DE23U69Ac6<7OADh+MxB({sU_~Sd){fuILwQka|D2;9gE_=M0RAVG!;+ z1FT7;bEX0tBb~X$UcWl(B+MD4k@aEOUVG*t^_UAwb2o{PThm(b|)W!M|O@uF|?VIJ*p49FSOB}>piX_JG$qwm>!WSI|<8`Czu^~aEoku zH6{Cu-6Q{%&vaMGdo))rJ>aMaPN+!KjZM9FB_uJt(Pxc+Bdu9C1d6re!j=j1(FR$o!$-|MSYrM02 zmBqbsvRs9Nwi+UDi!Nu&ud_eC9fG}rT$!;lnjR(OwTM5C65oBNuUl>}fN9UEJ))PN zG%EYXPsRHH000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4& zKXw2B00(qQO+^Re1QiG=7?*mK=A6^tt+j9++?~uMBG`LlW<1XWz}}m^Hxa=Y1AvHN&dD&d zKk9pLs;Y~b8C6A9@jMS^2EaK7Gs7d|k9GYZ+wRVsv#qOWW`6I^IbD6NMP_y(^;}h4 z*VW%uRk!43)+%O(fa+eB|95s>ms~uAMsxtm3`i{jSg5{r)n~lVs+c_xGM(KWAox-+Xr+ zEki8~2BYKY;SzxU>nXmP}^kjsxku+n%Df<@$fE(RmN zQ5X{0+WWosyJkzVn)$`Ybh{_NbYXw>RaIHRr7hm+RcmuHCF_9T@SV3!L+!gyy;e2h z9&=miZJHAHY^(K-iAys=cY^~k(leCOO)z=dFD2#}?-IQCcDzYAPOdFINej)}(_JyG zAuH}`^X7dMV**rf?lTl0*A5Bo&=0LUwrKm%nWEyTI?MCU;mi-$KTJ?P&+WSCs%!73 z-<2GlYI=`#Y@24+8_^3v?yq*sV)q`s#hrw_x|n6gi^;mP*Jzm-vHz9D)-F$yRV`@A z$;u1cl$IuMHfmqCDxt5uv&gE?>XG^W@nhkGjcQ58l>C_uD=(BWTXITOiq;=J#ZP1vrCRMZHyq42 ztDjTkwqpjR$NcKy7N7Q&)CiIPEB5boO**~QwY6#>NTb!wyr|V}92z$>s5H_;BW0oe z`4-B~ymGe*>ukSU`^41REqib`{<-bi-&W}BZ}rizdR4Q(^>$6z=DLt-BGKv8nn$xM z-@f^vy>#Y`7gPI_Fq;ZF>MhGytopw1ujs0>b{$Eyj0?r+RjE$m)vX?9R2Q!Wo0V>G z!GNpxsI+%Z2ySuek)&i=Usg|FJ0~%^X#*vti2ME^+k!+lefIvkdf|O zV@v3HdwajH{o5%^X8dcKleV+}JgNV_EvB{E?9DaiS>~_x1H3K!f;Dc`rBMJ`pFEZTOpF_FjvUBWC_`wCC=GGt2Lq|Bi9=E6&|Q*6O5c`3=Go%PQ1bh2-bZfU$iH4vcI|4R zN2uV3-Tc`0s1vp!JLra!V(tB~jc?or#%;-6w=(&-^Es!M2i=2J`c?6f>KYI8>{k5P zubQ#^LJvM&@2cUlDOzEdURd`}aQ!JFt8uF1Nv*8ViMYP*HHS(H$})mC$xddd!q>U0fAe)%Fz`etx(VvFJSzW%jcY ztkm~g9m<3??gpQa)`WfvOP2OvXdP(&&;J;y{xk+Y*|00>$Q{6zeN+yy>MyGYKww|+{@Kh3_Kp@ zBn@gW>S$?bEAuoc&QbSTxT=kwX{~>Hrq=00X1)H|oa^)WPZoPLdF?!;^=#TY!{9KN zSl^=KePJFqCtSK2nY{gJjH*SXmM){}*4(zlB=<90p1b?$xvX<4I^MF>cG~c?)J)r( z>b1K~cAf^*xR0DWOH6%1jn|@3)-5B=&032$#&1-8kQM!W8`)jgq?@iAQATeLZ|r*B zgbN59bgo$Cr?xco3ge8yRXd^1i9^(5J5C6HmOm}cJKk-z|K&QJw7UMvQ@pqNcW+d- zT?Ya@Rda;34@vZjE`J-bD04yZle_F9SavOm5P`If=njE%gA`4m`5Nn7z_dtB!D1* zA^=IeKnlqLfy7KfF~Z@3NH}8Db9|uytKfv#!dNK_hePMFqvQ&|y2{bP(FGLuN_vSD zCU~MZ6x1FRKmdtEIzR*gkUreDLLzmI`?TH{ zB_u)Uxq%RXNQALs4&oYz_FA*Ci;ALRC1cl&l^}{CrQT66mw+mzTzRaFyQh!eM;V11 zdHiURQbK_qi-b8JaiUmploA7T2uKtXjVdBRnMt4FQTdMoUo=Nau5=XBMaYR&uz0$# za0&&Ou#m%tnaWEx2*E@en*oq%Br-q&sceAGp^^ZE3L+#bNF>2Fq%l;U0*Mq7a1aF* zN{;8FJXAUvhF~rmfDkSTps>j_0OGPCfCCW`3WLU=!4&ow3STiFO>HP@tX2vt7^Q-U zL&gHC18Z0HmU{S#;*B9@?et6(J&@f76*%wf8rln|Oe z{Ah@W5JUo=aspMF=`2PdsZbmw6h^Ud3Z<|LNo6r$?MBm_=`G|yigHkb5m-?vqqX7$ z@d(OWJHlUq{|8fGxKJkezwvy6eq?bJOJzcFq_5bQ9f5G9f6enH@JFTqv`a~(;&{)0 zW7L1c*^T6-2P!KR$B$V*5Q!PN8)+p`e5I?fSY`P#A&$a}ESv<2LtteHP(O}Lal#=1 z4?+9nXp#Im&i_Kbf+Px=0@JwwkxizeNk)MIHk$|mBoYk-ZO~sTJQDej>=GeYDucv` zBM+@2G|p%ZDdUW_7)>+F&$W?-BZ?d%k{AGy41iz|2r|hurVSN067A9G|1;)sX%L#( z5C!0(-4mct5C&R9bO@jk*=WMk*<_eIQqg~xdE_7>oe9#IB>I2CJPw5pGPq>4MQ}hg zdL)<)usI+NU~}mR%0&Cbe;|4s1h(O_QKMjpY6DOZkOI(Q zG6SH%6dIXG;gZ0)4|Xo;}aq1^r)v8BXnM zb4ITwh&+CfU@&+y#dnwcTHE{xzY+t#vco;UUVE8G_;+smd zMNj^Fz%6c45`E7K)A#T0HQ#c@YU&D&c?V-vQ}$gZoVl{`O2)J1XTA46sDzoM-BD-k z4;Tz9@G^h!G-B3LOn435t*>p@arVktzWoi_go|DtwFafdxR_bnQaMYS2oT*8n1D?Q?|~kaE8JC$7e|k9!9LMTr{Dkp2?3eK9Z3+-n;DZ zu{5tKnCzk#+>0vH`=sjF*(vI-#>Q|{wU5r?+9=x$5mYSOq_eY(rn!C4~%Fw;#~*y^XYFp z*PDmyYNi*t`SVIItAMJ{oeCNox~*0XR7~F5ahAM2BbLYteVxaO|LNxwMTc>IvFV9t zj8hK|+;~yVz;DW|Y>#*U#c-?I*07>#>YV=M6JcUY0;A*HR)h6wp=tLD>>AwWtNfs` zpmpaGgWlezGK`F+nUoc)C;EwZlkkc$=jeOK#;nj|a@&~P_Ry#vPwU@?D!I@)Fry@G ze!|sFQn!PTH@NTrPWAPNO#?by3&6nSeU0{aQ(wH9_`1Ysqa@I5;a&Hhd?uq}*tF_k zoLDb=Z->Q`g^s2Uk2dV5Fgh0Ax3L=DassQa9bDp_(3|!H$gxOS@In3O0n(asm|BM> P5ysPXzDto)*qZ+W{>^N0 literal 0 HcmV?d00001 diff --git a/game/textures/water.png.import b/game/textures/water.png.import new file mode 100644 index 0000000..8145f42 --- /dev/null +++ b/game/textures/water.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/water.png-fc6d8597996cbe40611cc540182aeb29.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://game/textures/water.png" +dest_files=[ "res://.import/water.png-fc6d8597996cbe40611cc540182aeb29.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/textures/wieldhand.png b/game/textures/wieldhand.png new file mode 100644 index 0000000000000000000000000000000000000000..5e072fa1fcfcb87a10e48363ebf157216fa4ca74 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^Sx`hx!eY+M3ZRf=iEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8f1gPZ!4!i_>o>81gka2)N#Vr6iQ3)Vguu2eUgJ)+aijn5kR} z43OCLXkDcAO^t;SO-nETNiq8T?7!f(sA*TaTEDXYVNh5;t28o#VX>%D$DC!6dV6Gh zruT;Z6a2N#m2Ki>#z(vykB`KfM18Ee^W3)Z)uS~W@$q%dX|58V+6x~&U!ccrcQwOR zLj6mu_x-JF%%h(t*l4etZk#zSczSE_fqS#M?mj%Sb|pi{H}@2Q&W~@n=bVq4Q60m; Q4s<$$r>mdKI;Vst0Mz4sk^lez literal 0 HcmV?d00001 diff --git a/game/textures/wieldhand.png.import b/game/textures/wieldhand.png.import new file mode 100644 index 0000000..4ce5181 --- /dev/null +++ b/game/textures/wieldhand.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/wieldhand.png-dbc36933fe5deed47aeeb403693393fd.s3tc.stex" +path.etc2="res://.import/wieldhand.png-dbc36933fe5deed47aeeb403693393fd.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://game/textures/wieldhand.png" +dest_files=[ "res://.import/wieldhand.png-dbc36933fe5deed47aeeb403693393fd.s3tc.stex", "res://.import/wieldhand.png-dbc36933fe5deed47aeeb403693393fd.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8cac7f196b616a4c7c7337cc8445308d07fa5a GIT binary patch literal 5824 zcmeHKdpJ~U7au9PhC)PU8l8%o`+YLWEu35?wO`e{d!*a*oqu|s@B6QrXZGy9*6;nTwSMo~@7`}L-PS@$ewjQ3 z0#UNEG_wc)RU|)I8Sn^wJ;Q)N7UTyzx`^x ztDM!c9|P62BB!FBOkKRIh@D<%K1t~r%6!)Qd+4FwN87bklNMMWpSUyLHXWUqGin`^ zmU5akA-A|z-MZs>?kK7A%HyH^H&T|C1!?G5>gKec%vdyYCM6`^J zI`5`e)sOTYGxzCDgi#_Z+7?jf9nfuD^V|29Qcq8H=iFLh^eW{e>qwBrKw2y54T-+TzD(-LqqGsN zFw5MjO-A#Y0wz{BRnpRTjnoZJKJ6aQIMI}0YPZ!Sa&sHyA?(V z1@vZ(Olub;sHDl+Fg{AhJx%SLL$(z&F@Bk~BKLY+YpG0@Mtn#>e|m{bN7O$pqRxZk znGr716`_pD4wLQq9RGOD1M4H&RHIY_$b~y+Zoj^iMcG=vWLxN-1?Anp%cmA3ZRhc& zRMJTa{Q)mSdW{seD$jo!fO{HV=d8X(??i{I-!oE+Zk%e);Ie_x`PJqv%NdG6F!v?% zG8cD_x~+#B)-C=v%ys0Cj!g@?@2F|NtA8lbm1{tTVf$Xo%A#bue zw9ovs+8RWX+m-V0?8DD5M84D@0y*nF{+8fH5mroU8lU8rS>PPxjARkQbI|xYur0yrR~B>xc8Bi>u6~Y zq>4(jg4Fz??Wx<&s$^_yLEO7|FK(Wa`T0B>C$d%*%?_`=gW#eUIY@y|iYkA~U*D z7PstJXJSmxz7}P<<@$haeW*MF7Og=jP!cxtE$TH2g2Tt7+SGfmrz)xJ4<*Q1Y5qYx z_0*Ijh3PE$RB++1KL=u+K9;=^LlI>Au|Ef!5|D7;a??Tsi0dCzhHCO=r=|;gYwDvM zQh!_4)T$A$IKbER(C%ME(i=N0eNk{vH5Yk{P~vEuL_415QtBrz?HX)-X?%V>G9%w| zb>X8xh5aIb6JvFwA%RQiKB!F%VJ z+2dpRe!f|8=cghv`)N8it_ZFrQ1#DdhIGDNbpb+pn%5YxwyIUnMq!;9EzBI+wzLky zS!#POhx4~$#8ZNo`~_D>{TQd+zgg^P816HK7O3zNrdKbqc(Bp<$>}Zid88fk6B)IC z1maTvj>la+dtMqC>BvKzs8F(A9nj*m+@ernVfEGE=S$u#C&fO&hyb{LrH#mqn&`DY zh?42s5ZLXW4(~X5rgn+$mFxh2W$u;J^>++>fop&;2I zpJUM8wfJyUqubsE2NlbX(wE(lE44_MDand<4n8#=at~|gFT%?d{H1(nkcArdE*gy8 z6fp2m)wQR_PyLSchbD4uMp?n)i-z(C6jRRlIMq?(do)KKa_TEJlJc2l4c)KwIk$3x zH<0}EhNUuO!Z^e`4l=3E>&s7YdJw~C+r4P5^kCyY!}GnHSQ4;e3p#tovh?8(te z(^|d**I^Aw$D`yLpoD~e6_!DdXh<#eWf~7nfk^FR zo0`(COijNm-Qa?q5t2-^tl6kjx67dzu5P?GhCKiLiFGjt$iJ%}bk8nQclAe?zEMcW zuhd5-MEcyknOJvW@4>>$i!MjPrlk4@2Tu>ffBS^eFN*o6?>cn+1?@$zl*y%9$3o^j zI-$|hOwWT_Xz+e#>%LG$c+{5IwBU86sU}?${>sX`#%~$seJnMy$Uj8T>Qjv!O69uL zYS-e9AH5%Rl3Xo+$YhVLA-82gEVL9^K7E@qex({Gy~zM$rvuY?jaXNLUaM&^f%l_t zA>3X10J%1!gq(Lq-lsdIs^#P(=RlsCH_6m+FRx~l8^9a1L48<)EeTOCtuNUp%|b6X@f%HiFGNSADEPVd^zgyt%5 zJW%FZDYa-(1U>U=dsjtyd2vZtGyeStsRA`Yb-Vpg75I$RWP{IA7aMCTljnC_@;n2+cH=HI0V}|GJ}1X z6c*fQgS?@b3KIANA_h$C%i#*CVj6swmkORs%qTc)79#SY!Ch?VFjJlYfZ>sNBpP8Z zW(Q#58{}bz0+uJ$-fYtx1$ae+dy7PTDhd@C7>EqSA$bBX6ox{fpwL(p7K;E82w@Oc z#1JF6LOlt^XAUz!$P}>oA~uf;lW;OTc>W?991i+nU-I+i+t_@i=L+Xk0QEqL8GIB5 ziAMSQqP`y?6qyHrBy$P<>jifhxq|7VtalQ>xbMVp4oD~PXrA2mH!9ym)d8+ zAj-yuYQ|&wOM+UN(cqGNsVp9o&7#hpVn}EL4vQlo@SXq#JYY!(4>X31V3Gkm6Gy}o z0T0G^R90M}h{0t75-N}!$p(2miJlZJct8N2WW0oegj5L_C2b zkH?|GCE3Cxl(P*EGyFU)mTV!22$J;tT-Q4QexI*C-vk`?tP2L4ZComY`8kM?5dg4e z1A*f{yO`b#t``8_;d3qZ#m@e>>B5jH;7s8VI10%FfhVCc2oDB;H%k^admnqOlkRnux%V9kDnn9!td#;i$P{ zQIdQ5OSOim|I)*77VzC70FL`?0~Z%?twMcWtmgERNceyJ%+169F#<^aE67jj`%A80 za{ZJ7KL!5PUBBe|DFuEC{HweEXL8AZ+wK5d@C_&s+|2B8H`xnrgk(H6TbMy+B;TwX zxhbGUj&He52!SXpk^H0}=^2`!aiPe{#(d#`%wlx|m1BmJufXkYkCmCRBe}6SrP*hR zvDzIYo+qhuWl=KW^jUqED0{;-2wITp1pHK%>|4}JXwoN#;EDcSF!{_kEe^$W{I&kX z4kEEr6zDY+)L|)i2Brp8*OXI?`QX#b_F8eunvXqOqDhZmC2EX>uH*WF6YG-3%BKrJ&TJ9tZ`awN0gWTQYj2rN*!smjh>2>6BqSxQsQ8prTKplVAoqmk;~v;Y!NS*XwMKdU zYw2>08tq4QTescVU)nMslh=N@8ZZfkbg#69vqcR&>k literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..9775d8b --- /dev/null +++ b/icon.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex" +path.etc2="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex", "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/main.gd b/main.gd new file mode 100644 index 0000000..35ab32d --- /dev/null +++ b/main.gd @@ -0,0 +1,7 @@ +extends Spatial + +func _init(): + core.main = self + set_process(false) +func close_msg(): + $exitmsg.visible = false diff --git a/main.tscn b/main.tscn new file mode 100644 index 0000000..a144538 --- /dev/null +++ b/main.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://engine/MainManu/MainManu.tscn" type="PackedScene" id=1] +[ext_resource path="res://engine/WAEditor/WAEditor.tscn" type="PackedScene" id=2] +[ext_resource path="res://main.gd" type="Script" id=3] +[ext_resource path="res://engine/ui/ui.tscn" type="PackedScene" id=4] +[ext_resource path="res://engine/loader/loader.tscn" type="PackedScene" id=5] + +[sub_resource type="Environment" id=1] +background_mode = 1 +background_color = Color( 0.447059, 0.666667, 0.858824, 1 ) +ambient_light_color = Color( 1, 1, 1, 1 ) + +[node name="main" type="Spatial"] +pause_mode = 2 +script = ExtResource( 3 ) + +[node name="MainManu" parent="." instance=ExtResource( 1 )] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource( 1 ) + +[node name="Editor" parent="." instance=ExtResource( 2 )] +visible = false + +[node name="ui" parent="." instance=ExtResource( 4 )] +visible = false + +[node name="exitmsg" type="ColorRect" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0.2, 0.2, 0.2, 0.92 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="center" type="CenterContainer" parent="exitmsg"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -512.0 +margin_bottom = -300.0 +rect_scale = Vector2( 2, 2 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="text" type="Label" parent="exitmsg/center"] +margin_left = 171.0 +margin_top = 134.0 +margin_right = 340.0 +margin_bottom = 165.0 +custom_colors/font_color = Color( 1, 1, 0, 1 ) +text = "A fatal error occoupted. +No information about that." +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="close" type="Button" parent="exitmsg"] +anchor_left = 0.5 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -23.0 +margin_top = 514.0 +margin_right = 24.0 +margin_bottom = -50.0 +text = "Close" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="loader" parent="." instance=ExtResource( 5 )] +visible = false + +[connection signal="pressed" from="exitmsg/close" to="." method="close_msg"] diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..480896a --- /dev/null +++ b/project.godot @@ -0,0 +1,121 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +[application] + +config/name="Mineshafts" +run/main_scene="res://main.tscn" +config/use_custom_user_dir=true +config/custom_user_dir_name="Mineshafts" +config/icon="res://icon.png" + +[autoload] + +mapgen="*res://engine/mapgen.gd" +core="*res://engine/core.gd" +WaEngine="*res://engine/WAEditor/WAEngine.gd" +item2texture="*res://engine/item_to_texture/item_to_texture.tscn" +GUI="*res://engine/gui.gd" +GameBase="*res://game/game_base.gd" +GameItems="*res://game/game_items.gd" + +[debug] + +gdscript/warnings/unused_argument=false +gdscript/warnings/return_value_discarded=false + +[display] + +window/stretch/mode="2d" + +[editor_plugins] + +enabled=PoolStringArray( "res://addons/brackets/plugin.cfg" ) + +[importer_defaults] + +texture={ +"compress/bptc_ldr": 0, +"compress/hdr_mode": 0, +"compress/lossy_quality": 0.7, +"compress/mode": 2, +"compress/normal_map": 0, +"detect_3d": false, +"flags/anisotropic": false, +"flags/filter": false, +"flags/mipmaps": true, +"flags/repeat": true, +"flags/srgb": 1, +"process/HDR_as_SRGB": false, +"process/fix_alpha_border": false, +"process/invert_color": false, +"process/premult_alpha": false, +"size_limit": 0, +"stream": false, +"svg/scale": 1.0 +} + +[input] + +fly_mode={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null) + ] +} +LMB={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +} +RMB={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) + ] +} +SCREENSHOT={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":80,"unicode":0,"echo":false,"script":null) + ] +} +WHEEL_UP={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null) + ] +} +WHEEL_DOWN={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null) + ] +} +switch_index_side={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"unicode":0,"echo":false,"script":null) + ] +} +use={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":69,"unicode":0,"echo":false,"script":null) + ] +} +throw_item={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":86,"unicode":0,"echo":false,"script":null) + ] +} +actioneditor={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":85,"unicode":0,"echo":false,"script":null) + ] +} + +[rendering] + +environment/default_environment="res://default_env.tres" +quality/dynamic_fonts/use_oversampling=false