├── .gitattributes ├── .gitignore ├── Art ├── Arks │ ├── DinoSprites - doux.png │ ├── DinoSprites - doux.png.import │ ├── DinoSprites - mort.png │ ├── DinoSprites - mort.png.import │ ├── DinoSprites - tard.png │ ├── DinoSprites - tard.png.import │ ├── DinoSprites - vita.png │ ├── DinoSprites - vita.png.import │ └── Info.txt ├── Bitlytic │ ├── B0-Z0.png │ ├── B0-Z0.png.import │ ├── bullet.png │ ├── bullet.png.import │ ├── crosshair.png │ └── crosshair.png.import ├── Kenney │ ├── Info.txt │ ├── carrot.png │ ├── carrot.png.import │ ├── firework.png │ ├── firework.png.import │ ├── fish.png │ ├── fish.png.import │ ├── potion.png │ └── potion.png.import └── RGS_Dev │ ├── Info.txt │ ├── tileset_brown.png │ └── tileset_brown.png.import ├── Objects ├── Scenes │ ├── bullet.tscn │ ├── bullet_particles.tscn │ ├── eneA2C1.tmp │ ├── enemy.tscn │ └── upgrade.tscn └── Scripts │ ├── Enemy │ ├── States │ │ ├── enemy_chase.gd │ │ ├── enemy_idle.gd │ │ ├── enemy_state.gd │ │ ├── enemy_stun.gd │ │ └── enemy_wander.gd │ ├── enemy.gd │ ├── enemy_animation.gd │ ├── enemy_state_machine.gd │ └── health_label.gd │ ├── bullet.gd │ ├── bullet_particles.gd │ └── upgrade.gd ├── Player ├── Animations │ └── player.res ├── Scripts │ ├── player.gd │ ├── player_animation.gd │ ├── player_camera.gd │ ├── player_movement.gd │ └── player_weapon.gd ├── pla46D.tmp └── player.tscn ├── README.md ├── Resources └── Strategies │ ├── damage.tres │ ├── particles.tres │ ├── pierce.tres │ └── speed.tres ├── Scenes └── main.tscn ├── Util ├── Autoload │ └── enemy_spawner.gd ├── Classes │ └── attack.gd ├── Components │ ├── health.gd │ ├── hitbox.gd │ └── hurtbox.gd └── Strategy │ ├── base_bullet_strategy.gd │ ├── damage_bullet_strategy.gd │ ├── particle_bullet_strategy.gd │ ├── pierce_bullet_strategy.gd │ └── speed_bullet_strategy.gd ├── default_bus_layout.tres ├── icon.svg ├── icon.svg.import └── project.godot /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - doux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Arks/DinoSprites - doux.png -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - doux.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://drfyuy8w6p057" 6 | path="res://.godot/imported/DinoSprites - doux.png-9413f6c22a0a0b6b5eb66280c939fc43.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Arks/DinoSprites - doux.png" 14 | dest_files=["res://.godot/imported/DinoSprites - doux.png-9413f6c22a0a0b6b5eb66280c939fc43.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - mort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Arks/DinoSprites - mort.png -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - mort.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c5cbe07dk5lyn" 6 | path="res://.godot/imported/DinoSprites - mort.png-4944bd8cdfbc162b53514a6f97b8c4f2.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Arks/DinoSprites - mort.png" 14 | dest_files=["res://.godot/imported/DinoSprites - mort.png-4944bd8cdfbc162b53514a6f97b8c4f2.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - tard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Arks/DinoSprites - tard.png -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - tard.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cqcr6ctruxfn5" 6 | path="res://.godot/imported/DinoSprites - tard.png-069143546edf47b1dd1c622c0519259d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Arks/DinoSprites - tard.png" 14 | dest_files=["res://.godot/imported/DinoSprites - tard.png-069143546edf47b1dd1c622c0519259d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - vita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Arks/DinoSprites - vita.png -------------------------------------------------------------------------------- /Art/Arks/DinoSprites - vita.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://eb28cx5toii3" 6 | path="res://.godot/imported/DinoSprites - vita.png-e25ab919c4e2a987068a3c0b803fbb7f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Arks/DinoSprites - vita.png" 14 | dest_files=["res://.godot/imported/DinoSprites - vita.png-e25ab919c4e2a987068a3c0b803fbb7f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Arks/Info.txt: -------------------------------------------------------------------------------- 1 | Link: https://arks.itch.io/dino-characters 2 | -------------------------------------------------------------------------------- /Art/Bitlytic/B0-Z0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Bitlytic/B0-Z0.png -------------------------------------------------------------------------------- /Art/Bitlytic/B0-Z0.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b8qo5sm247axm" 6 | path="res://.godot/imported/B0-Z0.png-1060b3861fc03e514e9cec92df40b1cd.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Bitlytic/B0-Z0.png" 14 | dest_files=["res://.godot/imported/B0-Z0.png-1060b3861fc03e514e9cec92df40b1cd.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Bitlytic/bullet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Bitlytic/bullet.png -------------------------------------------------------------------------------- /Art/Bitlytic/bullet.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cr8v60ue1jsl7" 6 | path="res://.godot/imported/bullet.png-283aaa19221fe8b6202bb47a1e411067.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Bitlytic/bullet.png" 14 | dest_files=["res://.godot/imported/bullet.png-283aaa19221fe8b6202bb47a1e411067.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Bitlytic/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Bitlytic/crosshair.png -------------------------------------------------------------------------------- /Art/Bitlytic/crosshair.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dnp54j8h1op73" 6 | path="res://.godot/imported/crosshair.png-4801de39bb15a47086fac39f4aedb369.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Bitlytic/crosshair.png" 14 | dest_files=["res://.godot/imported/crosshair.png-4801de39bb15a47086fac39f4aedb369.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Kenney/Info.txt: -------------------------------------------------------------------------------- 1 | Link: https://kenney.nl/assets/1-bit-pack 2 | -------------------------------------------------------------------------------- /Art/Kenney/carrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Kenney/carrot.png -------------------------------------------------------------------------------- /Art/Kenney/carrot.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://30ltamteuvkx" 6 | path="res://.godot/imported/carrot.png-002f96bcb4aeb01ab290a59ab5060391.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Kenney/carrot.png" 14 | dest_files=["res://.godot/imported/carrot.png-002f96bcb4aeb01ab290a59ab5060391.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Kenney/firework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Kenney/firework.png -------------------------------------------------------------------------------- /Art/Kenney/firework.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://0aylbueaelkc" 6 | path="res://.godot/imported/firework.png-8d22a9e7b0dbb320db518ad9ff0f687e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Kenney/firework.png" 14 | dest_files=["res://.godot/imported/firework.png-8d22a9e7b0dbb320db518ad9ff0f687e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Kenney/fish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Kenney/fish.png -------------------------------------------------------------------------------- /Art/Kenney/fish.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://53h01ho1lvwp" 6 | path="res://.godot/imported/fish.png-81713d198b12aee450a4f0291336be39.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Kenney/fish.png" 14 | dest_files=["res://.godot/imported/fish.png-81713d198b12aee450a4f0291336be39.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/Kenney/potion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/Kenney/potion.png -------------------------------------------------------------------------------- /Art/Kenney/potion.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c26ro5ifb4gg4" 6 | path="res://.godot/imported/potion.png-b204cf6ce8f6c26d6136443630528b0c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/Kenney/potion.png" 14 | dest_files=["res://.godot/imported/potion.png-b204cf6ce8f6c26d6136443630528b0c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Art/RGS_Dev/Info.txt: -------------------------------------------------------------------------------- 1 | Link: https://rgsdev.itch.io/free-cc0-top-down-tileset-template-pixel-art 2 | -------------------------------------------------------------------------------- /Art/RGS_Dev/tileset_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Art/RGS_Dev/tileset_brown.png -------------------------------------------------------------------------------- /Art/RGS_Dev/tileset_brown.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cyr2m6q5pv84" 6 | path="res://.godot/imported/tileset_brown.png-e898a4dfbeaa2140469ae1477fd0cd3d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Art/RGS_Dev/tileset_brown.png" 14 | dest_files=["res://.godot/imported/tileset_brown.png-e898a4dfbeaa2140469ae1477fd0cd3d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /Objects/Scenes/bullet.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://dvnhfujng2ybw"] 2 | 3 | [ext_resource type="Script" path="res://Objects/Scripts/bullet.gd" id="1_7775e"] 4 | [ext_resource type="Texture2D" uid="uid://cr8v60ue1jsl7" path="res://Art/Bitlytic/bullet.png" id="1_gclts"] 5 | [ext_resource type="Script" path="res://Util/Components/hurtbox.gd" id="3_2ig4x"] 6 | 7 | [sub_resource type="CircleShape2D" id="CircleShape2D_0cebq"] 8 | radius = 6.0 9 | 10 | [sub_resource type="CircleShape2D" id="CircleShape2D_jng58"] 11 | radius = 7.0 12 | 13 | [node name="Bullet" type="CharacterBody2D" node_paths=PackedStringArray("hurtbox")] 14 | collision_layer = 0 15 | collision_mask = 128 16 | script = ExtResource("1_7775e") 17 | hurtbox = NodePath("BulletHurtbox") 18 | 19 | [node name="Sprite2D" type="Sprite2D" parent="."] 20 | rotation = 1.5708 21 | texture = ExtResource("1_gclts") 22 | 23 | [node name="Floor Collision" type="CollisionShape2D" parent="."] 24 | shape = SubResource("CircleShape2D_0cebq") 25 | 26 | [node name="BulletHurtbox" type="Area2D" parent="."] 27 | collision_layer = 0 28 | collision_mask = 4 29 | script = ExtResource("3_2ig4x") 30 | 31 | [node name="CollisionShape2D" type="CollisionShape2D" parent="BulletHurtbox"] 32 | shape = SubResource("CircleShape2D_jng58") 33 | -------------------------------------------------------------------------------- /Objects/Scenes/bullet_particles.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://drl8260u6fogv"] 2 | 3 | [ext_resource type="Script" path="res://Objects/Scripts/bullet_particles.gd" id="1_0u1m1"] 4 | 5 | [sub_resource type="Gradient" id="Gradient_jr0ln"] 6 | offsets = PackedFloat32Array(0, 0.828729, 0.872928) 7 | colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0.848101, 1, 1, 1, 0) 8 | 9 | [sub_resource type="GradientTexture1D" id="GradientTexture1D_gftm8"] 10 | gradient = SubResource("Gradient_jr0ln") 11 | 12 | [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_p1lar"] 13 | particle_flag_disable_z = true 14 | spread = 180.0 15 | initial_velocity_min = 25.0 16 | initial_velocity_max = 50.0 17 | gravity = Vector3(0, 0, 0) 18 | color_ramp = SubResource("GradientTexture1D_gftm8") 19 | 20 | [node name="BulletParticles" type="GPUParticles2D"] 21 | amount = 32 22 | process_material = SubResource("ParticleProcessMaterial_p1lar") 23 | script = ExtResource("1_0u1m1") 24 | -------------------------------------------------------------------------------- /Objects/Scenes/eneA2C1.tmp: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=25 format=3 uid="uid://ckfohqhp1io7i"] 2 | 3 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy.gd" id="1_80gx6"] 4 | [ext_resource type="Texture2D" uid="uid://eb28cx5toii3" path="res://Art/Arks/DinoSprites - vita.png" id="1_k54fi"] 5 | [ext_resource type="Script" path="res://Objects/Scripts/hitbox.gd" id="2_ic17g"] 6 | [ext_resource type="Script" path="res://Util/Components/health.gd" id="3_l2pti"] 7 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy_state_machine.gd" id="4_dx2tj"] 8 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy_animation.gd" id="4_qlt5l"] 9 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_idle.gd" id="6_0u1p1"] 10 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_wander.gd" id="7_0o0h0"] 11 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_chase.gd" id="8_3f4cv"] 12 | 13 | [sub_resource type="CircleShape2D" id="CircleShape2D_7ufao"] 14 | radius = 13.0 15 | 16 | [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_llgnc"] 17 | radius = 5.0 18 | height = 16.0 19 | 20 | [sub_resource type="Animation" id="Animation_3rrto"] 21 | length = 0.001 22 | tracks/0/type = "value" 23 | tracks/0/imported = false 24 | tracks/0/enabled = true 25 | tracks/0/path = NodePath("Sprite2D:frame") 26 | tracks/0/interp = 1 27 | tracks/0/loop_wrap = true 28 | tracks/0/keys = { 29 | "times": PackedFloat32Array(0), 30 | "transitions": PackedFloat32Array(1), 31 | "update": 1, 32 | "values": [0] 33 | } 34 | tracks/1/type = "value" 35 | tracks/1/imported = false 36 | tracks/1/enabled = true 37 | tracks/1/path = NodePath("Sprite2D:flip_h") 38 | tracks/1/interp = 1 39 | tracks/1/loop_wrap = true 40 | tracks/1/keys = { 41 | "times": PackedFloat32Array(0), 42 | "transitions": PackedFloat32Array(1), 43 | "update": 1, 44 | "values": [false] 45 | } 46 | 47 | [sub_resource type="Animation" id="Animation_qhy7m"] 48 | resource_name = "idle" 49 | loop_mode = 1 50 | tracks/0/type = "value" 51 | tracks/0/imported = false 52 | tracks/0/enabled = true 53 | tracks/0/path = NodePath("Sprite2D:frame") 54 | tracks/0/interp = 1 55 | tracks/0/loop_wrap = true 56 | tracks/0/keys = { 57 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9), 58 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), 59 | "update": 1, 60 | "values": [0, 1, 2, 1, 2, 1, 2, 1, 0] 61 | } 62 | 63 | [sub_resource type="Animation" id="Animation_nwual"] 64 | resource_name = "run_left" 65 | length = 0.6 66 | loop_mode = 1 67 | tracks/0/type = "value" 68 | tracks/0/imported = false 69 | tracks/0/enabled = true 70 | tracks/0/path = NodePath("Sprite2D:frame") 71 | tracks/0/interp = 1 72 | tracks/0/loop_wrap = true 73 | tracks/0/keys = { 74 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 75 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 76 | "update": 1, 77 | "values": [18, 19, 20, 21, 22, 23] 78 | } 79 | tracks/1/type = "value" 80 | tracks/1/imported = false 81 | tracks/1/enabled = true 82 | tracks/1/path = NodePath("Sprite2D:flip_h") 83 | tracks/1/interp = 1 84 | tracks/1/loop_wrap = true 85 | tracks/1/keys = { 86 | "times": PackedFloat32Array(0), 87 | "transitions": PackedFloat32Array(1), 88 | "update": 1, 89 | "values": [true] 90 | } 91 | 92 | [sub_resource type="Animation" id="Animation_jubin"] 93 | resource_name = "run_right" 94 | length = 0.6 95 | loop_mode = 1 96 | tracks/0/type = "value" 97 | tracks/0/imported = false 98 | tracks/0/enabled = true 99 | tracks/0/path = NodePath("Sprite2D:frame") 100 | tracks/0/interp = 1 101 | tracks/0/loop_wrap = true 102 | tracks/0/keys = { 103 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 104 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 105 | "update": 1, 106 | "values": [18, 19, 20, 21, 22, 23] 107 | } 108 | tracks/1/type = "value" 109 | tracks/1/imported = false 110 | tracks/1/enabled = true 111 | tracks/1/path = NodePath("Sprite2D:flip_h") 112 | tracks/1/interp = 1 113 | tracks/1/loop_wrap = true 114 | tracks/1/keys = { 115 | "times": PackedFloat32Array(0), 116 | "transitions": PackedFloat32Array(1), 117 | "update": 1, 118 | "values": [false] 119 | } 120 | 121 | [sub_resource type="Animation" id="Animation_xm4x4"] 122 | resource_name = "walk_left" 123 | length = 0.6 124 | loop_mode = 1 125 | tracks/0/type = "value" 126 | tracks/0/imported = false 127 | tracks/0/enabled = true 128 | tracks/0/path = NodePath("Sprite2D:frame") 129 | tracks/0/interp = 1 130 | tracks/0/loop_wrap = true 131 | tracks/0/keys = { 132 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 133 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 134 | "update": 1, 135 | "values": [4, 5, 6, 7, 8, 9] 136 | } 137 | tracks/1/type = "value" 138 | tracks/1/imported = false 139 | tracks/1/enabled = true 140 | tracks/1/path = NodePath("Sprite2D:flip_h") 141 | tracks/1/interp = 1 142 | tracks/1/loop_wrap = true 143 | tracks/1/keys = { 144 | "times": PackedFloat32Array(0), 145 | "transitions": PackedFloat32Array(1), 146 | "update": 1, 147 | "values": [true] 148 | } 149 | 150 | [sub_resource type="Animation" id="Animation_sirhc"] 151 | resource_name = "walk_right" 152 | length = 0.6 153 | loop_mode = 1 154 | tracks/0/type = "value" 155 | tracks/0/imported = false 156 | tracks/0/enabled = true 157 | tracks/0/path = NodePath("Sprite2D:frame") 158 | tracks/0/interp = 1 159 | tracks/0/loop_wrap = true 160 | tracks/0/keys = { 161 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 162 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 163 | "update": 1, 164 | "values": [4, 5, 6, 7, 8, 9] 165 | } 166 | tracks/1/type = "value" 167 | tracks/1/imported = false 168 | tracks/1/enabled = true 169 | tracks/1/path = NodePath("Sprite2D:flip_h") 170 | tracks/1/interp = 1 171 | tracks/1/loop_wrap = true 172 | tracks/1/keys = { 173 | "times": PackedFloat32Array(0), 174 | "transitions": PackedFloat32Array(1), 175 | "update": 1, 176 | "values": [false] 177 | } 178 | 179 | [sub_resource type="AnimationLibrary" id="AnimationLibrary_sxd88"] 180 | _data = { 181 | "RESET": SubResource("Animation_3rrto"), 182 | "idle": SubResource("Animation_qhy7m"), 183 | "run_left": SubResource("Animation_nwual"), 184 | "run_right": SubResource("Animation_jubin"), 185 | "walk_left": SubResource("Animation_xm4x4"), 186 | "walk_right": SubResource("Animation_sirhc") 187 | } 188 | 189 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3q2hq"] 190 | animation = &"idle" 191 | 192 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1imj2"] 193 | animation = &"walk_left" 194 | 195 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cym0a"] 196 | animation = &"walk_right" 197 | 198 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_7msoj"] 199 | animation = &"run_right" 200 | 201 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_r3yan"] 202 | animation = &"run_left" 203 | 204 | [sub_resource type="AnimationNodeBlendSpace1D" id="AnimationNodeBlendSpace1D_adqrl"] 205 | blend_point_0/node = SubResource("AnimationNodeAnimation_3q2hq") 206 | blend_point_0/pos = 0.0 207 | blend_point_1/node = SubResource("AnimationNodeAnimation_1imj2") 208 | blend_point_1/pos = -25.0 209 | blend_point_2/node = SubResource("AnimationNodeAnimation_cym0a") 210 | blend_point_2/pos = 25.0 211 | blend_point_3/node = SubResource("AnimationNodeAnimation_7msoj") 212 | blend_point_3/pos = 75.0 213 | blend_point_4/node = SubResource("AnimationNodeAnimation_r3yan") 214 | blend_point_4/pos = -75.0 215 | min_space = -75.0 216 | max_space = 75.0 217 | blend_mode = 1 218 | 219 | [node name="Enemy" type="CharacterBody2D"] 220 | collision_layer = 4 221 | collision_mask = 196 222 | script = ExtResource("1_80gx6") 223 | 224 | [node name="Hitbox" type="Area2D" parent="."] 225 | collision_layer = 4 226 | collision_mask = 0 227 | script = ExtResource("2_ic17g") 228 | 229 | [node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] 230 | shape = SubResource("CircleShape2D_7ufao") 231 | 232 | [node name="FloorCollision" type="CollisionShape2D" parent="."] 233 | position = Vector2(0, 8) 234 | rotation = 1.57079 235 | shape = SubResource("CapsuleShape2D_llgnc") 236 | 237 | [node name="Sprite2D" type="Sprite2D" parent="."] 238 | texture = ExtResource("1_k54fi") 239 | hframes = 24 240 | 241 | [node name="AnimationPlayer" type="AnimationPlayer" parent="."] 242 | libraries = { 243 | "": SubResource("AnimationLibrary_sxd88") 244 | } 245 | autoplay = "idle" 246 | 247 | [node name="AnimationTree" type="AnimationTree" parent="."] 248 | active = false 249 | libraries = { 250 | "": SubResource("AnimationLibrary_sxd88") 251 | } 252 | tree_root = SubResource("AnimationNodeBlendSpace1D_adqrl") 253 | anim_player = NodePath("../AnimationPlayer") 254 | parameters/blend_position = -0.0589142 255 | 256 | [node name="EnemyAnimation" type="Node" parent="."] 257 | script = ExtResource("4_qlt5l") 258 | 259 | [node name="Health" type="Node" parent="." node_paths=PackedStringArray("hitbox")] 260 | script = ExtResource("3_l2pti") 261 | hitbox = NodePath("../Hitbox") 262 | 263 | [node name="EnemyStateMachine" type="Node" parent="." node_paths=PackedStringArray("initial_state")] 264 | script = ExtResource("4_dx2tj") 265 | initial_state = NodePath("Wander") 266 | 267 | [node name="Idle" type="Node" parent="EnemyStateMachine"] 268 | script = ExtResource("6_0u1p1") 269 | 270 | [node name="Wander" type="Node" parent="EnemyStateMachine"] 271 | script = ExtResource("7_0o0h0") 272 | 273 | [node name="Chase" type="Node" parent="EnemyStateMachine"] 274 | script = ExtResource("8_3f4cv") 275 | -------------------------------------------------------------------------------- /Objects/Scenes/enemy.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=26 format=3 uid="uid://ckfohqhp1io7i"] 2 | 3 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy.gd" id="1_i5ap4"] 4 | [ext_resource type="Texture2D" uid="uid://drfyuy8w6p057" path="res://Art/Arks/DinoSprites - doux.png" id="2_n1oc7"] 5 | [ext_resource type="Texture2D" uid="uid://c5cbe07dk5lyn" path="res://Art/Arks/DinoSprites - mort.png" id="3_yk0c8"] 6 | [ext_resource type="Texture2D" uid="uid://cqcr6ctruxfn5" path="res://Art/Arks/DinoSprites - tard.png" id="4_s8wpe"] 7 | [ext_resource type="Texture2D" uid="uid://eb28cx5toii3" path="res://Art/Arks/DinoSprites - vita.png" id="5_8jp15"] 8 | [ext_resource type="Script" path="res://Util/Components/hitbox.gd" id="6_4fu81"] 9 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy_animation.gd" id="7_136f6"] 10 | [ext_resource type="Script" path="res://Util/Components/health.gd" id="8_ns7hb"] 11 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/enemy_state_machine.gd" id="9_23on8"] 12 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_idle.gd" id="10_d3r8p"] 13 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_wander.gd" id="11_6gdhw"] 14 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_chase.gd" id="12_ajv62"] 15 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/States/enemy_stun.gd" id="13_tkvih"] 16 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/health_label.gd" id="14_dvnq1"] 17 | 18 | [sub_resource type="CircleShape2D" id="CircleShape2D_7ufao"] 19 | radius = 13.0 20 | 21 | [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_llgnc"] 22 | radius = 5.0 23 | height = 16.0 24 | 25 | [sub_resource type="Animation" id="Animation_3rrto"] 26 | length = 0.001 27 | tracks/0/type = "value" 28 | tracks/0/imported = false 29 | tracks/0/enabled = true 30 | tracks/0/path = NodePath("Sprite2D:frame") 31 | tracks/0/interp = 1 32 | tracks/0/loop_wrap = true 33 | tracks/0/keys = { 34 | "times": PackedFloat32Array(0), 35 | "transitions": PackedFloat32Array(1), 36 | "update": 1, 37 | "values": [0] 38 | } 39 | tracks/1/type = "value" 40 | tracks/1/imported = false 41 | tracks/1/enabled = true 42 | tracks/1/path = NodePath("Sprite2D:flip_h") 43 | tracks/1/interp = 1 44 | tracks/1/loop_wrap = true 45 | tracks/1/keys = { 46 | "times": PackedFloat32Array(0), 47 | "transitions": PackedFloat32Array(1), 48 | "update": 1, 49 | "values": [false] 50 | } 51 | tracks/2/type = "value" 52 | tracks/2/imported = false 53 | tracks/2/enabled = true 54 | tracks/2/path = NodePath("Sprite2D:modulate") 55 | tracks/2/interp = 1 56 | tracks/2/loop_wrap = true 57 | tracks/2/keys = { 58 | "times": PackedFloat32Array(0), 59 | "transitions": PackedFloat32Array(1), 60 | "update": 0, 61 | "values": [Color(1, 1, 1, 1)] 62 | } 63 | tracks/3/type = "value" 64 | tracks/3/imported = false 65 | tracks/3/enabled = true 66 | tracks/3/path = NodePath("Sprite2D:rotation") 67 | tracks/3/interp = 1 68 | tracks/3/loop_wrap = true 69 | tracks/3/keys = { 70 | "times": PackedFloat32Array(0), 71 | "transitions": PackedFloat32Array(1), 72 | "update": 0, 73 | "values": [0.0] 74 | } 75 | tracks/4/type = "value" 76 | tracks/4/imported = false 77 | tracks/4/enabled = true 78 | tracks/4/path = NodePath("Sprite2D:position") 79 | tracks/4/interp = 1 80 | tracks/4/loop_wrap = true 81 | tracks/4/keys = { 82 | "times": PackedFloat32Array(0), 83 | "transitions": PackedFloat32Array(1), 84 | "update": 0, 85 | "values": [Vector2(0, 0)] 86 | } 87 | tracks/5/type = "value" 88 | tracks/5/imported = false 89 | tracks/5/enabled = true 90 | tracks/5/path = NodePath("HealthLabel:modulate") 91 | tracks/5/interp = 1 92 | tracks/5/loop_wrap = true 93 | tracks/5/keys = { 94 | "times": PackedFloat32Array(0), 95 | "transitions": PackedFloat32Array(1), 96 | "update": 0, 97 | "values": [Color(1, 1, 1, 1)] 98 | } 99 | 100 | [sub_resource type="Animation" id="Animation_o6yyx"] 101 | resource_name = "death" 102 | step = 0.05 103 | tracks/0/type = "value" 104 | tracks/0/imported = false 105 | tracks/0/enabled = true 106 | tracks/0/path = NodePath("Sprite2D:frame") 107 | tracks/0/interp = 1 108 | tracks/0/loop_wrap = true 109 | tracks/0/keys = { 110 | "times": PackedFloat32Array(0, 0.05, 0.15), 111 | "transitions": PackedFloat32Array(1, 1, 1), 112 | "update": 1, 113 | "values": [14, 15, 16] 114 | } 115 | tracks/1/type = "value" 116 | tracks/1/imported = false 117 | tracks/1/enabled = true 118 | tracks/1/path = NodePath("Sprite2D:modulate") 119 | tracks/1/interp = 1 120 | tracks/1/loop_wrap = true 121 | tracks/1/keys = { 122 | "times": PackedFloat32Array(0.7, 1), 123 | "transitions": PackedFloat32Array(0.5, 1), 124 | "update": 0, 125 | "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] 126 | } 127 | tracks/2/type = "value" 128 | tracks/2/imported = false 129 | tracks/2/enabled = true 130 | tracks/2/path = NodePath("Sprite2D:rotation") 131 | tracks/2/interp = 1 132 | tracks/2/loop_wrap = true 133 | tracks/2/keys = { 134 | "times": PackedFloat32Array(0.7, 1), 135 | "transitions": PackedFloat32Array(0.5, 1), 136 | "update": 0, 137 | "values": [0.0, 6.28319] 138 | } 139 | tracks/3/type = "value" 140 | tracks/3/imported = false 141 | tracks/3/enabled = true 142 | tracks/3/path = NodePath("Sprite2D:position") 143 | tracks/3/interp = 1 144 | tracks/3/loop_wrap = true 145 | tracks/3/keys = { 146 | "times": PackedFloat32Array(0.7, 1), 147 | "transitions": PackedFloat32Array(0.5, 1), 148 | "update": 0, 149 | "values": [Vector2(0, 0), Vector2(0, -14)] 150 | } 151 | tracks/4/type = "method" 152 | tracks/4/imported = false 153 | tracks/4/enabled = true 154 | tracks/4/path = NodePath(".") 155 | tracks/4/interp = 1 156 | tracks/4/loop_wrap = true 157 | tracks/4/keys = { 158 | "times": PackedFloat32Array(1), 159 | "transitions": PackedFloat32Array(1), 160 | "values": [{ 161 | "args": [], 162 | "method": &"queue_free" 163 | }] 164 | } 165 | tracks/5/type = "value" 166 | tracks/5/imported = false 167 | tracks/5/enabled = true 168 | tracks/5/path = NodePath("HealthLabel:modulate") 169 | tracks/5/interp = 1 170 | tracks/5/loop_wrap = true 171 | tracks/5/keys = { 172 | "times": PackedFloat32Array(0.4, 0.6), 173 | "transitions": PackedFloat32Array(1, 1), 174 | "update": 0, 175 | "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] 176 | } 177 | 178 | [sub_resource type="Animation" id="Animation_qhy7m"] 179 | resource_name = "idle" 180 | loop_mode = 1 181 | tracks/0/type = "value" 182 | tracks/0/imported = false 183 | tracks/0/enabled = true 184 | tracks/0/path = NodePath("Sprite2D:frame") 185 | tracks/0/interp = 1 186 | tracks/0/loop_wrap = true 187 | tracks/0/keys = { 188 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9), 189 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), 190 | "update": 1, 191 | "values": [0, 1, 2, 1, 2, 1, 2, 1, 0] 192 | } 193 | 194 | [sub_resource type="Animation" id="Animation_nwual"] 195 | resource_name = "run_left" 196 | length = 0.6 197 | loop_mode = 1 198 | tracks/0/type = "value" 199 | tracks/0/imported = false 200 | tracks/0/enabled = true 201 | tracks/0/path = NodePath("Sprite2D:frame") 202 | tracks/0/interp = 1 203 | tracks/0/loop_wrap = true 204 | tracks/0/keys = { 205 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 206 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 207 | "update": 1, 208 | "values": [18, 19, 20, 21, 22, 23] 209 | } 210 | tracks/1/type = "value" 211 | tracks/1/imported = false 212 | tracks/1/enabled = true 213 | tracks/1/path = NodePath("Sprite2D:flip_h") 214 | tracks/1/interp = 1 215 | tracks/1/loop_wrap = true 216 | tracks/1/keys = { 217 | "times": PackedFloat32Array(0), 218 | "transitions": PackedFloat32Array(1), 219 | "update": 1, 220 | "values": [true] 221 | } 222 | 223 | [sub_resource type="Animation" id="Animation_jubin"] 224 | resource_name = "run_right" 225 | length = 0.6 226 | loop_mode = 1 227 | tracks/0/type = "value" 228 | tracks/0/imported = false 229 | tracks/0/enabled = true 230 | tracks/0/path = NodePath("Sprite2D:frame") 231 | tracks/0/interp = 1 232 | tracks/0/loop_wrap = true 233 | tracks/0/keys = { 234 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 235 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 236 | "update": 1, 237 | "values": [18, 19, 20, 21, 22, 23] 238 | } 239 | tracks/1/type = "value" 240 | tracks/1/imported = false 241 | tracks/1/enabled = true 242 | tracks/1/path = NodePath("Sprite2D:flip_h") 243 | tracks/1/interp = 1 244 | tracks/1/loop_wrap = true 245 | tracks/1/keys = { 246 | "times": PackedFloat32Array(0), 247 | "transitions": PackedFloat32Array(1), 248 | "update": 1, 249 | "values": [false] 250 | } 251 | 252 | [sub_resource type="Animation" id="Animation_whn11"] 253 | resource_name = "stunned" 254 | step = 0.05 255 | tracks/0/type = "value" 256 | tracks/0/imported = false 257 | tracks/0/enabled = true 258 | tracks/0/path = NodePath("Sprite2D:frame") 259 | tracks/0/interp = 1 260 | tracks/0/loop_wrap = true 261 | tracks/0/keys = { 262 | "times": PackedFloat32Array(0, 0.1, 0.15, 0.4, 0.8), 263 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1), 264 | "update": 1, 265 | "values": [14, 15, 16, 14, 13] 266 | } 267 | 268 | [sub_resource type="Animation" id="Animation_xm4x4"] 269 | resource_name = "walk_left" 270 | length = 0.6 271 | loop_mode = 1 272 | tracks/0/type = "value" 273 | tracks/0/imported = false 274 | tracks/0/enabled = true 275 | tracks/0/path = NodePath("Sprite2D:frame") 276 | tracks/0/interp = 1 277 | tracks/0/loop_wrap = true 278 | tracks/0/keys = { 279 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 280 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 281 | "update": 1, 282 | "values": [4, 5, 6, 7, 8, 9] 283 | } 284 | tracks/1/type = "value" 285 | tracks/1/imported = false 286 | tracks/1/enabled = true 287 | tracks/1/path = NodePath("Sprite2D:flip_h") 288 | tracks/1/interp = 1 289 | tracks/1/loop_wrap = true 290 | tracks/1/keys = { 291 | "times": PackedFloat32Array(0), 292 | "transitions": PackedFloat32Array(1), 293 | "update": 1, 294 | "values": [true] 295 | } 296 | 297 | [sub_resource type="Animation" id="Animation_sirhc"] 298 | resource_name = "walk_right" 299 | length = 0.6 300 | loop_mode = 1 301 | tracks/0/type = "value" 302 | tracks/0/imported = false 303 | tracks/0/enabled = true 304 | tracks/0/path = NodePath("Sprite2D:frame") 305 | tracks/0/interp = 1 306 | tracks/0/loop_wrap = true 307 | tracks/0/keys = { 308 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), 309 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), 310 | "update": 1, 311 | "values": [4, 5, 6, 7, 8, 9] 312 | } 313 | tracks/1/type = "value" 314 | tracks/1/imported = false 315 | tracks/1/enabled = true 316 | tracks/1/path = NodePath("Sprite2D:flip_h") 317 | tracks/1/interp = 1 318 | tracks/1/loop_wrap = true 319 | tracks/1/keys = { 320 | "times": PackedFloat32Array(0), 321 | "transitions": PackedFloat32Array(1), 322 | "update": 1, 323 | "values": [false] 324 | } 325 | 326 | [sub_resource type="AnimationLibrary" id="AnimationLibrary_sxd88"] 327 | _data = { 328 | "RESET": SubResource("Animation_3rrto"), 329 | "death": SubResource("Animation_o6yyx"), 330 | "idle": SubResource("Animation_qhy7m"), 331 | "run_left": SubResource("Animation_nwual"), 332 | "run_right": SubResource("Animation_jubin"), 333 | "stunned": SubResource("Animation_whn11"), 334 | "walk_left": SubResource("Animation_xm4x4"), 335 | "walk_right": SubResource("Animation_sirhc") 336 | } 337 | 338 | [node name="Enemy" type="CharacterBody2D"] 339 | collision_layer = 4 340 | collision_mask = 192 341 | script = ExtResource("1_i5ap4") 342 | textures = Array[Texture2D]([ExtResource("2_n1oc7"), ExtResource("3_yk0c8"), ExtResource("4_s8wpe"), ExtResource("5_8jp15")]) 343 | 344 | [node name="Hitbox" type="Area2D" parent="."] 345 | collision_layer = 4 346 | collision_mask = 0 347 | script = ExtResource("6_4fu81") 348 | 349 | [node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] 350 | shape = SubResource("CircleShape2D_7ufao") 351 | 352 | [node name="FloorCollision" type="CollisionShape2D" parent="."] 353 | position = Vector2(0, 8) 354 | rotation = 1.57079 355 | shape = SubResource("CapsuleShape2D_llgnc") 356 | 357 | [node name="Sprite2D" type="Sprite2D" parent="."] 358 | texture = ExtResource("5_8jp15") 359 | hframes = 24 360 | 361 | [node name="AnimationPlayer" type="AnimationPlayer" parent="."] 362 | libraries = { 363 | "": SubResource("AnimationLibrary_sxd88") 364 | } 365 | autoplay = "idle" 366 | 367 | [node name="HealthLabel" type="Label" parent="."] 368 | anchors_preset = 8 369 | anchor_left = 0.5 370 | anchor_top = 0.5 371 | anchor_right = 0.5 372 | anchor_bottom = 0.5 373 | offset_left = -20.0 374 | offset_top = -23.0 375 | offset_right = 59.0 376 | offset_bottom = 13.0 377 | grow_horizontal = 2 378 | grow_vertical = 2 379 | scale = Vector2(0.5, 0.5) 380 | theme_override_font_sizes/font_size = 16 381 | text = "Health: 10" 382 | horizontal_alignment = 1 383 | script = ExtResource("14_dvnq1") 384 | 385 | [node name="EnemyAnimation" type="Node" parent="." node_paths=PackedStringArray("animation_player", "sprite")] 386 | script = ExtResource("7_136f6") 387 | animation_player = NodePath("../AnimationPlayer") 388 | sprite = NodePath("../Sprite2D") 389 | 390 | [node name="Health" type="Node" parent="." node_paths=PackedStringArray("hitbox", "animation_player")] 391 | script = ExtResource("8_ns7hb") 392 | hitbox = NodePath("../Hitbox") 393 | animation_player = NodePath("../AnimationPlayer") 394 | 395 | [node name="EnemyStateMachine" type="Node" parent="." node_paths=PackedStringArray("initial_state")] 396 | script = ExtResource("9_23on8") 397 | initial_state = NodePath("Wander") 398 | 399 | [node name="Idle" type="Node" parent="EnemyStateMachine"] 400 | script = ExtResource("10_d3r8p") 401 | 402 | [node name="Wander" type="Node" parent="EnemyStateMachine"] 403 | script = ExtResource("11_6gdhw") 404 | 405 | [node name="Chase" type="Node" parent="EnemyStateMachine"] 406 | script = ExtResource("12_ajv62") 407 | 408 | [node name="Stun" type="Node" parent="EnemyStateMachine"] 409 | script = ExtResource("13_tkvih") 410 | 411 | [connection signal="damaged" from="Hitbox" to="." method="on_damaged"] 412 | [connection signal="health_changed" from="Health" to="HealthLabel" method="on_health_changed"] 413 | -------------------------------------------------------------------------------- /Objects/Scenes/upgrade.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=7 format=3 uid="uid://duul6fe7ylcjr"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://30ltamteuvkx" path="res://Art/Kenney/carrot.png" id="1_1h1r5"] 4 | [ext_resource type="Script" path="res://Objects/Scripts/upgrade.gd" id="1_wj2mu"] 5 | [ext_resource type="Script" path="res://Util/Strategy/base_bullet_strategy.gd" id="2_h3bhn"] 6 | [ext_resource type="Script" path="res://Objects/Scripts/Enemy/health_label.gd" id="4_5ayge"] 7 | 8 | [sub_resource type="Resource" id="Resource_eyw8t"] 9 | script = ExtResource("2_h3bhn") 10 | texture = ExtResource("1_1h1r5") 11 | upgrade_text = "Speed" 12 | 13 | [sub_resource type="CircleShape2D" id="CircleShape2D_x2vwr"] 14 | 15 | [node name="Upgrade" type="Area2D" node_paths=PackedStringArray("upgrade_label", "sprite")] 16 | collision_layer = 0 17 | script = ExtResource("1_wj2mu") 18 | upgrade_label = NodePath("UpgradeLabel") 19 | sprite = NodePath("Sprite2D") 20 | bullet_strategy = SubResource("Resource_eyw8t") 21 | needs_update = true 22 | 23 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 24 | shape = SubResource("CircleShape2D_x2vwr") 25 | 26 | [node name="Sprite2D" type="Sprite2D" parent="."] 27 | texture = ExtResource("1_1h1r5") 28 | 29 | [node name="UpgradeLabel" type="Label" parent="."] 30 | anchors_preset = 8 31 | anchor_left = 0.5 32 | anchor_top = 0.5 33 | anchor_right = 0.5 34 | anchor_bottom = 0.5 35 | offset_left = -20.0 36 | offset_top = -23.0 37 | offset_right = 59.0 38 | offset_bottom = 13.0 39 | grow_horizontal = 2 40 | grow_vertical = 2 41 | scale = Vector2(0.5, 0.5) 42 | theme_override_font_sizes/font_size = 16 43 | text = "Speed" 44 | horizontal_alignment = 1 45 | script = ExtResource("4_5ayge") 46 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/States/enemy_chase.gd: -------------------------------------------------------------------------------- 1 | extends EnemyState 2 | 3 | 4 | @export var chase_speed := 75.0 5 | 6 | 7 | func physics_process_state(delta: float): 8 | 9 | var direction := player.global_position - enemy.global_position 10 | 11 | var distance = direction.length() 12 | if distance > enemy.chase_radius: 13 | transitioned.emit(self, "wander") 14 | return 15 | 16 | enemy.velocity = direction.normalized()*chase_speed 17 | 18 | if distance <= enemy.follow_radius: 19 | enemy.velocity = Vector2.ZERO 20 | 21 | enemy.move_and_slide() 22 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/States/enemy_idle.gd: -------------------------------------------------------------------------------- 1 | extends EnemyState 2 | 3 | 4 | var idle_timer : Timer 5 | 6 | 7 | # Upon moving to this state, initialize the 8 | # timer with a random duration. 9 | func enter(): 10 | enemy.velocity = Vector2.ZERO 11 | 12 | idle_timer = Timer.new() 13 | idle_timer.wait_time = randi_range(3, 10) 14 | idle_timer.timeout.connect(on_timeout) 15 | idle_timer.autostart = true 16 | add_child(idle_timer) 17 | 18 | 19 | func on_timeout(): 20 | transitioned.emit(self, "wander") 21 | 22 | 23 | func _physics_process(delta: float) -> void: 24 | try_chase() 25 | 26 | 27 | # When leaving this state (for any reason), stop timer, 28 | # disconnect signals, and free timer 29 | # Technically, just queue_free() would be required, but 30 | # I like showcasing all of the options 31 | func exit(): 32 | idle_timer.stop() 33 | idle_timer.timeout.disconnect(on_timeout) 34 | idle_timer.queue_free() 35 | idle_timer = null 36 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/States/enemy_state.gd: -------------------------------------------------------------------------------- 1 | class_name EnemyState 2 | extends Node 3 | 4 | 5 | ##################################### 6 | # This is the base enemy state 7 | # Each state will inherit from this 8 | ##################################### 9 | 10 | signal transitioned(state: EnemyState, new_state_name: String) 11 | 12 | @onready var enemy : Enemy = get_owner() 13 | var player : Player 14 | 15 | 16 | func _ready(): 17 | player = get_tree().get_first_node_in_group("player") 18 | enemy.damaged.connect(on_damaged) 19 | 20 | 21 | # This is called directly when transitioning to this state 22 | # Useful for setting up the state to be used 23 | # In Idle, we use this function to decide how long we will idle for 24 | func enter(): 25 | pass 26 | 27 | 28 | # When the state is active, this is essentially the _process() function 29 | func process_state(delta: float): 30 | pass 31 | 32 | 33 | # When the state is active, this is essentially the _physics_process() function 34 | func physics_process_state(delta: float): 35 | pass 36 | 37 | 38 | # Useful for cleaning up the state 39 | # For example, clearing any timers, disconnecting any signals, etc. 40 | func exit(): 41 | pass 42 | 43 | 44 | ############################################### 45 | # Non FSM-specific methods. These are utility 46 | # methods that may be used by multiple states. 47 | ############################################### 48 | 49 | # Attempts to switch to chase state if it detects the player 50 | func try_chase() -> bool: 51 | if get_distance_to_player() <= enemy.detection_radius: 52 | transitioned.emit(self, "chase") 53 | return true 54 | 55 | return false 56 | 57 | 58 | func get_distance_to_player() -> float: 59 | return player.global_position.distance_to(enemy.global_position) 60 | 61 | 62 | # If you wanted to replace this functionality in a state you can either: 63 | # 1. Disconnect the signal by doing enemy.damaged.disconnect(on_damaged) 64 | # 2. Override the on_damaged() function to do nothing 65 | # 3. Override the _ready() function 66 | # This is the order I would recommend personally 67 | func on_damaged(attack: Attack): 68 | transitioned.emit(self, "stun") 69 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/States/enemy_stun.gd: -------------------------------------------------------------------------------- 1 | extends EnemyState 2 | 3 | 4 | var timer : Timer 5 | 6 | 7 | # Upon moving to this state, initialize timer 8 | # and stun enemy 9 | func enter(): 10 | timer = Timer.new() 11 | timer.wait_time = 1.0 12 | timer.autostart = true 13 | timer.timeout.connect(on_timer_finished) 14 | add_child(timer) 15 | enemy.stunned = true 16 | 17 | 18 | # Upon leaving this state, clear and free all 19 | # state relevant stuff 20 | func exit(): 21 | timer.stop() 22 | timer.timeout.disconnect(on_timer_finished) 23 | timer.queue_free() 24 | timer = null 25 | enemy.stunned = false 26 | 27 | 28 | func on_timer_finished(): 29 | if !try_chase(): 30 | transitioned.emit(self, "chase") 31 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/States/enemy_wander.gd: -------------------------------------------------------------------------------- 1 | extends EnemyState 2 | 3 | 4 | @export var min_wander_time := 2.5 5 | @export var max_wander_time := 10.0 6 | @export var wander_speed := 50.0 7 | 8 | var wander_direction : Vector2 9 | 10 | var wander_timer : Timer 11 | 12 | 13 | # Upon moving to this state, initialize the 14 | # timer with a random duration. 15 | func enter(): 16 | wander_direction = Vector2.UP.rotated(deg_to_rad(randf_range(0, 360))) 17 | wander_timer = Timer.new() 18 | wander_timer.wait_time = randf_range(min_wander_time, max_wander_time) 19 | wander_timer.timeout.connect(on_timer_finished) 20 | wander_timer.autostart = true 21 | add_child(wander_timer) 22 | 23 | 24 | func physics_process_state(delta: float): 25 | enemy.velocity = wander_direction*wander_speed 26 | enemy.move_and_slide() 27 | 28 | try_chase() 29 | 30 | 31 | func on_timer_finished(): 32 | transitioned.emit(self, "idle") 33 | 34 | 35 | # When leaving this state (for any reason), stop timer, 36 | # disconnect signals, and free timer 37 | # Technically, just queue_free() would be required, but 38 | # I like showcasing all of the options 39 | func exit(): 40 | wander_timer.stop() 41 | wander_timer.timeout.disconnect(on_timer_finished) 42 | wander_timer.queue_free() 43 | wander_timer = null 44 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/enemy.gd: -------------------------------------------------------------------------------- 1 | class_name Enemy 2 | extends CharacterBody2D 3 | 4 | ######################################################### 5 | # I tend to keep the top level node's functionality 6 | # small. Here, this node is responsible for common state 7 | # variables, passing the damaged signal around, and 8 | # picking a random texture on spawn. 9 | # 10 | # For the most part, other functionality that controls 11 | # the enemy is handled by specific states. 12 | # 13 | # ex. Movement is handled by states setting velocity 14 | # and calling move_and_slide() 15 | ######################################################## 16 | 17 | 18 | signal damaged(attack: Attack) 19 | 20 | @export_group("Textures") 21 | @export var textures: Array[Texture2D] = [] 22 | 23 | @export_group("Vision Ranges") 24 | @export var detection_radius := 100.0 25 | @export var chase_radius := 200.0 26 | # This guy doesn't actually attack, he just tries to get close to the player 27 | @export var follow_radius := 25.0 28 | 29 | @onready var sprite : Sprite2D = $Sprite2D 30 | 31 | var alive := true 32 | var stunned := false 33 | 34 | 35 | func _ready(): 36 | sprite.texture = textures.pick_random() 37 | 38 | 39 | func on_damaged(attack: Attack) -> void: 40 | damaged.emit(attack) 41 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/enemy_animation.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | ################################################### 5 | # This controls all animations for the enemy. 6 | # You totally could use an AnimationTree for this, 7 | # but this is an example of how you could control 8 | # it through code. 9 | ################################################### 10 | 11 | 12 | @export var animation_player : AnimationPlayer 13 | @export var sprite : Sprite2D 14 | @onready var enemy : Enemy = get_owner() 15 | 16 | 17 | func _physics_process(delta: float) -> void: 18 | if !enemy.alive: 19 | return 20 | 21 | if enemy.stunned: 22 | animation_player.play("stunned") 23 | return 24 | 25 | if !enemy.velocity: 26 | animation_player.play("idle") 27 | return 28 | 29 | sprite.flip_h = enemy.velocity.x < 0 30 | 31 | var animation_name = "walk" 32 | 33 | if enemy.velocity.length() > 50: 34 | animation_name = "run" 35 | 36 | 37 | if sprite.flip_h: 38 | animation_name += "_left" 39 | else: 40 | animation_name += "_right" 41 | 42 | animation_player.play(animation_name) 43 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/enemy_state_machine.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | ############################################# 4 | # State machine as set up in my video on FSMs 5 | # https://www.youtube.com/watch?v=ow_Lum-Agbs 6 | # Code is clearer here though, better names 7 | ############################################# 8 | 9 | @export var initial_state : EnemyState 10 | 11 | var current_state : EnemyState 12 | var states : Dictionary = {} 13 | 14 | 15 | func _ready(): 16 | for child in get_children(): 17 | if child is EnemyState: 18 | states[child.name.to_lower()] = child 19 | child.transitioned.connect(on_child_transition) 20 | 21 | if initial_state: 22 | current_state = initial_state 23 | current_state.enter() 24 | 25 | 26 | func _process(delta): 27 | if current_state: 28 | current_state.process_state(delta) 29 | 30 | 31 | func _physics_process(delta): 32 | if current_state: 33 | current_state.physics_process_state(delta) 34 | 35 | 36 | func on_child_transition(state: EnemyState, new_state_name: String): 37 | if state != current_state: 38 | return 39 | 40 | var new_state = states.get(new_state_name.to_lower()) 41 | if !new_state: 42 | return 43 | 44 | # Clean up the previous state 45 | if current_state: 46 | current_state.exit() 47 | 48 | # Intialize the new state 49 | new_state.enter() 50 | current_state = new_state 51 | -------------------------------------------------------------------------------- /Objects/Scripts/Enemy/health_label.gd: -------------------------------------------------------------------------------- 1 | extends Label 2 | 3 | 4 | func on_health_changed(new_health: float): 5 | text = "Health: " + str(new_health) 6 | -------------------------------------------------------------------------------- /Objects/Scripts/bullet.gd: -------------------------------------------------------------------------------- 1 | class_name Bullet 2 | extends CharacterBody2D 3 | 4 | @export var hurtbox : Hurtbox 5 | 6 | @export var speed := 150.0 7 | @export var damage := 5.0 8 | @export var max_pierce := 1 9 | 10 | var current_pierce_count := 0 11 | 12 | 13 | func _ready(): 14 | if hurtbox: 15 | hurtbox.hit_enemy.connect(on_enemy_hit) 16 | 17 | 18 | func _physics_process(delta: float) -> void: 19 | var direction = Vector2.RIGHT.rotated(rotation) 20 | 21 | velocity = direction*speed 22 | 23 | var collision := move_and_collide(velocity*delta) 24 | 25 | if collision: 26 | queue_free() 27 | 28 | 29 | func on_enemy_hit(): 30 | current_pierce_count += 1 31 | 32 | if current_pierce_count >= max_pierce: 33 | queue_free() 34 | -------------------------------------------------------------------------------- /Objects/Scripts/bullet_particles.gd: -------------------------------------------------------------------------------- 1 | extends GPUParticles2D 2 | 3 | 4 | var target : Node2D 5 | 6 | 7 | func _ready(): 8 | # Here, we reparent the node to the root but store the parent as our follow target 9 | # We do this because if the parent gets freed, all of the particles disappear immediately. 10 | target = get_parent() 11 | finished.connect(on_finished) 12 | reparent(get_tree().root) 13 | 14 | 15 | func _physics_process(delta: float) -> void: 16 | if target && is_instance_valid(target): 17 | global_position = target.global_position 18 | else: 19 | emitting = false 20 | 21 | 22 | # Finished is called when all particles have disappeared 23 | func on_finished(): 24 | queue_free() 25 | -------------------------------------------------------------------------------- /Objects/Scripts/upgrade.gd: -------------------------------------------------------------------------------- 1 | #################################################### 2 | # Tools are sick. The code in this script is treated 3 | # nearly the same as if the game is running. The one 4 | # difference is we can do Engine.is_editor_hint() to 5 | # find out if we're currently in the editor 6 | # Docs: https://docs.godotengine.org/en/stable/tutorials/plugins/running_code_in_the_editor.html#how-to-use-tool 7 | #################################################### 8 | @tool 9 | extends Area2D 10 | 11 | @export var upgrade_label : Label 12 | @export var sprite : Sprite2D 13 | @export var bullet_strategy : BaseBulletStrategy: 14 | set(val): 15 | bullet_strategy = val 16 | needs_update = true 17 | 18 | # Used when editing to denote that the sprite has changed and needs updating 19 | @export var needs_update := false 20 | 21 | 22 | func _ready() -> void: 23 | body_entered.connect(on_body_entered) 24 | sprite.texture = bullet_strategy.texture 25 | upgrade_label.text = bullet_strategy.upgrade_text 26 | 27 | 28 | func _process(delta: float) -> void: 29 | 30 | # This is run only when we're editing the scene 31 | # It updates the texture of the sprite when we replace the upgrade strategy 32 | if Engine.is_editor_hint(): 33 | if needs_update: 34 | sprite.texture = bullet_strategy.texture 35 | upgrade_label.text = bullet_strategy.upgrade_text 36 | needs_update = false 37 | 38 | 39 | func on_body_entered(body: PhysicsBody2D): 40 | if body is Player: 41 | ###################################### 42 | # Strategy Relevant Code: 43 | # This adds the upgrade to our player, 44 | # which the player uses when firing. 45 | ###################################### 46 | body.upgrades.append(bullet_strategy) 47 | 48 | queue_free() 49 | -------------------------------------------------------------------------------- /Player/Animations/player.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bitlytic/Strategy-GDScript/0b362be9742a4d804f1b2b7348c9b107e8794bd5/Player/Animations/player.res -------------------------------------------------------------------------------- /Player/Scripts/player.gd: -------------------------------------------------------------------------------- 1 | class_name Player 2 | extends CharacterBody2D 3 | 4 | 5 | ############################################ 6 | # Strategy Relevant Code: 7 | # This is where the upgrades are stored 8 | ############################################ 9 | var upgrades : Array[BaseBulletStrategy] = [] 10 | 11 | var aim_position : Vector2 = Vector2(1, 0) 12 | 13 | 14 | func _unhandled_input(event: InputEvent) -> void: 15 | if event is InputEventMouseMotion: 16 | var half_viewport = get_viewport_rect().size / 2.0 17 | aim_position = (event.position - half_viewport) 18 | -------------------------------------------------------------------------------- /Player/Scripts/player_animation.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | ################################################## 4 | # Similar to the movement component. The actual 5 | # animations are handled through an AnimationTree 6 | # for the player, but parameters are updated here. 7 | ################################################## 8 | 9 | @export var animation_tree : AnimationTree 10 | @export var sprite : Sprite2D 11 | 12 | @onready var player : Player = get_owner() 13 | 14 | 15 | func _ready(): 16 | # The animation tree is inactive while outside of gameplay. 17 | # This makes it easier to edit animations in the editor. 18 | animation_tree.active = true 19 | 20 | 21 | func _physics_process(delta: float) -> void: 22 | var velocity = player.velocity 23 | 24 | if velocity: 25 | var time_scale = 1 26 | 27 | if sign(player.aim_position.x) != sign(player.velocity.x): 28 | time_scale = -1 29 | 30 | animation_tree.set("parameters/TimeScale/scale", time_scale) 31 | animation_tree.set("parameters/WalkDirection/blend_position", sign(player.aim_position.x)) 32 | else: 33 | sprite.flip_h = player.aim_position.x < 0 34 | animation_tree.set("parameters/TimeScale/scale", 1) 35 | animation_tree.set("parameters/WalkDirection/blend_position", 0) 36 | 37 | -------------------------------------------------------------------------------- /Player/Scripts/player_camera.gd: -------------------------------------------------------------------------------- 1 | extends Camera2D 2 | 3 | @export var target : Player 4 | @export var sensitivity := 0.1 5 | 6 | 7 | func _physics_process(delta: float) -> void: 8 | var target_position = target.aim_position * sensitivity 9 | 10 | position = position.lerp(target_position, 0.25) 11 | -------------------------------------------------------------------------------- /Player/Scripts/player_movement.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | ########################################################## 4 | # This is the player's movement controller. 5 | # Instead of placing all of the movement stuff inside 6 | # of the player, we move the code to a separate component 7 | ########################################################## 8 | 9 | @export_group("Speed Values") 10 | @export var max_speed := 100.0 11 | @export var acceleration_time := 0.1 12 | 13 | @onready var player : CharacterBody2D = get_owner() 14 | 15 | 16 | func _physics_process(delta): 17 | # Read the player's current velocity 18 | var velocity = player.velocity 19 | 20 | var input_direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") 21 | 22 | # Apply any changes to velocity 23 | velocity = velocity.move_toward(input_direction*max_speed, (1.0 / acceleration_time) * delta * max_speed) 24 | 25 | if input_direction.y && sign(input_direction.y) != sign(velocity.y): 26 | velocity.y *= 0.75 27 | 28 | if input_direction.x && sign(input_direction.x) != sign(velocity.x): 29 | velocity.x *= 0.75 30 | 31 | # Reassign velocity and move the player 32 | player.velocity = velocity 33 | player.move_and_slide() 34 | -------------------------------------------------------------------------------- /Player/Scripts/player_weapon.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | 4 | @export var firing_position : Marker2D 5 | 6 | @onready var player : Player = get_owner() 7 | 8 | var bullet_scene : PackedScene = preload("res://Objects/Scenes/bullet.tscn") 9 | 10 | 11 | func _physics_process(delta: float) -> void: 12 | if Input.is_action_just_pressed("primary_fire"): 13 | 14 | # If we're aiming at a different side, flip the firing position across the X axis 15 | if sign(player.aim_position.x) != sign(firing_position.position.x): 16 | firing_position.position.x *= -1 17 | 18 | # Spawn a bullet and give it a rotation based on the angle between the firing position and 19 | # the cursor's position. 20 | # The bullet will use this rotation to decide its direction. 21 | var spawned_bullet := bullet_scene.instantiate() 22 | var mouse_direction := get_global_mouse_position() - firing_position.global_position 23 | 24 | get_tree().root.add_child(spawned_bullet) 25 | spawned_bullet.global_position = firing_position.global_position 26 | spawned_bullet.rotation = mouse_direction.angle() 27 | 28 | 29 | ################################################## 30 | # Strategy Relevant Code: 31 | # Here, we loop over all of the upgrades currently 32 | # on the player, and apply their upgrade to the 33 | # spawned bullet. 34 | ################################################## 35 | for strategy in player.upgrades: 36 | strategy.apply_upgrade(spawned_bullet) 37 | 38 | -------------------------------------------------------------------------------- /Player/pla46D.tmp: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=19 format=3 uid="uid://dl7eyk012o1hp"] 2 | 3 | [ext_resource type="Script" path="res://Player/Scripts/player.gd" id="1_8rogi"] 4 | [ext_resource type="Texture2D" uid="uid://b8qo5sm247axm" path="res://Art/Bitlytic/B0-Z0.png" id="2_5ht7k"] 5 | [ext_resource type="Script" path="res://Scenes/player_movement.gd" id="3_cjxe3"] 6 | [ext_resource type="Script" path="res://Player/Scripts/PlayerAnimation.gd" id="4_of2ax"] 7 | [ext_resource type="Script" path="res://Player/Scripts/player_weapon.gd" id="4_rntaj"] 8 | [ext_resource type="Script" path="res://Objects/Scripts/player_camera.gd" id="5_dq44d"] 9 | 10 | [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_2ix7w"] 11 | radius = 4.0 12 | height = 14.0 13 | 14 | [sub_resource type="Animation" id="Animation_tcl75"] 15 | resource_name = "run_right" 16 | length = 0.8 17 | loop_mode = 1 18 | tracks/0/type = "value" 19 | tracks/0/imported = false 20 | tracks/0/enabled = true 21 | tracks/0/path = NodePath("PlayerSprite:frame") 22 | tracks/0/interp = 1 23 | tracks/0/loop_wrap = true 24 | tracks/0/keys = { 25 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), 26 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), 27 | "update": 1, 28 | "values": [16, 17, 18, 19, 20, 21, 22, 23] 29 | } 30 | tracks/1/type = "value" 31 | tracks/1/imported = false 32 | tracks/1/enabled = true 33 | tracks/1/path = NodePath("PlayerSprite:flip_h") 34 | tracks/1/interp = 1 35 | tracks/1/loop_wrap = true 36 | tracks/1/keys = { 37 | "times": PackedFloat32Array(0), 38 | "transitions": PackedFloat32Array(1), 39 | "update": 1, 40 | "values": [false] 41 | } 42 | 43 | [sub_resource type="Animation" id="Animation_5yh3q"] 44 | length = 0.001 45 | tracks/0/type = "value" 46 | tracks/0/imported = false 47 | tracks/0/enabled = true 48 | tracks/0/path = NodePath("PlayerSprite:frame") 49 | tracks/0/interp = 1 50 | tracks/0/loop_wrap = true 51 | tracks/0/keys = { 52 | "times": PackedFloat32Array(0), 53 | "transitions": PackedFloat32Array(1), 54 | "update": 1, 55 | "values": [16] 56 | } 57 | tracks/1/type = "value" 58 | tracks/1/imported = false 59 | tracks/1/enabled = true 60 | tracks/1/path = NodePath("PlayerSprite:flip_h") 61 | tracks/1/interp = 1 62 | tracks/1/loop_wrap = true 63 | tracks/1/keys = { 64 | "times": PackedFloat32Array(0), 65 | "transitions": PackedFloat32Array(1), 66 | "update": 1, 67 | "values": [false] 68 | } 69 | 70 | [sub_resource type="Animation" id="Animation_1uhdu"] 71 | resource_name = "run_left" 72 | length = 0.8 73 | loop_mode = 1 74 | tracks/0/type = "value" 75 | tracks/0/imported = false 76 | tracks/0/enabled = true 77 | tracks/0/path = NodePath("PlayerSprite:frame") 78 | tracks/0/interp = 1 79 | tracks/0/loop_wrap = true 80 | tracks/0/keys = { 81 | "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), 82 | "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), 83 | "update": 1, 84 | "values": [16, 17, 18, 19, 20, 21, 22, 23] 85 | } 86 | tracks/1/type = "value" 87 | tracks/1/imported = false 88 | tracks/1/enabled = true 89 | tracks/1/path = NodePath("PlayerSprite:flip_h") 90 | tracks/1/interp = 1 91 | tracks/1/loop_wrap = true 92 | tracks/1/keys = { 93 | "times": PackedFloat32Array(0), 94 | "transitions": PackedFloat32Array(1), 95 | "update": 1, 96 | "values": [true] 97 | } 98 | 99 | [sub_resource type="Animation" id="Animation_fh717"] 100 | resource_name = "idle" 101 | length = 0.1 102 | tracks/0/type = "value" 103 | tracks/0/imported = false 104 | tracks/0/enabled = true 105 | tracks/0/path = NodePath("PlayerSprite:frame") 106 | tracks/0/interp = 1 107 | tracks/0/loop_wrap = true 108 | tracks/0/keys = { 109 | "times": PackedFloat32Array(0), 110 | "transitions": PackedFloat32Array(1), 111 | "update": 1, 112 | "values": [0] 113 | } 114 | 115 | [sub_resource type="AnimationLibrary" id="AnimationLibrary_ffsxo"] 116 | _data = { 117 | "RESET": SubResource("Animation_5yh3q"), 118 | "idle": SubResource("Animation_fh717"), 119 | "run_left": SubResource("Animation_1uhdu"), 120 | "run_right": SubResource("Animation_tcl75") 121 | } 122 | 123 | [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_p4448"] 124 | 125 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_xldp4"] 126 | animation = &"idle" 127 | 128 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_yr4kv"] 129 | animation = &"run_right" 130 | 131 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_fbrvf"] 132 | animation = &"run_left" 133 | 134 | [sub_resource type="AnimationNodeBlendSpace1D" id="AnimationNodeBlendSpace1D_pvejd"] 135 | blend_point_0/node = SubResource("AnimationNodeAnimation_xldp4") 136 | blend_point_0/pos = 0.0 137 | blend_point_1/node = SubResource("AnimationNodeAnimation_yr4kv") 138 | blend_point_1/pos = 0.1 139 | blend_point_2/node = SubResource("AnimationNodeAnimation_fbrvf") 140 | blend_point_2/pos = -0.1 141 | blend_mode = 1 142 | 143 | [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_6djsc"] 144 | graph_offset = Vector2(-571.646, -172.827) 145 | nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_p4448") 146 | nodes/TimeScale/position = Vector2(40, 100) 147 | nodes/WalkDirection/node = SubResource("AnimationNodeBlendSpace1D_pvejd") 148 | nodes/WalkDirection/position = Vector2(-200, 80) 149 | node_connections = [&"TimeScale", 0, &"WalkDirection", &"output", 0, &"TimeScale"] 150 | 151 | [node name="Player" type="CharacterBody2D"] 152 | collision_mask = 128 153 | script = ExtResource("1_8rogi") 154 | 155 | [node name="FloorCollision" type="CollisionShape2D" parent="."] 156 | position = Vector2(0, 3) 157 | rotation = 1.57079 158 | shape = SubResource("CapsuleShape2D_2ix7w") 159 | 160 | [node name="PlayerSprite" type="Sprite2D" parent="."] 161 | position = Vector2(0, -12) 162 | texture = ExtResource("2_5ht7k") 163 | hframes = 8 164 | vframes = 3 165 | frame = 16 166 | 167 | [node name="PlayerMovement" type="Node" parent="."] 168 | script = ExtResource("3_cjxe3") 169 | 170 | [node name="PlayerAnimation" type="Node" parent="." node_paths=PackedStringArray("animation_tree")] 171 | script = ExtResource("4_of2ax") 172 | animation_tree = NodePath("../AnimationTree") 173 | 174 | [node name="PlayerWeapon" type="Node2D" parent="." node_paths=PackedStringArray("firing_position")] 175 | script = ExtResource("4_rntaj") 176 | firing_position = NodePath("../FiringPosition") 177 | 178 | [node name="FiringPosition" type="Marker2D" parent="."] 179 | position = Vector2(2, -4) 180 | 181 | [node name="PlayerCamera" type="Camera2D" parent="." node_paths=PackedStringArray("target")] 182 | position = Vector2(-571, -337) 183 | zoom = Vector2(2, 2) 184 | script = ExtResource("5_dq44d") 185 | target = NodePath("..") 186 | 187 | [node name="AnimationPlayer" type="AnimationPlayer" parent="."] 188 | libraries = { 189 | "": SubResource("AnimationLibrary_ffsxo") 190 | } 191 | 192 | [node name="AnimationTree" type="AnimationTree" parent="."] 193 | libraries = { 194 | "": SubResource("AnimationLibrary_ffsxo") 195 | } 196 | tree_root = SubResource("AnimationNodeBlendTree_6djsc") 197 | anim_player = NodePath("../AnimationPlayer") 198 | parameters/TimeScale/scale = 1.0 199 | parameters/WalkDirection/blend_position = 0.00235665 200 | -------------------------------------------------------------------------------- /Player/player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=15 format=3 uid="uid://dl7eyk012o1hp"] 2 | 3 | [ext_resource type="Script" path="res://Player/Scripts/player.gd" id="1_8rogi"] 4 | [ext_resource type="Texture2D" uid="uid://b8qo5sm247axm" path="res://Art/Bitlytic/B0-Z0.png" id="2_5ht7k"] 5 | [ext_resource type="Script" path="res://Player/Scripts/player_movement.gd" id="3_cjxe3"] 6 | [ext_resource type="Script" path="res://Player/Scripts/player_animation.gd" id="4_of2ax"] 7 | [ext_resource type="Script" path="res://Player/Scripts/player_weapon.gd" id="4_rntaj"] 8 | [ext_resource type="Script" path="res://Player/Scripts/player_camera.gd" id="5_dq44d"] 9 | [ext_resource type="AnimationLibrary" uid="uid://c8n45di3aj1ys" path="res://Player/Animations/player.res" id="7_qwi34"] 10 | 11 | [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_2ix7w"] 12 | radius = 4.0 13 | height = 14.0 14 | 15 | [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_p4448"] 16 | 17 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_xldp4"] 18 | animation = &"idle" 19 | 20 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_fbrvf"] 21 | animation = &"run_left" 22 | 23 | [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_cvija"] 24 | animation = &"run_right" 25 | 26 | [sub_resource type="AnimationNodeBlendSpace1D" id="AnimationNodeBlendSpace1D_pvejd"] 27 | blend_point_0/node = SubResource("AnimationNodeAnimation_xldp4") 28 | blend_point_0/pos = 0.0 29 | blend_point_1/node = SubResource("AnimationNodeAnimation_fbrvf") 30 | blend_point_1/pos = -0.1 31 | blend_point_2/node = SubResource("AnimationNodeAnimation_cvija") 32 | blend_point_2/pos = 0.1 33 | blend_mode = 1 34 | 35 | [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_6djsc"] 36 | graph_offset = Vector2(-369, 13) 37 | nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_p4448") 38 | nodes/TimeScale/position = Vector2(0, 80) 39 | nodes/WalkDirection/node = SubResource("AnimationNodeBlendSpace1D_pvejd") 40 | nodes/WalkDirection/position = Vector2(-540, 60) 41 | node_connections = [&"TimeScale", 0, &"WalkDirection", &"output", 0, &"TimeScale"] 42 | 43 | [node name="Player" type="CharacterBody2D" groups=["player"]] 44 | collision_mask = 128 45 | script = ExtResource("1_8rogi") 46 | 47 | [node name="FloorCollision" type="CollisionShape2D" parent="."] 48 | position = Vector2(0, 3) 49 | rotation = 1.57079 50 | shape = SubResource("CapsuleShape2D_2ix7w") 51 | 52 | [node name="PlayerSprite" type="Sprite2D" parent="."] 53 | position = Vector2(0, -12) 54 | texture = ExtResource("2_5ht7k") 55 | hframes = 8 56 | vframes = 3 57 | frame = 16 58 | 59 | [node name="PlayerMovement" type="Node" parent="."] 60 | script = ExtResource("3_cjxe3") 61 | 62 | [node name="PlayerAnimation" type="Node" parent="." node_paths=PackedStringArray("animation_tree", "sprite")] 63 | script = ExtResource("4_of2ax") 64 | animation_tree = NodePath("../AnimationTree") 65 | sprite = NodePath("../PlayerSprite") 66 | 67 | [node name="PlayerWeapon" type="Node2D" parent="." node_paths=PackedStringArray("firing_position")] 68 | script = ExtResource("4_rntaj") 69 | firing_position = NodePath("../FiringPosition") 70 | 71 | [node name="FiringPosition" type="Marker2D" parent="."] 72 | position = Vector2(6, -3) 73 | 74 | [node name="PlayerCamera" type="Camera2D" parent="." node_paths=PackedStringArray("target")] 75 | zoom = Vector2(2, 2) 76 | script = ExtResource("5_dq44d") 77 | target = NodePath("..") 78 | 79 | [node name="AnimationPlayer" type="AnimationPlayer" parent="."] 80 | libraries = { 81 | "": ExtResource("7_qwi34") 82 | } 83 | 84 | [node name="AnimationTree" type="AnimationTree" parent="."] 85 | active = false 86 | libraries = { 87 | "": ExtResource("7_qwi34") 88 | } 89 | tree_root = SubResource("AnimationNodeBlendTree_6djsc") 90 | anim_player = NodePath("../AnimationPlayer") 91 | parameters/TimeScale/scale = 1.0 92 | parameters/WalkDirection/blend_position = -0.415554 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # What is this? 2 | 3 | ## GDScript Version 4 | There is a GDScript and C# version available. 5 | 6 | This is the GDScript version, you can find the C# version [here](https://github.com/Bitlytic/Strategy-Mono). 7 | 8 | ### Template Project 9 | This is a top down arena shooter that uses Composition and the Strategy Pattern. It is designed in such a way that you can clone this github repo and use it as a template with a few things ready to go. The assets in this project have also been chosen so that you can use them for quick prototyping and if you decide to go commercial, there is no licensing other than giving credit due. 10 | 11 | 12 | ### GDScript & C# 13 | This project is full of comments, the C# version has nearly the same comments. If you are interested in learning C# and you know GDScript or vice-versa, doing a search for the text inside of comments is a great way to see how something in one language is done in the other. 14 | 15 | ### Strategy Pattern 16 | This is a project that uses the Strategy Pattern for my tutorial on [YouTube](https://www.youtube.com/watch?v=sZDJJeDNe_M) made in Godot 4.2 17 | 18 | 19 | ### Using this Project 20 | 21 | Using this project should be as simple as cloning it via git or downloading as a zip file. From there, you can point Godot to the project.godot file, and it _should_ just run. 22 | 23 | I do not require credit, you can use this as a template or a learning resource or any way you want to. If you do, you're welcome to share it and tag me on Twitter [@Bitlytic](https://www.twitter.com/bitlytic), I would love to see what you make! 24 | 25 | 26 | ## Assets 27 | 28 | This project uses the following Creative Commons assets: 29 | - [Arks Dinos](https://arks.itch.io/dino-characters) 30 | - [Kenney 1-Bit Pack](https://kenney.nl/assets/1-bit-pack) 31 | - [RGS_Dev's Tileset](https://rgsdev.itch.io/free-cc0-top-down-tileset-template-pixel-art) 32 | 33 | These assets specify that they can be used in commercial or non-commercial projects, just give credit. 34 | -------------------------------------------------------------------------------- /Resources/Strategies/damage.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="DamageBulletStrategy" load_steps=3 format=3 uid="uid://dedt6x6r4b7h7"] 2 | 3 | [ext_resource type="Script" path="res://Util/Strategy/damage_bullet_strategy.gd" id="1_mfwyj"] 4 | [ext_resource type="Texture2D" uid="uid://53h01ho1lvwp" path="res://Art/Kenney/fish.png" id="2_dwrdy"] 5 | 6 | [resource] 7 | script = ExtResource("1_mfwyj") 8 | texture = ExtResource("2_dwrdy") 9 | upgrade_text = "Damage" 10 | -------------------------------------------------------------------------------- /Resources/Strategies/particles.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="ParticleBulletStrategy" load_steps=3 format=3 uid="uid://biohhit4wb04x"] 2 | 3 | [ext_resource type="Script" path="res://Util/Strategy/particle_bullet_strategy.gd" id="1_quq4p"] 4 | [ext_resource type="Texture2D" uid="uid://0aylbueaelkc" path="res://Art/Kenney/firework.png" id="2_jjlqd"] 5 | 6 | [resource] 7 | script = ExtResource("1_quq4p") 8 | texture = ExtResource("2_jjlqd") 9 | upgrade_text = "Particles" 10 | -------------------------------------------------------------------------------- /Resources/Strategies/pierce.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="PierceBulletStrategy" load_steps=3 format=3 uid="uid://cf72l28pf7mom"] 2 | 3 | [ext_resource type="Script" path="res://Util/Strategy/pierce_bullet_strategy.gd" id="1_na2cs"] 4 | [ext_resource type="Texture2D" uid="uid://c26ro5ifb4gg4" path="res://Art/Kenney/potion.png" id="2_v0w2v"] 5 | 6 | [resource] 7 | script = ExtResource("1_na2cs") 8 | texture = ExtResource("2_v0w2v") 9 | upgrade_text = "Pierce" 10 | -------------------------------------------------------------------------------- /Resources/Strategies/speed.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" script_class="SpeedBulletStrategy" load_steps=3 format=3 uid="uid://bfwoyu25j5me"] 2 | 3 | [ext_resource type="Script" path="res://Util/Strategy/speed_bullet_strategy.gd" id="1_3cqj8"] 4 | [ext_resource type="Texture2D" uid="uid://30ltamteuvkx" path="res://Art/Kenney/carrot.png" id="2_aas4s"] 5 | 6 | [resource] 7 | script = ExtResource("1_3cqj8") 8 | speed_increase = 150.0 9 | texture = ExtResource("2_aas4s") 10 | upgrade_text = "Speed" 11 | -------------------------------------------------------------------------------- /Scenes/main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=11 format=3 uid="uid://c1mibcolpj6l1"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://dl7eyk012o1hp" path="res://Player/player.tscn" id="1_g1d0g"] 4 | [ext_resource type="Texture2D" uid="uid://cyr2m6q5pv84" path="res://Art/RGS_Dev/tileset_brown.png" id="2_r40t1"] 5 | [ext_resource type="PackedScene" uid="uid://ckfohqhp1io7i" path="res://Objects/Scenes/enemy.tscn" id="4_7vowh"] 6 | [ext_resource type="PackedScene" uid="uid://duul6fe7ylcjr" path="res://Objects/Scenes/upgrade.tscn" id="5_7nh6k"] 7 | [ext_resource type="Resource" uid="uid://bfwoyu25j5me" path="res://Resources/Strategies/speed.tres" id="6_tlnjk"] 8 | [ext_resource type="Resource" uid="uid://biohhit4wb04x" path="res://Resources/Strategies/particles.tres" id="7_44jfx"] 9 | [ext_resource type="Resource" uid="uid://dedt6x6r4b7h7" path="res://Resources/Strategies/damage.tres" id="7_i5k8s"] 10 | [ext_resource type="Resource" uid="uid://cf72l28pf7mom" path="res://Resources/Strategies/pierce.tres" id="8_t5n6q"] 11 | 12 | [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dxfh7"] 13 | texture = ExtResource("2_r40t1") 14 | 0:0/0 = 0 15 | 0:0/0/terrain_set = 0 16 | 0:0/0/terrain = 0 17 | 0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 18 | 0:0/0/physics_layer_0/angular_velocity = 0.0 19 | 0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 20 | 0:0/0/terrains_peering_bit/right_side = 0 21 | 0:0/0/terrains_peering_bit/bottom_side = 0 22 | 1:0/0 = 0 23 | 1:0/0/terrain_set = 0 24 | 1:0/0/terrain = 0 25 | 1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 26 | 1:0/0/physics_layer_0/angular_velocity = 0.0 27 | 1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 28 | 1:0/0/terrains_peering_bit/right_side = 0 29 | 1:0/0/terrains_peering_bit/bottom_side = 0 30 | 1:0/0/terrains_peering_bit/left_side = 0 31 | 2:0/0 = 0 32 | 2:0/0/terrain_set = 0 33 | 2:0/0/terrain = 0 34 | 2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 35 | 2:0/0/physics_layer_0/angular_velocity = 0.0 36 | 2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 37 | 2:0/0/terrains_peering_bit/right_side = 0 38 | 2:0/0/terrains_peering_bit/bottom_side = 0 39 | 2:0/0/terrains_peering_bit/left_side = 0 40 | 3:0/0 = 0 41 | 3:0/0/terrain_set = 0 42 | 3:0/0/terrain = 0 43 | 3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 44 | 3:0/0/physics_layer_0/angular_velocity = 0.0 45 | 3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 46 | 3:0/0/terrains_peering_bit/bottom_side = 0 47 | 3:0/0/terrains_peering_bit/left_side = 0 48 | 4:0/0 = 0 49 | 4:0/0/terrain_set = 0 50 | 4:0/0/terrain = 0 51 | 4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 52 | 4:0/0/physics_layer_0/angular_velocity = 0.0 53 | 4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 54 | 4:0/0/terrains_peering_bit/right_side = 0 55 | 4:0/0/terrains_peering_bit/bottom_side = 0 56 | 4:0/0/terrains_peering_bit/left_side = 0 57 | 5:0/0 = 0 58 | 5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 59 | 5:0/0/physics_layer_0/angular_velocity = 0.0 60 | 5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 61 | 6:0/0 = 0 62 | 6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 63 | 6:0/0/physics_layer_0/angular_velocity = 0.0 64 | 6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 65 | 7:0/0 = 0 66 | 7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 67 | 7:0/0/physics_layer_0/angular_velocity = 0.0 68 | 8:0/0 = 0 69 | 8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 70 | 8:0/0/physics_layer_0/angular_velocity = 0.0 71 | 9:0/0 = 0 72 | 9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 73 | 9:0/0/physics_layer_0/angular_velocity = 0.0 74 | 10:0/0 = 0 75 | 10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 76 | 10:0/0/physics_layer_0/angular_velocity = 0.0 77 | 11:0/0 = 0 78 | 11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 79 | 11:0/0/physics_layer_0/angular_velocity = 0.0 80 | 12:0/0 = 0 81 | 12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 82 | 12:0/0/physics_layer_0/angular_velocity = 0.0 83 | 13:0/0 = 0 84 | 13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 85 | 13:0/0/physics_layer_0/angular_velocity = 0.0 86 | 14:0/0 = 0 87 | 14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 88 | 14:0/0/physics_layer_0/angular_velocity = 0.0 89 | 15:0/0 = 0 90 | 15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) 91 | 15:0/0/physics_layer_0/angular_velocity = 0.0 92 | 0:1/0 = 0 93 | 0:1/0/terrain_set = 0 94 | 0:1/0/terrain = 0 95 | 0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 96 | 0:1/0/physics_layer_0/angular_velocity = 0.0 97 | 0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -8, 0, 8, -8, 8) 98 | 0:1/0/terrains_peering_bit/right_side = 0 99 | 0:1/0/terrains_peering_bit/bottom_side = 0 100 | 0:1/0/terrains_peering_bit/top_side = 0 101 | 1:1/0 = 0 102 | 1:1/0/terrain_set = 0 103 | 1:1/0/terrain = 0 104 | 1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 105 | 1:1/0/physics_layer_0/angular_velocity = 0.0 106 | 1:1/0/terrains_peering_bit/right_side = 0 107 | 1:1/0/terrains_peering_bit/bottom_side = 0 108 | 1:1/0/terrains_peering_bit/left_side = 0 109 | 1:1/0/terrains_peering_bit/top_side = 0 110 | 2:1/0 = 0 111 | 2:1/0/terrain_set = 0 112 | 2:1/0/terrain = 0 113 | 2:1/0/probability = 0.1 114 | 2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 115 | 2:1/0/physics_layer_0/angular_velocity = 0.0 116 | 2:1/0/terrains_peering_bit/right_side = 0 117 | 2:1/0/terrains_peering_bit/bottom_side = 0 118 | 2:1/0/terrains_peering_bit/left_side = 0 119 | 2:1/0/terrains_peering_bit/top_side = 0 120 | 3:1/0 = 0 121 | 3:1/0/terrain_set = 0 122 | 3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 123 | 3:1/0/physics_layer_0/angular_velocity = 0.0 124 | 4:1/0 = 0 125 | 4:1/0/terrain_set = 0 126 | 4:1/0/terrain = 0 127 | 4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 128 | 4:1/0/physics_layer_0/angular_velocity = 0.0 129 | 4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 130 | 4:1/0/terrains_peering_bit/right_side = 0 131 | 4:1/0/terrains_peering_bit/bottom_side = 0 132 | 4:1/0/terrains_peering_bit/left_side = 0 133 | 5:1/0 = 0 134 | 5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 135 | 5:1/0/physics_layer_0/angular_velocity = 0.0 136 | 6:1/0 = 0 137 | 6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 138 | 6:1/0/physics_layer_0/angular_velocity = 0.0 139 | 7:1/0 = 0 140 | 7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 141 | 7:1/0/physics_layer_0/angular_velocity = 0.0 142 | 8:1/0 = 0 143 | 8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 144 | 8:1/0/physics_layer_0/angular_velocity = 0.0 145 | 9:1/0 = 0 146 | 9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 147 | 9:1/0/physics_layer_0/angular_velocity = 0.0 148 | 10:1/0 = 0 149 | 10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 150 | 10:1/0/physics_layer_0/angular_velocity = 0.0 151 | 11:1/0 = 0 152 | 11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 153 | 11:1/0/physics_layer_0/angular_velocity = 0.0 154 | 12:1/0 = 0 155 | 12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 156 | 12:1/0/physics_layer_0/angular_velocity = 0.0 157 | 13:1/0 = 0 158 | 13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) 159 | 13:1/0/physics_layer_0/angular_velocity = 0.0 160 | 0:2/0 = 0 161 | 0:2/0/terrain_set = 0 162 | 0:2/0/terrain = 0 163 | 0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 164 | 0:2/0/physics_layer_0/angular_velocity = 0.0 165 | 0:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -8, 0, 8, -8, 8) 166 | 0:2/0/terrains_peering_bit/right_side = 0 167 | 0:2/0/terrains_peering_bit/bottom_side = 0 168 | 0:2/0/terrains_peering_bit/top_side = 0 169 | 1:2/0 = 0 170 | 1:2/0/terrain_set = 0 171 | 1:2/0/terrain = 0 172 | 1:2/0/probability = 0.1 173 | 1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 174 | 1:2/0/physics_layer_0/angular_velocity = 0.0 175 | 1:2/0/terrains_peering_bit/right_side = 0 176 | 1:2/0/terrains_peering_bit/bottom_side = 0 177 | 1:2/0/terrains_peering_bit/left_side = 0 178 | 1:2/0/terrains_peering_bit/top_side = 0 179 | 2:2/0 = 0 180 | 2:2/0/terrain_set = 0 181 | 2:2/0/terrain = 0 182 | 2:2/0/probability = 0.1 183 | 2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 184 | 2:2/0/physics_layer_0/angular_velocity = 0.0 185 | 2:2/0/terrains_peering_bit/right_side = 0 186 | 2:2/0/terrains_peering_bit/bottom_side = 0 187 | 2:2/0/terrains_peering_bit/left_side = 0 188 | 2:2/0/terrains_peering_bit/top_side = 0 189 | 3:2/0 = 0 190 | 3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 191 | 3:2/0/physics_layer_0/angular_velocity = 0.0 192 | 4:2/0 = 0 193 | 4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 194 | 4:2/0/physics_layer_0/angular_velocity = 0.0 195 | 5:2/0 = 0 196 | 5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 197 | 5:2/0/physics_layer_0/angular_velocity = 0.0 198 | 6:2/0 = 0 199 | 6:2/0/terrain_set = 0 200 | 6:2/0/terrain = 0 201 | 6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 202 | 6:2/0/physics_layer_0/angular_velocity = 0.0 203 | 6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, 8, 0, 8, 0, -8, 8, -8) 204 | 6:2/0/terrains_peering_bit/bottom_side = 0 205 | 6:2/0/terrains_peering_bit/left_side = 0 206 | 6:2/0/terrains_peering_bit/top_side = 0 207 | 7:2/0 = 0 208 | 7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 209 | 7:2/0/physics_layer_0/angular_velocity = 0.0 210 | 8:2/0 = 0 211 | 8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 212 | 8:2/0/physics_layer_0/angular_velocity = 0.0 213 | 9:2/0 = 0 214 | 9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 215 | 9:2/0/physics_layer_0/angular_velocity = 0.0 216 | 10:2/0 = 0 217 | 10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 218 | 10:2/0/physics_layer_0/angular_velocity = 0.0 219 | 11:2/0 = 0 220 | 11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 221 | 11:2/0/physics_layer_0/angular_velocity = 0.0 222 | 12:2/0 = 0 223 | 12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 224 | 12:2/0/physics_layer_0/angular_velocity = 0.0 225 | 13:2/0 = 0 226 | 13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) 227 | 13:2/0/physics_layer_0/angular_velocity = 0.0 228 | 0:3/0 = 0 229 | 0:3/0/terrain_set = 0 230 | 0:3/0/terrain = 0 231 | 0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 232 | 0:3/0/physics_layer_0/angular_velocity = 0.0 233 | 0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -8, 0, 8, -8, 8) 234 | 0:3/0/terrains_peering_bit/right_side = 0 235 | 0:3/0/terrains_peering_bit/bottom_side = 0 236 | 0:3/0/terrains_peering_bit/top_side = 0 237 | 1:3/0 = 0 238 | 1:3/0/terrain_set = 0 239 | 1:3/0/terrain = 0 240 | 1:3/0/probability = 0.1 241 | 1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 242 | 1:3/0/physics_layer_0/angular_velocity = 0.0 243 | 1:3/0/terrains_peering_bit/right_side = 0 244 | 1:3/0/terrains_peering_bit/bottom_side = 0 245 | 1:3/0/terrains_peering_bit/left_side = 0 246 | 1:3/0/terrains_peering_bit/top_side = 0 247 | 2:3/0 = 0 248 | 2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 249 | 2:3/0/physics_layer_0/angular_velocity = 0.0 250 | 3:3/0 = 0 251 | 3:3/0/terrain_set = 0 252 | 3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 253 | 3:3/0/physics_layer_0/angular_velocity = 0.0 254 | 3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, 8, 0, 8, 0, -8, 8, -8) 255 | 4:3/0 = 0 256 | 4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 257 | 4:3/0/physics_layer_0/angular_velocity = 0.0 258 | 4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 259 | 5:3/0 = 0 260 | 5:3/0/terrain_set = 0 261 | 5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 262 | 5:3/0/physics_layer_0/angular_velocity = 0.0 263 | 6:3/0 = 0 264 | 6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 265 | 6:3/0/physics_layer_0/angular_velocity = 0.0 266 | 7:3/0 = 0 267 | 7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 268 | 7:3/0/physics_layer_0/angular_velocity = 0.0 269 | 8:3/0 = 0 270 | 8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 271 | 8:3/0/physics_layer_0/angular_velocity = 0.0 272 | 9:3/0 = 0 273 | 9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 274 | 9:3/0/physics_layer_0/angular_velocity = 0.0 275 | 10:3/0 = 0 276 | 10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 277 | 10:3/0/physics_layer_0/angular_velocity = 0.0 278 | 11:3/0 = 0 279 | 11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 280 | 11:3/0/physics_layer_0/angular_velocity = 0.0 281 | 12:3/0 = 0 282 | 12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 283 | 12:3/0/physics_layer_0/angular_velocity = 0.0 284 | 13:3/0 = 0 285 | 13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) 286 | 13:3/0/physics_layer_0/angular_velocity = 0.0 287 | 0:4/0 = 0 288 | 0:4/0/terrain_set = 0 289 | 0:4/0/terrain = 0 290 | 0:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 291 | 0:4/0/physics_layer_0/angular_velocity = 0.0 292 | 0:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 293 | 0:4/0/terrains_peering_bit/right_side = 0 294 | 0:4/0/terrains_peering_bit/top_side = 0 295 | 1:4/0 = 0 296 | 1:4/0/terrain_set = 0 297 | 1:4/0/terrain = 0 298 | 1:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 299 | 1:4/0/physics_layer_0/angular_velocity = 0.0 300 | 1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 301 | 1:4/0/terrains_peering_bit/right_side = 0 302 | 1:4/0/terrains_peering_bit/left_side = 0 303 | 1:4/0/terrains_peering_bit/top_side = 0 304 | 2:4/0 = 0 305 | 2:4/0/terrain_set = 0 306 | 2:4/0/terrain = 0 307 | 2:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 308 | 2:4/0/physics_layer_0/angular_velocity = 0.0 309 | 2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 310 | 2:4/0/terrains_peering_bit/right_side = 0 311 | 2:4/0/terrains_peering_bit/left_side = 0 312 | 2:4/0/terrains_peering_bit/top_side = 0 313 | 3:4/0 = 0 314 | 3:4/0/terrain_set = 0 315 | 3:4/0/terrain = 0 316 | 3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 317 | 3:4/0/physics_layer_0/angular_velocity = 0.0 318 | 3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 319 | 3:4/0/terrains_peering_bit/left_side = 0 320 | 3:4/0/terrains_peering_bit/top_side = 0 321 | 4:4/0 = 0 322 | 4:4/0/terrain_set = 0 323 | 4:4/0/terrain = 0 324 | 4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 325 | 4:4/0/physics_layer_0/angular_velocity = 0.0 326 | 4:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 327 | 4:4/0/terrains_peering_bit/right_side = 0 328 | 4:4/0/terrains_peering_bit/left_side = 0 329 | 4:4/0/terrains_peering_bit/top_side = 0 330 | 5:4/0 = 0 331 | 5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 332 | 5:4/0/physics_layer_0/angular_velocity = 0.0 333 | 5:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 334 | 6:4/0 = 0 335 | 6:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 336 | 6:4/0/physics_layer_0/angular_velocity = 0.0 337 | 6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 338 | 7:4/0 = 0 339 | 7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 340 | 7:4/0/physics_layer_0/angular_velocity = 0.0 341 | 8:4/0 = 0 342 | 8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 343 | 8:4/0/physics_layer_0/angular_velocity = 0.0 344 | 9:4/0 = 0 345 | 9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 346 | 9:4/0/physics_layer_0/angular_velocity = 0.0 347 | 10:4/0 = 0 348 | 10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 349 | 10:4/0/physics_layer_0/angular_velocity = 0.0 350 | 11:4/0 = 0 351 | 11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 352 | 11:4/0/physics_layer_0/angular_velocity = 0.0 353 | 12:4/0 = 0 354 | 12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 355 | 12:4/0/physics_layer_0/angular_velocity = 0.0 356 | 13:4/0 = 0 357 | 13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) 358 | 13:4/0/physics_layer_0/angular_velocity = 0.0 359 | 360 | [sub_resource type="TileSet" id="TileSet_ih2d4"] 361 | physics_layer_0/collision_layer = 128 362 | physics_layer_0/collision_mask = 0 363 | terrain_set_0/mode = 2 364 | terrain_set_0/terrain_0/name = "Ground Tiles" 365 | terrain_set_0/terrain_0/color = Color(0.380392, 0.556863, 0.988235, 1) 366 | sources/0 = SubResource("TileSetAtlasSource_dxfh7") 367 | 368 | [node name="Main" type="Node2D"] 369 | 370 | [node name="TileMap" type="TileMap" parent="."] 371 | tile_set = SubResource("TileSet_ih2d4") 372 | format = 2 373 | layer_0/tile_data = PackedInt32Array(1572904, 196608, 4, 1507368, 393216, 2, 1441832, 393216, 2, 1376296, 393216, 2, 1310760, 393216, 2, 1245224, 393216, 2, 1179688, 393216, 2, 1114152, 393216, 2, 1048616, 393216, 2, 983080, 393216, 2, 917544, 393216, 2, 852008, 393216, 2, 786472, 393216, 2, 720936, 393216, 2, 655400, 393216, 2, 589864, 393216, 2, 524328, 393216, 2, 458792, 393216, 2, 393256, 393216, 2, 327720, 393216, 2, 262184, 393216, 2, 196648, 393216, 2, 131112, 393216, 2, 65576, 393216, 2, 40, 393216, 2, -65496, 393216, 2, -131032, 393216, 2, -196568, 393216, 2, -262104, 393216, 2, -327640, 393216, 2, -393176, 393216, 2, -458712, 393216, 2, -524248, 393216, 2, -589784, 393216, 2, -655320, 393216, 2, -720856, 393216, 2, -786392, 393216, 2, -851928, 393216, 2, -917464, 393216, 2, -983000, 393216, 2, -1048536, 393216, 2, -1114072, 196608, 0, 1572903, 65536, 4, 1507367, 65536, 1, 1441831, 65536, 1, 1376295, 65536, 1, 1310759, 65536, 1, 1245223, 65536, 1, 1179687, 65536, 3, 1114151, 65536, 1, 1048615, 65536, 1, 983079, 65536, 1, 917543, 65536, 1, 852007, 65536, 3, 786471, 65536, 1, 720935, 131072, 1, 655399, 65536, 1, 589863, 65536, 1, 524327, 65536, 1, 458791, 65536, 1, 393255, 65536, 2, 327719, 65536, 1, 262183, 131072, 2, 196647, 65536, 1, 131111, 65536, 1, 65575, 131072, 1, 39, 65536, 1, -65497, 131072, 1, -131033, 65536, 1, -196569, 65536, 1, -262105, 65536, 1, -327641, 65536, 1, -393177, 65536, 1, -458713, 65536, 1, -524249, 131072, 1, -589785, 65536, 1, -655321, 65536, 2, -720857, 131072, 1, -786393, 65536, 1, -851929, 131072, 2, -917465, 65536, 1, -983001, 65536, 1, -1048537, 65536, 1, -1114073, 131072, 0, 1572902, 131072, 4, 1507366, 65536, 1, 1441830, 65536, 1, 1376294, 65536, 1, 1310758, 131072, 1, 1245222, 65536, 1, 1179686, 65536, 1, 1114150, 65536, 1, 1048614, 131072, 1, 983078, 65536, 1, 917542, 65536, 1, 852006, 65536, 1, 786470, 65536, 1, 720934, 65536, 1, 655398, 65536, 1, 589862, 65536, 1, 524326, 65536, 3, 458790, 65536, 1, 393254, 65536, 3, 327718, 65536, 1, 262182, 131072, 1, 196646, 65536, 1, 131110, 65536, 1, 65574, 65536, 1, 38, 65536, 3, -65498, 65536, 1, -131034, 65536, 3, -196570, 65536, 1, -262106, 65536, 1, -327642, 65536, 1, -393178, 65536, 1, -458714, 65536, 1, -524250, 65536, 3, -589786, 65536, 1, -655322, 65536, 1, -720858, 65536, 1, -786394, 65536, 3, -851930, 65536, 1, -917466, 65536, 1, -983002, 65536, 1, -1048538, 65536, 1, -1114074, 131072, 0, 1572901, 262144, 4, 1507365, 65536, 1, 1441829, 65536, 1, 1376293, 65536, 1, 1310757, 65536, 3, 1245221, 131072, 2, 1179685, 65536, 1, 1114149, 65536, 3, 1048613, 65536, 2, 983077, 65536, 1, 917541, 65536, 1, 852005, 65536, 1, 786469, 65536, 1, 720933, 65536, 1, 655397, 65536, 2, 589861, 65536, 1, 524325, 65536, 3, 458789, 131072, 1, 393253, 131072, 1, 327717, 65536, 1, 262181, 131072, 2, 196645, 65536, 1, 131109, 65536, 1, 65573, 65536, 2, 37, 65536, 1, -65499, 65536, 1, -131035, 65536, 1, -196571, 65536, 2, -262107, 65536, 1, -327643, 65536, 1, -393179, 65536, 1, -458715, 65536, 1, -524251, 65536, 1, -589787, 65536, 1, -655323, 65536, 1, -720859, 65536, 1, -786395, 65536, 1, -851931, 65536, 1, -917467, 65536, 1, -983003, 65536, 3, -1048539, 65536, 1, -1114075, 262144, 0, 1572900, 65536, 4, 1507364, 65536, 1, 1441828, 65536, 1, 1376292, 65536, 1, 1310756, 65536, 1, 1245220, 65536, 1, 1179684, 65536, 1, 1114148, 65536, 1, 1048612, 65536, 1, 983076, 65536, 1, 917540, 65536, 1, 852004, 65536, 3, 786468, 65536, 1, 720932, 65536, 1, 655396, 65536, 1, 589860, 65536, 1, 524324, 65536, 1, 458788, 65536, 1, 393252, 65536, 1, 327716, 65536, 1, 262180, 65536, 1, 196644, 65536, 1, 131108, 65536, 1, 65572, 65536, 1, 36, 65536, 1, -65500, 65536, 3, -131036, 65536, 1, -196572, 65536, 1, -262108, 131072, 1, -327644, 65536, 1, -393180, 131072, 1, -458716, 65536, 1, -524252, 65536, 1, -589788, 65536, 1, -655324, 131072, 1, -720860, 65536, 1, -786396, 65536, 1, -851932, 65536, 1, -917468, 65536, 1, -983004, 65536, 1, -1048540, 65536, 1, -1114076, 262144, 1, 1572899, 65536, 4, 1507363, 65536, 1, 1441827, 65536, 1, 1376291, 65536, 1, 1310755, 65536, 1, 1245219, 65536, 1, 1179683, 65536, 1, 1114147, 65536, 1, 1048611, 65536, 1, 983075, 65536, 1, 917539, 65536, 1, 852003, 65536, 2, 786467, 65536, 1, 720931, 65536, 1, 655395, 131072, 2, 589859, 65536, 1, 524323, 65536, 1, 458787, 131072, 2, 393251, 131072, 2, 327715, 65536, 1, 262179, 65536, 2, 196643, 65536, 3, 131107, 65536, 2, 65571, 65536, 3, 35, 65536, 3, -65501, 65536, 1, -131037, 65536, 1, -196573, 65536, 3, -262109, 65536, 1, -327645, 65536, 3, -393181, 65536, 1, -458717, 65536, 1, -524253, 65536, 1, -589789, 65536, 1, -655325, 65536, 3, -720861, 131072, 1, -786397, 65536, 1, -851933, 65536, 1, -917469, 65536, 2, -983005, 65536, 1, -1048541, 65536, 1, -1114077, 262144, 1, 1572898, 262144, 4, 1507362, 65536, 1, 1441826, 65536, 1, 1376290, 65536, 1, 1310754, 65536, 1, 1245218, 65536, 3, 1179682, 65536, 1, 1114146, 65536, 1, 1048610, 65536, 1, 983074, 65536, 1, 917538, 65536, 1, 852002, 65536, 1, 786466, 65536, 1, 720930, 65536, 2, 655394, 65536, 1, 589858, 65536, 1, 524322, 65536, 1, 458786, 65536, 1, 393250, 65536, 1, 327714, 131072, 1, 262178, 65536, 1, 196642, 65536, 1, 131106, 65536, 1, 65570, 65536, 1, 34, 65536, 1, -65502, 65536, 1, -131038, 65536, 1, -196574, 65536, 1, -262110, 65536, 1, -327646, 65536, 1, -393182, 65536, 1, -458718, 65536, 1, -524254, 65536, 1, -589790, 65536, 2, -655326, 131072, 2, -720862, 65536, 1, -786398, 65536, 1, -851934, 65536, 1, -917470, 65536, 1, -983006, 65536, 1, -1048542, 65536, 1, -1114078, 262144, 1, 1572897, 65536, 4, 1507361, 65536, 1, 1441825, 65536, 1, 1376289, 65536, 1, 1310753, 65536, 1, 1245217, 131072, 1, 1179681, 65536, 1, 1114145, 65536, 1, 1048609, 131072, 2, 983073, 65536, 1, 917537, 65536, 1, 852001, 65536, 1, 786465, 131072, 2, 720929, 65536, 1, 655393, 65536, 1, 589857, 65536, 2, 524321, 65536, 1, 458785, 65536, 1, 393249, 65536, 1, 327713, 65536, 1, 262177, 131072, 2, 196641, 65536, 2, 131105, 65536, 1, 65569, 65536, 1, 33, 131072, 1, -65503, 65536, 1, -131039, 65536, 1, -196575, 65536, 1, -262111, 65536, 1, -327647, 65536, 1, -393183, 65536, 1, -458719, 65536, 1, -524255, 65536, 1, -589791, 65536, 1, -655327, 65536, 1, -720863, 65536, 1, -786399, 65536, 3, -851935, 65536, 1, -917471, 65536, 1, -983007, 131072, 2, -1048543, 65536, 2, -1114079, 65536, 0, 1572896, 262144, 4, 1507360, 131072, 2, 1441824, 131072, 2, 1376288, 65536, 1, 1310752, 65536, 1, 1245216, 65536, 1, 1179680, 131072, 1, 1114144, 65536, 1, 1048608, 65536, 1, 983072, 65536, 1, 917536, 65536, 1, 852000, 65536, 1, 786464, 65536, 1, 720928, 65536, 1, 655392, 131072, 1, 589856, 65536, 3, 524320, 65536, 1, 458784, 65536, 1, 393248, 65536, 1, 327712, 65536, 1, 262176, 65536, 1, 196640, 65536, 3, 131104, 65536, 1, 65568, 65536, 1, 32, 65536, 1, -65504, 131072, 1, -131040, 65536, 1, -196576, 65536, 3, -262112, 131072, 2, -327648, 65536, 2, -393184, 65536, 1, -458720, 65536, 1, -524256, 65536, 1, -589792, 65536, 1, -655328, 65536, 2, -720864, 65536, 1, -786400, 65536, 1, -851936, 65536, 1, -917472, 65536, 1, -983008, 65536, 1, -1048544, 65536, 1, -1114080, 65536, 0, 1572895, 131072, 4, 1507359, 65536, 3, 1441823, 65536, 1, 1376287, 65536, 1, 1310751, 65536, 1, 1245215, 65536, 1, 1179679, 65536, 1, 1114143, 65536, 1, 1048607, 65536, 1, 983071, 65536, 1, 917535, 65536, 1, 851999, 65536, 1, 786463, 131072, 2, 720927, 65536, 1, 655391, 131072, 2, 589855, 65536, 1, 524319, 65536, 3, 458783, 65536, 1, 393247, 65536, 1, 327711, 65536, 1, 262175, 65536, 1, 196639, 65536, 1, 131103, 65536, 1, 65567, 65536, 1, 31, 131072, 1, -65505, 65536, 1, -131041, 65536, 1, -196577, 65536, 1, -262113, 65536, 1, -327649, 65536, 1, -393185, 65536, 1, -458721, 65536, 1, -524257, 65536, 1, -589793, 65536, 1, -655329, 65536, 1, -720865, 65536, 1, -786401, 65536, 3, -851937, 65536, 1, -917473, 65536, 3, -983009, 65536, 1, -1048545, 65536, 1, -1114081, 262144, 1, 1572894, 131072, 4, 1507358, 65536, 1, 1441822, 65536, 1, 1376286, 65536, 1, 1310750, 65536, 1, 1245214, 65536, 2, 1179678, 65536, 1, 1114142, 65536, 2, 1048606, 65536, 3, 983070, 65536, 1, 917534, 65536, 1, 851998, 65536, 2, 786462, 131072, 2, 720926, 65536, 1, 655390, 65536, 1, 589854, 65536, 1, 524318, 131072, 2, 458782, 65536, 1, 393246, 131072, 2, 327710, 65536, 1, 262174, 65536, 1, 196638, 65536, 2, 131102, 131072, 2, 65566, 65536, 1, 30, 65536, 1, -65506, 131072, 2, -131042, 65536, 1, -196578, 65536, 1, -262114, 65536, 1, -327650, 65536, 1, -393186, 65536, 1, -458722, 65536, 1, -524258, 65536, 1, -589794, 65536, 1, -655330, 65536, 1, -720866, 65536, 1, -786402, 65536, 2, -851938, 65536, 1, -917474, 131072, 1, -983010, 65536, 1, -1048546, 65536, 3, -1114082, 65536, 0, 1572893, 262144, 4, 1507357, 65536, 1, 1441821, 65536, 1, 1376285, 65536, 1, 1310749, 65536, 1, 1245213, 65536, 1, 1179677, 65536, 1, 1114141, 131072, 1, 1048605, 65536, 1, 983069, 65536, 1, 917533, 65536, 1, 851997, 65536, 3, 786461, 65536, 1, 720925, 65536, 1, 655389, 65536, 1, 589853, 65536, 1, 524317, 65536, 1, 458781, 65536, 1, 393245, 65536, 1, 327709, 65536, 1, 262173, 131072, 2, 196637, 65536, 3, 131101, 131072, 1, 65565, 65536, 1, 29, 65536, 1, -65507, 131072, 1, -131043, 65536, 1, -196579, 65536, 2, -262115, 65536, 1, -327651, 65536, 2, -393187, 65536, 1, -458723, 65536, 1, -524259, 65536, 2, -589795, 65536, 2, -655331, 131072, 1, -720867, 65536, 1, -786403, 65536, 1, -851939, 131072, 1, -917475, 65536, 1, -983011, 65536, 1, -1048547, 65536, 2, -1114083, 262144, 0, 1572892, 262144, 4, 1507356, 65536, 3, 1441820, 65536, 1, 1376284, 65536, 1, 1310748, 65536, 1, 1245212, 65536, 3, 1179676, 65536, 1, 1114140, 65536, 1, 1048604, 65536, 1, 983068, 65536, 1, 917532, 131072, 1, 851996, 65536, 1, 786460, 65536, 1, 720924, 65536, 1, 655388, 131072, 1, 589852, 65536, 2, 524316, 65536, 3, 458780, 65536, 1, 393244, 65536, 1, 327708, 65536, 1, 262172, 65536, 1, 196636, 131072, 1, 131100, 65536, 3, 65564, 131072, 1, 28, 65536, 1, -65508, 65536, 1, -131044, 65536, 1, -196580, 131072, 2, -262116, 65536, 3, -327652, 65536, 1, -393188, 65536, 1, -458724, 65536, 1, -524260, 65536, 1, -589796, 65536, 1, -655332, 65536, 1, -720868, 65536, 1, -786404, 65536, 2, -851940, 131072, 1, -917476, 65536, 1, -983012, 65536, 1, -1048548, 65536, 1, -1114084, 131072, 0, 1572891, 131072, 4, 1507355, 65536, 1, 1441819, 131072, 1, 1376283, 65536, 3, 1310747, 65536, 2, 1245211, 65536, 1, 1179675, 65536, 1, 1114139, 131072, 1, 1048603, 65536, 3, 983067, 131072, 2, 917531, 65536, 1, 851995, 65536, 1, 786459, 65536, 1, 720923, 131072, 1, 655387, 65536, 1, 589851, 65536, 2, 524315, 65536, 1, 458779, 65536, 1, 393243, 131072, 1, 327707, 65536, 1, 262171, 65536, 1, 196635, 65536, 1, 131099, 65536, 1, 65563, 131072, 1, 27, 131072, 2, -65509, 65536, 1, -131045, 65536, 1, -196581, 65536, 1, -262117, 65536, 1, -327653, 65536, 1, -393189, 131072, 1, -458725, 65536, 1, -524261, 131072, 1, -589797, 131072, 1, -655333, 65536, 3, -720869, 65536, 1, -786405, 131072, 2, -851941, 65536, 1, -917477, 65536, 1, -983013, 65536, 1, -1048549, 65536, 1, -1114085, 262144, 1, 1572890, 131072, 4, 1507354, 65536, 1, 1441818, 131072, 1, 1376282, 65536, 1, 1310746, 65536, 2, 1245210, 65536, 2, 1179674, 65536, 1, 1114138, 131072, 1, 1048602, 65536, 1, 983066, 65536, 1, 917530, 65536, 1, 851994, 65536, 1, 786458, 65536, 1, 720922, 65536, 1, 655386, 65536, 3, 589850, 65536, 1, 524314, 131072, 1, 458778, 65536, 1, 393242, 65536, 1, 327706, 65536, 2, 262170, 131072, 1, 196634, 65536, 3, 131098, 65536, 1, 65562, 65536, 1, 26, 65536, 1, -65510, 65536, 1, -131046, 65536, 1, -196582, 131072, 2, -262118, 131072, 1, -327654, 65536, 1, -393190, 131072, 2, -458726, 65536, 1, -524262, 65536, 2, -589798, 65536, 1, -655334, 65536, 2, -720870, 131072, 2, -786406, 65536, 1, -851942, 131072, 2, -917478, 65536, 2, -983014, 65536, 1, -1048550, 65536, 1, -1114086, 262144, 0, 1572889, 262144, 4, 1507353, 65536, 2, 1441817, 65536, 1, 1376281, 131072, 1, 1310745, 131072, 2, 1245209, 65536, 1, 1179673, 65536, 1, 1114137, 65536, 1, 1048601, 65536, 1, 983065, 65536, 1, 917529, 131072, 1, 851993, 65536, 2, 786457, 65536, 1, 720921, 131072, 1, 655385, 65536, 1, 589849, 131072, 2, 524313, 131072, 2, 458777, 65536, 1, 393241, 65536, 2, 327705, 65536, 1, 262169, 65536, 3, 196633, 65536, 2, 131097, 131072, 1, 65561, 65536, 3, 25, 65536, 1, -65511, 131072, 2, -131047, 131072, 1, -196583, 131072, 1, -262119, 65536, 1, -327655, 65536, 1, -393191, 65536, 1, -458727, 65536, 1, -524263, 65536, 3, -589799, 65536, 1, -655335, 131072, 1, -720871, 65536, 1, -786407, 65536, 1, -851943, 65536, 1, -917479, 65536, 1, -983015, 65536, 1, -1048551, 131072, 1, -1114087, 262144, 0, 1572888, 65536, 4, 1507352, 65536, 1, 1441816, 65536, 2, 1376280, 65536, 1, 1310744, 131072, 2, 1245208, 65536, 1, 1179672, 131072, 2, 1114136, 65536, 1, 1048600, 65536, 1, 983064, 65536, 1, 917528, 65536, 1, 851992, 65536, 3, 786456, 65536, 3, 720920, 65536, 3, 655384, 65536, 1, 589848, 65536, 1, 524312, 65536, 1, 458776, 65536, 1, 393240, 65536, 3, 327704, 65536, 1, 262168, 65536, 1, 196632, 65536, 1, 131096, 65536, 1, 65560, 65536, 1, 24, 65536, 2, -65512, 65536, 1, -131048, 65536, 3, -196584, 65536, 1, -262120, 131072, 1, -327656, 65536, 1, -393192, 65536, 3, -458728, 131072, 1, -524264, 65536, 1, -589800, 65536, 1, -655336, 65536, 1, -720872, 65536, 1, -786408, 65536, 1, -851944, 65536, 1, -917480, 65536, 1, -983016, 65536, 3, -1048552, 65536, 1, -1114088, 262144, 0, 1572887, 262144, 4, 1507351, 65536, 1, 1441815, 131072, 1, 1376279, 131072, 1, 1310743, 65536, 1, 1245207, 65536, 2, 1179671, 65536, 2, 1114135, 65536, 1, 1048599, 65536, 2, 983063, 131072, 2, 917527, 65536, 1, 851991, 65536, 1, 786455, 131072, 1, 720919, 65536, 1, 655383, 65536, 1, 589847, 65536, 1, 524311, 65536, 1, 458775, 65536, 1, 393239, 65536, 1, 327703, 131072, 2, 262167, 65536, 1, 196631, 65536, 1, 131095, 65536, 1, 65559, 65536, 1, 23, 65536, 1, -65513, 65536, 1, -131049, 65536, 1, -196585, 65536, 1, -262121, 65536, 1, -327657, 65536, 1, -393193, 65536, 3, -458729, 65536, 1, -524265, 65536, 1, -589801, 65536, 1, -655337, 65536, 1, -720873, 65536, 1, -786409, 131072, 2, -851945, 65536, 1, -917481, 65536, 1, -983017, 65536, 1, -1048553, 65536, 1, -1114089, 262144, 0, 1572886, 65536, 4, 1507350, 65536, 1, 1441814, 65536, 1, 1376278, 65536, 1, 1310742, 65536, 1, 1245206, 131072, 2, 1179670, 65536, 1, 1114134, 65536, 1, 1048598, 65536, 1, 983062, 65536, 1, 917526, 65536, 2, 851990, 131072, 1, 786454, 131072, 2, 720918, 131072, 2, 655382, 65536, 1, 589846, 65536, 1, 524310, 65536, 1, 458774, 131072, 1, 393238, 65536, 2, 327702, 65536, 1, 262166, 65536, 1, 196630, 65536, 1, 131094, 65536, 1, 65558, 65536, 1, 22, 65536, 1, -65514, 65536, 1, -131050, 65536, 1, -196586, 65536, 1, -262122, 65536, 1, -327658, 131072, 2, -393194, 65536, 3, -458730, 65536, 3, -524266, 65536, 1, -589802, 65536, 2, -655338, 65536, 2, -720874, 65536, 1, -786410, 131072, 1, -851946, 65536, 1, -917482, 131072, 1, -983018, 65536, 1, -1048554, 65536, 2, -1114090, 131072, 0, 1572885, 131072, 4, 1507349, 65536, 1, 1441813, 65536, 1, 1376277, 65536, 1, 1310741, 65536, 1, 1245205, 131072, 2, 1179669, 65536, 2, 1114133, 131072, 2, 1048597, 65536, 1, 983061, 131072, 1, 917525, 65536, 1, 851989, 65536, 1, 786453, 65536, 2, 720917, 65536, 1, 655381, 65536, 1, 589845, 65536, 1, 524309, 65536, 1, 458773, 65536, 2, 393237, 65536, 1, 327701, 131072, 1, 262165, 65536, 1, 196629, 65536, 1, 131093, 65536, 1, 65557, 65536, 1, 21, 65536, 1, -65515, 65536, 1, -131051, 65536, 1, -196587, 65536, 1, -262123, 65536, 1, -327659, 65536, 1, -393195, 65536, 1, -458731, 65536, 1, -524267, 65536, 1, -589803, 65536, 1, -655339, 65536, 1, -720875, 65536, 1, -786411, 65536, 1, -851947, 65536, 1, -917483, 65536, 1, -983019, 65536, 1, -1048555, 65536, 2, -1114091, 262144, 0, 1572884, 131072, 4, 1507348, 65536, 1, 1441812, 65536, 1, 1376276, 65536, 1, 1310740, 65536, 1, 1245204, 65536, 1, 1179668, 65536, 2, 1114132, 65536, 1, 1048596, 65536, 1, 983060, 65536, 1, 917524, 65536, 1, 851988, 65536, 1, 786452, 65536, 1, 720916, 65536, 1, 655380, 65536, 2, 589844, 65536, 1, 524308, 65536, 1, 458772, 65536, 1, 393236, 65536, 1, 327700, 131072, 2, 262164, 65536, 1, 196628, 65536, 1, 131092, 65536, 1, 65556, 65536, 1, 20, 65536, 1, -65516, 65536, 1, -131052, 65536, 1, -196588, 131072, 2, -262124, 65536, 1, -327660, 65536, 1, -393196, 65536, 1, -458732, 65536, 3, -524268, 65536, 1, -589804, 65536, 1, -655340, 65536, 1, -720876, 131072, 1, -786412, 131072, 1, -851948, 65536, 1, -917484, 131072, 1, -983020, 65536, 3, -1048556, 65536, 1, -1114092, 65536, 0, 1572883, 131072, 4, 1507347, 65536, 1, 1441811, 65536, 1, 1376275, 65536, 1, 1310739, 65536, 1, 1245203, 131072, 1, 1179667, 65536, 1, 1114131, 131072, 2, 1048595, 65536, 1, 983059, 65536, 1, 917523, 65536, 1, 851987, 65536, 1, 786451, 65536, 1, 720915, 65536, 1, 655379, 65536, 1, 589843, 65536, 1, 524307, 131072, 1, 458771, 65536, 1, 393235, 65536, 2, 327699, 65536, 1, 262163, 65536, 1, 196627, 131072, 2, 131091, 65536, 3, 65555, 65536, 1, 19, 131072, 2, -65517, 65536, 1, -131053, 65536, 1, -196589, 65536, 1, -262125, 65536, 1, -327661, 65536, 1, -393197, 65536, 1, -458733, 131072, 2, -524269, 131072, 1, -589805, 65536, 2, -655341, 65536, 1, -720877, 65536, 1, -786413, 65536, 1, -851949, 65536, 1, -917485, 65536, 1, -983021, 65536, 1, -1048557, 65536, 1, -1114093, 65536, 0, 1572882, 131072, 4, 1507346, 65536, 1, 1441810, 131072, 2, 1376274, 65536, 1, 1310738, 65536, 1, 1245202, 65536, 1, 1179666, 65536, 1, 1114130, 65536, 1, 1048594, 65536, 1, 983058, 65536, 1, 917522, 65536, 2, 851986, 65536, 1, 786450, 65536, 1, 720914, 65536, 1, 655378, 65536, 3, 589842, 65536, 1, 524306, 131072, 1, 458770, 131072, 1, 393234, 65536, 1, 327698, 65536, 2, 262162, 65536, 1, 196626, 65536, 1, 131090, 65536, 1, 65554, 65536, 1, 18, 65536, 3, -65518, 131072, 2, -131054, 65536, 1, -196590, 65536, 1, -262126, 65536, 1, -327662, 131072, 1, -393198, 65536, 1, -458734, 65536, 1, -524270, 65536, 1, -589806, 65536, 1, -655342, 65536, 1, -720878, 65536, 1, -786414, 65536, 1, -851950, 65536, 1, -917486, 65536, 1, -983022, 65536, 3, -1048558, 131072, 1, -1114094, 65536, 0, 1572881, 262144, 4, 1507345, 131072, 1, 1441809, 65536, 1, 1376273, 65536, 1, 1310737, 65536, 1, 1245201, 65536, 1, 1179665, 65536, 1, 1114129, 65536, 3, 1048593, 65536, 1, 983057, 65536, 1, 917521, 65536, 1, 851985, 65536, 3, 786449, 65536, 1, 720913, 65536, 1, 655377, 65536, 1, 589841, 65536, 1, 524305, 65536, 1, 458769, 65536, 1, 393233, 65536, 1, 327697, 65536, 1, 262161, 65536, 1, 196625, 65536, 1, 131089, 65536, 1, 65553, 65536, 1, 17, 65536, 3, -65519, 65536, 1, -131055, 65536, 1, -196591, 65536, 1, -262127, 65536, 1, -327663, 65536, 1, -393199, 131072, 2, -458735, 65536, 3, -524271, 131072, 1, -589807, 65536, 1, -655343, 65536, 1, -720879, 65536, 1, -786415, 65536, 1, -851951, 65536, 1, -917487, 65536, 2, -983023, 65536, 1, -1048559, 65536, 1, -1114095, 262144, 1, 1572880, 65536, 4, 1507344, 65536, 1, 1441808, 65536, 1, 1376272, 65536, 1, 1310736, 65536, 1, 1245200, 65536, 3, 1179664, 65536, 1, 1114128, 65536, 1, 1048592, 65536, 1, 983056, 65536, 1, 917520, 65536, 1, 851984, 65536, 2, 786448, 65536, 2, 720912, 65536, 1, 655376, 65536, 3, 589840, 65536, 1, 524304, 131072, 1, 458768, 131072, 2, 393232, 65536, 1, 327696, 65536, 2, 262160, 65536, 1, 196624, 65536, 1, 131088, 65536, 3, 65552, 65536, 1, 16, 65536, 1, -65520, 131072, 2, -131056, 65536, 1, -196592, 65536, 1, -262128, 65536, 1, -327664, 65536, 1, -393200, 65536, 1, -458736, 65536, 1, -524272, 65536, 1, -589808, 65536, 1, -655344, 65536, 1, -720880, 65536, 1, -786416, 65536, 1, -851952, 131072, 1, -917488, 65536, 1, -983024, 65536, 1, -1048560, 131072, 1, -1114096, 131072, 0, 1572879, 131072, 4, 1507343, 65536, 3, 1441807, 65536, 1, 1376271, 65536, 1, 1310735, 65536, 2, 1245199, 65536, 1, 1179663, 131072, 2, 1114127, 65536, 2, 1048591, 131072, 1, 983055, 65536, 1, 917519, 65536, 1, 851983, 65536, 1, 786447, 65536, 1, 720911, 65536, 1, 655375, 65536, 2, 589839, 65536, 1, 524303, 65536, 1, 458767, 65536, 1, 393231, 65536, 1, 327695, 131072, 2, 262159, 65536, 1, 196623, 65536, 1, 131087, 65536, 1, 65551, 65536, 1, 15, 131072, 2, -65521, 131072, 1, -131057, 65536, 1, -196593, 65536, 1, -262129, 65536, 1, -327665, 65536, 1, -393201, 65536, 1, -458737, 65536, 1, -524273, 65536, 1, -589809, 65536, 1, -655345, 65536, 1, -720881, 65536, 1, -786417, 65536, 1, -851953, 65536, 1, -917489, 65536, 1, -983025, 65536, 1, -1048561, 65536, 1, -1114097, 262144, 0, 1572878, 131072, 4, 1507342, 65536, 1, 1441806, 65536, 2, 1376270, 65536, 1, 1310734, 65536, 1, 1245198, 65536, 1, 1179662, 65536, 1, 1114126, 131072, 1, 1048590, 65536, 1, 983054, 131072, 1, 917518, 65536, 1, 851982, 65536, 1, 786446, 65536, 1, 720910, 65536, 1, 655374, 131072, 2, 589838, 65536, 1, 524302, 65536, 1, 458766, 65536, 1, 393230, 65536, 1, 327694, 65536, 1, 262158, 65536, 1, 196622, 65536, 1, 131086, 65536, 2, 65550, 131072, 2, 14, 65536, 1, -65522, 65536, 1, -131058, 65536, 1, -196594, 65536, 1, -262130, 65536, 1, -327666, 65536, 1, -393202, 65536, 3, -458738, 65536, 1, -524274, 65536, 1, -589810, 65536, 1, -655346, 65536, 1, -720882, 65536, 1, -786418, 131072, 2, -851954, 131072, 1, -917490, 65536, 2, -983026, 131072, 2, -1048562, 65536, 1, -1114098, 131072, 0, 1572877, 262144, 4, 1507341, 65536, 1, 1441805, 65536, 3, 1376269, 65536, 1, 1310733, 65536, 1, 1245197, 65536, 1, 1179661, 65536, 1, 1114125, 65536, 1, 1048589, 65536, 1, 983053, 65536, 1, 917517, 65536, 1, 851981, 65536, 1, 786445, 65536, 1, 720909, 65536, 1, 655373, 65536, 1, 589837, 65536, 1, 524301, 65536, 1, 458765, 65536, 1, 393229, 65536, 1, 327693, 65536, 1, 262157, 131072, 1, 196621, 65536, 1, 131085, 65536, 3, 65549, 65536, 1, 13, 131072, 2, -65523, 65536, 1, -131059, 65536, 1, -196595, 65536, 1, -262131, 65536, 3, -327667, 65536, 3, -393203, 65536, 1, -458739, 65536, 1, -524275, 65536, 1, -589811, 65536, 1, -655347, 65536, 1, -720883, 65536, 1, -786419, 65536, 1, -851955, 65536, 1, -917491, 65536, 1, -983027, 131072, 1, -1048563, 65536, 1, -1114099, 262144, 0, 1572876, 65536, 4, 1507340, 65536, 1, 1441804, 65536, 1, 1376268, 65536, 1, 1310732, 131072, 1, 1245196, 65536, 1, 1179660, 131072, 2, 1114124, 131072, 2, 1048588, 65536, 1, 983052, 65536, 1, 917516, 65536, 1, 851980, 65536, 1, 786444, 65536, 1, 720908, 65536, 1, 655372, 65536, 2, 589836, 65536, 1, 524300, 65536, 3, 458764, 65536, 1, 393228, 65536, 1, 327692, 131072, 1, 262156, 131072, 1, 196620, 65536, 1, 131084, 65536, 3, 65548, 65536, 1, 12, 65536, 1, -65524, 65536, 1, -131060, 65536, 1, -196596, 65536, 1, -262132, 65536, 1, -327668, 65536, 1, -393204, 65536, 1, -458740, 65536, 1, -524276, 65536, 1, -589812, 65536, 1, -655348, 65536, 1, -720884, 65536, 1, -786420, 65536, 1, -851956, 65536, 1, -917492, 65536, 1, -983028, 65536, 1, -1048564, 65536, 1, -1114100, 262144, 0, 1572875, 131072, 4, 1507339, 131072, 1, 1441803, 65536, 1, 1376267, 131072, 2, 1310731, 65536, 1, 1245195, 65536, 1, 1179659, 65536, 1, 1114123, 131072, 2, 1048587, 65536, 2, 983051, 131072, 2, 917515, 65536, 1, 851979, 65536, 1, 786443, 65536, 3, 720907, 65536, 3, 655371, 65536, 1, 589835, 65536, 1, 524299, 65536, 1, 458763, 65536, 1, 393227, 65536, 1, 327691, 65536, 1, 262155, 65536, 1, 196619, 65536, 1, 131083, 65536, 3, 65547, 65536, 1, 11, 65536, 1, -65525, 65536, 1, -131061, 65536, 1, -196597, 65536, 1, -262133, 131072, 1, -327669, 65536, 1, -393205, 65536, 1, -458741, 65536, 1, -524277, 65536, 3, -589813, 65536, 3, -655349, 65536, 1, -720885, 65536, 1, -786421, 65536, 1, -851957, 65536, 1, -917493, 65536, 1, -983029, 65536, 1, -1048565, 65536, 1, -1114101, 262144, 1, 1572874, 65536, 4, 1507338, 65536, 1, 1441802, 65536, 3, 1376266, 65536, 1, 1310730, 65536, 1, 1245194, 65536, 1, 1179658, 65536, 3, 1114122, 65536, 2, 1048586, 65536, 1, 983050, 65536, 1, 917514, 65536, 1, 851978, 65536, 1, 786442, 65536, 1, 720906, 65536, 1, 655370, 65536, 1, 589834, 65536, 1, 524298, 131072, 1, 458762, 65536, 1, 393226, 131072, 2, 327690, 65536, 1, 262154, 65536, 1, 196618, 65536, 1, 131082, 65536, 1, 65546, 65536, 1, 10, 65536, 1, -65526, 65536, 1, -131062, 131072, 2, -196598, 131072, 2, -262134, 65536, 1, -327670, 65536, 1, -393206, 131072, 1, -458742, 65536, 1, -524278, 65536, 1, -589814, 65536, 3, -655350, 65536, 1, -720886, 65536, 1, -786422, 65536, 3, -851958, 131072, 2, -917494, 65536, 1, -983030, 65536, 1, -1048566, 65536, 1, -1114102, 131072, 0, 1572873, 65536, 4, 1507337, 65536, 1, 1441801, 131072, 1, 1376265, 65536, 3, 1310729, 65536, 1, 1245193, 65536, 3, 1179657, 65536, 1, 1114121, 131072, 1, 1048585, 65536, 1, 983049, 65536, 1, 917513, 65536, 1, 851977, 65536, 1, 786441, 65536, 2, 720905, 65536, 1, 655369, 65536, 1, 589833, 65536, 1, 524297, 65536, 1, 458761, 65536, 1, 393225, 65536, 1, 327689, 65536, 1, 262153, 65536, 3, 196617, 65536, 1, 131081, 65536, 1, 65545, 65536, 1, 9, 65536, 1, -65527, 65536, 1, -131063, 65536, 1, -196599, 65536, 1, -262135, 131072, 2, -327671, 65536, 3, -393207, 65536, 1, -458743, 65536, 1, -524279, 65536, 1, -589815, 65536, 3, -655351, 65536, 1, -720887, 65536, 1, -786423, 65536, 1, -851959, 131072, 1, -917495, 65536, 2, -983031, 65536, 1, -1048567, 65536, 2, -1114103, 131072, 0, 1572872, 131072, 4, 1507336, 65536, 1, 1441800, 65536, 3, 1376264, 65536, 1, 1310728, 65536, 3, 1245192, 65536, 1, 1179656, 65536, 1, 1114120, 65536, 1, 1048584, 65536, 1, 983048, 65536, 1, 917512, 131072, 1, 851976, 65536, 1, 786440, 65536, 1, 720904, 65536, 1, 655368, 65536, 1, 589832, 65536, 1, 524296, 65536, 1, 458760, 65536, 3, 393224, 65536, 3, 327688, 65536, 3, 262152, 65536, 3, 196616, 131072, 2, 131080, 65536, 1, 65544, 65536, 1, 8, 65536, 3, -65528, 65536, 1, -131064, 65536, 1, -196600, 65536, 1, -262136, 131072, 1, -327672, 65536, 1, -393208, 65536, 1, -458744, 65536, 1, -524280, 65536, 2, -589816, 65536, 1, -655352, 65536, 1, -720888, 65536, 1, -786424, 65536, 1, -851960, 65536, 1, -917496, 65536, 1, -983032, 65536, 1, -1048568, 65536, 3, -1114104, 262144, 1, 1572871, 131072, 4, 1507335, 65536, 1, 1441799, 65536, 1, 1376263, 131072, 1, 1310727, 65536, 1, 1245191, 65536, 1, 1179655, 65536, 1, 1114119, 65536, 1, 1048583, 65536, 1, 983047, 65536, 1, 917511, 65536, 1, 851975, 65536, 2, 786439, 65536, 1, 720903, 65536, 1, 655367, 65536, 1, 589831, 65536, 1, 524295, 65536, 1, 458759, 131072, 2, 393223, 65536, 3, 327687, 65536, 1, 262151, 65536, 1, 196615, 65536, 1, 131079, 65536, 1, 65543, 131072, 2, 7, 65536, 1, -65529, 65536, 1, -131065, 65536, 1, -196601, 65536, 1, -262137, 65536, 1, -327673, 65536, 1, -393209, 131072, 1, -458745, 65536, 2, -524281, 65536, 1, -589817, 65536, 1, -655353, 65536, 3, -720889, 65536, 1, -786425, 65536, 1, -851961, 65536, 1, -917497, 131072, 1, -983033, 65536, 1, -1048569, 65536, 1, -1114105, 131072, 0, 1572870, 262144, 4, 1507334, 65536, 1, 1441798, 131072, 1, 1376262, 65536, 1, 1310726, 65536, 1, 1245190, 65536, 2, 1179654, 65536, 1, 1114118, 65536, 1, 1048582, 65536, 1, 983046, 131072, 2, 917510, 65536, 1, 851974, 65536, 1, 786438, 65536, 2, 720902, 65536, 1, 655366, 65536, 1, 589830, 65536, 1, 524294, 65536, 1, 458758, 65536, 1, 393222, 65536, 2, 327686, 65536, 1, 262150, 131072, 1, 196614, 65536, 2, 131078, 65536, 1, 65542, 131072, 2, 6, 65536, 1, -65530, 65536, 1, -131066, 65536, 1, -196602, 65536, 3, -262138, 65536, 1, -327674, 65536, 3, -393210, 65536, 1, -458746, 65536, 2, -524282, 65536, 1, -589818, 65536, 1, -655354, 65536, 1, -720890, 65536, 1, -786426, 65536, 1, -851962, 131072, 2, -917498, 65536, 3, -983034, 65536, 1, -1048570, 65536, 3, -1114106, 65536, 0, 1572869, 262144, 4, 1507333, 65536, 1, 1441797, 65536, 1, 1376261, 65536, 1, 1310725, 65536, 1, 1245189, 65536, 2, 1179653, 65536, 1, 1114117, 65536, 1, 1048581, 65536, 1, 983045, 65536, 1, 917509, 65536, 1, 851973, 65536, 1, 786437, 65536, 1, 720901, 131072, 2, 655365, 65536, 1, 589829, 65536, 1, 524293, 131072, 2, 458757, 131072, 2, 393221, 65536, 1, 327685, 65536, 1, 262149, 65536, 1, 196613, 65536, 1, 131077, 65536, 1, 65541, 65536, 1, 5, 65536, 1, -65531, 131072, 2, -131067, 65536, 1, -196603, 65536, 1, -262139, 65536, 1, -327675, 65536, 1, -393211, 65536, 1, -458747, 65536, 1, -524283, 65536, 1, -589819, 65536, 1, -655355, 131072, 1, -720891, 65536, 1, -786427, 65536, 1, -851963, 65536, 1, -917499, 65536, 3, -983035, 131072, 1, -1048571, 65536, 2, -1114107, 131072, 0, 1572868, 262144, 4, 1507332, 65536, 2, 1441796, 65536, 1, 1376260, 65536, 1, 1310724, 131072, 1, 1245188, 65536, 1, 1179652, 65536, 1, 1114116, 65536, 1, 1048580, 65536, 1, 983044, 65536, 1, 917508, 65536, 1, 851972, 131072, 2, 786436, 65536, 3, 720900, 65536, 1, 655364, 65536, 1, 589828, 65536, 1, 524292, 65536, 1, 458756, 65536, 1, 393220, 65536, 1, 327684, 65536, 1, 262148, 65536, 1, 196612, 65536, 1, 131076, 131072, 1, 65540, 65536, 3, 4, 65536, 1, -65532, 65536, 1, -131068, 65536, 1, -196604, 65536, 1, -262140, 65536, 1, -327676, 65536, 2, -393212, 65536, 1, -458748, 65536, 3, -524284, 65536, 1, -589820, 65536, 1, -655356, 131072, 2, -720892, 65536, 1, -786428, 131072, 1, -851964, 65536, 2, -917500, 65536, 1, -983036, 131072, 1, -1048572, 65536, 1, -1114108, 65536, 0, 1572867, 131072, 4, 1507331, 131072, 1, 1441795, 65536, 1, 1376259, 65536, 1, 1310723, 65536, 1, 1245187, 65536, 1, 1179651, 65536, 2, 1114115, 65536, 3, 1048579, 131072, 2, 983043, 65536, 1, 917507, 65536, 3, 851971, 65536, 1, 786435, 65536, 1, 720899, 65536, 1, 655363, 131072, 1, 589827, 65536, 1, 524291, 65536, 1, 458755, 65536, 1, 393219, 65536, 1, 327683, 65536, 1, 262147, 65536, 1, 196611, 65536, 1, 131075, 131072, 1, 65539, 65536, 1, 3, 65536, 1, -65533, 65536, 1, -131069, 131072, 2, -196605, 65536, 3, -262141, 131072, 1, -327677, 65536, 1, -393213, 65536, 3, -458749, 65536, 1, -524285, 65536, 1, -589821, 65536, 2, -655357, 65536, 1, -720893, 131072, 1, -786429, 131072, 2, -851965, 65536, 3, -917501, 65536, 1, -983037, 65536, 1, -1048573, 65536, 3, -1114109, 262144, 0, 1572866, 65536, 4, 1507330, 65536, 1, 1441794, 65536, 1, 1376258, 65536, 1, 1310722, 131072, 2, 1245186, 65536, 1, 1179650, 65536, 1, 1114114, 65536, 1, 1048578, 65536, 1, 983042, 65536, 3, 917506, 65536, 1, 851970, 65536, 2, 786434, 65536, 1, 720898, 65536, 1, 655362, 65536, 3, 589826, 131072, 1, 524290, 65536, 1, 458754, 65536, 1, 393218, 65536, 1, 327682, 131072, 1, 262146, 65536, 1, 196610, 65536, 1, 131074, 65536, 2, 65538, 65536, 1, 2, 65536, 1, -65534, 65536, 2, -131070, 65536, 1, -196606, 65536, 1, -262142, 65536, 2, -327678, 65536, 1, -393214, 65536, 1, -458750, 65536, 1, -524286, 65536, 1, -589822, 65536, 1, -655358, 65536, 1, -720894, 65536, 1, -786430, 131072, 1, -851966, 65536, 3, -917502, 65536, 1, -983038, 65536, 1, -1048574, 65536, 2, -1114110, 65536, 0, 1572865, 262144, 4, 1507329, 65536, 1, 1441793, 65536, 1, 1376257, 131072, 1, 1310721, 131072, 1, 1245185, 65536, 1, 1179649, 131072, 1, 1114113, 65536, 1, 1048577, 65536, 1, 983041, 65536, 3, 917505, 65536, 1, 851969, 131072, 1, 786433, 131072, 2, 720897, 65536, 2, 655361, 65536, 1, 589825, 65536, 1, 524289, 65536, 1, 458753, 65536, 3, 393217, 65536, 1, 327681, 65536, 1, 262145, 65536, 2, 196609, 65536, 1, 131073, 131072, 1, 65537, 65536, 1, 1, 65536, 1, -65535, 65536, 3, -131071, 65536, 1, -196607, 65536, 2, -262143, 65536, 3, -327679, 65536, 3, -393215, 65536, 1, -458751, 65536, 1, -524287, 65536, 2, -589823, 65536, 2, -655359, 65536, 1, -720895, 65536, 2, -786431, 65536, 1, -851967, 65536, 1, -917503, 65536, 1, -983039, 65536, 1, -1048575, 65536, 1, -1114111, 262144, 1, 1572864, 131072, 4, 1507328, 65536, 3, 1441792, 131072, 1, 1376256, 65536, 1, 1310720, 65536, 1, 1245184, 65536, 1, 1179648, 65536, 1, 1114112, 65536, 3, 1048576, 65536, 1, 983040, 65536, 1, 917504, 65536, 1, 851968, 65536, 2, 786432, 65536, 1, 720896, 65536, 1, 655360, 131072, 2, 589824, 65536, 1, 524288, 65536, 1, 458752, 131072, 1, 393216, 65536, 1, 327680, 65536, 1, 262144, 65536, 1, 196608, 65536, 1, 131072, 65536, 2, 65536, 65536, 1, 0, 65536, 1, -65536, 131072, 1, -131072, 65536, 1, -196608, 65536, 1, -262144, 65536, 1, -327680, 65536, 2, -393216, 65536, 1, -458752, 65536, 3, -524288, 65536, 1, -589824, 131072, 1, -655360, 65536, 1, -720896, 65536, 1, -786432, 65536, 1, -851968, 65536, 1, -917504, 65536, 3, -983040, 131072, 1, -1048576, 65536, 1, -1114112, 131072, 0, 1638399, 131072, 4, 1572863, 131072, 2, 1507327, 65536, 1, 1441791, 131072, 2, 1376255, 65536, 1, 1310719, 65536, 1, 1245183, 65536, 1, 1179647, 131072, 2, 1114111, 65536, 2, 1048575, 65536, 1, 983039, 65536, 1, 917503, 65536, 1, 851967, 65536, 1, 786431, 65536, 1, 720895, 65536, 2, 655359, 65536, 3, 589823, 65536, 1, 524287, 65536, 1, 458751, 131072, 2, 393215, 65536, 1, 327679, 65536, 1, 262143, 65536, 1, 196607, 65536, 1, 131071, 65536, 3, 65535, 131072, 2, -1, 65536, 1, -65537, 65536, 1, -131073, 65536, 1, -196609, 131072, 2, -262145, 65536, 1, -327681, 65536, 1, -393217, 65536, 1, -458753, 65536, 1, -524289, 65536, 3, -589825, 65536, 1, -655361, 65536, 1, -720897, 65536, 1, -786433, 65536, 3, -851969, 131072, 1, -917505, 65536, 1, -983041, 65536, 1, -1048577, 131072, 0, 1638398, 65536, 4, 1572862, 65536, 1, 1507326, 65536, 1, 1441790, 65536, 1, 1376254, 65536, 1, 1310718, 65536, 1, 1245182, 65536, 1, 1179646, 65536, 1, 1114110, 65536, 1, 1048574, 65536, 1, 983038, 65536, 1, 917502, 65536, 1, 851966, 65536, 1, 786430, 65536, 1, 720894, 65536, 1, 655358, 65536, 1, 589822, 65536, 1, 524286, 65536, 1, 458750, 65536, 1, 393214, 65536, 1, 327678, 65536, 1, 262142, 65536, 1, 196606, 65536, 1, 131070, 65536, 1, 65534, 65536, 1, -2, 65536, 1, -65538, 65536, 3, -131074, 65536, 1, -196610, 65536, 1, -262146, 65536, 2, -327682, 65536, 3, -393218, 65536, 1, -458754, 65536, 1, -524290, 65536, 1, -589826, 65536, 1, -655362, 65536, 1, -720898, 65536, 1, -786434, 65536, 3, -851970, 65536, 1, -917506, 65536, 1, -983042, 65536, 1, -1048578, 131072, 0, 1638397, 131072, 4, 1572861, 65536, 1, 1507325, 65536, 1, 1441789, 65536, 1, 1376253, 65536, 1, 1310717, 131072, 1, 1245181, 65536, 1, 1179645, 65536, 1, 1114109, 65536, 2, 1048573, 65536, 1, 983037, 65536, 1, 917501, 65536, 1, 851965, 65536, 1, 786429, 65536, 1, 720893, 65536, 1, 655357, 65536, 1, 589821, 65536, 2, 524285, 65536, 1, 458749, 131072, 1, 393213, 65536, 1, 327677, 65536, 2, 262141, 65536, 3, 196605, 65536, 1, 131069, 131072, 2, 65533, 65536, 1, -3, 131072, 2, -65539, 65536, 1, -131075, 131072, 2, -196611, 65536, 1, -262147, 131072, 2, -327683, 65536, 1, -393219, 131072, 2, -458755, 65536, 1, -524291, 65536, 1, -589827, 65536, 1, -655363, 65536, 1, -720899, 65536, 1, -786435, 131072, 2, -851971, 65536, 1, -917507, 65536, 1, -983043, 65536, 1, -1048579, 262144, 1, 1638396, 131072, 4, 1572860, 65536, 1, 1507324, 65536, 1, 1441788, 65536, 1, 1376252, 65536, 1, 1310716, 65536, 1, 1245180, 65536, 1, 1179644, 65536, 1, 1114108, 65536, 1, 1048572, 65536, 1, 983036, 65536, 1, 917500, 65536, 3, 851964, 131072, 2, 786428, 65536, 1, 720892, 65536, 1, 655356, 65536, 1, 589820, 65536, 1, 524284, 65536, 1, 458748, 65536, 1, 393212, 65536, 1, 327676, 65536, 1, 262140, 65536, 1, 196604, 65536, 1, 131068, 65536, 1, 65532, 65536, 1, -4, 65536, 3, -65540, 65536, 1, -131076, 65536, 1, -196612, 65536, 1, -262148, 65536, 1, -327684, 65536, 1, -393220, 65536, 1, -458756, 65536, 1, -524292, 65536, 1, -589828, 65536, 1, -655364, 65536, 1, -720900, 65536, 1, -786436, 65536, 1, -851972, 65536, 2, -917508, 65536, 1, -983044, 65536, 1, -1048580, 131072, 0, 1638395, 65536, 4, 1572859, 65536, 1, 1507323, 65536, 1, 1441787, 65536, 3, 1376251, 65536, 2, 1310715, 65536, 1, 1245179, 65536, 1, 1179643, 65536, 1, 1114107, 131072, 2, 1048571, 65536, 2, 983035, 131072, 2, 917499, 65536, 1, 851963, 65536, 1, 786427, 65536, 1, 720891, 65536, 1, 655355, 65536, 1, 589819, 65536, 1, 524283, 65536, 1, 458747, 65536, 1, 393211, 65536, 1, 327675, 131072, 1, 262139, 65536, 1, 196603, 65536, 1, 131067, 65536, 1, 65531, 65536, 1, -5, 65536, 1, -65541, 131072, 1, -131077, 65536, 3, -196613, 65536, 1, -262149, 65536, 1, -327685, 131072, 2, -393221, 65536, 1, -458757, 65536, 1, -524293, 65536, 1, -589829, 65536, 3, -655365, 65536, 1, -720901, 65536, 1, -786437, 65536, 1, -851973, 65536, 1, -917509, 65536, 1, -983045, 65536, 1, -1048581, 131072, 0, 1638394, 131072, 4, 1572858, 65536, 3, 1507322, 65536, 1, 1441786, 65536, 1, 1376250, 65536, 1, 1310714, 65536, 1, 1245178, 65536, 1, 1179642, 65536, 3, 1114106, 65536, 1, 1048570, 65536, 2, 983034, 65536, 1, 917498, 65536, 1, 851962, 65536, 1, 786426, 131072, 1, 720890, 65536, 1, 655354, 65536, 1, 589818, 65536, 2, 524282, 65536, 1, 458746, 65536, 1, 393210, 131072, 2, 327674, 65536, 1, 262138, 65536, 1, 196602, 131072, 1, 131066, 131072, 2, 65530, 65536, 1, -6, 65536, 1, -65542, 65536, 1, -131078, 65536, 1, -196614, 131072, 1, -262150, 65536, 2, -327686, 131072, 2, -393222, 65536, 3, -458758, 65536, 1, -524294, 65536, 1, -589830, 65536, 1, -655366, 65536, 1, -720902, 131072, 2, -786438, 65536, 1, -851974, 65536, 1, -917510, 65536, 1, -983046, 65536, 1, -1048582, 131072, 0, 1638393, 65536, 4, 1572857, 65536, 1, 1507321, 65536, 1, 1441785, 131072, 1, 1376249, 65536, 1, 1310713, 65536, 1, 1245177, 65536, 1, 1179641, 65536, 1, 1114105, 65536, 1, 1048569, 65536, 2, 983033, 65536, 1, 917497, 65536, 1, 851961, 65536, 1, 786425, 65536, 1, 720889, 65536, 1, 655353, 65536, 1, 589817, 65536, 1, 524281, 65536, 1, 458745, 131072, 1, 393209, 65536, 1, 327673, 65536, 1, 262137, 65536, 2, 196601, 65536, 1, 131065, 65536, 1, 65529, 65536, 1, -7, 65536, 1, -65543, 65536, 2, -131079, 131072, 2, -196615, 65536, 2, -262151, 65536, 1, -327687, 65536, 1, -393223, 65536, 1, -458759, 131072, 2, -524295, 65536, 1, -589831, 65536, 1, -655367, 65536, 1, -720903, 65536, 2, -786439, 65536, 1, -851975, 65536, 2, -917511, 65536, 1, -983047, 65536, 1, -1048583, 65536, 0, 1638392, 262144, 4, 1572856, 65536, 2, 1507320, 131072, 1, 1441784, 65536, 1, 1376248, 65536, 1, 1310712, 65536, 1, 1245176, 65536, 1, 1179640, 65536, 1, 1114104, 65536, 2, 1048568, 65536, 1, 983032, 65536, 3, 917496, 65536, 1, 851960, 65536, 1, 786424, 65536, 1, 720888, 131072, 2, 655352, 65536, 2, 589816, 131072, 1, 524280, 131072, 2, 458744, 65536, 1, 393208, 65536, 1, 327672, 65536, 1, 262136, 65536, 3, 196600, 65536, 1, 131064, 65536, 1, 65528, 65536, 1, -8, 65536, 1, -65544, 65536, 1, -131080, 65536, 1, -196616, 65536, 2, -262152, 65536, 1, -327688, 65536, 3, -393224, 65536, 1, -458760, 65536, 1, -524296, 65536, 1, -589832, 65536, 1, -655368, 65536, 1, -720904, 65536, 1, -786440, 65536, 1, -851976, 65536, 1, -917512, 65536, 3, -983048, 65536, 1, -1048584, 262144, 0, 1638391, 262144, 4, 1572855, 131072, 1, 1507319, 65536, 1, 1441783, 65536, 1, 1376247, 65536, 2, 1310711, 65536, 1, 1245175, 65536, 1, 1179639, 65536, 1, 1114103, 65536, 1, 1048567, 65536, 1, 983031, 65536, 1, 917495, 65536, 1, 851959, 65536, 1, 786423, 65536, 1, 720887, 65536, 1, 655351, 65536, 1, 589815, 65536, 1, 524279, 65536, 1, 458743, 65536, 1, 393207, 131072, 1, 327671, 65536, 1, 262135, 65536, 1, 196599, 65536, 3, 131063, 65536, 1, 65527, 65536, 1, -9, 65536, 1, -65545, 131072, 2, -131081, 65536, 1, -196617, 131072, 2, -262153, 65536, 1, -327689, 131072, 2, -393225, 65536, 1, -458761, 65536, 1, -524297, 65536, 1, -589833, 65536, 1, -655369, 65536, 1, -720905, 65536, 1, -786441, 131072, 2, -851977, 65536, 1, -917513, 65536, 1, -983049, 65536, 1, -1048585, 262144, 1, 1638390, 65536, 4, 1572854, 65536, 1, 1507318, 65536, 1, 1441782, 65536, 1, 1376246, 131072, 2, 1310710, 65536, 1, 1245174, 131072, 2, 1179638, 65536, 3, 1114102, 131072, 1, 1048566, 65536, 1, 983030, 65536, 1, 917494, 65536, 1, 851958, 65536, 1, 786422, 65536, 1, 720886, 65536, 1, 655350, 65536, 3, 589814, 65536, 2, 524278, 65536, 1, 458742, 65536, 1, 393206, 65536, 1, 327670, 65536, 1, 262134, 65536, 1, 196598, 65536, 1, 131062, 65536, 1, 65526, 65536, 3, -10, 65536, 1, -65546, 65536, 2, -131082, 65536, 1, -196618, 65536, 1, -262154, 65536, 1, -327690, 65536, 1, -393226, 65536, 1, -458762, 65536, 1, -524298, 131072, 1, -589834, 131072, 2, -655370, 65536, 1, -720906, 65536, 1, -786442, 65536, 2, -851978, 65536, 1, -917514, 65536, 1, -983050, 65536, 1, -1048586, 262144, 1, 1638389, 262144, 4, 1572853, 65536, 3, 1507317, 65536, 1, 1441781, 65536, 1, 1376245, 65536, 1, 1310709, 65536, 1, 1245173, 131072, 2, 1179637, 65536, 1, 1114101, 65536, 1, 1048565, 131072, 1, 983029, 65536, 1, 917493, 65536, 1, 851957, 65536, 1, 786421, 65536, 3, 720885, 65536, 1, 655349, 65536, 1, 589813, 65536, 3, 524277, 65536, 2, 458741, 65536, 2, 393205, 65536, 3, 327669, 65536, 1, 262133, 131072, 2, 196597, 65536, 1, 131061, 65536, 1, 65525, 65536, 1, -11, 65536, 1, -65547, 65536, 1, -131083, 131072, 1, -196619, 65536, 1, -262155, 65536, 1, -327691, 65536, 1, -393227, 65536, 3, -458763, 65536, 3, -524299, 65536, 1, -589835, 65536, 1, -655371, 65536, 1, -720907, 65536, 1, -786443, 65536, 1, -851979, 65536, 1, -917515, 65536, 1, -983051, 65536, 1, -1048587, 131072, 0, 1638388, 262144, 4, 1572852, 65536, 1, 1507316, 65536, 1, 1441780, 65536, 1, 1376244, 65536, 1, 1310708, 131072, 2, 1245172, 65536, 1, 1179636, 131072, 2, 1114100, 65536, 1, 1048564, 65536, 1, 983028, 65536, 1, 917492, 131072, 1, 851956, 65536, 1, 786420, 65536, 1, 720884, 65536, 1, 655348, 65536, 1, 589812, 65536, 3, 524276, 65536, 2, 458740, 65536, 1, 393204, 65536, 1, 327668, 65536, 1, 262132, 65536, 1, 196596, 131072, 1, 131060, 65536, 1, 65524, 65536, 1, -12, 65536, 1, -65548, 65536, 1, -131084, 65536, 1, -196620, 65536, 1, -262156, 65536, 2, -327692, 65536, 1, -393228, 65536, 2, -458764, 65536, 1, -524300, 65536, 1, -589836, 131072, 2, -655372, 65536, 1, -720908, 65536, 3, -786444, 65536, 3, -851980, 65536, 1, -917516, 65536, 3, -983052, 65536, 2, -1048588, 262144, 1, 1638387, 65536, 4, 1572851, 65536, 1, 1507315, 131072, 2, 1441779, 65536, 1, 1376243, 65536, 1, 1310707, 65536, 2, 1245171, 65536, 1, 1179635, 65536, 1, 1114099, 65536, 1, 1048563, 65536, 1, 983027, 65536, 1, 917491, 131072, 1, 851955, 65536, 1, 786419, 65536, 1, 720883, 65536, 1, 655347, 65536, 3, 589811, 65536, 1, 524275, 65536, 1, 458739, 65536, 1, 393203, 65536, 3, 327667, 65536, 1, 262131, 65536, 1, 196595, 65536, 1, 131059, 65536, 1, 65523, 65536, 1, -13, 131072, 2, -65549, 65536, 1, -131085, 65536, 1, -196621, 65536, 1, -262157, 65536, 1, -327693, 65536, 1, -393229, 65536, 1, -458765, 65536, 1, -524301, 65536, 1, -589837, 65536, 1, -655373, 65536, 1, -720909, 65536, 1, -786445, 65536, 1, -851981, 65536, 1, -917517, 65536, 1, -983053, 65536, 1, -1048589, 131072, 0, 1638386, 262144, 4, 1572850, 65536, 3, 1507314, 65536, 1, 1441778, 65536, 1, 1376242, 65536, 1, 1310706, 131072, 2, 1245170, 65536, 1, 1179634, 65536, 1, 1114098, 131072, 2, 1048562, 131072, 1, 983026, 65536, 1, 917490, 131072, 2, 851954, 65536, 1, 786418, 65536, 3, 720882, 65536, 1, 655346, 65536, 1, 589810, 65536, 1, 524274, 131072, 2, 458738, 65536, 2, 393202, 65536, 2, 327666, 131072, 1, 262130, 65536, 1, 196594, 65536, 1, 131058, 65536, 1, 65522, 65536, 1, -14, 65536, 1, -65550, 131072, 1, -131086, 131072, 2, -196622, 65536, 3, -262158, 65536, 1, -327694, 65536, 3, -393230, 65536, 1, -458766, 65536, 1, -524302, 131072, 1, -589838, 65536, 1, -655374, 65536, 1, -720910, 65536, 1, -786446, 65536, 1, -851982, 65536, 1, -917518, 65536, 1, -983054, 65536, 1, -1048590, 262144, 1, 1638385, 262144, 4, 1572849, 65536, 1, 1507313, 65536, 1, 1441777, 65536, 1, 1376241, 65536, 1, 1310705, 65536, 1, 1245169, 65536, 3, 1179633, 131072, 2, 1114097, 65536, 1, 1048561, 65536, 1, 983025, 65536, 1, 917489, 65536, 1, 851953, 65536, 1, 786417, 65536, 1, 720881, 65536, 3, 655345, 65536, 1, 589809, 65536, 1, 524273, 65536, 1, 458737, 65536, 1, 393201, 65536, 2, 327665, 65536, 3, 262129, 65536, 1, 196593, 65536, 3, 131057, 65536, 1, 65521, 65536, 1, -15, 65536, 1, -65551, 65536, 1, -131087, 65536, 1, -196623, 65536, 1, -262159, 65536, 2, -327695, 65536, 1, -393231, 65536, 1, -458767, 65536, 1, -524303, 131072, 1, -589839, 65536, 3, -655375, 65536, 3, -720911, 65536, 1, -786447, 65536, 2, -851983, 131072, 2, -917519, 65536, 1, -983055, 65536, 2, -1048591, 262144, 0, 1638384, 131072, 4, 1572848, 65536, 1, 1507312, 65536, 1, 1441776, 131072, 2, 1376240, 65536, 3, 1310704, 65536, 1, 1245168, 65536, 2, 1179632, 65536, 1, 1114096, 65536, 1, 1048560, 65536, 1, 983024, 65536, 1, 917488, 65536, 1, 851952, 65536, 1, 786416, 65536, 1, 720880, 65536, 1, 655344, 65536, 1, 589808, 65536, 1, 524272, 65536, 2, 458736, 65536, 1, 393200, 65536, 1, 327664, 65536, 1, 262128, 65536, 1, 196592, 65536, 1, 131056, 65536, 1, 65520, 65536, 1, -16, 65536, 1, -65552, 65536, 1, -131088, 65536, 1, -196624, 65536, 1, -262160, 65536, 1, -327696, 65536, 1, -393232, 65536, 1, -458768, 65536, 1, -524304, 65536, 1, -589840, 65536, 3, -655376, 65536, 1, -720912, 65536, 3, -786448, 65536, 1, -851984, 65536, 2, -917520, 65536, 1, -983056, 65536, 1, -1048592, 262144, 0, 1638383, 262144, 4, 1572847, 65536, 1, 1507311, 65536, 1, 1441775, 131072, 2, 1376239, 65536, 1, 1310703, 65536, 1, 1245167, 65536, 1, 1179631, 65536, 1, 1114095, 131072, 2, 1048559, 65536, 1, 983023, 65536, 1, 917487, 65536, 1, 851951, 65536, 1, 786415, 65536, 1, 720879, 65536, 1, 655343, 65536, 1, 589807, 65536, 1, 524271, 65536, 1, 458735, 65536, 1, 393199, 65536, 3, 327663, 65536, 1, 262127, 131072, 2, 196591, 65536, 1, 131055, 65536, 1, 65519, 65536, 1, -17, 131072, 2, -65553, 65536, 1, -131089, 65536, 1, -196625, 65536, 3, -262161, 65536, 1, -327697, 65536, 1, -393233, 65536, 1, -458769, 65536, 1, -524305, 65536, 1, -589841, 65536, 1, -655377, 65536, 3, -720913, 65536, 3, -786449, 65536, 1, -851985, 65536, 1, -917521, 65536, 1, -983057, 65536, 1, -1048593, 262144, 1, 1638382, 65536, 4, 1572846, 65536, 3, 1507310, 65536, 1, 1441774, 65536, 1, 1376238, 65536, 1, 1310702, 131072, 2, 1245166, 65536, 1, 1179630, 65536, 1, 1114094, 65536, 1, 1048558, 65536, 1, 983022, 65536, 1, 917486, 65536, 1, 851950, 131072, 2, 786414, 65536, 1, 720878, 65536, 1, 655342, 65536, 1, 589806, 65536, 1, 524270, 65536, 1, 458734, 65536, 1, 393198, 65536, 1, 327662, 65536, 1, 262126, 65536, 3, 196590, 65536, 1, 131054, 65536, 3, 65518, 65536, 1, -18, 131072, 1, -65554, 65536, 3, -131090, 65536, 1, -196626, 65536, 1, -262162, 65536, 1, -327698, 65536, 2, -393234, 131072, 1, -458770, 65536, 1, -524306, 65536, 2, -589842, 65536, 1, -655378, 65536, 1, -720914, 65536, 1, -786450, 131072, 2, -851986, 65536, 1, -917522, 131072, 2, -983058, 65536, 1, -1048594, 262144, 0, 1638381, 65536, 4, 1572845, 65536, 1, 1507309, 65536, 3, 1441773, 131072, 1, 1376237, 65536, 1, 1310701, 131072, 2, 1245165, 65536, 1, 1179629, 65536, 1, 1114093, 65536, 1, 1048557, 131072, 2, 983021, 65536, 1, 917485, 65536, 1, 851949, 65536, 1, 786413, 65536, 1, 720877, 65536, 3, 655341, 65536, 1, 589805, 65536, 1, 524269, 65536, 1, 458733, 65536, 1, 393197, 65536, 1, 327661, 65536, 1, 262125, 65536, 1, 196589, 65536, 1, 131053, 65536, 1, 65517, 131072, 1, -19, 65536, 1, -65555, 131072, 1, -131091, 65536, 1, -196627, 65536, 1, -262163, 65536, 1, -327699, 131072, 1, -393235, 65536, 1, -458771, 65536, 1, -524307, 65536, 2, -589843, 65536, 1, -655379, 65536, 1, -720915, 65536, 3, -786451, 65536, 1, -851987, 65536, 1, -917523, 65536, 3, -983059, 65536, 1, -1048595, 65536, 0, 1638380, 131072, 4, 1572844, 65536, 1, 1507308, 65536, 1, 1441772, 65536, 1, 1376236, 65536, 1, 1310700, 65536, 1, 1245164, 65536, 1, 1179628, 65536, 1, 1114092, 65536, 3, 1048556, 65536, 1, 983020, 65536, 1, 917484, 65536, 1, 851948, 131072, 1, 786412, 65536, 1, 720876, 65536, 1, 655340, 65536, 1, 589804, 131072, 1, 524268, 65536, 1, 458732, 65536, 1, 393196, 65536, 1, 327660, 65536, 1, 262124, 65536, 1, 196588, 65536, 1, 131052, 131072, 1, 65516, 65536, 3, -20, 65536, 1, -65556, 65536, 3, -131092, 65536, 1, -196628, 65536, 1, -262164, 131072, 2, -327700, 65536, 1, -393236, 65536, 1, -458772, 65536, 1, -524308, 65536, 1, -589844, 65536, 1, -655380, 65536, 1, -720916, 65536, 1, -786452, 65536, 1, -851988, 65536, 1, -917524, 65536, 1, -983060, 65536, 2, -1048596, 262144, 1, 1638379, 131072, 4, 1572843, 131072, 1, 1507307, 65536, 1, 1441771, 65536, 1, 1376235, 65536, 1, 1310699, 65536, 1, 1245163, 131072, 2, 1179627, 65536, 1, 1114091, 65536, 1, 1048555, 65536, 1, 983019, 65536, 3, 917483, 65536, 3, 851947, 131072, 1, 786411, 65536, 1, 720875, 65536, 1, 655339, 65536, 1, 589803, 65536, 1, 524267, 65536, 1, 458731, 65536, 1, 393195, 65536, 1, 327659, 131072, 2, 262123, 65536, 1, 196587, 65536, 1, 131051, 65536, 1, 65515, 65536, 1, -21, 65536, 1, -65557, 65536, 1, -131093, 65536, 1, -196629, 65536, 1, -262165, 65536, 1, -327701, 65536, 1, -393237, 65536, 1, -458773, 65536, 1, -524309, 65536, 1, -589845, 65536, 1, -655381, 65536, 1, -720917, 65536, 1, -786453, 65536, 1, -851989, 65536, 1, -917525, 65536, 1, -983061, 131072, 2, -1048597, 262144, 1, 1638378, 65536, 4, 1572842, 65536, 1, 1507306, 65536, 1, 1441770, 65536, 1, 1376234, 65536, 1, 1310698, 65536, 1, 1245162, 65536, 1, 1179626, 65536, 1, 1114090, 131072, 2, 1048554, 65536, 1, 983018, 65536, 1, 917482, 65536, 1, 851946, 65536, 3, 786410, 65536, 1, 720874, 131072, 1, 655338, 131072, 1, 589802, 65536, 1, 524266, 65536, 1, 458730, 65536, 1, 393194, 65536, 1, 327658, 65536, 1, 262122, 65536, 1, 196586, 65536, 1, 131050, 65536, 1, 65514, 65536, 2, -22, 65536, 1, -65558, 131072, 2, -131094, 65536, 1, -196630, 131072, 1, -262166, 65536, 1, -327702, 65536, 1, -393238, 65536, 1, -458774, 65536, 1, -524310, 65536, 1, -589846, 65536, 1, -655382, 65536, 1, -720918, 65536, 1, -786454, 65536, 1, -851990, 65536, 1, -917526, 65536, 3, -983062, 65536, 1, -1048598, 131072, 0, 1638377, 65536, 4, 1572841, 65536, 1, 1507305, 65536, 2, 1441769, 65536, 1, 1376233, 65536, 1, 1310697, 65536, 1, 1245161, 65536, 1, 1179625, 131072, 1, 1114089, 65536, 1, 1048553, 65536, 3, 983017, 65536, 3, 917481, 65536, 1, 851945, 65536, 3, 786409, 65536, 1, 720873, 65536, 1, 655337, 65536, 1, 589801, 65536, 1, 524265, 65536, 1, 458729, 131072, 1, 393193, 65536, 1, 327657, 65536, 1, 262121, 65536, 1, 196585, 65536, 1, 131049, 65536, 1, 65513, 65536, 1, -23, 65536, 1, -65559, 65536, 1, -131095, 65536, 2, -196631, 65536, 1, -262167, 65536, 1, -327703, 65536, 1, -393239, 65536, 1, -458775, 65536, 1, -524311, 65536, 1, -589847, 131072, 2, -655383, 65536, 1, -720919, 65536, 1, -786455, 65536, 3, -851991, 65536, 3, -917527, 65536, 1, -983063, 65536, 1, -1048599, 262144, 0, 1638376, 131072, 4, 1572840, 65536, 1, 1507304, 65536, 1, 1441768, 65536, 1, 1376232, 65536, 1, 1310696, 65536, 1, 1245160, 65536, 3, 1179624, 65536, 1, 1114088, 65536, 1, 1048552, 65536, 2, 983016, 65536, 1, 917480, 65536, 1, 851944, 65536, 1, 786408, 65536, 1, 720872, 65536, 1, 655336, 65536, 1, 589800, 131072, 2, 524264, 65536, 1, 458728, 65536, 1, 393192, 65536, 1, 327656, 65536, 1, 262120, 65536, 1, 196584, 65536, 1, 131048, 65536, 1, 65512, 65536, 3, -24, 65536, 1, -65560, 65536, 1, -131096, 65536, 2, -196632, 65536, 2, -262168, 65536, 1, -327704, 65536, 1, -393240, 65536, 1, -458776, 131072, 1, -524312, 65536, 1, -589848, 65536, 1, -655384, 65536, 3, -720920, 65536, 1, -786456, 65536, 1, -851992, 65536, 1, -917528, 65536, 1, -983064, 65536, 1, -1048600, 131072, 0, 1638375, 131072, 4, 1572839, 65536, 2, 1507303, 65536, 2, 1441767, 131072, 1, 1376231, 65536, 1, 1310695, 65536, 1, 1245159, 65536, 1, 1179623, 65536, 1, 1114087, 65536, 1, 1048551, 65536, 1, 983015, 131072, 1, 917479, 65536, 1, 851943, 65536, 1, 786407, 131072, 1, 720871, 65536, 1, 655335, 65536, 1, 589799, 65536, 3, 524263, 65536, 1, 458727, 65536, 3, 393191, 65536, 1, 327655, 131072, 2, 262119, 65536, 3, 196583, 65536, 1, 131047, 65536, 1, 65511, 131072, 1, -25, 65536, 1, -65561, 65536, 1, -131097, 65536, 1, -196633, 65536, 1, -262169, 65536, 2, -327705, 131072, 1, -393241, 131072, 2, -458777, 65536, 1, -524313, 65536, 3, -589849, 131072, 1, -655385, 65536, 1, -720921, 65536, 1, -786457, 131072, 2, -851993, 65536, 1, -917529, 65536, 1, -983065, 131072, 1, -1048601, 262144, 0, 1638374, 262144, 4, 1572838, 65536, 1, 1507302, 65536, 1, 1441766, 65536, 1, 1376230, 65536, 1, 1310694, 131072, 1, 1245158, 65536, 1, 1179622, 65536, 1, 1114086, 65536, 1, 1048550, 65536, 1, 983014, 65536, 1, 917478, 65536, 1, 851942, 65536, 1, 786406, 65536, 1, 720870, 65536, 1, 655334, 131072, 1, 589798, 65536, 1, 524262, 65536, 1, 458726, 65536, 1, 393190, 65536, 3, 327654, 131072, 2, 262118, 65536, 3, 196582, 65536, 1, 131046, 65536, 1, 65510, 65536, 1, -26, 65536, 1, -65562, 65536, 1, -131098, 65536, 2, -196634, 65536, 1, -262170, 65536, 2, -327706, 65536, 1, -393242, 65536, 1, -458778, 65536, 1, -524314, 65536, 3, -589850, 65536, 1, -655386, 65536, 3, -720922, 65536, 1, -786458, 65536, 1, -851994, 65536, 2, -917530, 65536, 1, -983066, 65536, 1, -1048602, 65536, 0, 1638373, 262144, 4, 1572837, 65536, 1, 1507301, 65536, 1, 1441765, 65536, 1, 1376229, 65536, 1, 1310693, 65536, 1, 1245157, 131072, 1, 1179621, 65536, 2, 1114085, 131072, 1, 1048549, 65536, 1, 983013, 131072, 1, 917477, 65536, 1, 851941, 131072, 1, 786405, 65536, 1, 720869, 65536, 1, 655333, 65536, 2, 589797, 65536, 1, 524261, 65536, 1, 458725, 65536, 1, 393189, 131072, 1, 327653, 65536, 1, 262117, 65536, 1, 196581, 131072, 1, 131045, 131072, 2, 65509, 131072, 1, -27, 65536, 1, -65563, 65536, 1, -131099, 65536, 1, -196635, 65536, 1, -262171, 65536, 1, -327707, 65536, 1, -393243, 65536, 1, -458779, 131072, 2, -524315, 65536, 1, -589851, 65536, 3, -655387, 65536, 1, -720923, 65536, 2, -786459, 65536, 1, -851995, 65536, 1, -917531, 131072, 2, -983067, 65536, 1, -1048603, 262144, 0, 1638372, 262144, 4, 1572836, 65536, 1, 1507300, 65536, 1, 1441764, 65536, 3, 1376228, 65536, 1, 1310692, 65536, 1, 1245156, 65536, 1, 1179620, 65536, 1, 1114084, 131072, 1, 1048548, 65536, 1, 983012, 65536, 1, 917476, 131072, 1, 851940, 65536, 1, 786404, 65536, 1, 720868, 65536, 1, 655332, 65536, 1, 589796, 65536, 1, 524260, 65536, 3, 458724, 65536, 1, 393188, 65536, 1, 327652, 131072, 1, 262116, 65536, 1, 196580, 65536, 2, 131044, 131072, 2, 65508, 131072, 2, -28, 65536, 2, -65564, 131072, 1, -131100, 65536, 1, -196636, 65536, 1, -262172, 131072, 1, -327708, 65536, 1, -393244, 131072, 2, -458780, 65536, 1, -524316, 65536, 2, -589852, 65536, 1, -655388, 65536, 3, -720924, 65536, 1, -786460, 65536, 1, -851996, 131072, 1, -917532, 65536, 1, -983068, 65536, 1, -1048604, 262144, 1, 1638371, 65536, 4, 1572835, 65536, 1, 1507299, 131072, 2, 1441763, 65536, 1, 1376227, 65536, 1, 1310691, 131072, 1, 1245155, 65536, 1, 1179619, 65536, 2, 1114083, 65536, 1, 1048547, 65536, 1, 983011, 65536, 1, 917475, 65536, 1, 851939, 131072, 1, 786403, 65536, 1, 720867, 65536, 1, 655331, 131072, 1, 589795, 65536, 1, 524259, 65536, 1, 458723, 65536, 1, 393187, 131072, 1, 327651, 65536, 1, 262115, 65536, 1, 196579, 65536, 1, 131043, 131072, 2, 65507, 65536, 1, -29, 131072, 1, -65565, 65536, 3, -131101, 131072, 1, -196637, 65536, 1, -262173, 65536, 1, -327709, 65536, 1, -393245, 65536, 1, -458781, 65536, 1, -524317, 131072, 1, -589853, 65536, 1, -655389, 65536, 1, -720925, 65536, 1, -786461, 65536, 1, -851997, 65536, 1, -917533, 65536, 1, -983069, 65536, 3, -1048605, 65536, 0, 1638370, 131072, 4, 1572834, 65536, 1, 1507298, 65536, 3, 1441762, 65536, 1, 1376226, 65536, 3, 1310690, 65536, 1, 1245154, 65536, 3, 1179618, 65536, 1, 1114082, 131072, 1, 1048546, 65536, 1, 983010, 65536, 1, 917474, 131072, 2, 851938, 65536, 1, 786402, 65536, 1, 720866, 65536, 1, 655330, 65536, 1, 589794, 65536, 1, 524258, 65536, 1, 458722, 65536, 1, 393186, 65536, 1, 327650, 65536, 1, 262114, 65536, 1, 196578, 65536, 1, 131042, 65536, 2, 65506, 65536, 1, -30, 65536, 1, -65566, 65536, 3, -131102, 65536, 1, -196638, 65536, 1, -262174, 65536, 1, -327710, 65536, 3, -393246, 65536, 3, -458782, 65536, 1, -524318, 65536, 1, -589854, 65536, 1, -655390, 131072, 1, -720926, 65536, 1, -786462, 65536, 2, -851998, 65536, 1, -917534, 65536, 1, -983070, 65536, 1, -1048606, 131072, 0, 1638369, 131072, 4, 1572833, 65536, 2, 1507297, 65536, 1, 1441761, 131072, 1, 1376225, 65536, 1, 1310689, 65536, 1, 1245153, 65536, 1, 1179617, 65536, 1, 1114081, 65536, 1, 1048545, 65536, 1, 983009, 65536, 3, 917473, 65536, 1, 851937, 65536, 1, 786401, 65536, 1, 720865, 65536, 2, 655329, 65536, 1, 589793, 65536, 1, 524257, 65536, 1, 458721, 65536, 1, 393185, 65536, 2, 327649, 131072, 1, 262113, 65536, 3, 196577, 65536, 1, 131041, 65536, 1, 65505, 65536, 1, -31, 65536, 3, -65567, 65536, 1, -131103, 65536, 1, -196639, 65536, 1, -262175, 65536, 3, -327711, 65536, 1, -393247, 65536, 1, -458783, 65536, 1, -524319, 65536, 1, -589855, 65536, 1, -655391, 65536, 1, -720927, 65536, 1, -786463, 65536, 1, -851999, 65536, 1, -917535, 65536, 1, -983071, 65536, 1, -1048607, 262144, 0, 1638368, 65536, 4, 1572832, 65536, 1, 1507296, 65536, 1, 1441760, 65536, 1, 1376224, 65536, 1, 1310688, 65536, 1, 1245152, 65536, 3, 1179616, 131072, 2, 1114080, 65536, 2, 1048544, 65536, 1, 983008, 65536, 1, 917472, 65536, 1, 851936, 65536, 1, 786400, 65536, 1, 720864, 65536, 1, 655328, 65536, 2, 589792, 131072, 1, 524256, 65536, 1, 458720, 65536, 1, 393184, 65536, 1, 327648, 65536, 1, 262112, 65536, 1, 196576, 65536, 1, 131040, 65536, 1, 65504, 65536, 1, -32, 131072, 1, -65568, 65536, 1, -131104, 131072, 2, -196640, 65536, 1, -262176, 65536, 1, -327712, 65536, 1, -393248, 65536, 2, -458784, 65536, 1, -524320, 65536, 1, -589856, 65536, 1, -655392, 65536, 1, -720928, 65536, 1, -786464, 65536, 1, -852000, 65536, 1, -917536, 65536, 1, -983072, 65536, 1, -1048608, 262144, 0, 1638367, 131072, 4, 1572831, 131072, 1, 1507295, 65536, 1, 1441759, 65536, 1, 1376223, 65536, 1, 1310687, 65536, 1, 1245151, 65536, 1, 1179615, 65536, 3, 1114079, 65536, 1, 1048543, 131072, 2, 983007, 65536, 1, 917471, 65536, 1, 851935, 65536, 1, 786399, 65536, 1, 720863, 65536, 1, 655327, 65536, 1, 589791, 65536, 1, 524255, 65536, 1, 458719, 65536, 1, 393183, 65536, 1, 327647, 65536, 1, 262111, 65536, 2, 196575, 65536, 1, 131039, 131072, 1, 65503, 65536, 1, -33, 131072, 2, -65569, 65536, 1, -131105, 65536, 1, -196641, 65536, 3, -262177, 131072, 2, -327713, 65536, 1, -393249, 65536, 1, -458785, 131072, 1, -524321, 131072, 2, -589857, 65536, 3, -655393, 65536, 1, -720929, 65536, 1, -786465, 65536, 3, -852001, 65536, 1, -917537, 65536, 1, -983073, 65536, 3, -1048609, 131072, 0, 1638366, 131072, 4, 1572830, 65536, 1, 1507294, 131072, 1, 1441758, 65536, 3, 1376222, 65536, 1, 1310686, 65536, 2, 1245150, 131072, 2, 1179614, 65536, 1, 1114078, 65536, 1, 1048542, 65536, 1, 983006, 65536, 1, 917470, 65536, 1, 851934, 65536, 1, 786398, 65536, 1, 720862, 65536, 1, 655326, 65536, 1, 589790, 65536, 1, 524254, 131072, 2, 458718, 65536, 1, 393182, 131072, 1, 327646, 65536, 1, 262110, 65536, 1, 196574, 65536, 1, 131038, 65536, 1, 65502, 65536, 1, -34, 65536, 1, -65570, 65536, 1, -131106, 65536, 1, -196642, 65536, 1, -262178, 65536, 1, -327714, 65536, 3, -393250, 65536, 1, -458786, 65536, 1, -524322, 65536, 1, -589858, 131072, 2, -655394, 65536, 1, -720930, 65536, 1, -786466, 131072, 2, -852002, 65536, 1, -917538, 65536, 1, -983074, 65536, 3, -1048610, 262144, 0, 1638365, 131072, 4, 1572829, 65536, 1, 1507293, 131072, 2, 1441757, 131072, 1, 1376221, 65536, 1, 1310685, 65536, 1, 1245149, 65536, 1, 1179613, 65536, 1, 1114077, 65536, 1, 1048541, 65536, 2, 983005, 65536, 1, 917469, 65536, 1, 851933, 131072, 1, 786397, 65536, 1, 720861, 131072, 2, 655325, 65536, 1, 589789, 65536, 1, 524253, 65536, 2, 458717, 131072, 1, 393181, 65536, 1, 327645, 65536, 1, 262109, 65536, 1, 196573, 65536, 1, 131037, 65536, 1, 65501, 65536, 1, -35, 65536, 1, -65571, 65536, 1, -131107, 65536, 1, -196643, 131072, 1, -262179, 65536, 1, -327715, 65536, 2, -393251, 65536, 1, -458787, 65536, 3, -524323, 65536, 1, -589859, 65536, 1, -655395, 65536, 1, -720931, 65536, 1, -786467, 131072, 2, -852003, 65536, 2, -917539, 65536, 3, -983075, 65536, 1, -1048611, 262144, 0, 1638364, 0, 4, 1572828, 0, 1, 1507292, 0, 3, 1441756, 0, 2, 1376220, 0, 1, 1310684, 0, 3, 1245148, 0, 1, 1179612, 0, 2, 1114076, 0, 2, 1048540, 0, 2, 983004, 0, 3, 917468, 0, 1, 851932, 0, 2, 786396, 0, 3, 720860, 0, 2, 655324, 0, 3, 589788, 0, 3, 524252, 0, 2, 458716, 0, 3, 393180, 0, 1, 327644, 0, 3, 262108, 0, 2, 196572, 0, 3, 131036, 0, 2, 65500, 0, 2, -36, 0, 3, -65572, 0, 2, -131108, 0, 1, -196644, 0, 2, -262180, 0, 2, -327716, 0, 3, -393252, 0, 2, -458788, 0, 2, -524324, 0, 1, -589860, 0, 1, -655396, 0, 2, -720932, 0, 1, -786468, 0, 1, -852004, 0, 1, -917540, 0, 1, -983076, 0, 2, -1048612, 0, 0) 374 | 375 | [node name="Player" parent="." instance=ExtResource("1_g1d0g")] 376 | 377 | [node name="Enemies" type="Node" parent="."] 378 | 379 | [node name="Enemy" parent="Enemies" instance=ExtResource("4_7vowh")] 380 | position = Vector2(-237, -171) 381 | 382 | [node name="Enemy3" parent="Enemies" instance=ExtResource("4_7vowh")] 383 | position = Vector2(-436, 111) 384 | 385 | [node name="Enemy4" parent="Enemies" instance=ExtResource("4_7vowh")] 386 | position = Vector2(137, -196) 387 | 388 | [node name="Enemy5" parent="Enemies" instance=ExtResource("4_7vowh")] 389 | position = Vector2(393, -119) 390 | 391 | [node name="Enemy2" parent="Enemies" instance=ExtResource("4_7vowh")] 392 | position = Vector2(237, 300) 393 | 394 | [node name="Upgrades" type="Node" parent="."] 395 | 396 | [node name="Upgrade" parent="Upgrades" instance=ExtResource("5_7nh6k")] 397 | position = Vector2(-50, 44) 398 | bullet_strategy = ExtResource("6_tlnjk") 399 | needs_update = false 400 | 401 | [node name="Upgrade2" parent="Upgrades" instance=ExtResource("5_7nh6k")] 402 | position = Vector2(0, 44) 403 | bullet_strategy = ExtResource("7_i5k8s") 404 | needs_update = false 405 | 406 | [node name="Upgrade3" parent="Upgrades" instance=ExtResource("5_7nh6k")] 407 | position = Vector2(50, 44) 408 | bullet_strategy = ExtResource("8_t5n6q") 409 | needs_update = false 410 | 411 | [node name="Upgrade4" parent="Upgrades" instance=ExtResource("5_7nh6k")] 412 | position = Vector2(-48, -26) 413 | bullet_strategy = ExtResource("7_44jfx") 414 | needs_update = false 415 | -------------------------------------------------------------------------------- /Util/Autoload/enemy_spawner.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | ################################################ 4 | # This is an autoloaded node that allows you 5 | # to spawn an enemy when pressing "E" by default 6 | ################################################ 7 | 8 | 9 | var enemy_scene : PackedScene = preload("res://Objects/Scenes/enemy.tscn") 10 | 11 | 12 | func _physics_process(delta: float) -> void: 13 | if Input.is_action_just_pressed("spawn_enemy"): 14 | var spawned_enemy : Enemy = enemy_scene.instantiate() 15 | get_tree().root.add_child(spawned_enemy) 16 | spawned_enemy.global_position = get_global_mouse_position() 17 | -------------------------------------------------------------------------------- /Util/Classes/attack.gd: -------------------------------------------------------------------------------- 1 | class_name Attack 2 | 3 | # Strictly a data class, used for passing attack information 4 | # between hurtboxes and hitboxes 5 | 6 | var damage := 10.0 7 | -------------------------------------------------------------------------------- /Util/Components/health.gd: -------------------------------------------------------------------------------- 1 | class_name Health 2 | extends Node 3 | 4 | ############################## 5 | # Health Component for enemies 6 | ############################## 7 | 8 | signal health_changed(health: float) 9 | 10 | @export var hitbox : Hitbox 11 | @export var animation_player : AnimationPlayer 12 | 13 | @export var max_health := 10.0 14 | @onready var health := max_health 15 | 16 | @onready var enemy : Enemy = get_owner() 17 | 18 | 19 | func _ready(): 20 | if hitbox: 21 | hitbox.damaged.connect(on_damaged) 22 | 23 | 24 | func on_damaged(attack: Attack): 25 | if !enemy.alive: 26 | return 27 | 28 | health -= attack.damage 29 | health_changed.emit(health) 30 | 31 | if health <= 0: 32 | health = 0 33 | enemy.alive = false 34 | if animation_player: 35 | animation_player.play("death") 36 | -------------------------------------------------------------------------------- /Util/Components/hitbox.gd: -------------------------------------------------------------------------------- 1 | class_name Hitbox 2 | extends Area2D 3 | 4 | ############################################################ 5 | # Hitbox component - this gets hit by the bullet's hurtbox. 6 | # Only used by enemies by default, but can be referenced by 7 | # health components to receive damage 8 | ############################################################ 9 | 10 | 11 | signal damaged(attack: Attack) 12 | 13 | 14 | func damage(attack: Attack): 15 | damaged.emit(attack) 16 | -------------------------------------------------------------------------------- /Util/Components/hurtbox.gd: -------------------------------------------------------------------------------- 1 | class_name Hurtbox 2 | extends Area2D 3 | 4 | signal hit_enemy 5 | 6 | 7 | @onready var bullet : Bullet = get_owner() 8 | 9 | 10 | func _ready() -> void: 11 | area_entered.connect(on_area_entered) 12 | 13 | 14 | func on_area_entered(area: Area2D): 15 | if area is Hitbox: 16 | var attack := Attack.new() 17 | 18 | attack.damage = bullet.damage 19 | 20 | area.damage(attack) 21 | 22 | hit_enemy.emit() 23 | -------------------------------------------------------------------------------- /Util/Strategy/base_bullet_strategy.gd: -------------------------------------------------------------------------------- 1 | class_name BaseBulletStrategy 2 | extends Resource 3 | 4 | ########################################### 5 | # Strategy Relevant Code: 6 | # This is the base strategy that all other 7 | # bullet strategies will inherit from. 8 | ########################################### 9 | 10 | 11 | @export var texture : Texture2D = preload("res://Art/Kenney/carrot.png") 12 | @export var upgrade_text : String = "Speed" 13 | 14 | 15 | # This is the function that we later call when firing our bullet. 16 | # Since we pass in the instance of the bullet, we can do anything 17 | # to it that we could any other kind of node, plus more. 18 | # Some examples include: 19 | # 1. Editing simple variables (ex. bullet.damage += 5) 20 | # 2. Calling any functions defined in the node 21 | # 3. Attaching components or changing properties of any attached component 22 | func apply_upgrade(bullet: Bullet): 23 | # This does nothing by default 24 | pass 25 | -------------------------------------------------------------------------------- /Util/Strategy/damage_bullet_strategy.gd: -------------------------------------------------------------------------------- 1 | class_name DamageBulletStrategy 2 | extends BaseBulletStrategy 3 | 4 | 5 | 6 | func apply_upgrade(bullet: Bullet): 7 | bullet.damage += 5.0 8 | -------------------------------------------------------------------------------- /Util/Strategy/particle_bullet_strategy.gd: -------------------------------------------------------------------------------- 1 | class_name ParticleBulletStrategy 2 | extends BaseBulletStrategy 3 | 4 | var particle_scene : PackedScene = preload("res://Objects/Scenes/bullet_particles.tscn") 5 | 6 | func apply_upgrade(bullet: Bullet): 7 | var spawned_particles : Node2D = particle_scene.instantiate() 8 | bullet.add_child(spawned_particles) 9 | spawned_particles.global_position = bullet.global_position 10 | -------------------------------------------------------------------------------- /Util/Strategy/pierce_bullet_strategy.gd: -------------------------------------------------------------------------------- 1 | class_name PierceBulletStrategy 2 | extends BaseBulletStrategy 3 | 4 | 5 | func apply_upgrade(bullet: Bullet): 6 | bullet.max_pierce += 1 7 | -------------------------------------------------------------------------------- /Util/Strategy/speed_bullet_strategy.gd: -------------------------------------------------------------------------------- 1 | class_name SpeedBulletStrategy 2 | extends BaseBulletStrategy 3 | 4 | 5 | @export var speed_increase := 50.0 6 | 7 | 8 | func apply_upgrade(bullet: Bullet): 9 | bullet.speed += speed_increase 10 | -------------------------------------------------------------------------------- /default_bus_layout.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="AudioBusLayout" format=3 uid="uid://b7ehfcop5k33e"] 2 | 3 | [resource] 4 | bus/0/send = &"Music" 5 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d1nlg3gl7r2fq" 6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="Strategy Tutorial" 14 | run/main_scene="res://Scenes/main.tscn" 15 | config/features=PackedStringArray("4.2", "Forward Plus") 16 | config/icon="res://icon.svg" 17 | 18 | [autoload] 19 | 20 | EnemySpawner="*res://Util/Autoload/enemy_spawner.gd" 21 | 22 | [display] 23 | 24 | window/size/viewport_width=1280 25 | window/size/viewport_height=720 26 | window/stretch/mode="viewport" 27 | window/stretch/aspect="expand" 28 | mouse_cursor/custom_image="res://Art/Bitlytic/crosshair.png" 29 | mouse_cursor/custom_image_hotspot=Vector2(13, 13) 30 | 31 | [file_customization] 32 | 33 | folder_colors={ 34 | "res://Art/": "purple", 35 | "res://Objects/": "orange", 36 | "res://Player/": "red", 37 | "res://Resources/": "teal", 38 | "res://Scenes/": "green", 39 | "res://Util/": "pink" 40 | } 41 | 42 | [input] 43 | 44 | move_left={ 45 | "deadzone": 0.5, 46 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) 47 | ] 48 | } 49 | move_up={ 50 | "deadzone": 0.5, 51 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) 52 | ] 53 | } 54 | move_right={ 55 | "deadzone": 0.5, 56 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) 57 | ] 58 | } 59 | move_down={ 60 | "deadzone": 0.5, 61 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) 62 | ] 63 | } 64 | primary_fire={ 65 | "deadzone": 0.5, 66 | "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) 67 | ] 68 | } 69 | spawn_enemy={ 70 | "deadzone": 0.5, 71 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null) 72 | ] 73 | } 74 | 75 | [layer_names] 76 | 77 | 2d_physics/layer_1="Player" 78 | 2d_physics/layer_2="Player Projectile" 79 | 2d_physics/layer_3="Enemy" 80 | 2d_physics/layer_4="Enemy Projectile" 81 | 2d_physics/layer_7="Object" 82 | 2d_physics/layer_8="Walls" 83 | 84 | [rendering] 85 | 86 | textures/canvas_textures/default_texture_filter=0 87 | --------------------------------------------------------------------------------