diff --git a/Main.tscn b/Main.tscn index bf86ccf..bb2a25a 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,10 +1,13 @@ -[gd_scene load_steps=6 format=3 uid="uid://bs6ojoud4mvb8"] +[gd_scene load_steps=9 format=3 uid="uid://bs6ojoud4mvb8"] [ext_resource type="Script" path="res://main.gd" id="1_x66oe"] [ext_resource type="PackedScene" uid="uid://ccdhbljb3e0oh" path="res://src/ui/MainUI.tscn" id="2_anen6"] [ext_resource type="PackedScene" uid="uid://cr2nvts234wlw" path="res://src/manager/TimeManager.tscn" id="2_rrhko"] [ext_resource type="Texture2D" uid="uid://c37jv23kd15ay" path="res://parts/zones/images/home.png" id="3_kjcur"] [ext_resource type="AudioStream" uid="uid://br26r6ck51wa1" path="res://Bossa Monstra.wav" id="5_qgck0"] +[ext_resource type="AudioStream" uid="uid://c06j2q7c0j6br" path="res://sfx/UI Click 2.wav" id="6_xxay8"] +[ext_resource type="AudioStream" uid="uid://cv6th0edghuyr" path="res://sfx/pick up coin.wav" id="7_612ep"] +[ext_resource type="AudioStream" uid="uid://dpqyst1dkgwnr" path="res://sfx/coin spawn.wav" id="8_ddf5u"] [node name="Main" type="Node2D"] script = ExtResource("1_x66oe") @@ -27,4 +30,16 @@ stream = ExtResource("5_qgck0") volume_db = -18.0 autoplay = true +[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +stream = ExtResource("6_xxay8") +volume_db = 5.0 + +[node name="AudioStreamPlayer3" type="AudioStreamPlayer" parent="."] +stream = ExtResource("7_612ep") +volume_db = -11.0 + +[node name="AudioStreamPlayer4" type="AudioStreamPlayer" parent="."] +stream = ExtResource("8_ddf5u") +volume_db = -15.0 + [connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] diff --git a/components/Cursor/Cursor.tscn b/components/Cursor/Cursor.tscn index 99e6fa5..35650ac 100644 --- a/components/Cursor/Cursor.tscn +++ b/components/Cursor/Cursor.tscn @@ -7,7 +7,7 @@ [ext_resource type="AudioStream" uid="uid://bqn8ygvwt58sg" path="res://sfx/pick up.wav" id="5_mmqlh"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4cq27"] -size = Vector2(8, 8) +size = Vector2(4, 4) [node name="Cursor" type="CanvasLayer"] process_mode = 3 diff --git a/components/Cursor/cursor.gd b/components/Cursor/cursor.gd index 41533f4..0e4c46e 100644 --- a/components/Cursor/cursor.gd +++ b/components/Cursor/cursor.gd @@ -41,6 +41,8 @@ func _on_grab_creature(data): grabbed_creature = CREATURE.instantiate() grabbed_creature.key = data.creature grabbed_creature.held = true + grabbed_creature.tiles = data.tiles + grabbed_creature.tiled = data.tiled mouse_control.add_child(grabbed_creature) grabbed_creature.position = Vector2(0, 0) holding = true @@ -58,20 +60,34 @@ func let_go(): new_creature.key = grabbed_creature.key new_creature.position = original_position original_window.add_child(new_creature) + audio_stream_player_2.play() if get_window().get_window_id() == 0: Persister.persist_data("grabbing", false) - - if Persister.get_value("hovered"): - audio_stream_player_2.play() - else: - audio_stream_player.play() if signal_object and signal_object.mouse_in_window: - var new_creature = CREATURE.instantiate() - new_creature.key = grabbed_creature.key - new_creature.global_position = grabbed_creature.global_position - get_window().add_child(new_creature) + if get_window().name == "CreatureWindow": + var new_creature = CREATURE.instantiate() + new_creature.key = grabbed_creature.key + new_creature.global_position = grabbed_creature.global_position + get_window().add_child(new_creature) + audio_stream_player_2.play() + + if grabbed_creature.tiled: + original_window.remove_tiles(grabbed_creature.tiles) + else: + if not get_window().attempt_place(grabbed_creature.key, mouse_control.position, grabbed_creature.tiles): + var new_creature = CREATURE.instantiate() + new_creature.key = grabbed_creature.key + new_creature.position = original_position + new_creature.tiles = grabbed_creature.tiles + new_creature.tiled = grabbed_creature.tiled + original_window.add_child(new_creature) + audio_stream_player.play() + else: + audio_stream_player_2.play() + if grabbed_creature.tiled: + original_window.remove_tiles(grabbed_creature.tiles) grabbed_creature.queue_free() grabbed_creature = null diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..92f019c Binary files /dev/null and b/favicon.ico differ diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..c6e6be5 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="16" height="16" viewBox="0 0 16 16"><image width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACrSURBVDhPY9zzbN1/BgoAigEuUkFQFn4A1ANlMTAwQWmiNYMAslqwAdg0I9sCAuh8mB64C8gFeA0A2QrDuABWA0AaQsp2wTE+gNWA5fdmgOk1XW5gGh/A6wWQ7cEZ9+AGYgM4DQBpBGEYwOUVrAbMtYEoXjtDCYXGBnC6AN0QXABvGCADZO8gA3hewJYak4+gxgLMVSAASxtwF6AnFnTNIAATQ1ZLYXZmYAAAN3hJfOuteYcAAAAOZVhJZk1NACoAAAAIAAAAAAAAANJTkwAAAABJRU5ErkJggg=="></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } } +@media (prefers-color-scheme: dark) { :root { filter: none; } } +</style></svg> \ No newline at end of file diff --git a/favicon.svg.import b/favicon.svg.import new file mode 100644 index 0000000..b996745 --- /dev/null +++ b/favicon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rxpgln3d4n8g" +path="res://.godot/imported/favicon.svg-a165518550174d7996e87d364e3b1023.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://favicon.svg" +dest_files=["res://.godot/imported/favicon.svg-a165518550174d7996e87d364e3b1023.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/main.gd b/main.gd index 2923685..d7365ea 100644 --- a/main.gd +++ b/main.gd @@ -13,12 +13,18 @@ var build_object @onready var upgrade_pool = Data.data.upgrades.keys() @onready var zone_pool = Data.data.zones.keys() +@onready var audio_stream_player_2: AudioStreamPlayer = $AudioStreamPlayer2 +@onready var audio_stream_player_3: AudioStreamPlayer = $AudioStreamPlayer3 +@onready var audio_stream_player_4: AudioStreamPlayer = $AudioStreamPlayer4 func _ready() -> void: Persister.persist_data("creature_resource_spawn_rate", 20) Triggerer.listen("spawn_window", _on_spawn_window) Triggerer.listen("upgrade_menu", _on_build_menu) Triggerer.listen("quit", _on_quit) + Triggerer.listen("creature_sound", _on_creature_sound) + Triggerer.listen("coin_sound", _on_coin_sound) + Triggerer.listen("coin_collect_sound", _on_coin_collect_sound) DisplayServer.window_set_title("Home") get_viewport().transparent_bg = true DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_MOUSE_PASSTHROUGH, true) @@ -29,6 +35,18 @@ func _ready() -> void: add_child(new_buttons) +func _on_creature_sound(_data): + audio_stream_player_2.play() + + +func _on_coin_collect_sound(_data): + audio_stream_player_3.play() + + +func _on_coin_sound(_data): + audio_stream_player_4.play() + + func _process(delta: float) -> void: if Input.is_action_just_pressed("test"): Triggerer.trigger("spawn_window", {"key": ["farm", "desert", "lake", "forest"].pick_random()}) diff --git a/parts/creatures/images/1x1-1.png b/parts/creatures/images/1x1-1.png index 808a583..cc5b737 100644 Binary files a/parts/creatures/images/1x1-1.png and b/parts/creatures/images/1x1-1.png differ diff --git a/parts/creatures/images/1x2-1.png b/parts/creatures/images/1x2-1.png index ba5900d..05af398 100644 Binary files a/parts/creatures/images/1x2-1.png and b/parts/creatures/images/1x2-1.png differ diff --git a/parts/creatures/images/2x1-1.png b/parts/creatures/images/2x1-1.png index bc11a37..2790be2 100644 Binary files a/parts/creatures/images/2x1-1.png and b/parts/creatures/images/2x1-1.png differ diff --git a/parts/creatures/images/2x2-1.png b/parts/creatures/images/2x2-1.png index 852e42d..9d6b732 100644 Binary files a/parts/creatures/images/2x2-1.png and b/parts/creatures/images/2x2-1.png differ diff --git a/parts/upgrades/farm-card.aseprite b/parts/upgrades/farm-card.aseprite index f1f9737..7196f6f 100644 Binary files a/parts/upgrades/farm-card.aseprite and b/parts/upgrades/farm-card.aseprite differ diff --git a/parts/upgrades/farm-card.png b/parts/upgrades/farm-card.png index 9396ab9..378253d 100644 Binary files a/parts/upgrades/farm-card.png and b/parts/upgrades/farm-card.png differ diff --git a/parts/upgrades/more-creature-resources.txt b/parts/upgrades/more-creature-resources.txt index 1dbc544..a25881f 100644 --- a/parts/upgrades/more-creature-resources.txt +++ b/parts/upgrades/more-creature-resources.txt @@ -3,4 +3,4 @@ description: 10% higher chance for a creature to drop coins ev property: creature_resource_spawn_rate type: percent amount: 10 -cost: 10 +cost: 5 diff --git a/parts/upgrades/more-creatures.txt b/parts/upgrades/more-creatures.txt index d0f0ed4..4a41bdf 100644 --- a/parts/upgrades/more-creatures.txt +++ b/parts/upgrades/more-creatures.txt @@ -2,4 +2,4 @@ name: Creature Bait description: 2 More creatures will wander onto your property every day property: creature_amount amount: 2 -cost: 15 +cost: 7 diff --git a/parts/zones/images/farm.png b/parts/zones/images/farm.png index 29f7611..a692e74 100644 Binary files a/parts/zones/images/farm.png and b/parts/zones/images/farm.png differ diff --git a/project.godot b/project.godot index b6b9c83..865a2db 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="ld-56" run/main_scene="res://Main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") -config/icon="res://icon.svg" +config/icon="res://favicon.svg" [autoload] diff --git a/sfx/coin spawn.wav b/sfx/coin spawn.wav new file mode 100644 index 0000000..0f41418 Binary files /dev/null and b/sfx/coin spawn.wav differ diff --git a/sfx/coin spawn.wav.import b/sfx/coin spawn.wav.import new file mode 100644 index 0000000..4456820 --- /dev/null +++ b/sfx/coin spawn.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dpqyst1dkgwnr" +path="res://.godot/imported/coin spawn.wav-f206cd96b45c72a52c96538391684b3c.sample" + +[deps] + +source_file="res://sfx/coin spawn.wav" +dest_files=["res://.godot/imported/coin spawn.wav-f206cd96b45c72a52c96538391684b3c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/sfx/pick up coin.wav b/sfx/pick up coin.wav new file mode 100644 index 0000000..504e1d4 Binary files /dev/null and b/sfx/pick up coin.wav differ diff --git a/sfx/pick up coin.wav.import b/sfx/pick up coin.wav.import new file mode 100644 index 0000000..e34ebf5 --- /dev/null +++ b/sfx/pick up coin.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cv6th0edghuyr" +path="res://.godot/imported/pick up coin.wav-c21724f7cdbce893b4cf124a00df4ec9.sample" + +[deps] + +source_file="res://sfx/pick up coin.wav" +dest_files=["res://.godot/imported/pick up coin.wav-c21724f7cdbce893b4cf124a00df4ec9.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/src/BuildWindow.tscn b/src/BuildWindow.tscn index 6eddfa3..9cb13c0 100644 --- a/src/BuildWindow.tscn +++ b/src/BuildWindow.tscn @@ -20,6 +20,7 @@ size = Vector2(52, 73) [node name="BuildWindow" type="Window"] canvas_item_default_texture_filter = 0 +title = "Shop" position = Vector2i(0, 36) size = Vector2i(900, 500) unresizable = true @@ -72,7 +73,6 @@ offset_right = 83.15 offset_bottom = 145.945 grow_horizontal = 2 bbcode_enabled = true -text = "[center]Test Description" [node name="Upgrade" type="TextureRect" parent="Control"] custom_minimum_size = Vector2(32, 40) diff --git a/src/Coin.tscn b/src/Coin.tscn index b1ebd9c..0edfbcb 100644 --- a/src/Coin.tscn +++ b/src/Coin.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://dyd3gq1oc117t"] +[gd_scene load_steps=6 format=3 uid="uid://dyd3gq1oc117t"] [ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="1_53keb"] [ext_resource type="Script" path="res://src/coin.gd" id="1_l62nl"] [ext_resource type="Texture2D" uid="uid://cndrtahwhbkli" path="res://src/ui/coin.png" id="2_5qokh"] +[ext_resource type="AudioStream" uid="uid://cv6th0edghuyr" path="res://sfx/pick up coin.wav" id="4_rysea"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_6mwyk"] size = Vector2(8, 8) @@ -18,4 +19,8 @@ shape = SubResource("RectangleShape2D_6mwyk") [node name="Sprite2D" type="Sprite2D" parent="."] texture = ExtResource("2_5qokh") +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_rysea") +volume_db = -11.0 + [connection signal="hovered" from="MouseHandler" to="." method="_on_mouse_handler_hovered"] diff --git a/src/Creature.tscn b/src/Creature.tscn index 913bdda..9e7968d 100644 --- a/src/Creature.tscn +++ b/src/Creature.tscn @@ -1,8 +1,10 @@ -[gd_scene load_steps=5 format=3 uid="uid://yao5smo8c43u"] +[gd_scene load_steps=7 format=3 uid="uid://yao5smo8c43u"] [ext_resource type="Script" path="res://src/creature.gd" id="1_34bi4"] [ext_resource type="Texture2D" uid="uid://dnvnm78idadmn" path="res://parts/creatures/images/1x1-1.png" id="2_upgji"] [ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="3_vlaga"] +[ext_resource type="AudioStream" uid="uid://dpqyst1dkgwnr" path="res://sfx/coin spawn.wav" id="4_g8x0y"] +[ext_resource type="AudioStream" uid="uid://c06j2q7c0j6br" path="res://sfx/UI Click 2.wav" id="5_wsv0d"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4rqgs"] size = Vector2(12, 12) @@ -18,4 +20,13 @@ texture = ExtResource("2_upgji") [node name="CollisionShape2D" type="CollisionShape2D" parent="MouseHandler"] shape = SubResource("RectangleShape2D_4rqgs") +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_g8x0y") +volume_db = -15.0 + +[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +stream = ExtResource("5_wsv0d") +volume_db = 5.0 + [connection signal="clicked" from="MouseHandler" to="." method="_on_mouse_handler_clicked"] +[connection signal="hovered" from="MouseHandler" to="." method="_on_mouse_handler_hovered"] diff --git a/src/CreatureWindow.tscn b/src/CreatureWindow.tscn index e0ad1d9..c0c0dee 100644 --- a/src/CreatureWindow.tscn +++ b/src/CreatureWindow.tscn @@ -6,6 +6,7 @@ [node name="CreatureWindow" type="Window"] canvas_item_default_texture_filter = 0 +title = "Wild" position = Vector2i(0, 36) size = Vector2i(300, 300) unresizable = true @@ -20,3 +21,39 @@ texture = ExtResource("3_bxvic") script = ExtResource("1_eufhm") [node name="MouseSignals" parent="." instance=ExtResource("2_3cu4o")] + +[node name="Timer" type="Timer" parent="."] +one_shot = true +autostart = true + +[node name="Timer2" type="Timer" parent="."] +wait_time = 6.0 +one_shot = true +autostart = true + +[node name="Timer3" type="Timer" parent="."] +wait_time = 12.0 +one_shot = true +autostart = true + +[node name="Timer4" type="Timer" parent="."] +wait_time = 20.0 +one_shot = true +autostart = true + +[node name="Timer5" type="Timer" parent="."] +wait_time = 30.0 +one_shot = true +autostart = true + +[node name="Timer6" type="Timer" parent="."] +wait_time = 50.0 +one_shot = true +autostart = true + +[connection signal="timeout" from="Timer" to="Node2D" method="_on_timer_timeout"] +[connection signal="timeout" from="Timer2" to="Node2D" method="_on_timer_timeout"] +[connection signal="timeout" from="Timer3" to="Node2D" method="_on_timer_timeout"] +[connection signal="timeout" from="Timer4" to="Node2D" method="_on_timer_timeout"] +[connection signal="timeout" from="Timer5" to="Node2D" method="_on_timer_timeout"] +[connection signal="timeout" from="Timer6" to="Node2D" method="_on_timer_timeout"] diff --git a/src/build_window.gd b/src/build_window.gd index c2a7a05..0b7fc94 100644 --- a/src/build_window.gd +++ b/src/build_window.gd @@ -81,7 +81,7 @@ func _update_card(index): main.zone_pool.shuffle() choice = main.zone_pool.pop_back() card_data = Data.data.zones[choice] - cost = 20 + cost = 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0)) cards[index].object.texture = Data.data.images["%s-card" % [choice]] else: if main.upgrade_pool.size() == 0: @@ -89,12 +89,15 @@ func _update_card(index): main.upgrade_pool.shuffle() choice = main.upgrade_pool.pop_back() card_data = Data.data.upgrades[choice] - cost = card_data.cost + cost = card_data.cost + (round(card_data.cost / 2) * Persister.get_value(choice, PersisterEnums.Scope.UNKNOWN, 0)) cards[index].title.text = "[center]%s" % [card_data.name] cards[index].cost.text = "[center]%d G" % [cost] card_data.key = choice chosen_cards[index] = card_data + + if (index == 1 and chosen_cards[0].key == choice) or (index == 0 and chosen_cards[1] and chosen_cards[1].key == choice): + _update_card(index) func _on_mouse_handler_clicked() -> void: @@ -130,8 +133,8 @@ func _buy_upgrade(index): return var card_data = chosen_cards[index] - if Persister.get_value("gold", PersisterEnums.Scope.UNKNOWN, 0) >= (card_data.cost if card_data.has("cost") else 20): - Persister.change_value("gold", -(card_data.cost if card_data.has("cost") else 20)) + if Persister.get_value("gold", PersisterEnums.Scope.UNKNOWN, 0) >= (card_data.cost if card_data.has("cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0))): + Persister.change_value("gold", -(card_data.cost if card_data.has("cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0)))) buying[index] = true @@ -151,9 +154,11 @@ func _buy_upgrade(index): if index == 2: Triggerer.trigger("spawn_window", {"key": card_data.key}) audio_stream_player_2.play() + Persister.change_value("zones_bought", 1) else: Persister.change_value(card_data.property, card_data.amount) audio_stream_player.play() + Persister.change_value(card_data.key, 1) else: audio_stream_player_3.play() diff --git a/src/coin.gd b/src/coin.gd index 9868ef4..e72efc9 100644 --- a/src/coin.gd +++ b/src/coin.gd @@ -1,6 +1,38 @@ extends Node2D +var hovered = false + +@onready var audio_stream_player: AudioStreamPlayer = $AudioStreamPlayer +@onready var sprite_2d: Sprite2D = $Sprite2D + +var tween + +func _ready() -> void: + sprite_2d.scale = Vector2.ZERO + tween = create_tween() + tween.set_ease(Tween.EASE_OUT) + tween.set_trans(Tween.TRANS_BACK) + tween.tween_property(sprite_2d, "scale", Vector2.ONE, 0.25) func _on_mouse_handler_hovered() -> void: + if hovered: + return + + hovered = true + #audio_stream_player.play() + Triggerer.trigger("coin_collect_sound") Persister.change_value("gold", 1) - queue_free() + + if tween: + tween.kill() + + tween = create_tween() + tween.tween_property(sprite_2d, "scale:x", 0, 0.125) + tween.tween_property(sprite_2d, "scale:x", 1, 0.125) + tween.tween_property(sprite_2d, "scale:x", 0, 0.125) + tween.tween_property(sprite_2d, "scale:x", 1, 0.125) + tween.tween_callback(queue_free) + + var start_pos = position.y + var tween2 = create_tween() + tween2.tween_property(self, "position:y", start_pos - 5, 0.5) diff --git a/src/creature.gd b/src/creature.gd index 33ddbc4..60ce6d3 100644 --- a/src/creature.gd +++ b/src/creature.gd @@ -6,24 +6,73 @@ var key @onready var image = Data.data.images[key] @onready var sprite_2d: Sprite2D = $Sprite2D +@onready var audio_stream_player: AudioStreamPlayer = $AudioStreamPlayer +@onready var audio_stream_player_2: AudioStreamPlayer = $AudioStreamPlayer2 const COIN = preload("res://src/Coin.tscn") var held = false +var target +var start_pos +var lifetime_timer = randi_range(10, 15) +var end_pos +var tween +var tiled = false +var tiles = [] func _ready() -> void: sprite_2d.texture = image Triggerer.listen("hour", _on_hour) +func _process(delta: float) -> void: + if target: + position = position.lerp(target, delta * 2) + + if get_window().name == "CreatureWindow": + if Persister.get_value("paused"): + return + lifetime_timer -= delta + + if lifetime_timer <= 0 and not end_pos: + end_pos = true + match randi_range(0, 3): + 0: + target = Vector2(-25, randi_range(-25, 100)) + 1: + target = Vector2(100, randi_range(-25, 100)) + 2: + target = Vector2(randi_range(-25, 100), -25) + 3: + target = Vector2(randi_range(-25, 100), 100) + if lifetime_timer <= -2: + queue_free() + + func _on_hour(_data): if not held and randf() < (Persister.get_value("creature_resource_spawn_rate") / 100.0): var new_coin = COIN.instantiate() new_coin.global_position = global_position get_window().add_child(new_coin) + #audio_stream_player.play() + Triggerer.trigger("coin_sound") func _on_mouse_handler_clicked() -> void: - Triggerer.trigger("grab_creature", {"creature": key, "old_window": get_window(), "old_position": position}) + Triggerer.trigger("grab_creature", {"creature": key, "old_window": get_window(), "old_position": position, "tiled": tiled, "tiles": tiles}) Persister.persist_data("grabbing", true) queue_free() + + +func _on_mouse_handler_hovered() -> void: + if held: + return + + if tween: + tween.kill() + + tween = create_tween() + tween.tween_property(sprite_2d, "position:y", -1, 0.075) + tween.tween_property(sprite_2d, "position:y", 0, 0.075) + #audio_stream_player_2.play() + Triggerer.trigger("creature_sound") diff --git a/src/creature_window.gd b/src/creature_window.gd index d9a4659..d6ab6fc 100644 --- a/src/creature_window.gd +++ b/src/creature_window.gd @@ -24,11 +24,22 @@ func _on_minutes(_data): minutes_left -= 1 if spawn_times.has(minutes_left): - var new_creature = CREATURE.instantiate() - new_creature.position = Vector2(50, 50) - new_creature.key = Data.data.creatures.keys().pick_random() - add_child(new_creature) + _spawn_creature() +func _spawn_creature(): + var new_creature = CREATURE.instantiate() + match randi_range(0, 3): + 0: + new_creature.position = Vector2(-25, randi_range(-25, 100)) + 1: + new_creature.position = Vector2(100, randi_range(-25, 100)) + 2: + new_creature.position = Vector2(randi_range(-25, 100), -25) + 3: + new_creature.position = Vector2(randi_range(-25, 100), 100) + new_creature.target = Vector2(randi_range(25, 50), randi_range(25, 50)) + new_creature.key = Data.data.creatures.keys().pick_random() + add_child(new_creature) func _on_day(_data): minutes_left = 6 * 24 @@ -41,3 +52,7 @@ func _generate_spawn_times(): for i in range(0, 4): spawn_times.push_back(randi_range(2, 6 * 24 - 2)) + + +func _on_timer_timeout() -> void: + _spawn_creature() diff --git a/src/zone.gd b/src/zone.gd index aa3d59a..40a0953 100644 --- a/src/zone.gd +++ b/src/zone.gd @@ -9,6 +9,9 @@ var key const CREATURE = preload("res://src/Creature.tscn") +var tiles = [] +var newt = [] + func _ready() -> void: var window_size = get_tree().root.get_window().size @@ -19,6 +22,129 @@ func _ready() -> void: sprite_2d.position = Vector2(int(data.size[0]) * 12 / 2, int(data.size[1]) * 12 / 2) +func attempt_place(key, position, tiles2): + var creature_data = Data.data.creatures[key] + + var tile_size = Vector2(12, 12) + + var round_bound = round(position.x / tile_size.x) + var lower_bound = round_bound - 1 + var upper_bound = round_bound + var lower_bound2 = round_bound + var upper_bound2 = round_bound + 1 + var bound_2 = round((position.x + 6) / tile_size.x) + + var round_bound_y = round(position.y / tile_size.y) + var lower_bound_y = round_bound_y - 1 + var upper_bound_y = round_bound_y + var lower_bound_y2 = round_bound_y + var upper_bound_y2 = round_bound_y + 1 + var bound_2_y = round((position.y + 6) / tile_size.y) + + prints(position / tile_size.x) + + if lower_bound_y == upper_bound_y: + upper_bound_y += 1 + + if lower_bound_y2 == upper_bound_y2: + upper_bound_y2 += 1 + + var tile_x = round(position.x / tile_size.x) + var tile_y = round(position.y / tile_size.y) + + var valid_x = false + var bounds_x + var bounds_y + + if creature_data.width == 1: + valid_x = _check_tile(bound_2, 0) + else: + var check1 = _check_tile(lower_bound, 0) and _check_tile(upper_bound, 0) + var check2 = _check_tile(lower_bound2, 0) and _check_tile(upper_bound2, 0) + valid_x = check1 or check2 + + if check1: + bounds_x = Vector2(lower_bound, upper_bound) + if check2: + bounds_x = Vector2(lower_bound2, upper_bound2) + + var valid_y = false + + if creature_data.height == 1: + valid_y = _check_tile(bound_2_y, 1) + else: + var check1 = _check_tile(lower_bound_y, 1) and _check_tile(upper_bound_y, 1) + var check2 = _check_tile(lower_bound_y2, 1) and _check_tile(upper_bound_y2, 1) + valid_y = check1 or check2 + + if check1: + bounds_y = Vector2(lower_bound_y, upper_bound_y) + if check2: + bounds_y = Vector2(lower_bound_y2, upper_bound_y2) + + if valid_x and valid_y: + if _check_if_contains(creature_data, bound_2, bound_2_y, bounds_x, bounds_y, tiles2): + return false + + var new_creature = CREATURE.instantiate() + new_creature.key = key + new_creature.position = Vector2((bound_2 - 0.5) if creature_data.width == 1 else bounds_x[1] - 1, (bound_2_y - 0.5) if creature_data.height == 1 else bounds_y[1] - 1) * 12 + get_window().add_child(new_creature) + new_creature.tiled = true + new_creature.tiles = newt + return true + + +func remove_tiles(array): + for element in array: + tiles.erase(element) + + +func _check_if_contains(data, bound1, bound1y, bounds2, bounds2y, tiles2): + newt = [] + var checks = [] + + if data.width == 1: + if data.height == 1: + checks.push_back(Vector2i(bound1, bound1y)) + else: + checks.push_back(Vector2i(bound1, bounds2y[0])) + checks.push_back(Vector2i(bound1, bounds2y[1])) + else: + if data.height == 1: + checks.push_back(Vector2i(bounds2[0], bound1y)) + checks.push_back(Vector2i(bounds2[1], bound1y)) + else: + checks.push_back(Vector2i(bounds2[0], bounds2y[0])) + checks.push_back(Vector2i(bounds2[1], bounds2y[0])) + checks.push_back(Vector2i(bounds2[0], bounds2y[1])) + checks.push_back(Vector2i(bounds2[1], bounds2y[1])) + + for check in checks: + if tiles.has(check): + if tiles2: + if not tiles2.has(check): + return true + else: + return true + + for check in checks: + newt.push_back(check) + tiles.push_back(check) + + return false + + +func _check_tile(coords, dir): + var placeable_min = 2 + var placeable_max = int(data.size[dir]) - 1 + + if coords >= placeable_min and coords <= placeable_max: + return true + + return false + + # #New Zones # diff --git a/wall.png b/wall.png index 55d6707..bd5beb8 100644 Binary files a/wall.png and b/wall.png differ diff --git a/wild.png b/wild.png index ef36e1d..0930c2a 100644 Binary files a/wild.png and b/wild.png differ