From ecd9ebd48602a24f52993ff9fb4164b984f52a12 Mon Sep 17 00:00:00 2001 From: Tabby <41929769+tabby-cat-nya@users.noreply.github.com> Date: Sat, 17 May 2025 14:21:38 +1000 Subject: [PATCH] cooking --- bugs.md | 26 +++++++++--- game_logic.gd | 20 ++++++++- game_manager.gd | 2 +- games/bomb defusal/bomb_defusal.gd | 4 +- games/bomb defusal/bomb_defusal.tscn | 24 +++++++++++ games/crafting/crafting.gd | 2 +- games/crafting/crafting.tscn | 52 ++++++++++++++++++------ games/crafting/craftingbg.tres | 14 +++++++ games/ddr/ddr.gd | 3 +- games/ddr/ddr.tscn | 39 +++++++++++++++++- games/platformer/existWhenGaming.gd | 19 +++++++++ games/platformer/existWhenGaming.gd.uid | 1 + games/platformer/platformer.gd | 3 ++ games/platformer/platformer.tscn | 29 ++++++++++--- sprites/battery.pdn | Bin 0 -> 4224 bytes sprites/batteryEmpty.png | Bin 0 -> 421 bytes sprites/batteryEmpty.png.import | 34 ++++++++++++++++ sprites/batteryFull.png | Bin 0 -> 458 bytes sprites/batteryFull.png.import | 34 ++++++++++++++++ sprites/heart.pdn | Bin 0 -> 3995 bytes sprites/heart.png | Bin 0 -> 454 bytes sprites/heart.png.import | 34 ++++++++++++++++ 22 files changed, 308 insertions(+), 32 deletions(-) create mode 100644 games/crafting/craftingbg.tres create mode 100644 games/platformer/existWhenGaming.gd create mode 100644 games/platformer/existWhenGaming.gd.uid create mode 100644 sprites/battery.pdn create mode 100644 sprites/batteryEmpty.png create mode 100644 sprites/batteryEmpty.png.import create mode 100644 sprites/batteryFull.png create mode 100644 sprites/batteryFull.png.import create mode 100644 sprites/heart.pdn create mode 100644 sprites/heart.png create mode 100644 sprites/heart.png.import diff --git a/bugs.md b/bugs.md index 64af132..df06a9e 100644 --- a/bugs.md +++ b/bugs.md @@ -2,10 +2,11 @@ - [x] Finish Platformer - [ ] Finish Space Invaders - [ ] Finish Bullet Hell -- [ ] Finish Bomb Defusal -- [ ] Finish DDR +- [x] Finish Bomb Defusal +- [x] Finish DDR - [ ] Finish Asteroids -- [ ] Finish Crafting +- [x] Finish Crafting +- [ ] Game Over # High Priority - [ ] remote breaking animation not working @@ -13,13 +14,28 @@ - [x] lasers not appearing - [x] only 1 lane getting warning - [x] platformer works once but having trouble getting it to replay +- [ ] menu credits +- [ ] menu exit? (not visible in web build) +- [ ] still need a player!!! (make it the cat from catdash?) + +## Publishing +- [ ] check if web build works well +- [ ] finish itch page +- [ ] upload game and possible executable +- [ ] submit to jam! # Minor -- [ ] score text is infront of the player -- [ ] warning areas are infront of the player +- [x] score text is infront of the player +- [x] warning areas are infront of the player +- [ ] make score and life only appear when game starts # Ideas - [x] Have tick/cross effect appear on a won/failed game - [ ] 1 more game - [ ] 2 more games - [ ] standardized timer display + +# Sounds +- [ ] win sound +- [ ] lose sound +- [ ] kanes zoom out sound diff --git a/game_logic.gd b/game_logic.gd index abecfa0..8ae9208 100644 --- a/game_logic.gd +++ b/game_logic.gd @@ -35,9 +35,11 @@ func _ready() -> void: GameManager.channel_win.connect(rec_channel_win) GameManager.channel_lose.connect(rec_channel_lose) if(gamemode == Gamemode.Story): + main_camera.zoom = Vector2(3.1,3.1) main_channel.start_specific_channel(platformer_game) if(GameManager.are_we_skipping_intro): + zooming_out = true main_camera.zoom = Vector2(1,1) GameManager.skip_intro.emit() @@ -47,7 +49,10 @@ func _process(delta: float) -> void: #if(Input.is_action_just_pressed("ui_down")): #main_channel.start_channel() #so this works if(zooming_out): - var zoom_amount : float = clampf(main_camera.zoom.x - delta * zoom_speed,1, 4 ) + var zoom_amount : float = clampf(main_camera.zoom.x - delta * zoom_speed,1, 3.1 ) #was 4? + main_camera.zoom = Vector2(zoom_amount,zoom_amount) + else: + var zoom_amount : float = clampf(main_camera.zoom.x + delta * zoom_speed,1, 3.1 ) #was 4? main_camera.zoom = Vector2(zoom_amount,zoom_amount) if(gameplay): game_loop(delta) @@ -55,6 +60,9 @@ func _process(delta: float) -> void: func zoom_out(): zooming_out = true +func zoom_in(): + zooming_out = false + func get_ready(): for channel in outer_channels: channel.channel_mode = channel.Mode.Static @@ -99,4 +107,12 @@ func rec_channel_lose(): lives -= 1 GameManager.send_update_data(score, lives) if(lives <= 0): - game_over.emit() + game_over_gg() + +func game_over_gg(): + zoom_in() + game_over.emit() + gameplay = false + main_channel.end_channel() + for channel in outer_channels: + channel.make_offline() diff --git a/game_manager.gd b/game_manager.gd index 9f90057..1a3fdb6 100644 --- a/game_manager.gd +++ b/game_manager.gd @@ -44,7 +44,7 @@ func prepare_for_gaming(): prepare.emit() # as soon as the player dismisses this chat the game is afoot GameManager.show_item("Broken TV Remote", broken_tv_remote) - GameManager.show_chat("[color=red]ALERT: Intruder Detected... Initiating Security Protocol...") + GameManager.show_chat("[color=red][shake]ALERT: Intruder Detected... Initiating Security Protocol...") pass func actually_gaming(): diff --git a/games/bomb defusal/bomb_defusal.gd b/games/bomb defusal/bomb_defusal.gd index 6531144..971ea86 100644 --- a/games/bomb defusal/bomb_defusal.gd +++ b/games/bomb defusal/bomb_defusal.gd @@ -40,8 +40,8 @@ func _process(delta: float) -> void: prompt.modulate = Color(1, timer/time_limit, timer/time_limit) progress1.modulate = Color(1, timer/time_limit, timer/time_limit) progress2.modulate = Color(1, timer/time_limit, timer/time_limit) - camera.zoom = Vector2(2 - timer/time_limit,2 - timer/time_limit) - camera.rotation_degrees = rot_dir * (1-timer/time_limit) * 30 + camera.zoom = Vector2(1.5 - (timer/time_limit)*0.5,1.5 - (timer/time_limit)*0.5) + camera.rotation_degrees = rot_dir * (1-timer/time_limit) * 15 #TODO Surely theres a better way if Input.is_action_just_pressed("bomb_0"): diff --git a/games/bomb defusal/bomb_defusal.tscn b/games/bomb defusal/bomb_defusal.tscn index 9e76329..f11b322 100644 --- a/games/bomb defusal/bomb_defusal.tscn +++ b/games/bomb defusal/bomb_defusal.tscn @@ -73,3 +73,27 @@ show_percentage = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(320, 180) ignore_rotation = false + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +offset_left = 429.0 +offset_top = 338.0 +offset_right = 746.0 +offset_bottom = 416.0 +rotation = -1.57079 +theme_override_font_sizes/normal_font_size = 45 +bbcode_enabled = true +text = "[shake]Type the Code" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="RichTextLabel2" type="RichTextLabel" parent="."] +offset_left = 211.0 +offset_top = 23.0 +offset_right = 528.0 +offset_bottom = 101.0 +rotation = 1.57079 +theme_override_font_sizes/normal_font_size = 45 +bbcode_enabled = true +text = "[shake]Type the Code" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/games/crafting/crafting.gd b/games/crafting/crafting.gd index 052fa79..f93a557 100644 --- a/games/crafting/crafting.gd +++ b/games/crafting/crafting.gd @@ -8,7 +8,7 @@ signal game_lose @export_group("Node References") @export var pixel_grid : GridContainer -@export var timer_progress : ProgressBar +@export var timer_progress : TextureProgressBar var pixels : Array[Control] var current_time : float = 25 diff --git a/games/crafting/crafting.tscn b/games/crafting/crafting.tscn index 91ddf18..069b453 100644 --- a/games/crafting/crafting.tscn +++ b/games/crafting/crafting.tscn @@ -1,33 +1,51 @@ -[gd_scene load_steps=5 format=3 uid="uid://drk2fwkv816qv"] +[gd_scene load_steps=6 format=3 uid="uid://drk2fwkv816qv"] [ext_resource type="Script" uid="uid://b4ps00o1tpuft" path="res://games/crafting/crafting.gd" id="1_51qhm"] +[ext_resource type="Texture2D" uid="uid://cfyjy4tgni7oe" path="res://games/crafting/craftingbg.tres" id="2_51qhm"] -[sub_resource type="Gradient" id="Gradient_51qhm"] -colors = PackedColorArray(0.774014, 0.581042, 1, 1, 1, 0.595754, 0.986362, 1) +[sub_resource type="Gradient" id="Gradient_8e2i7"] +colors = PackedColorArray(0.392157, 0.588235, 1, 1, 1, 0, 0, 1) -[sub_resource type="FastNoiseLite" id="FastNoiseLite_8e2i7"] -noise_type = 0 -fractal_type = 3 - -[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_26tlc"] +[sub_resource type="GradientTexture2D" id="GradientTexture2D_26tlc"] +gradient = SubResource("Gradient_8e2i7") width = 360 height = 180 -color_ramp = SubResource("Gradient_51qhm") -noise = SubResource("FastNoiseLite_8e2i7") +fill_from = Vector2(1, 0) +fill_to = Vector2(1, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_51qhm"] +font_size = 32 +font_color = Color(0, 0, 0, 1) [node name="Crafting" type="Node" node_paths=PackedStringArray("pixel_grid", "timer_progress")] script = ExtResource("1_51qhm") keys = Array[String](["Q", "E", "R", "T", "Y", "U", "F", "M"]) pixel_grid = NodePath("CenterContainer/VBoxContainer/GridContainer") -timer_progress = NodePath("CenterContainer/VBoxContainer/Timer") +timer_progress = NodePath("TextureProgressBar") -[node name="TextureRect" type="TextureRect" parent="."] +[node name="TextureProgressBar" type="TextureProgressBar" parent="."] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = SubResource("NoiseTexture2D_26tlc") +max_value = 1.0 +step = 0.0 +value = 1.0 +fill_mode = 3 +nine_patch_stretch = true +texture_under = SubResource("GradientTexture2D_26tlc") +texture_progress = ExtResource("2_51qhm") + +[node name="TextureRect" type="TextureRect" parent="."] +visible = false +self_modulate = Color(0.564962, 0.564962, 0.564962, 1) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_51qhm") [node name="CenterContainer" type="CenterContainer" parent="."] anchors_preset = 15 @@ -44,6 +62,14 @@ layout_mode = 2 columns = 5 [node name="Timer" type="ProgressBar" parent="CenterContainer/VBoxContainer"] +visible = false layout_mode = 2 max_value = 1.0 step = 0.0 + +[node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] +layout_mode = 2 +text = "Press the Letters!" +label_settings = SubResource("LabelSettings_51qhm") +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/games/crafting/craftingbg.tres b/games/crafting/craftingbg.tres new file mode 100644 index 0000000..58e68b1 --- /dev/null +++ b/games/crafting/craftingbg.tres @@ -0,0 +1,14 @@ +[gd_resource type="NoiseTexture2D" load_steps=3 format=3 uid="uid://cfyjy4tgni7oe"] + +[sub_resource type="Gradient" id="Gradient_51qhm"] +colors = PackedColorArray(0.774014, 0.581042, 1, 1, 1, 0.595754, 0.986362, 1) + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_8e2i7"] +noise_type = 0 +fractal_type = 3 + +[resource] +width = 360 +height = 180 +color_ramp = SubResource("Gradient_51qhm") +noise = SubResource("FastNoiseLite_8e2i7") diff --git a/games/ddr/ddr.gd b/games/ddr/ddr.gd index 02af982..259d7f9 100644 --- a/games/ddr/ddr.gd +++ b/games/ddr/ddr.gd @@ -10,7 +10,7 @@ var next_note : float = 99 @export_group("Node References") -@export var combo_label : Label +@export var score_label : Label var score: int = 0 @@ -36,6 +36,7 @@ func _process(delta: float) -> void: detect_hit(2) if(Input.is_action_just_pressed("ddr_right")): detect_hit(3) + score_label.text = str(score) + "/" + str(win_amount) func spawn_note(): var ran_path = randi_range(0, paths.size()-1) diff --git a/games/ddr/ddr.tscn b/games/ddr/ddr.tscn index 90a0e65..0f46d9a 100644 --- a/games/ddr/ddr.tscn +++ b/games/ddr/ddr.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://b5lh8cnwu8xhg"] +[gd_scene load_steps=10 format=3 uid="uid://b5lh8cnwu8xhg"] [ext_resource type="PackedScene" uid="uid://dgg4fsg4xhdwa" path="res://games/ddr/note_path.tscn" id="1_wdky4"] [ext_resource type="Script" uid="uid://dv72o4x8p6raq" path="res://games/ddr/ddr.gd" id="1_wvoco"] @@ -17,9 +17,16 @@ fill = 2 fill_from = Vector2(0.542735, 1) fill_to = Vector2(0.487179, 0) -[node name="Ddr" type="Node" node_paths=PackedStringArray("paths")] +[sub_resource type="LabelSettings" id="LabelSettings_i3ush"] +font_size = 36 + +[sub_resource type="LabelSettings" id="LabelSettings_wvoco"] +font_size = 121 + +[node name="Ddr" type="Node" node_paths=PackedStringArray("paths", "score_label")] script = ExtResource("1_wvoco") paths = [NodePath("left_path"), NodePath("down_path"), NodePath("up_path"), NodePath("right_path")] +score_label = NodePath("VBoxContainer/Score") [node name="TextureRect" type="TextureRect" parent="."] anchors_preset = 15 @@ -46,3 +53,31 @@ arrow_texture = ExtResource("3_wvoco") position = Vector2(577, 40) arrow_texture = ExtResource("4_i3ush") arrow_rotation = 90 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +offset_left = 4.0 +offset_top = 15.0 +offset_right = 341.0 +offset_bottom = 350.0 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Press the Arrows!" +label_settings = SubResource("LabelSettings_i3ush") +horizontal_alignment = 1 + +[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/normal_font_size = 81 +bbcode_enabled = true +text = "[wave amp=100][rainbow freq=0.1 speed=10]Combo" +fit_content = true +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Score" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "0/5" +label_settings = SubResource("LabelSettings_wvoco") +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/games/platformer/existWhenGaming.gd b/games/platformer/existWhenGaming.gd new file mode 100644 index 0000000..8083711 --- /dev/null +++ b/games/platformer/existWhenGaming.gd @@ -0,0 +1,19 @@ +extends Control + +var become_real : bool = false +var realness : float = 0 +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + GameManager.gaming.connect(appear) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + if(become_real): + realness += delta/2 + modulate = Color(1,1,1,clampf(realness, 0,0.5)) + if(realness > 0.5): + become_real = false + +func appear(): + become_real = true diff --git a/games/platformer/existWhenGaming.gd.uid b/games/platformer/existWhenGaming.gd.uid new file mode 100644 index 0000000..0690a84 --- /dev/null +++ b/games/platformer/existWhenGaming.gd.uid @@ -0,0 +1 @@ +uid://bnprbj4be8n7j diff --git a/games/platformer/platformer.gd b/games/platformer/platformer.gd index 3adfd7e..f817321 100644 --- a/games/platformer/platformer.gd +++ b/games/platformer/platformer.gd @@ -19,6 +19,7 @@ enum GameStage{ @export var timer : Timer @export var warning_areas : Array[Node2D] @export var laser_areas : Array[Area2D] +@export var lifebar : TextureProgressBar var game_active : bool = false var stage : GameStage = GameStage.None @@ -49,6 +50,7 @@ func _process(delta: float) -> void: func update_ui(score : int, lives :int): score_label.text = str(score) + lifebar.value = lives func rec_skip_intro(): #teleport player to doorway @@ -65,6 +67,7 @@ func start_game(): func end_game(): # set stage back to none? + stage = GameStage.None game_active = false pass diff --git a/games/platformer/platformer.tscn b/games/platformer/platformer.tscn index 7111f6b..b049938 100644 --- a/games/platformer/platformer.tscn +++ b/games/platformer/platformer.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=36 format=4 uid="uid://ckbyiwy0dxbsd"] +[gd_scene load_steps=39 format=4 uid="uid://ckbyiwy0dxbsd"] [ext_resource type="Script" uid="uid://dqyddqx8xm0gw" path="res://games/platformer/player.gd" id="1_1wj3w"] [ext_resource type="Script" uid="uid://bs4keltwfbrrn" path="res://games/platformer/platformer.gd" id="1_mauky"] @@ -15,7 +15,10 @@ [ext_resource type="Texture2D" uid="uid://r71wb0u4bsxw" path="res://sprites/broken_tv_remote.png" id="11_vuxiy"] [ext_resource type="Script" uid="uid://bl7sx7fl7ye4a" path="res://games/platformer/tv_remote.gd" id="13_7gl5q"] [ext_resource type="PackedScene" uid="uid://dv4ex5tshavff" path="res://games/platformer/door.tscn" id="14_yphhh"] +[ext_resource type="Script" uid="uid://bnprbj4be8n7j" path="res://games/platformer/existWhenGaming.gd" id="16_g0mja"] +[ext_resource type="Texture2D" uid="uid://dwwqsaepieo3c" path="res://sprites/batteryEmpty.png" id="16_p7238"] [ext_resource type="Texture2D" uid="uid://bvnudttaiaab5" path="res://sprites/platformer_lab_laser.png" id="16_wtveo"] +[ext_resource type="Texture2D" uid="uid://bm6lkjpvfdqn3" path="res://sprites/batteryFull.png" id="17_g0mja"] [ext_resource type="Texture2D" uid="uid://dyfubdnvunea2" path="res://sprites/whiteSqaure.png" id="17_x1jr7"] [ext_resource type="Script" uid="uid://bvldm4nv0g3" path="res://games/platformer/flasher.gd" id="18_x1jr7"] @@ -191,7 +194,7 @@ font_color = Color(1, 1, 1, 0.439216) [sub_resource type="RectangleShape2D" id="RectangleShape2D_gyyvr"] size = Vector2(576, 64) -[node name="Platformer" type="Node" node_paths=PackedStringArray("score_label", "player", "skip_location", "timer", "warning_areas", "laser_areas")] +[node name="Platformer" type="Node" node_paths=PackedStringArray("score_label", "player", "skip_location", "timer", "warning_areas", "laser_areas", "lifebar")] script = ExtResource("1_mauky") score_label = NodePath("Score") player = NodePath("Player") @@ -199,6 +202,7 @@ skip_location = NodePath("IntroSkipLocation") timer = NodePath("Timer") warning_areas = [NodePath("Warnings/WarningNode"), NodePath("Warnings/WarningNode2"), NodePath("Warnings/WarningNode3")] laser_areas = [NodePath("Lasers/LaserSet"), NodePath("Lasers/LaserSet2"), NodePath("Lasers/LaserSet3")] +lifebar = NodePath("Lifebar") [node name="Parallax2D" type="Parallax2D" parent="."] scroll_scale = Vector2(0, 0) @@ -330,12 +334,27 @@ move_speed = 1000.0 [node name="Score" type="Label" parent="."] z_index = -1 offset_left = 208.0 -offset_top = 160.0 +offset_top = 176.0 offset_right = 432.0 -offset_bottom = 279.0 -text = "00" +offset_bottom = 295.0 +text = "0" label_settings = SubResource("LabelSettings_yphhh") horizontal_alignment = 1 +script = ExtResource("16_g0mja") + +[node name="Lifebar" type="TextureProgressBar" parent="."] +modulate = Color(1, 1, 1, 0.678431) +z_index = -1 +offset_left = 248.0 +offset_top = 144.0 +offset_right = 296.0 +offset_bottom = 160.0 +scale = Vector2(3, 3) +max_value = 3.0 +value = 3.0 +texture_under = ExtResource("16_p7238") +texture_progress = ExtResource("17_g0mja") +script = ExtResource("16_g0mja") [node name="IntroSkipLocation" type="Marker2D" parent="."] position = Vector2(-40, 256) diff --git a/sprites/battery.pdn b/sprites/battery.pdn new file mode 100644 index 0000000000000000000000000000000000000000..a56e2c73abb245de90c88d78de2f1f4e066a13e9 GIT binary patch literal 4224 zcmd^BS#KLv6rO2p$4&z+Wea7gF$fAyy~NI9DNZ$GJE_xp&$vlT6(;uWc#`pqnI*CF zP>?_%L?r~`fwv+dAr^@r07$e*h!-9}s>%aG0*OTkQ3L`}L1{SWjuYFZtP)SXme1UC z@0su1d)CP(vyqeAn8`*}P1i+9Pw*MaBH@q98M|qlCbg+#~~P(;&_ec3moVNrMSc!TYM4ugv4`e_C9@OrhWi~ zsr(#;z&Ck&hUc9@zAX>>SGbDJB)L{*9kii6=)LVbXviRcU<(Y72KZ_Fz3KF54o<;! zaGDw0lAKhWP03dIz(E0R#)IvPd^uUmhmWM2U@IxXWqE&aB9e%vi`n(YSSmCU<+A(p-Mb2<3v!hAGH+ zw0TwJ=8Iu<{7{qbS>6?v&+j%Xl+zrVM_()hSIS{WS+$0AV@nur}6{y)Kw9X*DZXFPpC zLh#>-4A_eCIDt5E`N}p!8COHp!8JQMT^CzuNdKaY#@^AjV94uaR~Nr(S11R-U(wID zFOYgL7Cikx@D%uTpwi3SM9;C95tlXHwV07reDId6R6UDDvMOUWgqOg*Za3cOIQ&oD z#W1^{14vw;fsG)2pI;RYcU*uZzB;aoLDaWGTFzBWRhD&mVBwm(NmD)^FhwbHG<3{0 z087b9T=L3Q=%t}iXsl3-Xoodh4HEZ__`DP#?h|IF8%t`znp-Ig>7-y~O3@a_*=3Xc z3G9ltbq)4tiK3QkU@6$qG7`h~jamTPRsv1DtptiRt;6gOn}9od07nrJ({#KGZ~}lR zAbca(fN+mC-~zN4?3FNV;O{npcl7{|A@KE=1H-}oDez93qX6K!0m+R>ZUQnecr(zR zUXjpr(kYJru~(p$o4X4-FPn9-LCZRA7Y$u&5Z#oC(QjD#aj`;n(oKJ-k8HOWXd4-{ z=XNt`OLib=@p0_?6Mg7-<@e$a#y+~;wHHV~J(_pK*3E3N=Rh~=hdqYH#GsIV3(?Ur#O1TwFhR z@x;4(HgZ3I^UMbOiFR&m``+~OW47`RGS@+_JUH~r=`&|O+sL1O@%$cZ|GtZn56%x+ z8>inSXMaoVc>0Zp&;EATE0=b^eqI`ShhZMM@8ORwM=STBIUi;BUXm{4?tdv6eC3xX zAKJed|9z8i7_KU9?+WwQ<9%otR K+qd)&QN`~=K-8ZA literal 0 HcmV?d00001 diff --git a/sprites/batteryEmpty.png b/sprites/batteryEmpty.png new file mode 100644 index 0000000000000000000000000000000000000000..02ef2316ca3e4c1a1de6c4c2d4d5429ce0fbce71 GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3-qR3wWA=6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H$efS0L@+-~c53?>xQ%q?k*B{DS}gXSjZf7pRtjv%n*=n1O-sFbFdq z&tH)O6qG1&jVKAuPb(=;EJ|evNX*PD(erZ+Q83jr)HC|Mhj|-N&9>AC&ooa@Ed~xC zhm}E!k(GfF$npYWX($`yVhu)Sus9QtZOF*PAONJJfHC!*ursg#RTvl<8!#?_mEak-;eU0KAs>SR2eaev|K{9Hg639L!oE9LI1Vv5yWEyZ4EfS) z8lM=qNAa}pNi~+*#C}%}!?5^*I`J1v*Q%UP{7%g5Z+Dvw{6;{f3);3#%aqT!LeiK$0$x&|HN?;J8^91my)h`U+j(TU9-E6 z<6h{Y;sOVddO`?#=!p|Oa0Cfagy4V#CxnDRr9u=AAVj5}T4vtHwOv|TkT~_NcJ|G@ z_r7^=X5P%sMUuXY9n4roQsQMHPnv|vUN2Q6W+3WzcT8N*1S@Ga-cqtTLTta;#5g@a*+T>(z zxKPBga(Q7ny|^-!POE$v1$>H+<)afkA4R4QNvzi3Lowv1`6%Gfak@lU7J)%NG>hZ3 z(V6CHm#KixhjrmpsAeusMB?WYppCCJtb!94^KfWtB|_Ix0(xM5-dva6DEfIm&Np$Q zHEK;h9Eujx(?eOYLTwcFPR&OrveOeuX=AyVgagL;+R~uUs|?5D`Q)OO7iQNNr~Ldz zhJk&SG(YFz<&2V+q&VGev^0?^rmLxPIP7u`jE@a80%V{OdE*QV55wGrhF@%59YE&h z1X(d6s*xmyJ0ciDzq1i}_Xl3TGh8hhRgDA{QZ+Q8)bE_D=1Q_SP3jr7NR*&bEtRYY zf1nLj6{}^U7&aK#A?p!Yuc$haY-ZG3>7B5d*MYki{(GxB(GtWEB-m5jAZ4AgFidAB zd$1LH1~1NxtQ&X~hhulTuESLK_6dGsxB0MIDiP6u>!iD5L?N0ix?$4`La9msPCGZa zy1G3zZD_KR?{}7UQPoOvu4xXx+k?-et&kfT5r)K}VQ;|aC!W#3+5Z0%{OsykJUqj7 z0_om3wdZ`&df|8>(hoOUMd-LRGmWaclErQ^qU^i@?1O2cBph-gkQ$ z=Ex<6v7>+nHiC5Ccp@Bbxeb^2$v7&8OlOhQt($mNS=PpZVAn~qC9k^;A@5uDoVD!$ zQDh87PFV`Ne4ZhfvjoYAR#~H7A+)YifS@ZIo2cZJR5epv$i^etY9j5g^L#LfX_LJL zc17FTy4tk(QOhn64K%e32B3sfEl{&fB|evPTM5(+6Y!4);GQS1T8zH^tt-;zHqaid!|_b(kg1%~b^rw74k0-Vq?w_g28KlgQ%fI# z4tEqtbHXuTthn&sZ5mUqJqHe#W-FG{ty|1OMGct)dS6o2%0g+I#XZt}9!H(H&j%eF z;zKsg?0`$2PK&)tpN1GBO!lDRe z^7kJDJJtv|ahI%z1hJUc)T$!c)rug>MxCRkNT?EFu@YLIlz#%2?Kslvd>Wb5-Dr!3 z!)-lalO0W~aZcb__OA7NNHG7fo(36BPHSt71JSUt7{xTyUC3cLV=T3~911tXVrZk= zZ6|@)>DHWsrf%jg`z`23{V>K@F(Mx`ig7+}#fo9|usFmZaKI(V8--y%R}l0$`UB*U z$U4z9BEc}nvKXl}58{`#JLv}rv?t^*gGC>r^;vWonzU(NS%G|>0G|+7ApO6-{y&gnVEAsd`8|+gDGBlm{{R0!gM-$}FF-zLfk$L90|Vb- z5N14{zaj-FC{f}XQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXY_jy^ERNGZK)BSX`Y^1 z3>-iXD}xjxD+42tQ+t_km>8`;uxY49NXK;%b>u)%=+zq