diff --git a/project/blocky_game/blocks/block.gd b/project/blocky_game/blocks/block.gd index 37143be..26347d9 100644 --- a/project/blocky_game/blocks/block.gd +++ b/project/blocky_game/blocks/block.gd @@ -21,3 +21,6 @@ class BaseInfo: var base_info := BaseInfo.new() +func place(_voxel_tool: VoxelTool, _pos: Vector3, _look_dir: Vector3): + pass + diff --git a/project/blocky_game/blocky_game.tscn b/project/blocky_game/blocky_game.tscn index 98fe9a4..9a62bd1 100644 --- a/project/blocky_game/blocky_game.tscn +++ b/project/blocky_game/blocky_game.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=2] +[gd_scene load_steps=17 format=2] [ext_resource path="res://blocky_game/blocks/voxel_library.tres" type="VoxelLibrary" id=1] [ext_resource path="res://blocky_game/blocks/terrain_material.tres" type="Material" id=2] @@ -12,6 +12,7 @@ [ext_resource path="res://blocky_game/random_ticks.gd" type="Script" id=10] [ext_resource path="res://blocky_game/water.gd" type="Script" id=11] [ext_resource path="res://blocky_game/blocks/blocks.gd" type="Script" id=12] +[ext_resource path="res://blocky_game/items/item_db.gd" type="Script" id=13] [sub_resource type="ProceduralSky" id=1] sky_top_color = Color( 0.268204, 0.522478, 0.847656, 1 ) @@ -51,6 +52,9 @@ script = ExtResource( 5 ) [node name="Blocks" type="Node" parent="."] script = ExtResource( 12 ) +[node name="Items" type="Node" parent="."] +script = ExtResource( 13 ) + [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource( 2 ) diff --git a/project/blocky_game/gui/inventory/inventory.gd b/project/blocky_game/gui/inventory/inventory.gd index 258bf2d..a94f699 100644 --- a/project/blocky_game/gui/inventory/inventory.gd +++ b/project/blocky_game/gui/inventory/inventory.gd @@ -26,12 +26,16 @@ func _ready(): # Initial contents var hotbar_begin_index := BAG_WIDTH * BAG_HEIGHT - var hotbar_block_ids := [1, 2, 3, 4, 5, 6, 7, 8, 9] - for i in BAG_WIDTH: - var item := InventoryItem.new() - item.type = InventoryItem.TYPE_BLOCK - item.id = hotbar_block_ids[i] - _slots[hotbar_begin_index + i] = item + _slots[hotbar_begin_index + 0] = _make_item(InventoryItem.TYPE_BLOCK, 1) + _slots[hotbar_begin_index + 1] = _make_item(InventoryItem.TYPE_BLOCK, 2) + _slots[hotbar_begin_index + 2] = _make_item(InventoryItem.TYPE_BLOCK, 3) + _slots[hotbar_begin_index + 3] = _make_item(InventoryItem.TYPE_BLOCK, 4) + _slots[hotbar_begin_index + 4] = _make_item(InventoryItem.TYPE_BLOCK, 5) + _slots[hotbar_begin_index + 5] = _make_item(InventoryItem.TYPE_BLOCK, 6) + _slots[hotbar_begin_index + 6] = _make_item(InventoryItem.TYPE_BLOCK, 7) + _slots[hotbar_begin_index + 7] = _make_item(InventoryItem.TYPE_ITEM, 0) + _slots[hotbar_begin_index + 8] = _make_item(InventoryItem.TYPE_BLOCK, 9) + _slots[0] = _make_item(InventoryItem.TYPE_BLOCK, 8) # Init views var slot_idx := 0 @@ -45,6 +49,13 @@ func _ready(): slot_idx += 1 +static func _make_item(type, id): + var i = InventoryItem.new() + i.id = id + i.type = type + return i + + func _update_views(): var slot_idx := 0 for container in [_bag_container, _hotbar_container]: diff --git a/project/blocky_game/gui/inventory_item_display.gd b/project/blocky_game/gui/inventory_item_display.gd index 3ea755d..1d4f5bf 100644 --- a/project/blocky_game/gui/inventory_item_display.gd +++ b/project/blocky_game/gui/inventory_item_display.gd @@ -1,10 +1,11 @@ extends TextureRect const InventoryItem = preload("res://blocky_game/player/inventory_item.gd") -const DefaultTexture = preload("res://icon.png") const Blocks = preload("../blocks/blocks.gd") +const ItemDB = preload("../items/item_db.gd") onready var _block_types : Blocks = get_node("/root/Main/Blocks") +onready var _item_db : ItemDB = get_node("/root/Main/Items") func set_item(data: InventoryItem): @@ -16,8 +17,8 @@ func set_item(data: InventoryItem): texture = block.base_info.sprite_texture elif data.type == InventoryItem.TYPE_ITEM: - # TODO Items db - texture = DefaultTexture + var item := _item_db.get_item(data.id) + texture = item.base_info.sprite else: assert(false) diff --git a/project/blocky_game/items/item.gd b/project/blocky_game/items/item.gd new file mode 100644 index 0000000..4cd9f22 --- /dev/null +++ b/project/blocky_game/items/item.gd @@ -0,0 +1,15 @@ +extends Node + + +class BaseInfo: + var id := 0 + var name := "" + var sprite : Texture + + +var base_info := BaseInfo.new() + + +func use(_trans: Transform): + pass + diff --git a/project/blocky_game/items/item_db.gd b/project/blocky_game/items/item_db.gd new file mode 100644 index 0000000..fa70749 --- /dev/null +++ b/project/blocky_game/items/item_db.gd @@ -0,0 +1,38 @@ +extends Node + +const ROOT = "res://blocky_game/items" + +const Item = preload("./item.gd") + + +var _items := [] + + +func _init(): + _create_item({ + "name": "rocket_launcher", + "behavior": "rocket_launcher.gd" + }) + + +func get_item(id: int) -> Item: + assert(id >= 0) + return _items[id] + + +func _create_item(d: Dictionary): + var dir = str(ROOT, "/", d.name, "/") + + var item : Item + if d.has("behavior"): + var behavior_script = load(str(dir, d.name, ".gd")) + item = behavior_script.new() + else: + item = Item.new() + + var base_info = item.base_info + base_info.id = len(_items) + base_info.name = d.name + base_info.sprite = load(str(dir, d.name, "_sprite.png")) + _items.append(item) + add_child(item) diff --git a/project/blocky_game/items/rocket_launcher/debris.gd b/project/blocky_game/items/rocket_launcher/debris.gd new file mode 100644 index 0000000..bf73fa5 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/debris.gd @@ -0,0 +1,51 @@ +extends Spatial + +const GRAVITY = Vector3(0, -14, 0) +const LIFETIME = 3.0 + +onready var _mesh_instance = $MeshInstance +onready var _terrain : VoxelTerrain = get_node("/root/Main/VoxelTerrain") +onready var _terrain_tool := _terrain.get_voxel_tool() + + +var _velocity := Vector3() +var _rotation_axis := Vector3() +var _angular_velocity := 4.0 * TAU * rand_range(-1.0, 1.0) +var _remaining_time := rand_range(0.5, 1.5) * LIFETIME + + +func _ready(): + rotation = Vector3(rand_range(-PI, PI), rand_range(-PI, PI), rand_range(-PI, PI)) + scale = Vector3(rand_range(0.5, 1.5), rand_range(0.5, 1.5), rand_range(0.5, 1.5)) + _rotation_axis = \ + Vector3(rand_range(-PI, PI), rand_range(-PI, PI), rand_range(-PI, PI)).normalized() + + +func set_velocity(vel: Vector3): + _velocity = vel + + +func _process(delta: float): + _remaining_time -= delta + if _remaining_time <= 0: + queue_free() + return + + _velocity += GRAVITY * delta + + var trans := transform + + trans.basis = trans.basis.rotated(_rotation_axis, _angular_velocity * delta) + + var motion := _velocity * delta + var hit := _terrain_tool.raycast(trans.origin, motion.normalized(), motion.length() * 1.01) + if hit != null: + # BOUNCE + var normal = hit.previous_position - hit.position + _velocity = _velocity.bounce(normal) + # Damp on impact + _velocity *= 0.5 + _angular_velocity *= 0.5 + + trans.origin += _velocity * delta + transform = trans diff --git a/project/blocky_game/items/rocket_launcher/debris.tscn b/project/blocky_game/items/rocket_launcher/debris.tscn new file mode 100644 index 0000000..c31cde8 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/debris.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://blocky_game/items/rocket_launcher/debris.gd" type="Script" id=1] + +[sub_resource type="CubeMesh" id=1] +size = Vector3( 0.3, 0.3, 0.3 ) + +[sub_resource type="SpatialMaterial" id=2] +albedo_color = Color( 0.458824, 0.266667, 0.0980392, 1 ) + +[node name="Debris" type="Spatial"] +script = ExtResource( 1 ) + +[node name="MeshInstance" type="MeshInstance" parent="."] +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) diff --git a/project/blocky_game/items/rocket_launcher/rocket.gd b/project/blocky_game/items/rocket_launcher/rocket.gd new file mode 100644 index 0000000..8af3a9f --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket.gd @@ -0,0 +1,55 @@ +extends Spatial + +const LIFETIME = 10.0 + +const DebrisScene = preload("./debris.tscn") +const ExplosionScene = preload("./rocket_explosion.tscn") + +onready var _terrain : VoxelTerrain = get_node("../VoxelTerrain") +onready var _terrain_tool := _terrain.get_voxel_tool() + +var _direction := Vector3(0, 0, 1) +var _speed := 20.0 +var _remaining_time := LIFETIME + + +func set_direction(direction: Vector3): + assert(is_inside_tree()) + direction += Vector3(0.0001, 0.0001, 0.001) # Haaaaak + _direction = direction.normalized() + look_at(global_transform.origin + _direction, Vector3(0, 1, 0)) + + +func _physics_process(delta: float): + _remaining_time -= delta + if _remaining_time <= 0: + queue_free() + return + + var trans = global_transform + var crossed_distance := _speed * delta + var motion := crossed_distance * _direction + + var hit = _terrain_tool.raycast(trans.origin, _direction, crossed_distance) + if hit != null: + # EXPLODE + _terrain_tool.do_sphere(hit.position, 4.0) + + var explosion = ExplosionScene.instance() + explosion.translation = trans.origin + get_parent().add_child(explosion) + + # Create debris + for i in 30: + var debris = DebrisScene.instance() + var debris_velocity := \ + Vector3(rand_range(-1, 1), rand_range(-1, 1), rand_range(-1, 1)).normalized() + debris_velocity *= rand_range(5.0, 30.0) + debris.set_velocity(debris_velocity) + debris.translation = trans.origin + get_parent().add_child(debris) + queue_free() + + else: + trans.origin += motion + global_transform = trans diff --git a/project/blocky_game/items/rocket_launcher/rocket.tscn b/project/blocky_game/items/rocket_launcher/rocket.tscn new file mode 100644 index 0000000..8d4eafd --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://blocky_game/items/rocket_launcher/rocket.gd" type="Script" id=1] + +[sub_resource type="CylinderMesh" id=1] +top_radius = 0.1 +bottom_radius = 0.3 +height = 1.0 +radial_segments = 8 + +[node name="Rocket" type="Spatial"] +script = ExtResource( 1 ) + +[node name="MeshInstance" type="MeshInstance" parent="."] +transform = Transform( -1, -3.25841e-07, 5.30863e-14, 0, -1.62921e-07, -1, 3.25841e-07, -1, 1.62921e-07, 0, 0, 0 ) +mesh = SubResource( 1 ) +material/0 = null diff --git a/project/blocky_game/items/rocket_launcher/rocket_explosion.gd b/project/blocky_game/items/rocket_launcher/rocket_explosion.gd new file mode 100644 index 0000000..f5c9080 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_explosion.gd @@ -0,0 +1,11 @@ +extends Spatial + +onready var _particles = $Particles + + +func _ready(): + _particles.emitting = true + + +func _on_Timer_timeout(): + queue_free() diff --git a/project/blocky_game/items/rocket_launcher/rocket_explosion.tscn b/project/blocky_game/items/rocket_launcher/rocket_explosion.tscn new file mode 100644 index 0000000..8cc1297 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_explosion.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://blocky_game/items/rocket_launcher/smoke_particle.png" type="Texture" id=1] +[ext_resource path="res://blocky_game/items/rocket_launcher/rocket_explosion.gd" type="Script" id=2] + + +[sub_resource type="SpatialMaterial" id=1] +flags_transparent = true +vertex_color_use_as_albedo = true +params_billboard_mode = 3 +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false +albedo_texture = ExtResource( 1 ) + +[sub_resource type="Gradient" id=2] +colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 ) + +[sub_resource type="GradientTexture" id=3] +gradient = SubResource( 2 ) +width = 64 + +[sub_resource type="Curve" id=6] +_data = [ Vector2( 0, 0.364035 ), 0.0, 6.99055, 0, 0, Vector2( 0.0810811, 0.723684 ), 0.0, 0.0, 0, 0, Vector2( 1, 0.399123 ), 0.0, 0.0, 0, 0 ] + +[sub_resource type="CurveTexture" id=7] +curve = SubResource( 6 ) + +[sub_resource type="ParticlesMaterial" id=4] +render_priority = -1 +direction = Vector3( 0, 1, 0 ) +spread = 170.0 +gravity = Vector3( 0, 1, 0 ) +initial_velocity = 10.0 +initial_velocity_random = 0.51 +linear_accel = -6.0 +scale = 10.0 +scale_random = 0.39 +scale_curve = SubResource( 7 ) +color_ramp = SubResource( 3 ) + +[sub_resource type="QuadMesh" id=5] + +[node name="RocketExplosion" type="Spatial"] +script = ExtResource( 2 ) + +[node name="Particles" type="Particles" parent="."] +material_override = SubResource( 1 ) +emitting = false +amount = 15 +lifetime = 2.0 +one_shot = true +explosiveness = 0.95 +process_material = SubResource( 4 ) +draw_pass_1 = SubResource( 5 ) + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +transform = Transform( 1, 0, 0, 0, 0.790016, 0.613086, 0, -0.613086, 0.790016, 0, 3.14598, 4.16366 ) +editor_only = true + +[node name="Timer" type="Timer" parent="."] +wait_time = 3.0 +autostart = true +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.bin b/project/blocky_game/items/rocket_launcher/rocket_launcher.bin new file mode 100644 index 0000000..352af63 Binary files /dev/null and b/project/blocky_game/items/rocket_launcher/rocket_launcher.bin differ diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.gd b/project/blocky_game/items/rocket_launcher/rocket_launcher.gd new file mode 100644 index 0000000..126df18 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher.gd @@ -0,0 +1,15 @@ +extends "../item.gd" + +const RocketScene = preload("./rocket.tscn") + +onready var _world = get_node("/root/Main") + + +func use(trans: Transform): + var rocket = RocketScene.instance() + rocket.translation = trans.origin + _world.add_child(rocket) + print("Launch rocket at ", rocket.translation) + var forward = -trans.basis.z.normalized() + rocket.set_direction(forward) + diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf b/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf new file mode 100644 index 0000000..e893b17 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf @@ -0,0 +1,145 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.2.75", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "RocketLauncher", + "rotation" : [ + 0, + 0.19509032368659973, + 0, + 0.9807852506637573 + ] + } + ], + "materials" : [ + { + "doubleSided" : true, + "emissiveFactor" : [ + 0, + 0, + 0 + ], + "name" : "rocket_launcher_mat", + "pbrMetallicRoughness" : { + "baseColorTexture" : { + "index" : 0, + "texCoord" : 0 + }, + "metallicFactor" : 0, + "roughnessFactor" : 1 + } + } + ], + "meshes" : [ + { + "name" : "Cylinder.001", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3, + "material" : 0 + } + ] + } + ], + "textures" : [ + { + "sampler" : 0, + "source" : 0 + } + ], + "images" : [ + { + "mimeType" : "image/png", + "name" : "rocket_launcher", + "uri" : "rocket_launcher.png" + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 358, + "max" : [ + 0.49119770526885986, + 0.34520694613456726, + 1.5060045719146729 + ], + "min" : [ + -0.8064760565757751, + -0.6934827566146851, + -0.9066932797431946 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 358, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 358, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 516, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 4296, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 4296, + "byteOffset" : 4296 + }, + { + "buffer" : 0, + "byteLength" : 2864, + "byteOffset" : 8592 + }, + { + "buffer" : 0, + "byteLength" : 1032, + "byteOffset" : 11456 + } + ], + "samplers" : [ + { + "magFilter" : 9728, + "minFilter" : 9984 + } + ], + "buffers" : [ + { + "byteLength" : 12488, + "uri" : "rocket_launcher.bin" + } + ] +} diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf.import b/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf.import new file mode 100644 index 0000000..65dc805 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher.gltf.import @@ -0,0 +1,1063 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/rocket_launcher.gltf-ded10881832c42fb1322c6c995faaaef.scn" + +[deps] + +source_file="res://blocky_game/items/rocket_launcher/rocket_launcher.gltf" +dest_files=[ "res://.import/rocket_launcher.gltf-ded10881832c42fb1322c6c995faaaef.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +materials/location=1 +materials/storage=2 +materials/keep_on_reimport=true +meshes/compress=true +meshes/ensure_tangents=true +meshes/storage=0 +meshes/light_baking=0 +meshes/lightmap_texel_size=0.1 +skins/use_named_skins=true +external_files/store_in_subdir=false +animation/import=true +animation/fps=15 +animation/filter_script="" +animation/storage=false +animation/keep_custom_tracks=false +animation/optimizer/enabled=true +animation/optimizer/max_linear_error=0.05 +animation/optimizer/max_angular_error=0.01 +animation/optimizer/max_angle=22 +animation/optimizer/remove_unused_tracks=true +animation/clips/amount=0 +animation/clip_1/name="" +animation/clip_1/start_frame=0 +animation/clip_1/end_frame=0 +animation/clip_1/loops=false +animation/clip_2/name="" +animation/clip_2/start_frame=0 +animation/clip_2/end_frame=0 +animation/clip_2/loops=false +animation/clip_3/name="" +animation/clip_3/start_frame=0 +animation/clip_3/end_frame=0 +animation/clip_3/loops=false +animation/clip_4/name="" +animation/clip_4/start_frame=0 +animation/clip_4/end_frame=0 +animation/clip_4/loops=false +animation/clip_5/name="" +animation/clip_5/start_frame=0 +animation/clip_5/end_frame=0 +animation/clip_5/loops=false +animation/clip_6/name="" +animation/clip_6/start_frame=0 +animation/clip_6/end_frame=0 +animation/clip_6/loops=false +animation/clip_7/name="" +animation/clip_7/start_frame=0 +animation/clip_7/end_frame=0 +animation/clip_7/loops=false +animation/clip_8/name="" +animation/clip_8/start_frame=0 +animation/clip_8/end_frame=0 +animation/clip_8/loops=false +animation/clip_9/name="" +animation/clip_9/start_frame=0 +animation/clip_9/end_frame=0 +animation/clip_9/loops=false +animation/clip_10/name="" +animation/clip_10/start_frame=0 +animation/clip_10/end_frame=0 +animation/clip_10/loops=false +animation/clip_11/name="" +animation/clip_11/start_frame=0 +animation/clip_11/end_frame=0 +animation/clip_11/loops=false +animation/clip_12/name="" +animation/clip_12/start_frame=0 +animation/clip_12/end_frame=0 +animation/clip_12/loops=false +animation/clip_13/name="" +animation/clip_13/start_frame=0 +animation/clip_13/end_frame=0 +animation/clip_13/loops=false +animation/clip_14/name="" +animation/clip_14/start_frame=0 +animation/clip_14/end_frame=0 +animation/clip_14/loops=false +animation/clip_15/name="" +animation/clip_15/start_frame=0 +animation/clip_15/end_frame=0 +animation/clip_15/loops=false +animation/clip_16/name="" +animation/clip_16/start_frame=0 +animation/clip_16/end_frame=0 +animation/clip_16/loops=false +animation/clip_17/name="" +animation/clip_17/start_frame=0 +animation/clip_17/end_frame=0 +animation/clip_17/loops=false +animation/clip_18/name="" +animation/clip_18/start_frame=0 +animation/clip_18/end_frame=0 +animation/clip_18/loops=false +animation/clip_19/name="" +animation/clip_19/start_frame=0 +animation/clip_19/end_frame=0 +animation/clip_19/loops=false +animation/clip_20/name="" +animation/clip_20/start_frame=0 +animation/clip_20/end_frame=0 +animation/clip_20/loops=false +animation/clip_21/name="" +animation/clip_21/start_frame=0 +animation/clip_21/end_frame=0 +animation/clip_21/loops=false +animation/clip_22/name="" +animation/clip_22/start_frame=0 +animation/clip_22/end_frame=0 +animation/clip_22/loops=false +animation/clip_23/name="" +animation/clip_23/start_frame=0 +animation/clip_23/end_frame=0 +animation/clip_23/loops=false +animation/clip_24/name="" +animation/clip_24/start_frame=0 +animation/clip_24/end_frame=0 +animation/clip_24/loops=false +animation/clip_25/name="" +animation/clip_25/start_frame=0 +animation/clip_25/end_frame=0 +animation/clip_25/loops=false +animation/clip_26/name="" +animation/clip_26/start_frame=0 +animation/clip_26/end_frame=0 +animation/clip_26/loops=false +animation/clip_27/name="" +animation/clip_27/start_frame=0 +animation/clip_27/end_frame=0 +animation/clip_27/loops=false +animation/clip_28/name="" +animation/clip_28/start_frame=0 +animation/clip_28/end_frame=0 +animation/clip_28/loops=false +animation/clip_29/name="" +animation/clip_29/start_frame=0 +animation/clip_29/end_frame=0 +animation/clip_29/loops=false +animation/clip_30/name="" +animation/clip_30/start_frame=0 +animation/clip_30/end_frame=0 +animation/clip_30/loops=false +animation/clip_31/name="" +animation/clip_31/start_frame=0 +animation/clip_31/end_frame=0 +animation/clip_31/loops=false +animation/clip_32/name="" +animation/clip_32/start_frame=0 +animation/clip_32/end_frame=0 +animation/clip_32/loops=false +animation/clip_33/name="" +animation/clip_33/start_frame=0 +animation/clip_33/end_frame=0 +animation/clip_33/loops=false +animation/clip_34/name="" +animation/clip_34/start_frame=0 +animation/clip_34/end_frame=0 +animation/clip_34/loops=false +animation/clip_35/name="" +animation/clip_35/start_frame=0 +animation/clip_35/end_frame=0 +animation/clip_35/loops=false +animation/clip_36/name="" +animation/clip_36/start_frame=0 +animation/clip_36/end_frame=0 +animation/clip_36/loops=false +animation/clip_37/name="" +animation/clip_37/start_frame=0 +animation/clip_37/end_frame=0 +animation/clip_37/loops=false +animation/clip_38/name="" +animation/clip_38/start_frame=0 +animation/clip_38/end_frame=0 +animation/clip_38/loops=false +animation/clip_39/name="" +animation/clip_39/start_frame=0 +animation/clip_39/end_frame=0 +animation/clip_39/loops=false +animation/clip_40/name="" +animation/clip_40/start_frame=0 +animation/clip_40/end_frame=0 +animation/clip_40/loops=false +animation/clip_41/name="" +animation/clip_41/start_frame=0 +animation/clip_41/end_frame=0 +animation/clip_41/loops=false +animation/clip_42/name="" +animation/clip_42/start_frame=0 +animation/clip_42/end_frame=0 +animation/clip_42/loops=false +animation/clip_43/name="" +animation/clip_43/start_frame=0 +animation/clip_43/end_frame=0 +animation/clip_43/loops=false +animation/clip_44/name="" +animation/clip_44/start_frame=0 +animation/clip_44/end_frame=0 +animation/clip_44/loops=false +animation/clip_45/name="" +animation/clip_45/start_frame=0 +animation/clip_45/end_frame=0 +animation/clip_45/loops=false +animation/clip_46/name="" +animation/clip_46/start_frame=0 +animation/clip_46/end_frame=0 +animation/clip_46/loops=false +animation/clip_47/name="" +animation/clip_47/start_frame=0 +animation/clip_47/end_frame=0 +animation/clip_47/loops=false +animation/clip_48/name="" +animation/clip_48/start_frame=0 +animation/clip_48/end_frame=0 +animation/clip_48/loops=false +animation/clip_49/name="" +animation/clip_49/start_frame=0 +animation/clip_49/end_frame=0 +animation/clip_49/loops=false +animation/clip_50/name="" +animation/clip_50/start_frame=0 +animation/clip_50/end_frame=0 +animation/clip_50/loops=false +animation/clip_51/name="" +animation/clip_51/start_frame=0 +animation/clip_51/end_frame=0 +animation/clip_51/loops=false +animation/clip_52/name="" +animation/clip_52/start_frame=0 +animation/clip_52/end_frame=0 +animation/clip_52/loops=false +animation/clip_53/name="" +animation/clip_53/start_frame=0 +animation/clip_53/end_frame=0 +animation/clip_53/loops=false +animation/clip_54/name="" +animation/clip_54/start_frame=0 +animation/clip_54/end_frame=0 +animation/clip_54/loops=false +animation/clip_55/name="" +animation/clip_55/start_frame=0 +animation/clip_55/end_frame=0 +animation/clip_55/loops=false +animation/clip_56/name="" +animation/clip_56/start_frame=0 +animation/clip_56/end_frame=0 +animation/clip_56/loops=false +animation/clip_57/name="" +animation/clip_57/start_frame=0 +animation/clip_57/end_frame=0 +animation/clip_57/loops=false +animation/clip_58/name="" +animation/clip_58/start_frame=0 +animation/clip_58/end_frame=0 +animation/clip_58/loops=false +animation/clip_59/name="" +animation/clip_59/start_frame=0 +animation/clip_59/end_frame=0 +animation/clip_59/loops=false +animation/clip_60/name="" +animation/clip_60/start_frame=0 +animation/clip_60/end_frame=0 +animation/clip_60/loops=false +animation/clip_61/name="" +animation/clip_61/start_frame=0 +animation/clip_61/end_frame=0 +animation/clip_61/loops=false +animation/clip_62/name="" +animation/clip_62/start_frame=0 +animation/clip_62/end_frame=0 +animation/clip_62/loops=false +animation/clip_63/name="" +animation/clip_63/start_frame=0 +animation/clip_63/end_frame=0 +animation/clip_63/loops=false +animation/clip_64/name="" +animation/clip_64/start_frame=0 +animation/clip_64/end_frame=0 +animation/clip_64/loops=false +animation/clip_65/name="" +animation/clip_65/start_frame=0 +animation/clip_65/end_frame=0 +animation/clip_65/loops=false +animation/clip_66/name="" +animation/clip_66/start_frame=0 +animation/clip_66/end_frame=0 +animation/clip_66/loops=false +animation/clip_67/name="" +animation/clip_67/start_frame=0 +animation/clip_67/end_frame=0 +animation/clip_67/loops=false +animation/clip_68/name="" +animation/clip_68/start_frame=0 +animation/clip_68/end_frame=0 +animation/clip_68/loops=false +animation/clip_69/name="" +animation/clip_69/start_frame=0 +animation/clip_69/end_frame=0 +animation/clip_69/loops=false +animation/clip_70/name="" +animation/clip_70/start_frame=0 +animation/clip_70/end_frame=0 +animation/clip_70/loops=false +animation/clip_71/name="" +animation/clip_71/start_frame=0 +animation/clip_71/end_frame=0 +animation/clip_71/loops=false +animation/clip_72/name="" +animation/clip_72/start_frame=0 +animation/clip_72/end_frame=0 +animation/clip_72/loops=false +animation/clip_73/name="" +animation/clip_73/start_frame=0 +animation/clip_73/end_frame=0 +animation/clip_73/loops=false +animation/clip_74/name="" +animation/clip_74/start_frame=0 +animation/clip_74/end_frame=0 +animation/clip_74/loops=false +animation/clip_75/name="" +animation/clip_75/start_frame=0 +animation/clip_75/end_frame=0 +animation/clip_75/loops=false +animation/clip_76/name="" +animation/clip_76/start_frame=0 +animation/clip_76/end_frame=0 +animation/clip_76/loops=false +animation/clip_77/name="" +animation/clip_77/start_frame=0 +animation/clip_77/end_frame=0 +animation/clip_77/loops=false +animation/clip_78/name="" +animation/clip_78/start_frame=0 +animation/clip_78/end_frame=0 +animation/clip_78/loops=false +animation/clip_79/name="" +animation/clip_79/start_frame=0 +animation/clip_79/end_frame=0 +animation/clip_79/loops=false +animation/clip_80/name="" +animation/clip_80/start_frame=0 +animation/clip_80/end_frame=0 +animation/clip_80/loops=false +animation/clip_81/name="" +animation/clip_81/start_frame=0 +animation/clip_81/end_frame=0 +animation/clip_81/loops=false +animation/clip_82/name="" +animation/clip_82/start_frame=0 +animation/clip_82/end_frame=0 +animation/clip_82/loops=false +animation/clip_83/name="" +animation/clip_83/start_frame=0 +animation/clip_83/end_frame=0 +animation/clip_83/loops=false +animation/clip_84/name="" +animation/clip_84/start_frame=0 +animation/clip_84/end_frame=0 +animation/clip_84/loops=false +animation/clip_85/name="" +animation/clip_85/start_frame=0 +animation/clip_85/end_frame=0 +animation/clip_85/loops=false +animation/clip_86/name="" +animation/clip_86/start_frame=0 +animation/clip_86/end_frame=0 +animation/clip_86/loops=false +animation/clip_87/name="" +animation/clip_87/start_frame=0 +animation/clip_87/end_frame=0 +animation/clip_87/loops=false +animation/clip_88/name="" +animation/clip_88/start_frame=0 +animation/clip_88/end_frame=0 +animation/clip_88/loops=false +animation/clip_89/name="" +animation/clip_89/start_frame=0 +animation/clip_89/end_frame=0 +animation/clip_89/loops=false +animation/clip_90/name="" +animation/clip_90/start_frame=0 +animation/clip_90/end_frame=0 +animation/clip_90/loops=false +animation/clip_91/name="" +animation/clip_91/start_frame=0 +animation/clip_91/end_frame=0 +animation/clip_91/loops=false +animation/clip_92/name="" +animation/clip_92/start_frame=0 +animation/clip_92/end_frame=0 +animation/clip_92/loops=false +animation/clip_93/name="" +animation/clip_93/start_frame=0 +animation/clip_93/end_frame=0 +animation/clip_93/loops=false +animation/clip_94/name="" +animation/clip_94/start_frame=0 +animation/clip_94/end_frame=0 +animation/clip_94/loops=false +animation/clip_95/name="" +animation/clip_95/start_frame=0 +animation/clip_95/end_frame=0 +animation/clip_95/loops=false +animation/clip_96/name="" +animation/clip_96/start_frame=0 +animation/clip_96/end_frame=0 +animation/clip_96/loops=false +animation/clip_97/name="" +animation/clip_97/start_frame=0 +animation/clip_97/end_frame=0 +animation/clip_97/loops=false +animation/clip_98/name="" +animation/clip_98/start_frame=0 +animation/clip_98/end_frame=0 +animation/clip_98/loops=false +animation/clip_99/name="" +animation/clip_99/start_frame=0 +animation/clip_99/end_frame=0 +animation/clip_99/loops=false +animation/clip_100/name="" +animation/clip_100/start_frame=0 +animation/clip_100/end_frame=0 +animation/clip_100/loops=false +animation/clip_101/name="" +animation/clip_101/start_frame=0 +animation/clip_101/end_frame=0 +animation/clip_101/loops=false +animation/clip_102/name="" +animation/clip_102/start_frame=0 +animation/clip_102/end_frame=0 +animation/clip_102/loops=false +animation/clip_103/name="" +animation/clip_103/start_frame=0 +animation/clip_103/end_frame=0 +animation/clip_103/loops=false +animation/clip_104/name="" +animation/clip_104/start_frame=0 +animation/clip_104/end_frame=0 +animation/clip_104/loops=false +animation/clip_105/name="" +animation/clip_105/start_frame=0 +animation/clip_105/end_frame=0 +animation/clip_105/loops=false +animation/clip_106/name="" +animation/clip_106/start_frame=0 +animation/clip_106/end_frame=0 +animation/clip_106/loops=false +animation/clip_107/name="" +animation/clip_107/start_frame=0 +animation/clip_107/end_frame=0 +animation/clip_107/loops=false +animation/clip_108/name="" +animation/clip_108/start_frame=0 +animation/clip_108/end_frame=0 +animation/clip_108/loops=false +animation/clip_109/name="" +animation/clip_109/start_frame=0 +animation/clip_109/end_frame=0 +animation/clip_109/loops=false +animation/clip_110/name="" +animation/clip_110/start_frame=0 +animation/clip_110/end_frame=0 +animation/clip_110/loops=false +animation/clip_111/name="" +animation/clip_111/start_frame=0 +animation/clip_111/end_frame=0 +animation/clip_111/loops=false +animation/clip_112/name="" +animation/clip_112/start_frame=0 +animation/clip_112/end_frame=0 +animation/clip_112/loops=false +animation/clip_113/name="" +animation/clip_113/start_frame=0 +animation/clip_113/end_frame=0 +animation/clip_113/loops=false +animation/clip_114/name="" +animation/clip_114/start_frame=0 +animation/clip_114/end_frame=0 +animation/clip_114/loops=false +animation/clip_115/name="" +animation/clip_115/start_frame=0 +animation/clip_115/end_frame=0 +animation/clip_115/loops=false +animation/clip_116/name="" +animation/clip_116/start_frame=0 +animation/clip_116/end_frame=0 +animation/clip_116/loops=false +animation/clip_117/name="" +animation/clip_117/start_frame=0 +animation/clip_117/end_frame=0 +animation/clip_117/loops=false +animation/clip_118/name="" +animation/clip_118/start_frame=0 +animation/clip_118/end_frame=0 +animation/clip_118/loops=false +animation/clip_119/name="" +animation/clip_119/start_frame=0 +animation/clip_119/end_frame=0 +animation/clip_119/loops=false +animation/clip_120/name="" +animation/clip_120/start_frame=0 +animation/clip_120/end_frame=0 +animation/clip_120/loops=false +animation/clip_121/name="" +animation/clip_121/start_frame=0 +animation/clip_121/end_frame=0 +animation/clip_121/loops=false +animation/clip_122/name="" +animation/clip_122/start_frame=0 +animation/clip_122/end_frame=0 +animation/clip_122/loops=false +animation/clip_123/name="" +animation/clip_123/start_frame=0 +animation/clip_123/end_frame=0 +animation/clip_123/loops=false +animation/clip_124/name="" +animation/clip_124/start_frame=0 +animation/clip_124/end_frame=0 +animation/clip_124/loops=false +animation/clip_125/name="" +animation/clip_125/start_frame=0 +animation/clip_125/end_frame=0 +animation/clip_125/loops=false +animation/clip_126/name="" +animation/clip_126/start_frame=0 +animation/clip_126/end_frame=0 +animation/clip_126/loops=false +animation/clip_127/name="" +animation/clip_127/start_frame=0 +animation/clip_127/end_frame=0 +animation/clip_127/loops=false +animation/clip_128/name="" +animation/clip_128/start_frame=0 +animation/clip_128/end_frame=0 +animation/clip_128/loops=false +animation/clip_129/name="" +animation/clip_129/start_frame=0 +animation/clip_129/end_frame=0 +animation/clip_129/loops=false +animation/clip_130/name="" +animation/clip_130/start_frame=0 +animation/clip_130/end_frame=0 +animation/clip_130/loops=false +animation/clip_131/name="" +animation/clip_131/start_frame=0 +animation/clip_131/end_frame=0 +animation/clip_131/loops=false +animation/clip_132/name="" +animation/clip_132/start_frame=0 +animation/clip_132/end_frame=0 +animation/clip_132/loops=false +animation/clip_133/name="" +animation/clip_133/start_frame=0 +animation/clip_133/end_frame=0 +animation/clip_133/loops=false +animation/clip_134/name="" +animation/clip_134/start_frame=0 +animation/clip_134/end_frame=0 +animation/clip_134/loops=false +animation/clip_135/name="" +animation/clip_135/start_frame=0 +animation/clip_135/end_frame=0 +animation/clip_135/loops=false +animation/clip_136/name="" +animation/clip_136/start_frame=0 +animation/clip_136/end_frame=0 +animation/clip_136/loops=false +animation/clip_137/name="" +animation/clip_137/start_frame=0 +animation/clip_137/end_frame=0 +animation/clip_137/loops=false +animation/clip_138/name="" +animation/clip_138/start_frame=0 +animation/clip_138/end_frame=0 +animation/clip_138/loops=false +animation/clip_139/name="" +animation/clip_139/start_frame=0 +animation/clip_139/end_frame=0 +animation/clip_139/loops=false +animation/clip_140/name="" +animation/clip_140/start_frame=0 +animation/clip_140/end_frame=0 +animation/clip_140/loops=false +animation/clip_141/name="" +animation/clip_141/start_frame=0 +animation/clip_141/end_frame=0 +animation/clip_141/loops=false +animation/clip_142/name="" +animation/clip_142/start_frame=0 +animation/clip_142/end_frame=0 +animation/clip_142/loops=false +animation/clip_143/name="" +animation/clip_143/start_frame=0 +animation/clip_143/end_frame=0 +animation/clip_143/loops=false +animation/clip_144/name="" +animation/clip_144/start_frame=0 +animation/clip_144/end_frame=0 +animation/clip_144/loops=false +animation/clip_145/name="" +animation/clip_145/start_frame=0 +animation/clip_145/end_frame=0 +animation/clip_145/loops=false +animation/clip_146/name="" +animation/clip_146/start_frame=0 +animation/clip_146/end_frame=0 +animation/clip_146/loops=false +animation/clip_147/name="" +animation/clip_147/start_frame=0 +animation/clip_147/end_frame=0 +animation/clip_147/loops=false +animation/clip_148/name="" +animation/clip_148/start_frame=0 +animation/clip_148/end_frame=0 +animation/clip_148/loops=false +animation/clip_149/name="" +animation/clip_149/start_frame=0 +animation/clip_149/end_frame=0 +animation/clip_149/loops=false +animation/clip_150/name="" +animation/clip_150/start_frame=0 +animation/clip_150/end_frame=0 +animation/clip_150/loops=false +animation/clip_151/name="" +animation/clip_151/start_frame=0 +animation/clip_151/end_frame=0 +animation/clip_151/loops=false +animation/clip_152/name="" +animation/clip_152/start_frame=0 +animation/clip_152/end_frame=0 +animation/clip_152/loops=false +animation/clip_153/name="" +animation/clip_153/start_frame=0 +animation/clip_153/end_frame=0 +animation/clip_153/loops=false +animation/clip_154/name="" +animation/clip_154/start_frame=0 +animation/clip_154/end_frame=0 +animation/clip_154/loops=false +animation/clip_155/name="" +animation/clip_155/start_frame=0 +animation/clip_155/end_frame=0 +animation/clip_155/loops=false +animation/clip_156/name="" +animation/clip_156/start_frame=0 +animation/clip_156/end_frame=0 +animation/clip_156/loops=false +animation/clip_157/name="" +animation/clip_157/start_frame=0 +animation/clip_157/end_frame=0 +animation/clip_157/loops=false +animation/clip_158/name="" +animation/clip_158/start_frame=0 +animation/clip_158/end_frame=0 +animation/clip_158/loops=false +animation/clip_159/name="" +animation/clip_159/start_frame=0 +animation/clip_159/end_frame=0 +animation/clip_159/loops=false +animation/clip_160/name="" +animation/clip_160/start_frame=0 +animation/clip_160/end_frame=0 +animation/clip_160/loops=false +animation/clip_161/name="" +animation/clip_161/start_frame=0 +animation/clip_161/end_frame=0 +animation/clip_161/loops=false +animation/clip_162/name="" +animation/clip_162/start_frame=0 +animation/clip_162/end_frame=0 +animation/clip_162/loops=false +animation/clip_163/name="" +animation/clip_163/start_frame=0 +animation/clip_163/end_frame=0 +animation/clip_163/loops=false +animation/clip_164/name="" +animation/clip_164/start_frame=0 +animation/clip_164/end_frame=0 +animation/clip_164/loops=false +animation/clip_165/name="" +animation/clip_165/start_frame=0 +animation/clip_165/end_frame=0 +animation/clip_165/loops=false +animation/clip_166/name="" +animation/clip_166/start_frame=0 +animation/clip_166/end_frame=0 +animation/clip_166/loops=false +animation/clip_167/name="" +animation/clip_167/start_frame=0 +animation/clip_167/end_frame=0 +animation/clip_167/loops=false +animation/clip_168/name="" +animation/clip_168/start_frame=0 +animation/clip_168/end_frame=0 +animation/clip_168/loops=false +animation/clip_169/name="" +animation/clip_169/start_frame=0 +animation/clip_169/end_frame=0 +animation/clip_169/loops=false +animation/clip_170/name="" +animation/clip_170/start_frame=0 +animation/clip_170/end_frame=0 +animation/clip_170/loops=false +animation/clip_171/name="" +animation/clip_171/start_frame=0 +animation/clip_171/end_frame=0 +animation/clip_171/loops=false +animation/clip_172/name="" +animation/clip_172/start_frame=0 +animation/clip_172/end_frame=0 +animation/clip_172/loops=false +animation/clip_173/name="" +animation/clip_173/start_frame=0 +animation/clip_173/end_frame=0 +animation/clip_173/loops=false +animation/clip_174/name="" +animation/clip_174/start_frame=0 +animation/clip_174/end_frame=0 +animation/clip_174/loops=false +animation/clip_175/name="" +animation/clip_175/start_frame=0 +animation/clip_175/end_frame=0 +animation/clip_175/loops=false +animation/clip_176/name="" +animation/clip_176/start_frame=0 +animation/clip_176/end_frame=0 +animation/clip_176/loops=false +animation/clip_177/name="" +animation/clip_177/start_frame=0 +animation/clip_177/end_frame=0 +animation/clip_177/loops=false +animation/clip_178/name="" +animation/clip_178/start_frame=0 +animation/clip_178/end_frame=0 +animation/clip_178/loops=false +animation/clip_179/name="" +animation/clip_179/start_frame=0 +animation/clip_179/end_frame=0 +animation/clip_179/loops=false +animation/clip_180/name="" +animation/clip_180/start_frame=0 +animation/clip_180/end_frame=0 +animation/clip_180/loops=false +animation/clip_181/name="" +animation/clip_181/start_frame=0 +animation/clip_181/end_frame=0 +animation/clip_181/loops=false +animation/clip_182/name="" +animation/clip_182/start_frame=0 +animation/clip_182/end_frame=0 +animation/clip_182/loops=false +animation/clip_183/name="" +animation/clip_183/start_frame=0 +animation/clip_183/end_frame=0 +animation/clip_183/loops=false +animation/clip_184/name="" +animation/clip_184/start_frame=0 +animation/clip_184/end_frame=0 +animation/clip_184/loops=false +animation/clip_185/name="" +animation/clip_185/start_frame=0 +animation/clip_185/end_frame=0 +animation/clip_185/loops=false +animation/clip_186/name="" +animation/clip_186/start_frame=0 +animation/clip_186/end_frame=0 +animation/clip_186/loops=false +animation/clip_187/name="" +animation/clip_187/start_frame=0 +animation/clip_187/end_frame=0 +animation/clip_187/loops=false +animation/clip_188/name="" +animation/clip_188/start_frame=0 +animation/clip_188/end_frame=0 +animation/clip_188/loops=false +animation/clip_189/name="" +animation/clip_189/start_frame=0 +animation/clip_189/end_frame=0 +animation/clip_189/loops=false +animation/clip_190/name="" +animation/clip_190/start_frame=0 +animation/clip_190/end_frame=0 +animation/clip_190/loops=false +animation/clip_191/name="" +animation/clip_191/start_frame=0 +animation/clip_191/end_frame=0 +animation/clip_191/loops=false +animation/clip_192/name="" +animation/clip_192/start_frame=0 +animation/clip_192/end_frame=0 +animation/clip_192/loops=false +animation/clip_193/name="" +animation/clip_193/start_frame=0 +animation/clip_193/end_frame=0 +animation/clip_193/loops=false +animation/clip_194/name="" +animation/clip_194/start_frame=0 +animation/clip_194/end_frame=0 +animation/clip_194/loops=false +animation/clip_195/name="" +animation/clip_195/start_frame=0 +animation/clip_195/end_frame=0 +animation/clip_195/loops=false +animation/clip_196/name="" +animation/clip_196/start_frame=0 +animation/clip_196/end_frame=0 +animation/clip_196/loops=false +animation/clip_197/name="" +animation/clip_197/start_frame=0 +animation/clip_197/end_frame=0 +animation/clip_197/loops=false +animation/clip_198/name="" +animation/clip_198/start_frame=0 +animation/clip_198/end_frame=0 +animation/clip_198/loops=false +animation/clip_199/name="" +animation/clip_199/start_frame=0 +animation/clip_199/end_frame=0 +animation/clip_199/loops=false +animation/clip_200/name="" +animation/clip_200/start_frame=0 +animation/clip_200/end_frame=0 +animation/clip_200/loops=false +animation/clip_201/name="" +animation/clip_201/start_frame=0 +animation/clip_201/end_frame=0 +animation/clip_201/loops=false +animation/clip_202/name="" +animation/clip_202/start_frame=0 +animation/clip_202/end_frame=0 +animation/clip_202/loops=false +animation/clip_203/name="" +animation/clip_203/start_frame=0 +animation/clip_203/end_frame=0 +animation/clip_203/loops=false +animation/clip_204/name="" +animation/clip_204/start_frame=0 +animation/clip_204/end_frame=0 +animation/clip_204/loops=false +animation/clip_205/name="" +animation/clip_205/start_frame=0 +animation/clip_205/end_frame=0 +animation/clip_205/loops=false +animation/clip_206/name="" +animation/clip_206/start_frame=0 +animation/clip_206/end_frame=0 +animation/clip_206/loops=false +animation/clip_207/name="" +animation/clip_207/start_frame=0 +animation/clip_207/end_frame=0 +animation/clip_207/loops=false +animation/clip_208/name="" +animation/clip_208/start_frame=0 +animation/clip_208/end_frame=0 +animation/clip_208/loops=false +animation/clip_209/name="" +animation/clip_209/start_frame=0 +animation/clip_209/end_frame=0 +animation/clip_209/loops=false +animation/clip_210/name="" +animation/clip_210/start_frame=0 +animation/clip_210/end_frame=0 +animation/clip_210/loops=false +animation/clip_211/name="" +animation/clip_211/start_frame=0 +animation/clip_211/end_frame=0 +animation/clip_211/loops=false +animation/clip_212/name="" +animation/clip_212/start_frame=0 +animation/clip_212/end_frame=0 +animation/clip_212/loops=false +animation/clip_213/name="" +animation/clip_213/start_frame=0 +animation/clip_213/end_frame=0 +animation/clip_213/loops=false +animation/clip_214/name="" +animation/clip_214/start_frame=0 +animation/clip_214/end_frame=0 +animation/clip_214/loops=false +animation/clip_215/name="" +animation/clip_215/start_frame=0 +animation/clip_215/end_frame=0 +animation/clip_215/loops=false +animation/clip_216/name="" +animation/clip_216/start_frame=0 +animation/clip_216/end_frame=0 +animation/clip_216/loops=false +animation/clip_217/name="" +animation/clip_217/start_frame=0 +animation/clip_217/end_frame=0 +animation/clip_217/loops=false +animation/clip_218/name="" +animation/clip_218/start_frame=0 +animation/clip_218/end_frame=0 +animation/clip_218/loops=false +animation/clip_219/name="" +animation/clip_219/start_frame=0 +animation/clip_219/end_frame=0 +animation/clip_219/loops=false +animation/clip_220/name="" +animation/clip_220/start_frame=0 +animation/clip_220/end_frame=0 +animation/clip_220/loops=false +animation/clip_221/name="" +animation/clip_221/start_frame=0 +animation/clip_221/end_frame=0 +animation/clip_221/loops=false +animation/clip_222/name="" +animation/clip_222/start_frame=0 +animation/clip_222/end_frame=0 +animation/clip_222/loops=false +animation/clip_223/name="" +animation/clip_223/start_frame=0 +animation/clip_223/end_frame=0 +animation/clip_223/loops=false +animation/clip_224/name="" +animation/clip_224/start_frame=0 +animation/clip_224/end_frame=0 +animation/clip_224/loops=false +animation/clip_225/name="" +animation/clip_225/start_frame=0 +animation/clip_225/end_frame=0 +animation/clip_225/loops=false +animation/clip_226/name="" +animation/clip_226/start_frame=0 +animation/clip_226/end_frame=0 +animation/clip_226/loops=false +animation/clip_227/name="" +animation/clip_227/start_frame=0 +animation/clip_227/end_frame=0 +animation/clip_227/loops=false +animation/clip_228/name="" +animation/clip_228/start_frame=0 +animation/clip_228/end_frame=0 +animation/clip_228/loops=false +animation/clip_229/name="" +animation/clip_229/start_frame=0 +animation/clip_229/end_frame=0 +animation/clip_229/loops=false +animation/clip_230/name="" +animation/clip_230/start_frame=0 +animation/clip_230/end_frame=0 +animation/clip_230/loops=false +animation/clip_231/name="" +animation/clip_231/start_frame=0 +animation/clip_231/end_frame=0 +animation/clip_231/loops=false +animation/clip_232/name="" +animation/clip_232/start_frame=0 +animation/clip_232/end_frame=0 +animation/clip_232/loops=false +animation/clip_233/name="" +animation/clip_233/start_frame=0 +animation/clip_233/end_frame=0 +animation/clip_233/loops=false +animation/clip_234/name="" +animation/clip_234/start_frame=0 +animation/clip_234/end_frame=0 +animation/clip_234/loops=false +animation/clip_235/name="" +animation/clip_235/start_frame=0 +animation/clip_235/end_frame=0 +animation/clip_235/loops=false +animation/clip_236/name="" +animation/clip_236/start_frame=0 +animation/clip_236/end_frame=0 +animation/clip_236/loops=false +animation/clip_237/name="" +animation/clip_237/start_frame=0 +animation/clip_237/end_frame=0 +animation/clip_237/loops=false +animation/clip_238/name="" +animation/clip_238/start_frame=0 +animation/clip_238/end_frame=0 +animation/clip_238/loops=false +animation/clip_239/name="" +animation/clip_239/start_frame=0 +animation/clip_239/end_frame=0 +animation/clip_239/loops=false +animation/clip_240/name="" +animation/clip_240/start_frame=0 +animation/clip_240/end_frame=0 +animation/clip_240/loops=false +animation/clip_241/name="" +animation/clip_241/start_frame=0 +animation/clip_241/end_frame=0 +animation/clip_241/loops=false +animation/clip_242/name="" +animation/clip_242/start_frame=0 +animation/clip_242/end_frame=0 +animation/clip_242/loops=false +animation/clip_243/name="" +animation/clip_243/start_frame=0 +animation/clip_243/end_frame=0 +animation/clip_243/loops=false +animation/clip_244/name="" +animation/clip_244/start_frame=0 +animation/clip_244/end_frame=0 +animation/clip_244/loops=false +animation/clip_245/name="" +animation/clip_245/start_frame=0 +animation/clip_245/end_frame=0 +animation/clip_245/loops=false +animation/clip_246/name="" +animation/clip_246/start_frame=0 +animation/clip_246/end_frame=0 +animation/clip_246/loops=false +animation/clip_247/name="" +animation/clip_247/start_frame=0 +animation/clip_247/end_frame=0 +animation/clip_247/loops=false +animation/clip_248/name="" +animation/clip_248/start_frame=0 +animation/clip_248/end_frame=0 +animation/clip_248/loops=false +animation/clip_249/name="" +animation/clip_249/start_frame=0 +animation/clip_249/end_frame=0 +animation/clip_249/loops=false +animation/clip_250/name="" +animation/clip_250/start_frame=0 +animation/clip_250/end_frame=0 +animation/clip_250/loops=false +animation/clip_251/name="" +animation/clip_251/start_frame=0 +animation/clip_251/end_frame=0 +animation/clip_251/loops=false +animation/clip_252/name="" +animation/clip_252/start_frame=0 +animation/clip_252/end_frame=0 +animation/clip_252/loops=false +animation/clip_253/name="" +animation/clip_253/start_frame=0 +animation/clip_253/end_frame=0 +animation/clip_253/loops=false +animation/clip_254/name="" +animation/clip_254/start_frame=0 +animation/clip_254/end_frame=0 +animation/clip_254/loops=false +animation/clip_255/name="" +animation/clip_255/start_frame=0 +animation/clip_255/end_frame=0 +animation/clip_255/loops=false +animation/clip_256/name="" +animation/clip_256/start_frame=0 +animation/clip_256/end_frame=0 +animation/clip_256/loops=false diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.png b/project/blocky_game/items/rocket_launcher/rocket_launcher.png new file mode 100644 index 0000000..7382283 Binary files /dev/null and b/project/blocky_game/items/rocket_launcher/rocket_launcher.png differ diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.png.import b/project/blocky_game/items/rocket_launcher/rocket_launcher.png.import new file mode 100644 index 0000000..930740f --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/rocket_launcher.png-39a62c94360c7e30fde0ee1247cbcd43.s3tc.stex" +path.etc2="res://.import/rocket_launcher.png-39a62c94360c7e30fde0ee1247cbcd43.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://blocky_game/items/rocket_launcher/rocket_launcher.png" +dest_files=[ "res://.import/rocket_launcher.png-39a62c94360c7e30fde0ee1247cbcd43.s3tc.stex", "res://.import/rocket_launcher.png-39a62c94360c7e30fde0ee1247cbcd43.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=false +flags/anisotropic=false +flags/srgb=1 +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=false +svg/scale=1.0 diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher.tscn b/project/blocky_game/items/rocket_launcher/rocket_launcher.tscn new file mode 100644 index 0000000..27641bc --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher.tscn @@ -0,0 +1,5 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://blocky_game/items/rocket_launcher/rocket_launcher.gltf" type="PackedScene" id=1] + +[node name="RocketLauncher" instance=ExtResource( 1 )] diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher_mat.tres b/project/blocky_game/items/rocket_launcher/rocket_launcher_mat.tres new file mode 100644 index 0000000..7832499 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher_mat.tres @@ -0,0 +1,13 @@ +[gd_resource type="SpatialMaterial" load_steps=2 format=2] + +[ext_resource path="res://blocky_game/items/rocket_launcher/rocket_launcher.png" type="Texture" id=1] + +[resource] +resource_name = "rocket_launcher_mat" +params_cull_mode = 2 +albedo_texture = ExtResource( 1 ) +emission_enabled = true +emission = Color( 0, 0, 0, 1 ) +emission_energy = 1.0 +emission_operator = 0 +emission_on_uv2 = false diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png b/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png new file mode 100644 index 0000000..41597c0 Binary files /dev/null and b/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png differ diff --git a/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png.import b/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png.import new file mode 100644 index 0000000..223d32d --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/rocket_launcher_sprite.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/rocket_launcher_sprite.png-16646f5a50978a86494ee5643a399252.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://blocky_game/items/rocket_launcher/rocket_launcher_sprite.png" +dest_files=[ "res://.import/rocket_launcher_sprite.png-16646f5a50978a86494ee5643a399252.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/project/blocky_game/items/rocket_launcher/smoke_particle.png b/project/blocky_game/items/rocket_launcher/smoke_particle.png new file mode 100644 index 0000000..3a03d14 Binary files /dev/null and b/project/blocky_game/items/rocket_launcher/smoke_particle.png differ diff --git a/project/blocky_game/items/rocket_launcher/smoke_particle.png.import b/project/blocky_game/items/rocket_launcher/smoke_particle.png.import new file mode 100644 index 0000000..8c50513 --- /dev/null +++ b/project/blocky_game/items/rocket_launcher/smoke_particle.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/smoke_particle.png-fb3550ba61ffc8fc9954e15c5a87c644.s3tc.stex" +path.etc2="res://.import/smoke_particle.png-fb3550ba61ffc8fc9954e15c5a87c644.etc2.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2" ], +"vram_texture": true +} + +[deps] + +source_file="res://blocky_game/items/rocket_launcher/smoke_particle.png" +dest_files=[ "res://.import/smoke_particle.png-fb3550ba61ffc8fc9954e15c5a87c644.s3tc.stex", "res://.import/smoke_particle.png-fb3550ba61ffc8fc9954e15c5a87c644.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=true +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +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=false +svg/scale=1.0 diff --git a/project/blocky_game/player/avatar_interaction.gd b/project/blocky_game/player/avatar_interaction.gd index 24133b4..1de4e17 100644 --- a/project/blocky_game/player/avatar_interaction.gd +++ b/project/blocky_game/player/avatar_interaction.gd @@ -2,7 +2,9 @@ extends Node const Util = preload("res://common/util.gd") const Blocks = preload("../blocks/blocks.gd") +const ItemDB = preload("../items/item_db.gd") const InventoryItem = preload("./inventory_item.gd") +const Hotbar = preload("../gui/hotbar/hotbar.gd") const COLLISION_LAYER_AVATAR = 2 @@ -23,15 +25,16 @@ export(Material) var cursor_material = null # TODO Eventually invert these dependencies onready var _head : Camera = get_parent().get_node("Camera") -onready var _hotbar = get_node("../HotBar") +onready var _hotbar : Hotbar = get_node("../HotBar") onready var _block_types : Blocks = get_node("/root/Main/Blocks") +onready var _item_db : ItemDB = get_node("/root/Main/Items") onready var _water_updater = get_node("../../Water") var _terrain = null var _terrain_tool = null var _cursor = null var _action_place = false -var _action_remove = false +var _action_use = false var _action_pick = false @@ -62,7 +65,7 @@ func _get_pointed_voxel(): return hit -func _physics_process(delta): +func _physics_process(_delta): if _terrain == null: return @@ -74,34 +77,42 @@ func _physics_process(delta): else: _cursor.hide() DDD.set_text("Pointed voxel", "---") + + var inv_item := _hotbar.get_selected_item() # These inputs have to be in _fixed_process because they rely on collision queries - if hit != null: + if inv_item == null or inv_item.type == InventoryItem.TYPE_BLOCK: + if hit != null: + var hit_raw_id = _terrain_tool.get_voxel(hit.position) + var has_cube = hit_raw_id != 0 + + if _action_use and has_cube: + var pos = hit.position + _place_single_block(pos, 0) + + elif _action_place: + var pos = hit.previous_position + if has_cube == false: + pos = hit.position + if _can_place_voxel_at(pos): + if inv_item != null: + _place_single_block(pos, inv_item.id) + print("Place voxel at ", pos) + else: + print("Can't place here!") + + elif inv_item.type == InventoryItem.TYPE_ITEM: + if _action_use: + var item = _item_db.get_item(inv_item.id) + item.use(_head.global_transform) + + if _action_pick and hit != null: var hit_raw_id = _terrain_tool.get_voxel(hit.position) - var has_cube = hit_raw_id != 0 - - if _action_remove and has_cube: - var pos = hit.position - _place_single_block(pos, 0) - - elif _action_place: - var pos = hit.previous_position - if has_cube == false: - pos = hit.position - if _can_place_voxel_at(pos): - var item = _hotbar.get_selected_item() - if item != null and item.type == InventoryItem.TYPE_BLOCK: - _place_single_block(pos, item.id) - print("Place voxel at ", pos) - else: - print("Can't place here!") - - elif _action_pick: - var rm := _block_types.get_raw_mapping(hit_raw_id) - _hotbar.try_select_slot_by_block_id(rm.block_id) + var rm := _block_types.get_raw_mapping(hit_raw_id) + _hotbar.try_select_slot_by_block_id(rm.block_id) _action_place = false - _action_remove = false + _action_use = false _action_pick = false @@ -110,7 +121,7 @@ func _unhandled_input(event): if event.pressed: match event.button_index: BUTTON_LEFT: - _action_remove = true + _action_use = true BUTTON_RIGHT: _action_place = true BUTTON_MIDDLE: