wild jam prototype

This commit is contained in:
2024-02-24 08:35:47 -06:00
parent e6d1f5a8df
commit bd0e9e21cd
28 changed files with 606 additions and 19 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
# Godot 4+ specific ignores # Godot 4+ specific ignores
.godot/ .godot/
export

BIN
assets/rocket.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

34
assets/rocket.png.import Normal file
View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d0hl8bxqr6pit"
path="res://.godot/imported/rocket.png-ee7caa6d60b8c73f0b17d79a887f39b7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/rocket.png"
dest_files=["res://.godot/imported/rocket.png-ee7caa6d60b8c73f0b17d79a887f39b7.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bov61wf487vok"
path="res://.godot/imported/66-All-Cards.png-3b6d757317c73e1d6ae59e3b465a3399.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/wild_jam/66-All-Cards.png"
dest_files=["res://.godot/imported/66-All-Cards.png-3b6d757317c73e1d6ae59e3b465a3399.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xkyvydieglea"
path="res://.godot/imported/66-Escape.png-1e2f87117eee255a6bff76adf9986f2b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/wild_jam/66-Escape.png"
dest_files=["res://.godot/imported/66-Escape.png-1e2f87117eee255a6bff76adf9986f2b.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c2mrfb6olx5xg"
path="res://.godot/imported/Et-tu-Brute.png-12df95ef3de215143d4b5ab392bb40e3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/wild_jam/Et-tu-Brute.png"
dest_files=["res://.godot/imported/Et-tu-Brute.png-12df95ef3de215143d4b5ab392bb40e3.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bkugnjwg6m3ef"
path="res://.godot/imported/inside-box.png-c9f4e79ee0fdb1bf73515f816556c251.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/wild_jam/inside-box.png"
dest_files=["res://.godot/imported/inside-box.png-c9f4e79ee0fdb1bf73515f816556c251.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://be8ir6au5xed5"
path="res://.godot/imported/then-the-morning-comes.png-2d3f4245fb4f2475f0a4c4d21fad9262.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/wild_jam/then-the-morning-comes.png"
dest_files=["res://.godot/imported/then-the-morning-comes.png-2d3f4245fb4f2475f0a4c4d21fad9262.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

37
export_presets.cfg Normal file
View File

@@ -0,0 +1,37 @@
[preset.0]
name="Web"
platform="Web"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="export/index.html"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.0.options]
custom_template/debug=""
custom_template/release=""
variant/extensions_support=false
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
html/custom_html_shell=""
html/head_include=""
html/canvas_resize_policy=2
html/focus_canvas_on_start=true
html/experimental_virtual_keyboard=false
progressive_web_app/enabled=false
progressive_web_app/offline_page=""
progressive_web_app/display=1
progressive_web_app/orientation=0
progressive_web_app/icon_144x144=""
progressive_web_app/icon_180x180=""
progressive_web_app/icon_512x512=""
progressive_web_app/background_color=Color(0, 0, 0, 1)

View File

@@ -11,7 +11,7 @@ config_version=5
[application] [application]
config/name="rgb" config/name="rgb"
run/main_scene="res://scene/maze_1.tscn" run/main_scene="res://scene/main_menu.tscn"
config/features=PackedStringArray("4.2", "GL Compatibility") config/features=PackedStringArray("4.2", "GL Compatibility")
config/icon="res://icon.svg" config/icon="res://icon.svg"
@@ -19,6 +19,14 @@ config/icon="res://icon.svg"
aseprite_executable_path="C:/Program Files/aseprite/build/bin/aseprite.exe" aseprite_executable_path="C:/Program Files/aseprite/build/bin/aseprite.exe"
[autoload]
HasWon="*res://scripts/has_won.gd"
[display]
window/stretch/mode="canvas_items"
[editor_plugins] [editor_plugins]
enabled=PackedStringArray("res://addons/nklbdev.aseprite_importers/plugin.cfg") enabled=PackedStringArray("res://addons/nklbdev.aseprite_importers/plugin.cfg")

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=7 format=3 uid="uid://dcpeowc6xcfcv"] [gd_scene load_steps=9 format=3 uid="uid://dcpeowc6xcfcv"]
[ext_resource type="Texture2D" uid="uid://d32ory5gus4lm" path="res://assets/dot.png" id="1_tsiui"] [ext_resource type="Texture2D" uid="uid://d32ory5gus4lm" path="res://assets/dot.png" id="1_tsiui"]
[ext_resource type="Script" path="res://scripts/hud.gd" id="1_yk6cu"] [ext_resource type="Script" path="res://scripts/hud.gd" id="1_yk6cu"]
@@ -7,6 +7,13 @@
[ext_resource type="Theme" uid="uid://ewgo3qi2xs54" path="res://data/themes/green_progress_bar_theme.tres" id="3_wvu2t"] [ext_resource type="Theme" uid="uid://ewgo3qi2xs54" path="res://data/themes/green_progress_bar_theme.tres" id="3_wvu2t"]
[ext_resource type="Theme" uid="uid://dm1sx57hw07cn" path="res://data/themes/blue_progress_bar_theme.tres" id="4_n8d17"] [ext_resource type="Theme" uid="uid://dm1sx57hw07cn" path="res://data/themes/blue_progress_bar_theme.tres" id="4_n8d17"]
[sub_resource type="Gradient" id="Gradient_qj638"]
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_w5aj4"]
gradient = SubResource("Gradient_qj638")
width = 64
[node name="HUD" type="CanvasLayer"] [node name="HUD" type="CanvasLayer"]
script = ExtResource("1_yk6cu") script = ExtResource("1_yk6cu")
@@ -14,10 +21,10 @@ script = ExtResource("1_yk6cu")
anchors_preset = 2 anchors_preset = 2
anchor_top = 1.0 anchor_top = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
offset_left = 16.0 offset_left = 8.0
offset_top = -184.0 offset_top = -258.0
offset_right = 64.0 offset_right = 80.0
offset_bottom = -24.0 offset_bottom = -8.0
grow_vertical = 0 grow_vertical = 0
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] [node name="MarginContainer" type="MarginContainer" parent="PanelContainer"]
@@ -30,6 +37,26 @@ theme_override_constants/margin_bottom = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer"] [node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer"]
layout_mode = 2 layout_mode = 2
[node name="AllianceContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="AllianceText" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AllianceContainer"]
layout_mode = 2
text = "Alliance"
horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AllianceContainer"]
layout_mode = 2
theme_override_constants/margin_left = 2
theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 2
theme_override_constants/margin_bottom = 2
[node name="AllianceTexture" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/AllianceContainer/MarginContainer"]
custom_minimum_size = Vector2(0, 8)
layout_mode = 2
texture = SubResource("GradientTexture1D_w5aj4")
[node name="LivesContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] [node name="LivesContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2 layout_mode = 2
columns = 3 columns = 3
@@ -106,3 +133,28 @@ theme_override_constants/margin_right = 8
[node name="EntityCountLabel" type="Label" parent="EntityCountContainer/MarginContainer"] [node name="EntityCountLabel" type="Label" parent="EntityCountContainer/MarginContainer"]
layout_mode = 2 layout_mode = 2
text = "Entity Count: 0" text = "Entity Count: 0"
[node name="RocketSpawnedToast" type="PanelContainer" parent="."]
visible = false
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -20.0
offset_right = 20.0
offset_bottom = 20.0
grow_horizontal = 2
grow_vertical = 2
[node name="Label" type="Label" parent="RocketSpawnedToast"]
layout_mode = 2
text = "Rocket has been placed!
Find it to escape!"
horizontal_alignment = 1
[node name="Timer" type="Timer" parent="RocketSpawnedToast"]
wait_time = 2.0
[connection signal="timeout" from="RocketSpawnedToast/Timer" to="." method="_on_timer_timeout"]

106
scene/main_menu.tscn Normal file
View File

@@ -0,0 +1,106 @@
[gd_scene load_steps=4 format=3 uid="uid://bx16w4v1gvjjm"]
[ext_resource type="Script" path="res://scripts/main_menu.gd" id="1_wb16r"]
[ext_resource type="Texture2D" uid="uid://c2mrfb6olx5xg" path="res://assets/wild_jam/Et-tu-Brute.png" id="2_i550s"]
[ext_resource type="Texture2D" uid="uid://bkugnjwg6m3ef" path="res://assets/wild_jam/inside-box.png" id="3_jsic8"]
[node name="MainMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_wb16r")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MarginContainer2" type="MarginContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_top = 150
theme_override_constants/margin_bottom = 150
[node name="Betrayal" type="TextureRect" parent="HBoxContainer/MarginContainer2"]
layout_mode = 2
texture = ExtResource("2_i550s")
expand_mode = 3
stretch_mode = 5
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_left = 64
theme_override_constants/margin_right = 64
[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/MarginContainer"]
layout_mode = 2
[node name="Spacer" type="Control" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 0.5
[node name="Label" type="Label" parent="HBoxContainer/MarginContainer/VBoxContainer"]
custom_minimum_size = Vector2(250, 0)
layout_mode = 2
size_flags_vertical = 6
theme_override_font_sizes/font_size = 64
text = "RGBetrayal"
horizontal_alignment = 1
[node name="Spacer2" type="Control" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 0.5
[node name="WinLossLabel" type="Label" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
horizontal_alignment = 1
[node name="Spacer5" type="Control" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 0.5
[node name="PlayButton" type="Button" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
text = "Play"
[node name="Spacer3" type="Control" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 0.5
[node name="QuitButton" type="Button" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
text = "Quit"
[node name="Spacer4" type="Control" parent="HBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 0.5
[node name="MarginContainer3" type="MarginContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_top = 150
theme_override_constants/margin_bottom = 150
[node name="ThinkInsideTheBox" type="TextureRect" parent="HBoxContainer/MarginContainer3"]
layout_mode = 2
size_flags_horizontal = 3
texture = ExtResource("3_jsic8")
expand_mode = 3
stretch_mode = 5
[connection signal="pressed" from="HBoxContainer/MarginContainer/VBoxContainer/PlayButton" to="." method="_on_play_button_pressed"]
[connection signal="pressed" from="HBoxContainer/MarginContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"]

View File

@@ -262,3 +262,10 @@ buff = ExtResource("6_ll7oj")
[node name="HUD" parent="." instance=ExtResource("4_7uel4")] [node name="HUD" parent="." instance=ExtResource("4_7uel4")]
[node name="EntityContainer" type="Node" parent="."] [node name="EntityContainer" type="Node" parent="."]
[node name="RocketTimer" type="Timer" parent="."]
wait_time = 45.0
one_shot = true
autostart = true
[connection signal="timeout" from="RocketTimer" to="." method="_on_rocket_timer_timeout"]

42
scene/rocket.tscn Normal file
View File

@@ -0,0 +1,42 @@
[gd_scene load_steps=4 format=3 uid="uid://dktsl7nrpdhkd"]
[ext_resource type="Texture2D" uid="uid://d0hl8bxqr6pit" path="res://assets/rocket.png" id="1_rmsjo"]
[ext_resource type="Script" path="res://scripts/rocket.gd" id="1_y7fw2"]
[sub_resource type="CircleShape2D" id="CircleShape2D_l5sta"]
radius = 32.0
[node name="Rocket" type="Node2D"]
script = ExtResource("1_y7fw2")
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("1_rmsjo")
[node name="CollectionZone" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="CollectionZone"]
shape = SubResource("CircleShape2D_l5sta")
[node name="LeaveTimer" type="Timer" parent="."]
[node name="CountdownLabel" type="Label" parent="."]
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -11.5
offset_right = 20.0
offset_bottom = 11.5
grow_horizontal = 2
grow_vertical = 2
text = "5"
horizontal_alignment = 1
vertical_alignment = 1
[connection signal="body_entered" from="CollectionZone" to="." method="_on_collection_zone_body_entered"]
[connection signal="body_exited" from="CollectionZone" to="." method="_on_collection_zone_body_exited"]
[connection signal="timeout" from="LeaveTimer" to="." method="_on_leave_timer_timeout"]

View File

@@ -3,6 +3,7 @@ class_name Attack
@onready var cpu_particles_2d: CPUParticles2D = $CPUParticles2D @onready var cpu_particles_2d: CPUParticles2D = $CPUParticles2D
@onready var area_2d: Area2D = $Area2D @onready var area_2d: Area2D = $Area2D
@onready var collision_shape_2d: CollisionShape2D = $Area2D/CollisionShape2D
var initiator: Entity var initiator: Entity
@@ -13,11 +14,15 @@ func set_initiator(entity: Entity) -> void:
func _ready() -> void: func _ready() -> void:
cpu_particles_2d.emitting = true cpu_particles_2d.emitting = true
cpu_particles_2d.color = initiator.color cpu_particles_2d.color = initiator.color
collision_shape_2d.shape.radius = initiator.attack_pow
cpu_particles_2d.initial_velocity_min = float(initiator.attack_pow) * 4.0
cpu_particles_2d.initial_velocity_max = float(initiator.attack_pow) * 4.0
func _on_cpu_particles_2d_finished() -> void: func _on_cpu_particles_2d_finished() -> void:
var collisions := area_2d.get_overlapping_bodies() var collisions := area_2d.get_overlapping_bodies()
for object in collisions: for object in collisions:
if object is Entity and object != initiator: if object is Entity and object != initiator:
object.hit() var color_diff = object.color - initiator.color
print("attack hit %s" % collisions.size()) if abs(color_diff.r) + abs(color_diff.g) + abs(color_diff.b) > 0.5:
object.hit()
queue_free() queue_free()

View File

@@ -5,8 +5,13 @@ class_name Enemy
@onready var nav_agent: NavigationAgent2D = $NavigationAgent2D @onready var nav_agent: NavigationAgent2D = $NavigationAgent2D
var vision: int = 100 var vision: int = 100
var at_rocket := false
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if not at_rocket:
random_movement()
func random_movement():
if nav_agent.is_navigation_finished(): if nav_agent.is_navigation_finished():
call_deferred("new_target_point") call_deferred("new_target_point")
return return
@@ -26,7 +31,7 @@ func _physics_process(delta: float) -> void:
lives += 1 lives += 1
color.r -= 0.25 color.r -= 0.25
buff.colors.GREEN: buff.colors.GREEN:
#$Camera2D.zoom -= Vector2(0.4, 0.4) vision += 25
color.g -= 0.25 color.g -= 0.25
buff.colors.BLUE: buff.colors.BLUE:
speed += 12 speed += 12
@@ -48,3 +53,6 @@ func new_target_point():
#point_delta = point_delta.normalized() #point_delta = point_delta.normalized()
#closest_point += point_delta * 32 #closest_point += point_delta * 32
nav_agent.target_position = closest_point nav_agent.target_position = closest_point
func reach_rocket():
at_rocket = true

View File

@@ -1,14 +1,21 @@
extends CharacterBody2D extends CharacterBody2D
class_name Entity class_name Entity
signal death signal death(entity: Entity)
var alliance: Buff.colors
var attack_pow: int = 0
var color := Color.WHITE var color := Color.WHITE
@export var speed = 100 @export var speed = 80
var lives: int = 1 var lives: int = 1
func received_buff(color: Buff.colors) -> void:
if alliance == color:
attack_pow += 6
else:
attack_pow -= 3
func hit() -> void: func hit() -> void:
lives -= 1 lives -= 1
if lives <= 0: if lives <= 0:
death.emit() death.emit(self)
queue_free()

5
scripts/has_won.gd Normal file
View File

@@ -0,0 +1,5 @@
extends Node
var won := false
var inital_load := true
var escaped = {}

View File

@@ -7,6 +7,8 @@ class_name HUD
@onready var texture_rect: TextureRect = $PanelContainer/MarginContainer/VBoxContainer/TextureRect @onready var texture_rect: TextureRect = $PanelContainer/MarginContainer/VBoxContainer/TextureRect
@onready var lives_container: GridContainer = $PanelContainer/MarginContainer/VBoxContainer/LivesContainer @onready var lives_container: GridContainer = $PanelContainer/MarginContainer/VBoxContainer/LivesContainer
@onready var entity_count_label: Label = $EntityCountContainer/MarginContainer/EntityCountLabel @onready var entity_count_label: Label = $EntityCountContainer/MarginContainer/EntityCountLabel
@onready var rocket_spawned_toast: PanelContainer = $RocketSpawnedToast
@onready var alliance_texture: TextureRect = $PanelContainer/MarginContainer/VBoxContainer/AllianceContainer/MarginContainer/AllianceTexture
const HEART = preload("res://assets/heart.png") const HEART = preload("res://assets/heart.png")
func _on_player_color_changed(color: Color) -> void: func _on_player_color_changed(color: Color) -> void:
@@ -27,3 +29,19 @@ func _on_player_lives_changed(lives: int) -> void:
func update_entity_count(count: int): func update_entity_count(count: int):
entity_count_label.text = "Entity Count: %s" % count entity_count_label.text = "Entity Count: %s" % count
func rocket_placed() -> void:
rocket_spawned_toast.show()
rocket_spawned_toast.get_node("Timer").start()
func _on_timer_timeout() -> void:
rocket_spawned_toast.hide()
func set_alliance(alliance: Buff.colors) -> void:
match alliance:
Buff.colors.RED:
alliance_texture.modulate = Color.RED
Buff.colors.GREEN:
alliance_texture.modulate = Color.GREEN
Buff.colors.BLUE:
alliance_texture.modulate = Color.BLUE

19
scripts/main_menu.gd Normal file
View File

@@ -0,0 +1,19 @@
extends Control
class_name MainMenu
var mazes = ["res://scene/maze_1.tscn"]
@onready var win_loss_label: Label = $HBoxContainer/MarginContainer/VBoxContainer/WinLossLabel
func _on_quit_button_pressed() -> void:
get_tree().quit()
func _on_play_button_pressed() -> void:
get_tree().change_scene_to_file(mazes.pick_random())
func _ready() -> void:
if not HasWon.inital_load:
var won_text = ["YOU WON!!!" if HasWon.won else "You Lost..."]
won_text.append_array(HasWon.escaped.values())
win_loss_label.text = "%s Escaped counts: %s Red, %s Green, %s Blue" % won_text

View File

@@ -3,6 +3,8 @@ class_name Maze
const PLAYER = preload("res://scene/player.tscn") const PLAYER = preload("res://scene/player.tscn")
const ENEMY = preload("res://scene/enemy.tscn") const ENEMY = preload("res://scene/enemy.tscn")
const ROCKET = preload("res://scene/rocket.tscn")
const MAIN_MENU = "res://scene/main_menu.tscn"
var spawn_locations: Array[Vector2] = [] var spawn_locations: Array[Vector2] = []
@@ -11,6 +13,7 @@ var spawn_locations: Array[Vector2] = []
@onready var entity_container: Node = $EntityContainer @onready var entity_container: Node = $EntityContainer
func _ready() -> void: func _ready() -> void:
HasWon.inital_load = false
var spawn_zone_array := spawn_zones.get_children() var spawn_zone_array := spawn_zones.get_children()
for spawn_zone in spawn_zone_array: for spawn_zone in spawn_zone_array:
var zone := spawn_zone.get_child(0) as CollisionShape2D var zone := spawn_zone.get_child(0) as CollisionShape2D
@@ -20,18 +23,40 @@ func _ready() -> void:
spawn_locations.append(top_left + Vector2(x * 16, y * 16)) spawn_locations.append(top_left + Vector2(x * 16, y * 16))
hud.update_entity_count(spawn_locations.size()) hud.update_entity_count(spawn_locations.size())
var player_loc: Vector2 = spawn_locations.pick_random() var player_loc: Vector2 = spawn_locations.pick_random()
var alliegences: Array[Buff.colors] = []
for spawn in spawn_locations: for spawn in spawn_locations:
var entity var entity: Entity
if spawn == player_loc: if spawn == player_loc:
entity = PLAYER.instantiate() entity = PLAYER.instantiate()
entity.alliance = get_random_alliance(alliegences)
hud.set_alliance(entity.alliance)
entity.color_changed.connect(hud._on_player_color_changed) entity.color_changed.connect(hud._on_player_color_changed)
entity.lives_changed.connect(hud._on_player_lives_changed) entity.lives_changed.connect(hud._on_player_lives_changed)
else: else:
entity = ENEMY.instantiate() entity = ENEMY.instantiate()
entity.alliance = get_random_alliance(alliegences)
entity.position = spawn entity.position = spawn
entity.death.connect(_on_entity_death) entity.death.connect(_on_entity_death)
entity_container.add_child(entity) entity_container.add_child(entity)
func _on_entity_death(): func get_random_alliance(alliegences: Array[Buff.colors]) -> Buff.colors:
var entities = entity_container.get_child_count() if alliegences.size() == 0:
alliegences.append_array([Buff.colors.RED, Buff.colors.GREEN, Buff.colors.BLUE])
return alliegences.pop_at(randi_range(0, alliegences.size() - 1))
func _on_entity_death(entity: Entity):
var entities = entity_container.get_child_count() - 1
hud.update_entity_count(entities) hud.update_entity_count(entities)
entity.queue_free()
func _on_rocket_timer_timeout() -> void:
var rocket_location: Node2D = spawn_zones.get_children().pick_random().get_child(0)
var rocket = ROCKET.instantiate()
rocket.global_position = rocket_location.global_position
rocket.game_over.connect(_on_game_over)
add_child(rocket)
hud.rocket_placed()
func _on_game_over() -> void:
get_tree().change_scene_to_file(MAIN_MENU)

View File

@@ -18,6 +18,7 @@ func _physics_process(delta: float) -> void:
if collision.get_collider() is Chest: if collision.get_collider() is Chest:
var buff: Buff = collision.get_collider().open(self) var buff: Buff = collision.get_collider().open(self)
if buff: if buff:
super.received_buff(buff.color)
match(buff.color): match(buff.color):
buff.colors.RED: buff.colors.RED:
lives += 1 lives += 1
@@ -33,6 +34,7 @@ func _physics_process(delta: float) -> void:
color_changed.emit(color) color_changed.emit(color)
if Input.is_action_just_pressed("ui_accept"): if Input.is_action_just_pressed("ui_accept"):
var attack: Attack = ATTACK.instantiate() if attack_pow > 0:
attack.set_initiator(self) var attack: Attack = ATTACK.instantiate()
get_parent().add_sibling(attack) attack.set_initiator(self)
get_parent().add_sibling(attack)

41
scripts/rocket.gd Normal file
View File

@@ -0,0 +1,41 @@
extends Node2D
signal game_over
@onready var leave_timer: Timer = $LeaveTimer
@onready var collection_zone: Area2D = $CollectionZone
@onready var countdown_label: Label = $CountdownLabel
var countdown = 5
var count = -1
func _on_collection_zone_body_entered(body: Node2D) -> void:
leave_timer.start()
count = countdown
countdown_label.text = str(count)
countdown_label.show()
if body is Enemy:
body.reach_rocket()
func _on_collection_zone_body_exited(body: Node2D) -> void:
if collection_zone.get_overlapping_bodies().size() == 0:
leave_timer.stop()
countdown_label.hide()
func _on_leave_timer_timeout() -> void:
count -= 1
countdown_label.text = str(count)
if count == 0:
for clr in Buff.colors:
HasWon.escaped[clr] = 0
var escaped: Array[Node2D] = collection_zone.get_overlapping_bodies()
HasWon.won = false
for entity: Entity in escaped:
HasWon.escaped[Buff.colors.keys()[entity.alliance]] += 1
if entity is Player:
HasWon.won = true
game_over.emit()