From c930eb8a0cabaeb3651e2dc7f94a26310fb2dcf3 Mon Sep 17 00:00:00 2001 From: jacopograndi Date: Wed, 19 Jan 2022 20:08:32 +0100 Subject: turrets implementation finished --- assets/blender/turrets.blend | Bin 1362944 -> 1363584 bytes assets/blender/turrets.blend1 | Bin 1362944 -> 1363584 bytes assets/json/turrets.json | 115 ++- assets/models/turrets/frost.glb | Bin 0 -> 47712 bytes assets/models/turrets/frost.glb.import | 1065 ++++++++++++++++++++ assets/textures/thumbnails/turrets/finance.png | Bin 10253 -> 10253 bytes assets/textures/thumbnails/turrets/frost.png | Bin 0 -> 10748 bytes .../textures/thumbnails/turrets/frost.png.import | 35 + assets/textures/thumbnails/turrets/laser.png | Bin 13309 -> 13309 bytes assets/textures/thumbnails/turrets/plastic.png | Bin 10532 -> 10532 bytes assets/textures/thumbnails/turrets/shotgun.png | Bin 10783 -> 10783 bytes assets/textures/thumbnails/turrets/slower.png | Bin 10748 -> 0 bytes .../textures/thumbnails/turrets/slower.png.import | 35 - assets/textures/thumbnails/turrets/sniper.png | Bin 10209 -> 10208 bytes assets/textures/thumbnails/turrets/structI.png | Bin 10217 -> 10217 bytes assets/textures/thumbnails/turrets/structT.png | Bin 12177 -> 12177 bytes assets/textures/thumbnails/turrets/structX.png | Bin 12422 -> 12425 bytes docs/turret/turrets/cannon.md | 1 + docs/turret/turrets/final slower.md | 3 +- docs/turret/turrets/heavy slower.md | 3 +- docs/turret/turrets/heavy stopper.md | 4 +- docs/turret/turrets/slower.md | 3 +- docs/turret/turrets/stopper.md | 5 +- scenes/fx/fx_explosion.tscn | 16 + scenes/gui/gui_button.tscn | 15 +- scenes/projectiles/ray.tscn | 2 +- scripts/bullet.gd | 94 +- scripts/control.gd | 17 +- scripts/enemies.gd | 27 +- scripts/fx/selfdestruct.gd | 8 + scripts/gui_picker.gd | 2 + scripts/load_scenes.gd | 2 + scripts/placer.gd | 2 +- scripts/resources.gd | 5 +- scripts/turret.gd | 29 +- scripts/wave.gd | 1 - 36 files changed, 1341 insertions(+), 148 deletions(-) create mode 100644 assets/models/turrets/frost.glb create mode 100644 assets/models/turrets/frost.glb.import create mode 100644 assets/textures/thumbnails/turrets/frost.png create mode 100644 assets/textures/thumbnails/turrets/frost.png.import delete mode 100644 assets/textures/thumbnails/turrets/slower.png delete mode 100644 assets/textures/thumbnails/turrets/slower.png.import create mode 100644 scenes/fx/fx_explosion.tscn create mode 100644 scripts/fx/selfdestruct.gd diff --git a/assets/blender/turrets.blend b/assets/blender/turrets.blend index ad8a28f..92b96f4 100644 Binary files a/assets/blender/turrets.blend and b/assets/blender/turrets.blend differ diff --git a/assets/blender/turrets.blend1 b/assets/blender/turrets.blend1 index 3c763d2..96d3dfe 100644 Binary files a/assets/blender/turrets.blend1 and b/assets/blender/turrets.blend1 differ diff --git a/assets/json/turrets.json b/assets/json/turrets.json index 65cd271..846300f 100644 --- a/assets/json/turrets.json +++ b/assets/json/turrets.json @@ -3,7 +3,6 @@ "name": "laser", "cost": { "T": 100 }, "cooldown": 1.0, - "damage": 1, "turn_speed": 3, "range": 5, "upgrades": [ "heavy laser", "sniper" ], @@ -11,6 +10,7 @@ "model_name": "laser.glb", "thumbnail_name": "laser.png", "projectile": { + "damage": 1, "type": "bullet", "speed": 5, "model_name": "laser_shot.glb", @@ -21,7 +21,6 @@ "name": "heavy laser", "cost": { "T": 250 }, "cooldown": 0.9, - "damage": 2, "turn_speed": 3, "range": 5, "upgrades": [ "minigun" ], @@ -29,6 +28,7 @@ "model_name": "laser.glb", "thumbnail_name": "laser.png", "projectile": { + "damage": 2, "type": "bullet", "speed": 5, "model_name": "laser_shot.glb", @@ -37,15 +37,15 @@ }, { "name": "minigun", - "cost": { "T": 1000 }, + "cost": { "T": 1000, "k": 1000 }, "cooldown": 0.2, - "damage": 2, "turn_speed": 10, "range": 5, "modules_max": 6, "model_name": "laser.glb", "thumbnail_name": "laser.png", "projectile": { + "damage": 2, "type": "bullet", "speed": 10, "model_name": "laser_shot.glb", @@ -56,7 +56,6 @@ "name": "sniper", "cost": { "T": 300 }, "cooldown": 2, - "damage": 3, "turn_speed": 1, "range": 7, "upgrades": [ "railgun" ], @@ -64,6 +63,7 @@ "model_name": "sniper.glb", "thumbnail_name": "sniper.png", "projectile": { + "damage": 3, "type": "ray", "model_name": "ray_laser.glb", "amount": 1 @@ -71,15 +71,15 @@ }, { "name": "railgun", - "cost": { "T": 1200 }, + "cost": { "T": 1200, "a": 1000 }, "cooldown": 5, - "damage": 10, "turn_speed": 1, "range": 8, "modules_max": 4, "model_name": "sniper.glb", "thumbnail_name": "laser.png", "projectile": { + "damage": 10, "type": "ray", "model_name": "ray_laser.glb", "amount": 1 @@ -89,7 +89,6 @@ "name": "shotgun", "cost": { "T": 250 }, "cooldown": 2.0, - "damage": 1, "turn_speed": 1, "range": 4, "upgrades": [ "cannon" ], @@ -97,6 +96,7 @@ "model_name": "shotgun.glb", "thumbnail_name": "shotgun.png", "projectile": { + "damage": 1, "type": "bullet", "speed": 5, "model_name": "bullet_shot.glb", @@ -108,32 +108,36 @@ "name": "cannon", "cost": { "T": 400 }, "cooldown": 2.0, - "damage": 5, "turn_speed": 1, "range": 4, - "upgrades": [ "tesla" ], + "upgrades": [ "triple cannon" ], "modules_max": 3, "model_name": "shotgun.glb", "thumbnail_name": "shotgun.png", "projectile": { - "type": "bomb", + "damage": 5, + "type": "bullet", + "area_of_effect": 1, "speed": 3, "model_name": "bullet_shot.glb" } }, { - "name": "tesla", - "cost": { "T": 800 }, + "name": "triple cannon", + "cost": { "T": 800, "d": 800 }, "cooldown": 1.0, - "damage": 2, "turn_speed": 1, "range": 4, "modules_max": 5, "model_name": "shotgun.glb", "thumbnail_name": "shotgun.png", "projectile": { - "type": "shock", - "jumps": 5, + "damage": 5, + "type": "bullet", + "area_of_effect": 1, + "spread": 45, + "speed": 3, + "amount": 3, "model_name": "bullet_shot.glb" } }, @@ -141,7 +145,6 @@ "name": "plastic", "cost": { "T": 400 }, "cooldown": 1.5, - "damage": 1, "turn_speed": 0.5, "range": 6, "upgrades": [ "heavy plastic" ], @@ -149,6 +152,7 @@ "model_name": "plastic.glb", "thumbnail_name": "plastic.png", "projectile": { + "damage": 1, "type": "bounce", "model_name": "bullet_bounce.glb", "speed": 5, @@ -160,7 +164,6 @@ "name": "heavy plastic", "cost": { "T": 400 }, "cooldown": 1.5, - "damage": 2, "turn_speed": 0.5, "range": 6, "upgrades": [ "plasma plastic" ], @@ -168,6 +171,7 @@ "model_name": "plastic.glb", "thumbnail_name": "plastic.png", "projectile": { + "damage": 2, "type": "bounce", "model_name": "bullet_bounce.glb", "speed": 7.5, @@ -177,15 +181,15 @@ }, { "name": "plasma plastic", - "cost": { "T": 800 }, + "cost": { "T": 1500 }, "cooldown": 1, - "damage": 2, "turn_speed": 0.5, "range": 6, "modules_max": 4, "model_name": "plastic.glb", "thumbnail_name": "plastic.png", "projectile": { + "damage": 2, "type": "bounce", "lifetime": 5, "model_name": "bullet_bounce.glb", @@ -194,53 +198,57 @@ } }, { - "name": "slower", + "name": "frost", "cost": { "T": 350 }, "cooldown": 1, "turn_speed": 5, "range": 5, - "upgrades": [ "heavy slower", "stopper" ], + "upgrades": [ "heavy frost", "stopper" ], "modules_max": 4, - "model_name": "slower.glb", - "thumbnail_name": "slower.png", - "slowness": 5, + "model_name": "frost.glb", + "thumbnail_name": "frost.png", "projectile": { "type": "bullet", + "slowness_time": 3, + "slowness_effect": 0.5, "model_name": "bullet_slow.glb", "speed": 10, "amount": 1 } }, { - "name": "heavy slower", + "name": "heavy frost", "cost": { "T": 500 }, "cooldown": 0.7, "turn_speed": 5, "range": 6, - "upgrades": [ "final slower" ], + "upgrades": [ "blizzard" ], "modules_max": 5, - "model_name": "slower.glb", - "thumbnail_name": "slower.png", - "slowness": 7, + "model_name": "frost.glb", + "thumbnail_name": "frost.png", "projectile": { "type": "bullet", + "slowness_time": 5, + "slowness_effect": 0.5, "model_name": "bullet_slow.glb", "speed": 10, "amount": 1 } }, { - "name": "final slower", - "cost": { "T": 1000 }, - "cooldown": 2, - "turn_speed": 5, + "name": "blizzard", + "cost": { "T": 1000, "s": 3000 }, + "cooldown": 0.5, + "turn_speed": 10, "range": 7, "modules_max": 5, - "model_name": "slower.glb", - "thumbnail_name": "slower.png", + "model_name": "frost.glb", + "thumbnail_name": "frost.png", "slowness": 10, "projectile": { "type": "ray", + "slowness_time": 5, + "slowness_effect": 0.7, "model_name": "ray_slow.glb", "amount": 1 } @@ -252,28 +260,35 @@ "range": 2, "upgrades": [ "heavy stopper" ], "modules_max": 4, - "model_name": "slower.glb", - "thumbnail_name": "slower.png", - "stop": 3, + "model_name": "frost.glb", + "thumbnail_name": "frost.png", "projectile": { - "type": "area", + "type": "bullet", + "area_of_effect": 2, + "slowness_time": 1, + "slowness_effect": 1, "model_name": "ray_slow.glb", - "amount": 1 + "amount": 1, + "lifetime": 0 } }, { "name": "heavy stopper", - "cost": { "T": 1000 }, + "cost": { "T": 1000, "s": 2000 }, "cooldown": 3, "range": 3, "modules_max": 5, - "model_name": "slower.glb", - "thumbnail_name": "slower.png", - "stop": 5, + "model_name": "frost.glb", + "thumbnail_name": "frost.png", "projectile": { - "type": "area", + "type": "bullet", + "area_of_effect": 3, + "slowness_time": 2, + "slowness_effect": 1, "model_name": "ray_slow.glb", - "amount": 1 + "amount": 1, + "lifetime": 0, + "damage": 5 } }, { @@ -287,7 +302,7 @@ }, { "name": "kad generator", - "cost": { "T": 400 }, + "cost": { "k": 400, "a": 400, "d": 400 }, "resource_per_wave": { "k": 30, "a": 30, "d": 30 }, "upgrades": [ "s generator" ], "max_modules": 2, @@ -296,8 +311,8 @@ }, { "name": "s generator", - "cost": { "T": 800 }, - "resource_per_wave": { "s": 30 }, + "cost": { "s": 2000 }, + "resource_per_wave": { "s": 100 }, "max_modules": 3, "model_name": "finance.glb", "thumbnail_name": "finance.png" diff --git a/assets/models/turrets/frost.glb b/assets/models/turrets/frost.glb new file mode 100644 index 0000000..85934a7 Binary files /dev/null and b/assets/models/turrets/frost.glb differ diff --git a/assets/models/turrets/frost.glb.import b/assets/models/turrets/frost.glb.import new file mode 100644 index 0000000..595dc7b --- /dev/null +++ b/assets/models/turrets/frost.glb.import @@ -0,0 +1,1065 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/frost.glb-815af56ed5a3eb04cf6fd14589a32414.scn" + +[deps] + +source_file="res://assets/models/turrets/frost.glb" +dest_files=[ "res://.import/frost.glb-815af56ed5a3eb04cf6fd14589a32414.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +nodes/use_legacy_names=false +materials/location=1 +materials/storage=1 +materials/keep_on_reimport=true +meshes/octahedral_compression=true +meshes/compress=4286 +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/assets/textures/thumbnails/turrets/finance.png b/assets/textures/thumbnails/turrets/finance.png index d42b900..0053f79 100644 Binary files a/assets/textures/thumbnails/turrets/finance.png and b/assets/textures/thumbnails/turrets/finance.png differ diff --git a/assets/textures/thumbnails/turrets/frost.png b/assets/textures/thumbnails/turrets/frost.png new file mode 100644 index 0000000..762a831 Binary files /dev/null and b/assets/textures/thumbnails/turrets/frost.png differ diff --git a/assets/textures/thumbnails/turrets/frost.png.import b/assets/textures/thumbnails/turrets/frost.png.import new file mode 100644 index 0000000..0b61c57 --- /dev/null +++ b/assets/textures/thumbnails/turrets/frost.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/frost.png-98680390741fd56be15b564785e45f35.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/thumbnails/turrets/frost.png" +dest_files=[ "res://.import/frost.png-98680390741fd56be15b564785e45f35.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 +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/textures/thumbnails/turrets/laser.png b/assets/textures/thumbnails/turrets/laser.png index a34c207..e2dba80 100644 Binary files a/assets/textures/thumbnails/turrets/laser.png and b/assets/textures/thumbnails/turrets/laser.png differ diff --git a/assets/textures/thumbnails/turrets/plastic.png b/assets/textures/thumbnails/turrets/plastic.png index 67cbc5c..f29f892 100644 Binary files a/assets/textures/thumbnails/turrets/plastic.png and b/assets/textures/thumbnails/turrets/plastic.png differ diff --git a/assets/textures/thumbnails/turrets/shotgun.png b/assets/textures/thumbnails/turrets/shotgun.png index be8ff61..a409543 100644 Binary files a/assets/textures/thumbnails/turrets/shotgun.png and b/assets/textures/thumbnails/turrets/shotgun.png differ diff --git a/assets/textures/thumbnails/turrets/slower.png b/assets/textures/thumbnails/turrets/slower.png deleted file mode 100644 index 7355a40..0000000 Binary files a/assets/textures/thumbnails/turrets/slower.png and /dev/null differ diff --git a/assets/textures/thumbnails/turrets/slower.png.import b/assets/textures/thumbnails/turrets/slower.png.import deleted file mode 100644 index 42775a8..0000000 --- a/assets/textures/thumbnails/turrets/slower.png.import +++ /dev/null @@ -1,35 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/slower.png-564311ab0a6b2d42a68471a253272d1a.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/textures/thumbnails/turrets/slower.png" -dest_files=[ "res://.import/slower.png-564311ab0a6b2d42a68471a253272d1a.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 -process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/assets/textures/thumbnails/turrets/sniper.png b/assets/textures/thumbnails/turrets/sniper.png index 0c88f91..bc13cc9 100644 Binary files a/assets/textures/thumbnails/turrets/sniper.png and b/assets/textures/thumbnails/turrets/sniper.png differ diff --git a/assets/textures/thumbnails/turrets/structI.png b/assets/textures/thumbnails/turrets/structI.png index 481f259..b6199e0 100644 Binary files a/assets/textures/thumbnails/turrets/structI.png and b/assets/textures/thumbnails/turrets/structI.png differ diff --git a/assets/textures/thumbnails/turrets/structT.png b/assets/textures/thumbnails/turrets/structT.png index 834fdc4..b318449 100644 Binary files a/assets/textures/thumbnails/turrets/structT.png and b/assets/textures/thumbnails/turrets/structT.png differ diff --git a/assets/textures/thumbnails/turrets/structX.png b/assets/textures/thumbnails/turrets/structX.png index 14ca95e..668629d 100644 Binary files a/assets/textures/thumbnails/turrets/structX.png and b/assets/textures/thumbnails/turrets/structX.png differ diff --git a/docs/turret/turrets/cannon.md b/docs/turret/turrets/cannon.md index 3da758f..6910dcf 100644 --- a/docs/turret/turrets/cannon.md +++ b/docs/turret/turrets/cannon.md @@ -17,5 +17,6 @@ stats: - max modules: 3 - projectile: - type: splash + - area of effect: 1 - speed: 3 diff --git a/docs/turret/turrets/final slower.md b/docs/turret/turrets/final slower.md index 5df0525..dd13407 100644 --- a/docs/turret/turrets/final slower.md +++ b/docs/turret/turrets/final slower.md @@ -11,6 +11,7 @@ stats: - turn speed: 5 - range: 7 - max modules: 5 -- slowness: 15 (seconds) - projectile: - type: ray + - slowness time: 5 (seconds) + - slowness effect: 0.7 diff --git a/docs/turret/turrets/heavy slower.md b/docs/turret/turrets/heavy slower.md index 75e6e2e..9266c5c 100644 --- a/docs/turret/turrets/heavy slower.md +++ b/docs/turret/turrets/heavy slower.md @@ -14,7 +14,8 @@ stats: - turn speed: 5 - range: 6 - max modules: 5 -- slowness: 15 (seconds) - projectile: + - slowness time: 5 (seconds) + - slowness effect: 0.5 - type: bullet - speed: 10 diff --git a/docs/turret/turrets/heavy stopper.md b/docs/turret/turrets/heavy stopper.md index 90cddab..af53b8a 100644 --- a/docs/turret/turrets/heavy stopper.md +++ b/docs/turret/turrets/heavy stopper.md @@ -10,6 +10,8 @@ stats: - cooldown: 3 - range: 3 - max modules: 5 -- stop: 3 (seconds) - projectile: - type: area + - area of effect: 3 + - slowness time: 2 (seconds) + - slowness effect: 1 diff --git a/docs/turret/turrets/slower.md b/docs/turret/turrets/slower.md index fa9218a..101aefc 100644 --- a/docs/turret/turrets/slower.md +++ b/docs/turret/turrets/slower.md @@ -18,7 +18,8 @@ stats: - turn speed: 5 - range: 5 - max modules: 4 -- slowness: 10 (seconds) - projectile: + - slowness time: 3 (seconds) + - slowness effect: 0.5 (half speed) - type: bullet - speed: 10 diff --git a/docs/turret/turrets/stopper.md b/docs/turret/turrets/stopper.md index 76d4d9a..90496d4 100644 --- a/docs/turret/turrets/stopper.md +++ b/docs/turret/turrets/stopper.md @@ -13,6 +13,9 @@ stats: - cooldown: 5 - range: 2 - max modules: 4 -- stop: 3 (seconds) - projectile: - type: area + - area of effect: 2 + - slowness time: 1 (seconds) + - slowness effect: 1 + diff --git a/scenes/fx/fx_explosion.tscn b/scenes/fx/fx_explosion.tscn new file mode 100644 index 0000000..ca68adb --- /dev/null +++ b/scenes/fx/fx_explosion.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scripts/fx/selfdestruct.gd" type="Script" id=1] + +[sub_resource type="SphereMesh" id=1] + +[sub_resource type="SpatialMaterial" id=2] +flags_transparent = true +albedo_color = Color( 1, 1, 1, 0.337255 ) + +[node name="fx_explosion" type="Spatial"] +script = ExtResource( 1 ) + +[node name="MeshInstance" type="MeshInstance" parent="."] +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) diff --git a/scenes/gui/gui_button.tscn b/scenes/gui/gui_button.tscn index 1922583..f5c69c0 100644 --- a/scenes/gui/gui_button.tscn +++ b/scenes/gui/gui_button.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://scripts/gui_button.gd" type="Script" id=1] [ext_resource path="res://themes/snub_theme.tres" type="Theme" id=2] +[sub_resource type="StyleBoxFlat" id=4] +bg_color = Color( 0, 0, 0, 0.305882 ) + [sub_resource type="StyleBoxFlat" id=3] bg_color = Color( 0.6, 0.6, 0.6, 0 ) border_width_left = 1 @@ -59,6 +62,16 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="panel_cash" type="Panel" parent="."] +visible = false +anchor_right = 1.0 +margin_bottom = 20.0 +theme = ExtResource( 2 ) +custom_styles/panel = SubResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + [node name="name" type="Label" parent="."] anchor_right = 1.0 margin_top = 101.0 diff --git a/scenes/projectiles/ray.tscn b/scenes/projectiles/ray.tscn index c537ebd..37c520d 100644 --- a/scenes/projectiles/ray.tscn +++ b/scenes/projectiles/ray.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=2] -[ext_resource path="res://scripts/bullet.gd" type="Script" id=1] +[ext_resource path="res://scripts/fx/selfdestruct.gd" type="Script" id=1] [sub_resource type="CubeMesh" id=1] size = Vector3( 1, 1, 1 ) diff --git a/scripts/bullet.gd b/scripts/bullet.gd index 3a50a12..86319bb 100644 --- a/scripts/bullet.gd +++ b/scripts/bullet.gd @@ -1,9 +1,14 @@ extends Spatial var _enemies_holder +var _fx_holder +var load_scenes var shooter var damage = 0 +var aoe = 0 +var slowness_effect = 0 +var slowness_time = 0 var timer = 0 var time_life = 3 @@ -15,60 +20,89 @@ var hitlist = [] var ignore_collisions = false func _ready(): - if ignore_collisions: return - _enemies_holder = get_tree().root.get_node("world").find_node("enemies") + var root = get_tree().root.get_node("world") + _enemies_holder = root.get_node("enemies") + _fx_holder = root.get_node("fx") var _err = $Area.connect("body_entered", self, "collided") + var saveload = root.get_node("saveload") + load_scenes = saveload.get_node("load_scenes") + +func bounce_physics (delta): + var forward_dir = -global_transform.basis.z.normalized() + var space: PhysicsDirectSpaceState = get_world().direct_space_state + var from = transform.origin + var to = transform.origin + forward_dir * speed * delta + var mask = 0b0101 + var result = space.intersect_ray(from, to, [], mask) + if result.size() > 0: + hitlist.clear() + var bounced = forward_dir.bounce(result.normal).normalized() + var z = -bounced; + var x = bounced.cross(result.normal).normalized(); + var y = x.cross(z).normalized(); + var basis = Basis(x, y, z); + global_transform.basis = basis + forward_dir = -global_transform.basis.z.normalized() + var dist = transform.origin.distance_to(result.position) + transform.origin = result.position + var amt = speed * delta - dist + global_translate(forward_dir * amt) + else: + global_translate(forward_dir * speed * delta) func _physics_process(delta): timer += delta if timer >= time_life: + if aoe > 0: explode() queue_free() return - - if ignore_collisions: return - var forward_dir = -global_transform.basis.z.normalized() if bounce: - var space: PhysicsDirectSpaceState = get_world().direct_space_state - var from = transform.origin - var to = transform.origin + forward_dir * speed * delta - var mask = 0b0101 - var result = space.intersect_ray(from, to, [], mask) - if result.size() > 0: - hitlist.clear() - var bounced = forward_dir.bounce(result.normal).normalized() - var z = -bounced; - var x = bounced.cross(result.normal).normalized(); - var y = x.cross(z).normalized(); - var basis = Basis(x, y, z); - global_transform.basis = basis - forward_dir = -global_transform.basis.z.normalized() - var dist = transform.origin.distance_to(result.position) - transform.origin = result.position - var amt = speed * delta - dist - global_translate(forward_dir * amt) - else: - global_translate(forward_dir * speed * delta) + bounce_physics(delta) else: + var forward_dir = -global_transform.basis.z.normalized() global_translate(forward_dir * speed * delta) +func explode (): + var space = get_world().direct_space_state + + var shape = SphereShape.new() + shape.radius = aoe + + var params: = PhysicsShapeQueryParameters.new() + params.set_shape(shape) + params.collision_mask = 0b1000 + params.transform = transform + + var result = space.intersect_shape(params) + for body in result: + apply_damage(body.collider.get_parent().name) + + var fx_ex = load_scenes.fx_explosion.instance() + fx_ex.transform = transform + fx_ex.transform.basis = fx_ex.transform.basis.scaled(Vector3.ONE * aoe) + fx_ex.time_life = 0.2 + _fx_holder.add_child(fx_ex) + func collided(body): - if ignore_collisions: return var parent = body.get_parent() if parent == shooter: return if parent in hitlist: return if hit_something == false: var groups = parent.get_groups() - if "enemies" in groups: - _enemies_holder.damage(parent.name, damage) + ## TODO design? aoe damages twice: on hit and aoe + if "enemies" in groups: apply_damage(parent.name) + if aoe > 0: explode() - if !bounce: hit_something = true + if aoe > 0: explode() queue_free() else: hitlist.append(parent) - print(hitlist) +func apply_damage (enemyname): + _enemies_holder.damage(enemyname, damage, slowness_effect, slowness_time) + diff --git a/scripts/control.gd b/scripts/control.gd index 7c8b95d..68b0bb4 100644 --- a/scripts/control.gd +++ b/scripts/control.gd @@ -88,8 +88,8 @@ func build_option (st, sttype): func buy (pos, rot, turr_name): var info = load_turrets.info[turr_name] - if resources.greater_than(info.cost): - resources.sub(info.cost) + if ineditor or resources.greater_than(info.cost): + if !ineditor: resources.sub(info.cost) var obj = placer.inst_turret(pos, rot, turr_name) editing_turret = obj.name state = Globals.PlayerState.EDIT @@ -100,8 +100,8 @@ func buy (pos, rot, turr_name): func upgrade (turr_inst_name, upg_name): var info = load_turrets.info[upg_name] - if resources.greater_than(info.cost): - resources.sub(info.cost) + if ineditor or resources.greater_than(info.cost): + if !ineditor: resources.sub(info.cost) var prv = turret_holder.get_node(turr_inst_name) var pos = prv.transform.origin var rot = prv.transform.basis.get_rotation_quat() @@ -254,6 +254,15 @@ func gui_start_wave_event (): wave.start() gui.refresh() +func end_wave_event (): + wave.end() + + for turr in turret_holder.get_children(): + if turr.info.has("resource_per_wave"): + resources.add(turr.info.resource_per_wave) + + _refresh() + func gui_save_map_event (): saveload_map.map_save() func gui_save_as_map_event (mapname : String): diff --git a/scripts/enemies.gd b/scripts/enemies.gd index fe5ae14..a0f4416 100644 --- a/scripts/enemies.gd +++ b/scripts/enemies.gd @@ -7,7 +7,7 @@ var _enemy_blue var _dissolve_mat : ShaderMaterial var _enemy_mat : Material -var wave +var control var _fx_holder var _fx_enemy_damage @@ -33,7 +33,7 @@ var colors = [ func _ready(): var root = get_tree().root.get_node("world") _fx_holder = root.get_node("fx") - wave = root.get_node("wave") + control = root.get_node("player").get_node("control") _path = root.get_node("path") _resources = root.get_node("player").get_node("resources") _dissolve_mat = load("res://shaders/dissolve_mat.tres") @@ -61,8 +61,8 @@ func spawn(name, node_cur=0, rel_pos=0): enemies[serial_enemy] = { "name": name, "hp": info.lives, - "slowed_effect": 0, - "slowed_time": 0, + "slow_effect": 0, + "slow_time": 0, "cur": node_cur, "rel": rel_pos, "axis": [axis.x, axis.y, axis.z] @@ -93,8 +93,11 @@ func _physics_process(delta): # todo rel +- epslion spawn(info.spawn_on_death, enemy.cur, enemy.rel - n/10) continue + + enemy.slow_time -= delta + if enemy.slow_time < 0: enemy.slow_effect = 0 - var speed = info.speed + var speed = info.speed * (1-enemy.slow_effect) enemy.rel += speed * delta while enemy.rel > 1: enemy.rel -= 1 @@ -120,18 +123,22 @@ func _physics_process(delta): enemies.erase(id) if enemies.size() == 0: - wave.end() + control.end_wave_event() -func damage(name, amt): +func damage(name, dam, slow_effect=0, slow_time=0): var id = int(name) var enemy = enemies[id] var info = load_shapes.info[enemy.name] if enemy.hp > 0: - enemy.hp -= amt - _resources.add({ info.resource: amt }) - fx_damage(name) + if dam > 0: + enemy.hp -= dam + _resources.add({ info.resource: dam }) + fx_damage(name) + if slow_effect > 0: + enemy.slow_effect = max(slow_effect, enemy.slow_effect) + enemy.slow_time = slow_time func fx_damage(name): var id = int(name) diff --git a/scripts/fx/selfdestruct.gd b/scripts/fx/selfdestruct.gd new file mode 100644 index 0000000..14f941f --- /dev/null +++ b/scripts/fx/selfdestruct.gd @@ -0,0 +1,8 @@ +extends Node + +var timer = 0 +var time_life = 3 + +func _physics_process(delta): + timer += delta + if timer >= time_life: queue_free() diff --git a/scripts/gui_picker.gd b/scripts/gui_picker.gd index b888572..85909ec 100644 --- a/scripts/gui_picker.gd +++ b/scripts/gui_picker.gd @@ -52,11 +52,13 @@ func build (options : Array = []): if opt.type == "turret buy": var tinfo = load_turrets.info[opt.name] button.get_node("name").text = tinfo.name + button.get_node("panel_cash").visible = true button.get_node("cash").text = resources.dict_to_str(tinfo.cost) button.get_node("texture").texture = load_turrets.thumbnails[tinfo.thumbnail_name] if opt.type == "turret upg": var tinfo = load_turrets.info[opt.name] button.get_node("name").text = tinfo.name + button.get_node("panel_cash").visible = true button.get_node("cash").text = resources.dict_to_str(tinfo.cost) button.get_node("texture").texture = load_turrets.thumbnails[tinfo.thumbnail_name] tback.texture = thumbs_generic["upgrade.svg"] diff --git a/scripts/load_scenes.gd b/scripts/load_scenes.gd index fe237a4..0c28061 100644 --- a/scripts/load_scenes.gd +++ b/scripts/load_scenes.gd @@ -5,3 +5,5 @@ var path_start : PackedScene = load("res://scenes/path_start.tscn") var path : PackedScene = load("res://scenes/path.tscn") var path_end : PackedScene= load("res://scenes/path_end.tscn") var attach_point : PackedScene = load("res://scenes/attach_point.tscn") + +var fx_explosion : PackedScene = load("res://scenes/fx/fx_explosion.tscn") diff --git a/scripts/placer.gd b/scripts/placer.gd index 991f333..18e72e8 100644 --- a/scripts/placer.gd +++ b/scripts/placer.gd @@ -132,7 +132,7 @@ func inst_path (pos, rot): instance.transform.origin = pos + normal * 0.25; instance.transform.basis = Basis(rot); instance.set_name("path") - # remove collision depencency + # TODO multiplayer remove collision depencency colliding_node.transform.basis = Basis(rot); return instance diff --git a/scripts/resources.gd b/scripts/resources.gd index 2575cb3..53462a6 100644 --- a/scripts/resources.gd +++ b/scripts/resources.gd @@ -12,8 +12,11 @@ func get_names(): return "Tkads" func dict_to_str (cost): var st = "" + var i = 0 for n in cost.keys(): - st += str(cost[n]) + n + st += str(cost[n]) + n + if i <= cost.keys().size()-2: st += " " + i += 1 return st func add (cost): diff --git a/scripts/turret.gd b/scripts/turret.gd index a9dfb74..fd44ce0 100644 --- a/scripts/turret.gd +++ b/scripts/turret.gd @@ -2,6 +2,7 @@ extends Spatial var _path : Node var _enemies : Node +var _fx_holder : Node var _projectiles_holder : Node var _enemies_holder : Node @@ -27,6 +28,7 @@ func _ready(): _enemies = root.get_node("enemies") _projectiles_holder = root.get_node("projectiles") _enemies_holder = root.find_node("enemies") + _fx_holder = root.find_node("fx") projectile = load("res://scenes/projectiles/bullet.tscn") ray = load("res://scenes/projectiles/ray.tscn") @@ -81,7 +83,7 @@ func get_target(): else: return null func _physics_process(delta): - if !info.has("damage"): return + if !info.has("projectile"): return if !_enemies.enemies.has(_target): _target = null @@ -93,6 +95,8 @@ func _physics_process(delta): _target = get_target() _target = get_target() + + var turn_speed = info.get("turn_speed", 0) if _target != null: var enemy = _enemies.node_from_id(_target) @@ -112,14 +116,14 @@ func _physics_process(delta): var base_basis = base.global_transform.basis.get_rotation_quat() var base_angle = base_basis.angle_to(base_rot) if base_angle > 0.01: - var base_amt = (info.turn_speed * delta) / base_angle + var base_amt = (turn_speed * delta) / base_angle base_amt = min(1, base_amt) base.global_transform.basis = Basis(base_basis.slerp(Basis(base_rot), base_amt)) var gun_basis = gun.transform.basis.get_rotation_quat() var gun_angle = gun_basis.angle_to(gun_rot) if gun_angle > 0.01: - var gun_amt = (info.turn_speed * delta) / gun_angle + var gun_amt = (turn_speed * delta) / gun_angle gun_amt = min(1, gun_amt) gun.transform.basis = Basis(gun_basis.slerp(Basis(gun_rot), gun_amt)) @@ -142,7 +146,7 @@ func spread (amt : int) -> Array: return dirs func shoot (): - if info.projectile.amount > 1: + if info.projectile.get("amount", 1) > 1: for dir in spread(info.projectile.amount): shoot_switch(dir) else: @@ -160,9 +164,13 @@ func shoot_bullet (dir : Basis, bounce = false): instance.transform.basis = dir instance.transform.origin = _shooting_point - dir.z*0.3; instance.shooter = self - instance.damage = info.damage - instance.speed = info.projectile.speed + instance.damage = info.projectile.get("damage", 0) + instance.speed = info.projectile.get("speed", 0) instance.bounce = bounce + instance.aoe = info.projectile.get("area_of_effect", 0) + instance.slowness_effect = info.projectile.get("slowness_effect", 0) + instance.slowness_time = info.projectile.get("slowness_time", 0) + instance.time_life = info.projectile.get("lifetime", 3) func shoot_ray (dir : Basis): var space: PhysicsDirectSpaceState = get_world().direct_space_state @@ -175,14 +183,17 @@ func shoot_ray (dir : Basis): var parent = result.collider.get_parent() var groups = parent.get_groups() if "enemies" in groups: - _enemies_holder.damage(parent.name, info.damage) + var dam = info.projectile.get("damage", 0) + var eff = info.projectile.get("slowness_effect", 0) + var tim = info.projectile.get("slowness_time", 0) + _enemies_holder.damage(parent.name, dam, eff, tim) var distance = result.position.distance_to(from) var instance = ray.instance() - instance.ignore_collisions = true - _projectiles_holder.add_child(instance) + _fx_holder.add_child(instance) instance.transform.origin = _shooting_point - dir.z*0.3; instance.transform.basis = dir instance.transform.basis.z *= distance instance.time_life = 0.05 + diff --git a/scripts/wave.gd b/scripts/wave.gd index c4c43c7..e61dfef 100644 --- a/scripts/wave.gd +++ b/scripts/wave.gd @@ -91,4 +91,3 @@ func start(): func end(): ongoing = false wave_num += 1 - gui.refresh() -- cgit v1.2.3-54-g00ecf