commit 35600f72f9b74f7c4b5edc13e62f641847e6769a Author: Elaina Claus Date: Mon Aug 18 19:39:33 2025 -0400 My first 2D game in Godot 4.4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/addons/colorpicker_presets/README.md b/addons/colorpicker_presets/README.md new file mode 100644 index 0000000..7534d92 --- /dev/null +++ b/addons/colorpicker_presets/README.md @@ -0,0 +1,39 @@ +# GDQuest ColorPicker Presets + +Reads a color presets `gpl` (GIMP Palette) file in the addon local directory, called `presets.gpl`. It adds the colors to the editor ColorPicker for quick access. + +This repository includes a `presets.gpl` file as an example. It's the official GDQuest color palette. + +## ✗ WARNING + +> Compatible: Godot `>= v4.0` + +The addon: + +1. Doesn't check the length of the color palette/file. +1. Overwrites the _ColorPicker_ presets whenever you reopen the project or re-enable the addon. + +## ✓ Install + +### Using [Godot Package Manager](https://github.com/godot-package-manager) + +1. `gpm init`. +1. Follow instructions with [NPMjs package](https://www.npmjs.com/package/gdquest.colorpicker_presets). +1. Enable the addon from `Project > Project Settings... > Plugins`. +1. Profit. + +### Manual + +1. Make a new folder at `res://addons/colorpicker_presets/`. +1. Copy the contents of this repository into `res://addons/colorpicker_presets/`. +1. Replace `res://addons/colorpicker_presets/presets.gpl` with your preferred version. +1. Enable the addon from `Project > Project Settings... > Plugins`. +1. Profit. + +![install project settings](readme/install_project_settings.png) + +## Where do I find the presets? + +They'll be available in the editor _ColorPicker_. + +![ColorPicker presets](readme/colorpicker_presets.png) diff --git a/addons/colorpicker_presets/colorpicker_presets.gd b/addons/colorpicker_presets/colorpicker_presets.gd new file mode 100644 index 0000000..01985ba --- /dev/null +++ b/addons/colorpicker_presets/colorpicker_presets.gd @@ -0,0 +1,26 @@ +@tool +extends EditorPlugin + + +const PRESETS_FILENAME := 'presets.gpl' + + +func _enter_tree() -> void: + var presets_path: String = get_script().resource_path.get_base_dir().path_join(PRESETS_FILENAME) + var presets_file := FileAccess.open(presets_path, FileAccess.READ) + + if FileAccess.get_open_error() == OK: + var presets_raw := presets_file.get_as_text(true).strip_edges().split("\n") + presets_file.close() + presets_raw = presets_raw.slice(presets_raw.find("#") + 1) + var presets := Array(presets_raw).map( + func(s: String): + var rgb := (Array(s.strip_edges().split(" ").slice(0, -1)) + .filter(func(s: String): return not s.is_empty()) + .map(func(s: String): return s.to_int()) + ) + return Color8(rgb[0], rgb[1], rgb[2]) + ) + get_editor_interface().get_editor_settings().set_project_metadata( + "color_picker", "presets", presets + ) diff --git a/addons/colorpicker_presets/colorpicker_presets.gd.uid b/addons/colorpicker_presets/colorpicker_presets.gd.uid new file mode 100644 index 0000000..882ca5b --- /dev/null +++ b/addons/colorpicker_presets/colorpicker_presets.gd.uid @@ -0,0 +1 @@ +uid://efuldfeh4dud diff --git a/addons/colorpicker_presets/plugin.cfg b/addons/colorpicker_presets/plugin.cfg new file mode 100644 index 0000000..32efab0 --- /dev/null +++ b/addons/colorpicker_presets/plugin.cfg @@ -0,0 +1,9 @@ +[plugin] + +name="GDQuest ColorPicker Presets" +description="Sets the editor color picker presets from +`presets.hex`, if it exists. The file is local to the +addon folder." +author="razcore-rad" +version="0.0.2-beta" +script="colorpicker_presets.gd" diff --git a/addons/colorpicker_presets/presets.gpl b/addons/colorpicker_presets/presets.gpl new file mode 100644 index 0000000..5114466 --- /dev/null +++ b/addons/colorpicker_presets/presets.gpl @@ -0,0 +1,31 @@ +GIMP Palette +Name: gdquest.gpl +# + 0 122 195 Blue + 16 178 239 BlueAlt + 6 29 84 BlueDark +207 221 255 BlueLight +108 44 218 Purple +141 25 215 PurpleAlt + 40 20 78 PurpleDark +235 224 255 PurpleLight +196 29 61 Red +255 65 125 RedAlt/Pink +115 39 92 RedDark +255 219 244 RedLight +255 183 48 Yellow +255 213 0 YellowAlt +222 80 43 YellowDark/Orange +255 236 201 YellowLight + 99 204 95 Green +159 221 81 GreenAlt/Lime + 21 89 63 GreenDark +221 255 242 GreenLight/Mint +109 61 44 Brown +176 87 55 BrownAlt +106 25 0 BrownDark +255 227 227 BrownLight +202 202 202 Gray +255 255 255 White + 39 43 48 Deep +243 248 254 Light diff --git a/addons/colorpicker_presets/readme/.gdignore b/addons/colorpicker_presets/readme/.gdignore new file mode 100644 index 0000000..e69de29 diff --git a/addons/colorpicker_presets/readme/colorpicker_presets.png b/addons/colorpicker_presets/readme/colorpicker_presets.png new file mode 100644 index 0000000..e4c3ea0 Binary files /dev/null and b/addons/colorpicker_presets/readme/colorpicker_presets.png differ diff --git a/addons/colorpicker_presets/readme/install_project_settings.png b/addons/colorpicker_presets/readme/install_project_settings.png new file mode 100644 index 0000000..e2d036b Binary files /dev/null and b/addons/colorpicker_presets/readme/install_project_settings.png differ diff --git a/bullet.gd b/bullet.gd new file mode 100644 index 0000000..01274e1 --- /dev/null +++ b/bullet.gd @@ -0,0 +1,21 @@ +extends Area2D + +var travelled_distance = 0 + +func _physics_process(delta: float) -> void: + const SPEED = 800.0 + const MAX_RANGE = 1500.0 + + var direction = Vector2.RIGHT.rotated(rotation) + position += (direction * SPEED) * delta + travelled_distance += SPEED * delta + + if travelled_distance >= MAX_RANGE: + queue_free() + + +func _on_body_entered(body: Node2D) -> void: + queue_free() + + if body.has_method("take_damage"): + body.take_damage() diff --git a/bullet.gd.uid b/bullet.gd.uid new file mode 100644 index 0000000..b04d46f --- /dev/null +++ b/bullet.gd.uid @@ -0,0 +1 @@ +uid://b1og3ublo2loc diff --git a/bullet.tscn b/bullet.tscn new file mode 100644 index 0000000..97fd8c3 --- /dev/null +++ b/bullet.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://luwdantua0vh"] + +[ext_resource type="Script" uid="uid://b1og3ublo2loc" path="res://bullet.gd" id="1_v8qja"] +[ext_resource type="Texture2D" uid="uid://dftkbqwsfd68r" path="res://pistol/projectile.png" id="2_t4vbm"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_2b2rl"] +radius = 15.0333 + +[node name="Bullet" type="Area2D"] +top_level = true +collision_layer = 0 +collision_mask = 3 +script = ExtResource("1_v8qja") + +[node name="Projectile" type="Sprite2D" parent="."] +position = Vector2(-11, -1) +texture = ExtResource("2_t4vbm") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_2b2rl") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/characters/ground_shadow.png b/characters/ground_shadow.png new file mode 100644 index 0000000..d2acfd5 Binary files /dev/null and b/characters/ground_shadow.png differ diff --git a/characters/ground_shadow.png.import b/characters/ground_shadow.png.import new file mode 100644 index 0000000..0aba52d --- /dev/null +++ b/characters/ground_shadow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7rhtttevhxtj" +path="res://.godot/imported/ground_shadow.png-b9267d10ca04362d5b540659e4ab0dbd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/ground_shadow.png" +dest_files=["res://.godot/imported/ground_shadow.png-b9267d10ca04362d5b540659e4ab0dbd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/happy_boo.gd b/characters/happy_boo/happy_boo.gd new file mode 100644 index 0000000..02e15c4 --- /dev/null +++ b/characters/happy_boo/happy_boo.gd @@ -0,0 +1,9 @@ +extends Node2D + + +func play_idle_animation(): + %AnimationPlayer.play("idle") + + +func play_walk_animation(): + %AnimationPlayer.play("walk") diff --git a/characters/happy_boo/happy_boo.gd.uid b/characters/happy_boo/happy_boo.gd.uid new file mode 100644 index 0000000..2f38157 --- /dev/null +++ b/characters/happy_boo/happy_boo.gd.uid @@ -0,0 +1 @@ +uid://dhe20gx73tm5u diff --git a/characters/happy_boo/happy_boo.tscn b/characters/happy_boo/happy_boo.tscn new file mode 100644 index 0000000..7f17bfa --- /dev/null +++ b/characters/happy_boo/happy_boo.tscn @@ -0,0 +1,651 @@ +[gd_scene load_steps=12 format=3 uid="uid://pbmyh1qru7p"] + +[ext_resource type="Script" uid="uid://dhe20gx73tm5u" path="res://characters/happy_boo/happy_boo.gd" id="1_kg7lb"] +[ext_resource type="Texture2D" uid="uid://b7rhtttevhxtj" path="res://characters/ground_shadow.png" id="2_62bos"] +[ext_resource type="Texture2D" uid="uid://ng8e5ot0dtpd" path="res://characters/happy_boo/square_foot.png" id="3_186qq"] +[ext_resource type="Texture2D" uid="uid://dhapxq8y8ow57" path="res://characters/happy_boo/square_lower_leg.png" id="4_plnsd"] +[ext_resource type="Texture2D" uid="uid://qmqpm6asge1i" path="res://characters/happy_boo/square_upper_leg.png" id="5_q2t1e"] +[ext_resource type="Texture2D" uid="uid://cksiu5gst6fmp" path="res://characters/happy_boo/square_body.png" id="6_w3ck4"] +[ext_resource type="Texture2D" uid="uid://cvs0lh814pk7h" path="res://characters/happy_boo/square_face.png" id="7_h5h8s"] + +[sub_resource type="Animation" id="Animation_hed62"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Colorizer/SquareUpperLegL:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-10.6303, -27.3998)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Colorizer/SquareUpperLegL:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.4009] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 14)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-2.98023e-08] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 12)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-3.40666] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Colorizer/SquareUpperLegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(9.20459, -29.9444)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Colorizer/SquareUpperLegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-0.213676] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4.76837e-07, 14)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 12)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-2.92296] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Colorizer/SquareBody:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1.73067, -36.6061)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Colorizer/SquareBody:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-0.0250386] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Colorizer/SquareBody/SquareFace:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -17)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Colorizer/SquareBody/SquareFace:rotation") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_sablf"] +resource_name = "idle" +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Colorizer/SquareUpperLegL:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-10.6303, -27.3998)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Colorizer/SquareUpperLegL:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.4009] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 14)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-2.98023e-08] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 12)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-3.40666] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Colorizer/SquareUpperLegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(9.20459, -29.9444)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Colorizer/SquareUpperLegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-0.213676] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4.76837e-07, 14)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 12)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-2.92296] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Colorizer/SquareBody:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.4, 0.8), +"transitions": PackedFloat32Array(0.466516, 0.189465, 1), +"update": 0, +"values": [Vector2(-1.73067, -36.6061), Vector2(-1.731, -32), Vector2(-1.731, -38)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Colorizer/SquareBody:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(2.46229, 0.535887), +"update": 0, +"values": [-0.0250386, 0.0698132] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Colorizer/SquareBody/SquareFace:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -17)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Colorizer/SquareBody/SquareFace:rotation") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_74kqe"] +resource_name = "walk" +length = 0.6 +loop_mode = 1 +step = 0.0333333 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Colorizer/SquareUpperLegL:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.466666), +"transitions": PackedFloat32Array(1, 0.5, 2), +"update": 0, +"values": [Vector2(-10.6303, -27.3998), Vector2(-10.6303, -27.3998), Vector2(-16, -40)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Colorizer/SquareUpperLegL:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3, 0.466666), +"transitions": PackedFloat32Array(1, 0.5, 2), +"update": 0, +"values": [0.4009, 0.4009, -0.197871] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 0.5), +"update": 0, +"values": [Vector2(0, 14), Vector2(0, 14)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.3, 0.466667), +"transitions": PackedFloat32Array(1, 0.5, 2), +"update": 0, +"values": [-2.98023e-08, -2.98023e-08, 1.12966] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 0.5), +"update": 0, +"values": [Vector2(0, 12), Vector2(0, 12)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Colorizer/SquareUpperLegL/SquareLowerLegL/SquareFootL:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.3, 0.466667), +"transitions": PackedFloat32Array(1, 0.5, 2), +"update": 0, +"values": [-3.40666, -3.40666, -3.92035] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Colorizer/SquareUpperLegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.166667, 0.3), +"transitions": PackedFloat32Array(0.5, 2, 1), +"update": 0, +"values": [Vector2(9, -27), Vector2(11, -44), Vector2(9, -27)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Colorizer/SquareUpperLegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.166667, 0.3), +"transitions": PackedFloat32Array(0.5, 2, 1), +"update": 0, +"values": [-0.213676, -0.458455, -0.213676] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(0.5, 1), +"update": 0, +"values": [Vector2(-4.76837e-07, 14), Vector2(-4.76837e-07, 14)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.166667, 0.3), +"transitions": PackedFloat32Array(0.5, 2, 1), +"update": 0, +"values": [0.0, 0.888296, 0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(0.5, 1), +"update": 0, +"values": [Vector2(0, 12), Vector2(0, 12)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Colorizer/SquareUpperLegR/SquareLowerLegR/SquareFootR:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.166667, 0.3), +"transitions": PackedFloat32Array(0.5, 2, 1), +"update": 0, +"values": [-2.92296, -3.45549, -2.92296] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Colorizer/SquareBody:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1.73067, -36.6061)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Colorizer/SquareBody:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.166667, 0.3, 0.466667), +"transitions": PackedFloat32Array(0.392292, 1.31951, 0.267943, 1.8025), +"update": 0, +"values": [-0.0250386, -0.209487, 0.0372028, 0.23927] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_wrcpu"] +_data = { +&"RESET": SubResource("Animation_hed62"), +&"idle": SubResource("Animation_sablf"), +&"walk": SubResource("Animation_74kqe") +} + +[node name="HappyBoo" type="Node2D"] +script = ExtResource("1_kg7lb") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +playback_default_blend_time = 0.2 +libraries = { +"": SubResource("AnimationLibrary_wrcpu") +} + +[node name="GroundShadow" type="Sprite2D" parent="."] +modulate = Color(0.898039, 0.878431, 0.831373, 1) +z_index = -1 +z_as_relative = false +scale = Vector2(0.8, 0.8) +texture = ExtResource("2_62bos") +metadata/_edit_lock_ = true + +[node name="Colorizer" type="Node2D" parent="."] +modulate = Color(1, 0.572549, 0.176471, 1) + +[node name="SquareUpperLegL" type="Sprite2D" parent="Colorizer"] +position = Vector2(-10.6303, -27.3998) +rotation = 0.4009 +scale = Vector2(0.997829, 0.999794) +texture = ExtResource("5_q2t1e") +offset = Vector2(0, 6) + +[node name="SquareLowerLegL" type="Sprite2D" parent="Colorizer/SquareUpperLegL"] +position = Vector2(0, 14) +texture = ExtResource("4_plnsd") +offset = Vector2(0, 6) + +[node name="SquareFootL" type="Sprite2D" parent="Colorizer/SquareUpperLegL/SquareLowerLegL"] +position = Vector2(0, 12) +rotation = -3.40666 +scale = Vector2(1.01116, 1) +texture = ExtResource("3_186qq") +offset = Vector2(-4, 0) + +[node name="SquareUpperLegR" type="Sprite2D" parent="Colorizer"] +position = Vector2(9.20459, -29.9444) +rotation = -0.213676 +scale = Vector2(0.999794, 0.999794) +texture = ExtResource("5_q2t1e") +offset = Vector2(0, 6) + +[node name="SquareLowerLegR" type="Sprite2D" parent="Colorizer/SquareUpperLegR"] +position = Vector2(-4.76837e-07, 14) +texture = ExtResource("4_plnsd") +offset = Vector2(0, 6) + +[node name="SquareFootR" type="Sprite2D" parent="Colorizer/SquareUpperLegR/SquareLowerLegR"] +position = Vector2(0, 12) +rotation = -2.92296 +texture = ExtResource("3_186qq") +offset = Vector2(-4, 0) + +[node name="SquareBody" type="Sprite2D" parent="Colorizer"] +position = Vector2(-1.73067, -36.6061) +rotation = -0.0250386 +scale = Vector2(0.9842, 0.990263) +texture = ExtResource("6_w3ck4") +offset = Vector2(0, -23) + +[node name="SquareFace" type="Sprite2D" parent="Colorizer/SquareBody"] +position = Vector2(0, -17) +texture = ExtResource("7_h5h8s") +metadata/_edit_lock_ = true diff --git a/characters/happy_boo/square_body.png b/characters/happy_boo/square_body.png new file mode 100644 index 0000000..72ecdb6 Binary files /dev/null and b/characters/happy_boo/square_body.png differ diff --git a/characters/happy_boo/square_body.png.import b/characters/happy_boo/square_body.png.import new file mode 100644 index 0000000..a1b7552 --- /dev/null +++ b/characters/happy_boo/square_body.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cksiu5gst6fmp" +path="res://.godot/imported/square_body.png-ef1c56c8912cd968d7fd09a95e6ea8f4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_body.png" +dest_files=["res://.godot/imported/square_body.png-ef1c56c8912cd968d7fd09a95e6ea8f4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/square_face.png b/characters/happy_boo/square_face.png new file mode 100644 index 0000000..66d8d29 Binary files /dev/null and b/characters/happy_boo/square_face.png differ diff --git a/characters/happy_boo/square_face.png.import b/characters/happy_boo/square_face.png.import new file mode 100644 index 0000000..8f87f7b --- /dev/null +++ b/characters/happy_boo/square_face.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvs0lh814pk7h" +path="res://.godot/imported/square_face.png-e27720ce35d82859f41580927c22ef18.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_face.png" +dest_files=["res://.godot/imported/square_face.png-e27720ce35d82859f41580927c22ef18.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/square_foot.png b/characters/happy_boo/square_foot.png new file mode 100644 index 0000000..b277326 Binary files /dev/null and b/characters/happy_boo/square_foot.png differ diff --git a/characters/happy_boo/square_foot.png.import b/characters/happy_boo/square_foot.png.import new file mode 100644 index 0000000..3be09d9 --- /dev/null +++ b/characters/happy_boo/square_foot.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ng8e5ot0dtpd" +path="res://.godot/imported/square_foot.png-62023e9ce7985c4b370739df29445354.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_foot.png" +dest_files=["res://.godot/imported/square_foot.png-62023e9ce7985c4b370739df29445354.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/square_lower_leg.png b/characters/happy_boo/square_lower_leg.png new file mode 100644 index 0000000..5642ace Binary files /dev/null and b/characters/happy_boo/square_lower_leg.png differ diff --git a/characters/happy_boo/square_lower_leg.png.import b/characters/happy_boo/square_lower_leg.png.import new file mode 100644 index 0000000..467bc4d --- /dev/null +++ b/characters/happy_boo/square_lower_leg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhapxq8y8ow57" +path="res://.godot/imported/square_lower_leg.png-313909793abe38b44566c8e252c075e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_lower_leg.png" +dest_files=["res://.godot/imported/square_lower_leg.png-313909793abe38b44566c8e252c075e0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/square_modification_stack.tres b/characters/happy_boo/square_modification_stack.tres new file mode 100644 index 0000000..4308bdc --- /dev/null +++ b/characters/happy_boo/square_modification_stack.tres @@ -0,0 +1,23 @@ +[gd_resource type="SkeletonModificationStack2D" load_steps=3 format=3 uid="uid://dtf0pmja4mcaa"] + +[sub_resource type="SkeletonModification2DTwoBoneIK" id="SkeletonModification2DTwoBoneIK_7lb5u"] +target_nodepath = NodePath("FootLIK") +flip_bend_direction = true +joint_one_bone_idx = 1 +joint_one_bone2d_node = NodePath("Center/UpperLegL") +joint_two_bone_idx = 2 +joint_two_bone2d_node = NodePath("Center/UpperLegL/LowerLegL") +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DTwoBoneIK" id="SkeletonModification2DTwoBoneIK_h82yt"] +target_nodepath = NodePath("FootRIK") +joint_one_bone_idx = 4 +joint_one_bone2d_node = NodePath("Center/UpperLegR") +joint_two_bone_idx = 5 +joint_two_bone2d_node = NodePath("Center/UpperLegR/LowerLegR") + +[resource] +enabled = true +modification_count = 2 +modifications/0 = SubResource("SkeletonModification2DTwoBoneIK_7lb5u") +modifications/1 = SubResource("SkeletonModification2DTwoBoneIK_h82yt") diff --git a/characters/happy_boo/square_ref.png b/characters/happy_boo/square_ref.png new file mode 100644 index 0000000..b67c0c4 Binary files /dev/null and b/characters/happy_boo/square_ref.png differ diff --git a/characters/happy_boo/square_ref.png.import b/characters/happy_boo/square_ref.png.import new file mode 100644 index 0000000..f7ba546 --- /dev/null +++ b/characters/happy_boo/square_ref.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2ent6mf1y7w7" +path="res://.godot/imported/square_ref.png-ad4b2771e34de0b9a0fbda7055a9fe1c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_ref.png" +dest_files=["res://.godot/imported/square_ref.png-ad4b2771e34de0b9a0fbda7055a9fe1c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/happy_boo/square_upper_leg.png b/characters/happy_boo/square_upper_leg.png new file mode 100644 index 0000000..c7994fc Binary files /dev/null and b/characters/happy_boo/square_upper_leg.png differ diff --git a/characters/happy_boo/square_upper_leg.png.import b/characters/happy_boo/square_upper_leg.png.import new file mode 100644 index 0000000..0377cbd --- /dev/null +++ b/characters/happy_boo/square_upper_leg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qmqpm6asge1i" +path="res://.godot/imported/square_upper_leg.png-e1f848aab7dd8805f40f881c2160a53d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/happy_boo/square_upper_leg.png" +dest_files=["res://.godot/imported/square_upper_leg.png-e1f848aab7dd8805f40f881c2160a53d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/slime/slime.gd b/characters/slime/slime.gd new file mode 100644 index 0000000..61789f5 --- /dev/null +++ b/characters/slime/slime.gd @@ -0,0 +1,10 @@ +extends Node2D + + +func play_walk(): + %AnimationPlayer.play("walk") + + +func play_hurt(): + %AnimationPlayer.play("hurt") + %AnimationPlayer.queue("walk") diff --git a/characters/slime/slime.gd.uid b/characters/slime/slime.gd.uid new file mode 100644 index 0000000..055b100 --- /dev/null +++ b/characters/slime/slime.gd.uid @@ -0,0 +1 @@ +uid://fv1e5gkanivs diff --git a/characters/slime/slime.tscn b/characters/slime/slime.tscn new file mode 100644 index 0000000..2246dfb --- /dev/null +++ b/characters/slime/slime.tscn @@ -0,0 +1,245 @@ +[gd_scene load_steps=12 format=3 uid="uid://ogik4s70pgwl"] + +[ext_resource type="Texture2D" uid="uid://dvgfmy6vtvjji" path="res://characters/slime/slime_body.png" id="1_3j35h"] +[ext_resource type="Script" uid="uid://fv1e5gkanivs" path="res://characters/slime/slime.gd" id="1_87y5x"] +[ext_resource type="Texture2D" uid="uid://b7rhtttevhxtj" path="res://characters/ground_shadow.png" id="1_cq7ej"] +[ext_resource type="Texture2D" uid="uid://c078jrp2yvc4s" path="res://characters/slime/slime_face.png" id="2_ygydt"] +[ext_resource type="Texture2D" uid="uid://btbxea1f3vwot" path="res://characters/slime/slime_body_hurt.png" id="4_0qu0c"] +[ext_resource type="Texture2D" uid="uid://cai2ijnbypqtr" path="res://characters/slime/slime_hurt_eyes.png" id="4_hi70h"] + +[sub_resource type="Animation" id="Animation_y4lve"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor/Face:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-25.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/SlimeBody:scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Anchor:position:y") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Anchor/Face/SlimeFace:texture") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("2_ygydt")] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Anchor:scale") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_lu163"] +resource_name = "hurt" +length = 0.2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor/Face/SlimeFace:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [ExtResource("4_hi70h"), ExtResource("2_ygydt")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/Face:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [-25.0, -35.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Anchor:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(-2, -2, -2), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Anchor/SlimeBody/SlimeBodyHurt:modulate:a") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, -2, 1), +"update": 0, +"values": [0.0, 1.0, 0.0] +} + +[sub_resource type="Animation" id="Animation_71vdi"] +resource_name = "idle" +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor/Face:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(-2, -2, -2), +"update": 0, +"values": [-28.0, -24.0, -28.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/SlimeBody:scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(-2, -2, -2), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.05, 0.95), Vector2(1, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Anchor:position:y") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_l6fy2"] +resource_name = "walk" +length = 0.4 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Anchor:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -20.0, 0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Anchor/SlimeBody:scale") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.1, 0.3, 0.5), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.9, 1.1), Vector2(1.1, 0.9), Vector2(0.9, 1.1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Anchor/Face:position:y") +tracks/2/interp = 2 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.1, 0.3, 0.5), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [-24.0, -28.0, -24.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_j6cum"] +_data = { +&"RESET": SubResource("Animation_y4lve"), +&"hurt": SubResource("Animation_lu163"), +&"idle": SubResource("Animation_71vdi"), +&"walk": SubResource("Animation_l6fy2") +} + +[node name="Slime" type="Node2D"] +script = ExtResource("1_87y5x") + +[node name="GroundShadow" type="Sprite2D" parent="."] +modulate = Color(0.898039, 0.878431, 0.831373, 1) +z_index = -1 +z_as_relative = false +scale = Vector2(0.8, 0.8) +texture = ExtResource("1_cq7ej") + +[node name="Anchor" type="Marker2D" parent="."] + +[node name="SlimeBody" type="Sprite2D" parent="Anchor"] +texture = ExtResource("1_3j35h") +offset = Vector2(0, -36) + +[node name="SlimeBodyHurt" type="Sprite2D" parent="Anchor/SlimeBody"] +modulate = Color(1, 1, 1, 0) +texture = ExtResource("4_0qu0c") +offset = Vector2(0, -36) + +[node name="Face" type="Marker2D" parent="Anchor"] +position = Vector2(0, -25) + +[node name="SlimeFace" type="Sprite2D" parent="Anchor/Face"] +texture = ExtResource("2_ygydt") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_j6cum") +} diff --git a/characters/slime/slime_body.png b/characters/slime/slime_body.png new file mode 100644 index 0000000..4c54c79 Binary files /dev/null and b/characters/slime/slime_body.png differ diff --git a/characters/slime/slime_body.png.import b/characters/slime/slime_body.png.import new file mode 100644 index 0000000..149a77b --- /dev/null +++ b/characters/slime/slime_body.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvgfmy6vtvjji" +path="res://.godot/imported/slime_body.png-0d515f9e912a0d42a36c28f828394f6a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/slime/slime_body.png" +dest_files=["res://.godot/imported/slime_body.png-0d515f9e912a0d42a36c28f828394f6a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/slime/slime_body_hurt.png b/characters/slime/slime_body_hurt.png new file mode 100644 index 0000000..e6ad527 Binary files /dev/null and b/characters/slime/slime_body_hurt.png differ diff --git a/characters/slime/slime_body_hurt.png.import b/characters/slime/slime_body_hurt.png.import new file mode 100644 index 0000000..8e0e9e8 --- /dev/null +++ b/characters/slime/slime_body_hurt.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btbxea1f3vwot" +path="res://.godot/imported/slime_body_hurt.png-3f38b75e5ebee1f99a984b348a7e7f8b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/slime/slime_body_hurt.png" +dest_files=["res://.godot/imported/slime_body_hurt.png-3f38b75e5ebee1f99a984b348a7e7f8b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/slime/slime_face.png b/characters/slime/slime_face.png new file mode 100644 index 0000000..c6e2736 Binary files /dev/null and b/characters/slime/slime_face.png differ diff --git a/characters/slime/slime_face.png.import b/characters/slime/slime_face.png.import new file mode 100644 index 0000000..d5ebd0d --- /dev/null +++ b/characters/slime/slime_face.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c078jrp2yvc4s" +path="res://.godot/imported/slime_face.png-561a1f87b138570340118953f07aab21.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/slime/slime_face.png" +dest_files=["res://.godot/imported/slime_face.png-561a1f87b138570340118953f07aab21.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/characters/slime/slime_hurt_eyes.png b/characters/slime/slime_hurt_eyes.png new file mode 100644 index 0000000..8d8958b Binary files /dev/null and b/characters/slime/slime_hurt_eyes.png differ diff --git a/characters/slime/slime_hurt_eyes.png.import b/characters/slime/slime_hurt_eyes.png.import new file mode 100644 index 0000000..bb6c1cb --- /dev/null +++ b/characters/slime/slime_hurt_eyes.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cai2ijnbypqtr" +path="res://.godot/imported/slime_hurt_eyes.png-711256b4a2a47dcea723d274f00b4628.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/slime/slime_hurt_eyes.png" +dest_files=["res://.godot/imported/slime_hurt_eyes.png-711256b4a2a47dcea723d274f00b4628.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..cb230c5 --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,3 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://c0r1synmqj70v"] + +[resource] diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..c398efd --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,108 @@ +[preset.0] + +name="Linux" +platform="Linux" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../ShootahGame.x86_64" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=false +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +binary_format/architecture="x86_64" +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="#!/usr/bin/env bash +export DISPLAY=:0 +unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\" +\"{temp_dir}/{exe_name}\" {cmd_args}" +ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash +kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\") +rm -rf \"{temp_dir}\"" + +[preset.1] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../../ShootahGame.exe" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=false +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=false +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +application/export_d3d12=0 +application/d3d12_agility_sdk_multiarch=true +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" diff --git a/gun.gd b/gun.gd new file mode 100644 index 0000000..29da528 --- /dev/null +++ b/gun.gd @@ -0,0 +1,19 @@ +extends Area2D + +func _physics_process(delta: float) -> void: + var monsters_in_range = get_overlapping_bodies() + + if monsters_in_range.size() > 0: + var target = monsters_in_range.front() + look_at(target.global_position) + +func shoot(): + const BULLET = preload("res://bullet.tscn") + var new_bullet = BULLET.instantiate() + + new_bullet.global_transform = %Barrel.global_transform + %Barrel.add_child(new_bullet) + + +func _on_timer_timeout() -> void: + shoot() diff --git a/gun.gd.uid b/gun.gd.uid new file mode 100644 index 0000000..213713a --- /dev/null +++ b/gun.gd.uid @@ -0,0 +1 @@ +uid://dl331nhv6dm0l diff --git a/gun.tscn b/gun.tscn new file mode 100644 index 0000000..5c1022c --- /dev/null +++ b/gun.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=4 format=3 uid="uid://daagdf86t4bjn"] + +[ext_resource type="Script" uid="uid://dl331nhv6dm0l" path="res://gun.gd" id="1_dk5gl"] +[ext_resource type="Texture2D" uid="uid://cswb5do8rrj7q" path="res://pistol/pistol.png" id="1_vk1bi"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_dk5gl"] +radius = 356.051 + +[node name="Gun" type="Area2D"] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_dk5gl") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_dk5gl") + +[node name="Pivot" type="Marker2D" parent="."] + +[node name="Pistol" type="Sprite2D" parent="Pivot"] +position = Vector2(85, 0) +texture = ExtResource("1_vk1bi") + +[node name="Barrel" type="Marker2D" parent="Pivot/Pistol"] +unique_name_in_owner = true +position = Vector2(25, -11) + +[node name="Timer" type="Timer" parent="."] +wait_time = 0.33 +autostart = true + +[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..26171fd Binary files /dev/null and b/icon.png differ diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..d1effcf --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://i4cjdwy1kcoj" +path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/monster.gd b/monster.gd new file mode 100644 index 0000000..f69433b --- /dev/null +++ b/monster.gd @@ -0,0 +1,28 @@ +extends CharacterBody2D + +var health = 3 + +@onready var player = get_node("/root/Game/Player") + +func _ready() -> void: + %Slime.play_walk() + +func _physics_process(delta: float) -> void: + var direction = global_position.direction_to(player.global_position) + velocity = direction * 200.0 + move_and_slide() + +func take_damage() -> void: + const SMOKE_EXPLOSION = preload("res://smoke_explosion/smoke_explosion.tscn") + + %Slime.play_hurt() + health -= 1 + + if health == 0: + queue_free() + var s = SMOKE_EXPLOSION.instantiate() + get_parent().add_child(s) + s.global_transform = global_transform + + + diff --git a/monster.gd.uid b/monster.gd.uid new file mode 100644 index 0000000..eae22ba --- /dev/null +++ b/monster.gd.uid @@ -0,0 +1 @@ +uid://btk7g8n7jstwp diff --git a/monster.tscn b/monster.tscn new file mode 100644 index 0000000..afe3e12 --- /dev/null +++ b/monster.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=3 uid="uid://5dgdagljfax1"] + +[ext_resource type="Script" uid="uid://btk7g8n7jstwp" path="res://monster.gd" id="1_mrqeg"] +[ext_resource type="PackedScene" uid="uid://ogik4s70pgwl" path="res://characters/slime/slime.tscn" id="2_ga5te"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_vr0w3"] +radius = 45.815 +height = 114.012 + +[node name="Monster" type="CharacterBody2D"] +collision_layer = 2 +collision_mask = 3 +script = ExtResource("1_mrqeg") + +[node name="Slime" parent="." instance=ExtResource("2_ga5te")] +unique_name_in_owner = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -32) +rotation = -1.57878 +shape = SubResource("CapsuleShape2D_vr0w3") diff --git a/pistol/impact/circle.png b/pistol/impact/circle.png new file mode 100644 index 0000000..03b68f8 Binary files /dev/null and b/pistol/impact/circle.png differ diff --git a/pistol/impact/circle.png.import b/pistol/impact/circle.png.import new file mode 100644 index 0000000..7ad4968 --- /dev/null +++ b/pistol/impact/circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn80eu1qs371v" +path="res://.godot/imported/circle.png-a2fa3270dee1c1c7e1cb0869903e82df.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pistol/impact/circle.png" +dest_files=["res://.godot/imported/circle.png-a2fa3270dee1c1c7e1cb0869903e82df.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/pistol/impact/impact.gd b/pistol/impact/impact.gd new file mode 100644 index 0000000..b971b6a --- /dev/null +++ b/pistol/impact/impact.gd @@ -0,0 +1,10 @@ +extends Node2D + +@onready var sprite = %Sprite + + +func _ready(): + var tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT) + tween.tween_property(sprite, "scale", Vector2.ONE * 1.35, 0.3).from(Vector2.ONE * 0.6) + tween.tween_property(sprite, "modulate:a", 0.0, 0.15).set_delay(0.15) + tween.chain().tween_callback(queue_free) diff --git a/pistol/impact/impact.gd.uid b/pistol/impact/impact.gd.uid new file mode 100644 index 0000000..86bd603 --- /dev/null +++ b/pistol/impact/impact.gd.uid @@ -0,0 +1 @@ +uid://c6w1u8mii1jdj diff --git a/pistol/impact/impact.tscn b/pistol/impact/impact.tscn new file mode 100644 index 0000000..c5171c2 --- /dev/null +++ b/pistol/impact/impact.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://kcl4efkvrany"] + +[ext_resource type="Script" uid="uid://c6w1u8mii1jdj" path="res://pistol/impact/impact.gd" id="1_4vum2"] +[ext_resource type="Texture2D" uid="uid://dn80eu1qs371v" path="res://pistol/impact/circle.png" id="2_wp1di"] + +[node name="Impact" type="Node2D"] +top_level = true +script = ExtResource("1_4vum2") + +[node name="Sprite" type="Sprite2D" parent="."] +unique_name_in_owner = true +modulate = Color(1, 0.831373, 0.239216, 1) +texture = ExtResource("2_wp1di") diff --git a/pistol/muzzle_flash/muzzle_flash.gd b/pistol/muzzle_flash/muzzle_flash.gd new file mode 100644 index 0000000..8fcd0d0 --- /dev/null +++ b/pistol/muzzle_flash/muzzle_flash.gd @@ -0,0 +1,11 @@ +extends Node2D + +@onready var sprite = %Sprite + + +func _ready(): + var tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + tween.tween_property(sprite, "position:x", 16.0, 0.25) + tween.tween_property(sprite, "scale", Vector2.ONE * 1.25, 0.25) + tween.tween_property(sprite, "modulate:a", 0.0, 0.25).set_delay(0.1) + tween.chain().tween_callback(queue_free) diff --git a/pistol/muzzle_flash/muzzle_flash.gd.uid b/pistol/muzzle_flash/muzzle_flash.gd.uid new file mode 100644 index 0000000..636a90d --- /dev/null +++ b/pistol/muzzle_flash/muzzle_flash.gd.uid @@ -0,0 +1 @@ +uid://beuxhimda3hkr diff --git a/pistol/muzzle_flash/muzzle_flash.png b/pistol/muzzle_flash/muzzle_flash.png new file mode 100644 index 0000000..2f6c8ba Binary files /dev/null and b/pistol/muzzle_flash/muzzle_flash.png differ diff --git a/pistol/muzzle_flash/muzzle_flash.png.import b/pistol/muzzle_flash/muzzle_flash.png.import new file mode 100644 index 0000000..c9dc695 --- /dev/null +++ b/pistol/muzzle_flash/muzzle_flash.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brgpjilf7s2ul" +path="res://.godot/imported/muzzle_flash.png-752b19c1a1a60c24eac6f205d487f2ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pistol/muzzle_flash/muzzle_flash.png" +dest_files=["res://.godot/imported/muzzle_flash.png-752b19c1a1a60c24eac6f205d487f2ea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/pistol/muzzle_flash/muzzle_flash.tscn b/pistol/muzzle_flash/muzzle_flash.tscn new file mode 100644 index 0000000..988fb77 --- /dev/null +++ b/pistol/muzzle_flash/muzzle_flash.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://c1b2kbuq1if08"] + +[ext_resource type="Script" uid="uid://beuxhimda3hkr" path="res://pistol/muzzle_flash/muzzle_flash.gd" id="1_wouey"] +[ext_resource type="Texture2D" uid="uid://brgpjilf7s2ul" path="res://pistol/muzzle_flash/muzzle_flash.png" id="2_6pgu4"] + +[node name="MuzzleFlash" type="Node2D"] +script = ExtResource("1_wouey") + +[node name="Sprite" type="Sprite2D" parent="."] +unique_name_in_owner = true +texture = ExtResource("2_6pgu4") +offset = Vector2(10, 0) diff --git a/pistol/pistol.png b/pistol/pistol.png new file mode 100644 index 0000000..cc24e8b Binary files /dev/null and b/pistol/pistol.png differ diff --git a/pistol/pistol.png.import b/pistol/pistol.png.import new file mode 100644 index 0000000..c258004 --- /dev/null +++ b/pistol/pistol.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cswb5do8rrj7q" +path="res://.godot/imported/pistol.png-ccb9a9487ce225cdf094ad33c19c2ede.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pistol/pistol.png" +dest_files=["res://.godot/imported/pistol.png-ccb9a9487ce225cdf094ad33c19c2ede.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/pistol/projectile.png b/pistol/projectile.png new file mode 100644 index 0000000..42fb536 Binary files /dev/null and b/pistol/projectile.png differ diff --git a/pistol/projectile.png.import b/pistol/projectile.png.import new file mode 100644 index 0000000..05d66a4 --- /dev/null +++ b/pistol/projectile.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dftkbqwsfd68r" +path="res://.godot/imported/projectile.png-e03ae856d530df914009475206433400.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pistol/projectile.png" +dest_files=["res://.godot/imported/projectile.png-e03ae856d530df914009475206433400.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/player.gd b/player.gd new file mode 100644 index 0000000..ff6b039 --- /dev/null +++ b/player.gd @@ -0,0 +1,24 @@ +extends CharacterBody2D + +signal health_depleted + +var health = 100.0 +var move_speed := 400.0 + +func _physics_process(delta: float) -> void: + var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") + velocity = (direction * move_speed) + move_and_slide() + + if velocity.length() > 0.0: + %HappyBoo.play_walk_animation() + else: + %HappyBoo.play_idle_animation() + + const DAMAGE_RATE = 15.0 + var overlapping_mobs = %Hitbox.get_overlapping_bodies() + if overlapping_mobs.size() > 0: + health -= (DAMAGE_RATE * overlapping_mobs.size()) * delta + %ProgressBar.value = health + if health <= 0.0: + health_depleted.emit() diff --git a/player.gd.uid b/player.gd.uid new file mode 100644 index 0000000..265d1a3 --- /dev/null +++ b/player.gd.uid @@ -0,0 +1 @@ +uid://chd6vgc03ew6a diff --git a/player.tscn b/player.tscn new file mode 100644 index 0000000..aaa1fbc --- /dev/null +++ b/player.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=8 format=3 uid="uid://4c77448gw84s"] + +[ext_resource type="PackedScene" uid="uid://pbmyh1qru7p" path="res://characters/happy_boo/happy_boo.tscn" id="1_4flbx"] +[ext_resource type="Script" uid="uid://chd6vgc03ew6a" path="res://player.gd" id="1_onrkg"] +[ext_resource type="PackedScene" uid="uid://daagdf86t4bjn" path="res://gun.tscn" id="3_i3pqv"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_onrkg"] +radius = 30.0 +height = 96.0 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_i3pqv"] +radius = 33.0 +height = 104.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_i3pqv"] +bg_color = Color(0.162066, 0.162066, 0.162065, 1) +corner_radius_top_left = 6 +corner_radius_top_right = 6 +corner_radius_bottom_right = 6 +corner_radius_bottom_left = 6 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hqtel"] +bg_color = Color(0.25499, 0.702712, 0.379593, 1) +corner_radius_top_left = 6 +corner_radius_top_right = 6 +corner_radius_bottom_right = 6 +corner_radius_bottom_left = 6 + +[node name="Player" type="CharacterBody2D"] +script = ExtResource("1_onrkg") + +[node name="HappyBoo" parent="." instance=ExtResource("1_4flbx")] +unique_name_in_owner = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(-1, -37) +shape = SubResource("CapsuleShape2D_onrkg") + +[node name="Camera2D" type="Camera2D" parent="."] + +[node name="Gun" parent="." instance=ExtResource("3_i3pqv")] +position = Vector2(-1, -37) + +[node name="Hitbox" type="Area2D" parent="."] +unique_name_in_owner = true +collision_layer = 0 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(-1, -37) +shape = SubResource("CapsuleShape2D_i3pqv") +debug_color = Color(0.881613, 0.286763, 0.460338, 0.42) + +[node name="ProgressBar" type="ProgressBar" parent="."] +unique_name_in_owner = true +offset_left = -53.0 +offset_top = -115.0 +offset_right = 55.0 +offset_bottom = -107.0 +theme_override_styles/background = SubResource("StyleBoxFlat_i3pqv") +theme_override_styles/fill = SubResource("StyleBoxFlat_hqtel") +value = 100.0 +show_percentage = false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..9870a6b --- /dev/null +++ b/project.godot @@ -0,0 +1,127 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[Asset_Placer] + +Settings/Preview_Perspective=2 +Settings/Library_Save_File_Location=1 +Shortcuts/Change_Placement_Plane_Position=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Transform_Asset_Blueprint=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Select_Previous_Asset=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Select_Y_Z_Plane=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Select_X_Z_Plane=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Select_X_Y_Plane=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Reset_Transform=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Rotate_Asset_90_Degrees_Around_X=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Rotate_Asset_90_Degrees_Around_Y=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Rotate_Asset_90_Degrees_Around_Z=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Flip_Asset_On_X_Axis=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":49,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Flip_Asset_On_Y_Axis=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":50,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Flip_Asset_On_Z_Axis=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":51,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Settings/Shortcut_Shift_Rotation_Step=45.0 +Shortcuts/Rotate_Asset_Secondary_Step_Degrees_Around_X=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Rotate_Asset_Secondary_Step_Degrees_Around_Y=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Rotate_Asset_Secondary_Step_Degrees_Around_Z=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":true,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Double_Snap_Step=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":true,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Shortcuts/Halve_Snap_Step=Object(Shortcut,"resource_local_to_scene":false,"resource_name":"","events":[Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":true,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +],"script":null) + +Settings/Use_Shift_instead_of_Alt=false +Settings/Surface_Placement_Collision_Mask=4294967295 +Settings/Show_Tooltips=true + +[application] + +config/name="ShootahGame" +run/main_scene="uid://b185yicmacoke" +config/features=PackedStringArray("4.4", "Forward Plus") +config/icon="res://icon.png" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/stretch/mode="viewport" + +[dotnet] + +project/assembly_name="Getting started with Godot 4" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/colorpicker_presets/plugin.cfg") + +[input] + +move_left={ +"deadzone": 0.5, +"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,"location":0,"echo":false,"script":null) +] +} +move_right={ +"deadzone": 0.5, +"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,"location":0,"echo":false,"script":null) +] +} +move_up={ +"deadzone": 0.5, +"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,"location":0,"echo":false,"script":null) +] +} +move_down={ +"deadzone": 0.5, +"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,"location":0,"echo":false,"script":null) +] +} +shoot={ +"deadzone": 0.25, +"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +, 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) +] +} + +[layer_names] + +3d_physics/layer_2="player" diff --git a/smoke_explosion/circle_32.png b/smoke_explosion/circle_32.png new file mode 100644 index 0000000..e4fe575 Binary files /dev/null and b/smoke_explosion/circle_32.png differ diff --git a/smoke_explosion/circle_32.png.import b/smoke_explosion/circle_32.png.import new file mode 100644 index 0000000..ab7242c --- /dev/null +++ b/smoke_explosion/circle_32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvmbm3sxj85fm" +path="res://.godot/imported/circle_32.png-ff53eadac5c62484a55afe7e47d5145f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://smoke_explosion/circle_32.png" +dest_files=["res://.godot/imported/circle_32.png-ff53eadac5c62484a55afe7e47d5145f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/smoke_explosion/smoke_explosion.gd b/smoke_explosion/smoke_explosion.gd new file mode 100644 index 0000000..ea29c24 --- /dev/null +++ b/smoke_explosion/smoke_explosion.gd @@ -0,0 +1,8 @@ +extends Node2D + + +func _ready(): + %Smoke.material.set_shader_parameter("texture_offset", Vector2(randfn(0.0, 1.0), randfn(0.0, 1.0))) + %AnimationPlayer.play("explosion") + await %AnimationPlayer.animation_finished + queue_free() diff --git a/smoke_explosion/smoke_explosion.gd.uid b/smoke_explosion/smoke_explosion.gd.uid new file mode 100644 index 0000000..bda4b0c --- /dev/null +++ b/smoke_explosion/smoke_explosion.gd.uid @@ -0,0 +1 @@ +uid://qrh44gblhgir diff --git a/smoke_explosion/smoke_explosion.gdshader b/smoke_explosion/smoke_explosion.gdshader new file mode 100644 index 0000000..0718ece --- /dev/null +++ b/smoke_explosion/smoke_explosion.gdshader @@ -0,0 +1,15 @@ +shader_type canvas_item; + +uniform sampler2D voronoi_sampler : repeat_enable; +uniform sampler2D edge_curve; +uniform float offset = 0.0; +uniform vec2 texture_offset = vec2(0.0); +uniform sampler2D color_gradient : source_color; + +void fragment() { + float voronoi = 1.0 - texture(voronoi_sampler, UV * 0.25 + texture_offset).x; + float d = distance(UV, vec2(0.5)) * 2.0; + float n_smooth_d = (voronoi * offset) * texture(edge_curve, vec2(d, 0.0)).x; + COLOR.a *= step(0.5, n_smooth_d); + COLOR.rgb = texture(color_gradient, vec2(n_smooth_d, 0.0)).rgb; +} diff --git a/smoke_explosion/smoke_explosion.gdshader.uid b/smoke_explosion/smoke_explosion.gdshader.uid new file mode 100644 index 0000000..db33482 --- /dev/null +++ b/smoke_explosion/smoke_explosion.gdshader.uid @@ -0,0 +1 @@ +uid://dnum4fa7v8hu diff --git a/smoke_explosion/smoke_explosion.tscn b/smoke_explosion/smoke_explosion.tscn new file mode 100644 index 0000000..a88fe17 --- /dev/null +++ b/smoke_explosion/smoke_explosion.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=13 format=3 uid="uid://dhmhmrth6rdce"] + +[ext_resource type="Shader" uid="uid://dnum4fa7v8hu" path="res://smoke_explosion/smoke_explosion.gdshader" id="1_bmef6"] +[ext_resource type="Script" uid="uid://qrh44gblhgir" path="res://smoke_explosion/smoke_explosion.gd" id="1_kb8ql"] + +[sub_resource type="Gradient" id="Gradient_obal6"] +interpolation_mode = 1 +offsets = PackedFloat32Array(0.105691, 0.7) +colors = PackedColorArray(0.878431, 0.878431, 0.878431, 1, 0.878431, 0.878431, 0.878431, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_mxd0d"] +gradient = SubResource("Gradient_obal6") + +[sub_resource type="Curve" id="Curve_aov55"] +_data = [Vector2(0.752381, 1), 0.0, -4.03846, 0, 1, Vector2(1, 0), -4.03846, 0.0, 1, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_p664q"] +texture_mode = 1 +curve = SubResource("Curve_aov55") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_ti4n0"] +noise_type = 2 +fractal_octaves = 1 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_uji5e"] +seamless = true +noise = SubResource("FastNoiseLite_ti4n0") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_dssfe"] +resource_local_to_scene = true +shader = ExtResource("1_bmef6") +shader_parameter/voronoi_sampler = SubResource("NoiseTexture2D_uji5e") +shader_parameter/edge_curve = SubResource("CurveTexture_p664q") +shader_parameter/offset = 2.0 +shader_parameter/texture_offset = Vector2(0, 0) +shader_parameter/color_gradient = SubResource("GradientTexture1D_mxd0d") + +[sub_resource type="Animation" id="Animation_6fv2e"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Smoke:material:shader_parameter/offset") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [2.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Smoke:scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Smoke:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.396078, 0.396078, 0.396078, 1)] +} + +[sub_resource type="Animation" id="Animation_viyco"] +resource_name = "explosion" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Smoke:material:shader_parameter/offset") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [2.0, 0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Smoke:scale") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(3, 3)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Smoke:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.1, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.0, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_8msef"] +_data = { +&"RESET": SubResource("Animation_6fv2e"), +&"explosion": SubResource("Animation_viyco") +} + +[node name="SmokeExplosion" type="Node2D"] +z_index = 10 +script = ExtResource("1_kb8ql") + +[node name="Smoke" type="ColorRect" parent="."] +unique_name_in_owner = true +modulate = Color(0.396078, 0.396078, 0.396078, 1) +material = SubResource("ShaderMaterial_dssfe") +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -64.0 +offset_top = -64.0 +offset_right = 64.0 +offset_bottom = 64.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(64, 64) +color = Color(0.568627, 0.568627, 0.568627, 1) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +autoplay = "RESET" +libraries = { +"": SubResource("AnimationLibrary_8msef") +} diff --git a/static_pine_tree.tscn b/static_pine_tree.tscn new file mode 100644 index 0000000..a08303e --- /dev/null +++ b/static_pine_tree.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=3 uid="uid://beit5tp4qdcsg"] + +[ext_resource type="Texture2D" uid="uid://b7rhtttevhxtj" path="res://characters/ground_shadow.png" id="1_4ec4t"] +[ext_resource type="Texture2D" uid="uid://caqfk2xng5v5u" path="res://trees/pine_tree.png" id="2_fou4c"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_dtvk7"] +radius = 16.0 +height = 48.0 + +[node name="StaticPineTree" type="StaticBody2D"] + +[node name="GroundShadow" type="Sprite2D" parent="."] +modulate = Color(0.299547, 0.299547, 0.299547, 1) +position = Vector2(0.562503, -9) +scale = Vector2(0.819941, 0.692308) +texture = ExtResource("1_4ec4t") + +[node name="PineTree" type="Sprite2D" parent="."] +position = Vector2(0, -75) +texture = ExtResource("2_fou4c") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(1, -22) +shape = SubResource("CapsuleShape2D_dtvk7") diff --git a/survivors_game.gd b/survivors_game.gd new file mode 100644 index 0000000..15c2798 --- /dev/null +++ b/survivors_game.gd @@ -0,0 +1,24 @@ +extends Node2D + +func _ready(): + spawn_monster() + spawn_monster() + spawn_monster() + spawn_monster() + spawn_monster() + %SpawnTimer.start() + +func spawn_monster(): + var new_monster = preload("res://monster.tscn").instantiate() + %PathFollow2D.progress_ratio = randf() + new_monster.global_position = %PathFollow2D.global_position + add_child(new_monster) + + +func _on_spawn_timer_timeout() -> void: + spawn_monster() + + +func _on_player_health_depleted() -> void: + %GameoverCanvasLayer.visible = true + get_tree().paused = true diff --git a/survivors_game.gd.uid b/survivors_game.gd.uid new file mode 100644 index 0000000..69b07d8 --- /dev/null +++ b/survivors_game.gd.uid @@ -0,0 +1 @@ +uid://dw0g2r5t2fe8r diff --git a/survivors_game.tscn b/survivors_game.tscn new file mode 100644 index 0000000..0407d0b --- /dev/null +++ b/survivors_game.tscn @@ -0,0 +1,106 @@ +[gd_scene load_steps=5 format=3 uid="uid://b185yicmacoke"] + +[ext_resource type="Script" uid="uid://dw0g2r5t2fe8r" path="res://survivors_game.gd" id="1_qqaft"] +[ext_resource type="PackedScene" uid="uid://4c77448gw84s" path="res://player.tscn" id="1_y3pti"] +[ext_resource type="PackedScene" uid="uid://beit5tp4qdcsg" path="res://static_pine_tree.tscn" id="2_l26od"] + +[sub_resource type="Curve2D" id="Curve2D_7jj1j"] +_data = { +"points": PackedVector2Array(0, 0, 0, 0, -114, -125, 0, 0, 0, 0, 2103, -120, 0, 0, 0, 0, 2095, 1198, 0, 0, 0, 0, -108, 1196, 0, 0, 0, 0, -114, -125) +} +point_count = 5 + +[node name="Game" type="Node2D"] +y_sort_enabled = true +script = ExtResource("1_qqaft") + +[node name="CanvasLayer" type="CanvasLayer" parent="."] +layer = -1 + +[node name="ColorRect" type="ColorRect" parent="CanvasLayer"] +offset_left = -12.0 +offset_top = -9.0 +offset_right = 2000.0 +offset_bottom = 1106.0 + +[node name="Player" parent="." instance=ExtResource("1_y3pti")] +position = Vector2(1003, 549) + +[node name="Path2D" type="Path2D" parent="Player"] +position = Vector2(-1003, -549) +curve = SubResource("Curve2D_7jj1j") + +[node name="PathFollow2D" type="PathFollow2D" parent="Player/Path2D"] +unique_name_in_owner = true +position = Vector2(-114, -125) +rotation = 0.0022553 + +[node name="StaticPineTree" parent="." instance=ExtResource("2_l26od")] +position = Vector2(258, 872) + +[node name="StaticPineTree2" parent="." instance=ExtResource("2_l26od")] +position = Vector2(600, 219) + +[node name="StaticPineTree3" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1487, 878) + +[node name="StaticPineTree4" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1581, 775) + +[node name="StaticPineTree5" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1640, 872) + +[node name="StaticPineTree6" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1382, 221) + +[node name="StaticPineTree7" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1471, 270) + +[node name="StaticPineTree8" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1783, 516) + +[node name="StaticPineTree9" parent="." instance=ExtResource("2_l26od")] +position = Vector2(266, 506) + +[node name="StaticPineTree10" parent="." instance=ExtResource("2_l26od")] +position = Vector2(772, 680) + +[node name="StaticPineTree11" parent="." instance=ExtResource("2_l26od")] +position = Vector2(1250, 380) + +[node name="SpawnTimer" type="Timer" parent="."] +unique_name_in_owner = true + +[node name="GameoverCanvasLayer" type="CanvasLayer" parent="."] +unique_name_in_owner = true +visible = false + +[node name="ColorRect" type="ColorRect" parent="GameoverCanvasLayer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -191.0 +offset_top = -61.0 +offset_right = 191.0 +offset_bottom = 61.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.0588235, 0.0588235, 0.0588235, 0.501961) + +[node name="Label" type="Label" parent="GameoverCanvasLayer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -391.0 +offset_top = -98.5 +offset_right = 391.0 +offset_bottom = 98.5 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_font_sizes/font_size = 144 +text = "Game Over" + +[connection signal="health_depleted" from="Player" to="." method="_on_player_health_depleted"] +[connection signal="timeout" from="SpawnTimer" to="." method="_on_spawn_timer_timeout"] diff --git a/trees/pine_tree.png b/trees/pine_tree.png new file mode 100644 index 0000000..48e8f79 Binary files /dev/null and b/trees/pine_tree.png differ diff --git a/trees/pine_tree.png.import b/trees/pine_tree.png.import new file mode 100644 index 0000000..b74c18a --- /dev/null +++ b/trees/pine_tree.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://caqfk2xng5v5u" +path="res://.godot/imported/pine_tree.png-d61929395d8fbd7dd9882891dc69101d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://trees/pine_tree.png" +dest_files=["res://.godot/imported/pine_tree.png-d61929395d8fbd7dd9882891dc69101d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1