diff --git a/art_collector.gd b/art_collector.gd index f35659b..674fdcc 100644 --- a/art_collector.gd +++ b/art_collector.gd @@ -1,8 +1,12 @@ class_name ArtCollector extends Node2D + +var painting_pile: PaintingPile + + func _ready() -> void: $ArtCollectorAnimations.set_frame(randi_range(0, 16)) - #$ArtCollectorAnimations.animation_finished.connect(_handle_anim_finish) + func normal_paddle(): $ArtCollectorAnimations.play("NormalPaddle") @@ -16,5 +20,3 @@ func critical_paddle(): $ArtCollectorAnimations.play("CriticalPaddle") await $ArtCollectorAnimations.animation_finished $ArtCollectorAnimations.play("Idle") - -#func _handle_anim_finish diff --git a/audience_manager.gd b/audience_manager.gd index 47b05ca..c01c207 100644 --- a/audience_manager.gd +++ b/audience_manager.gd @@ -25,6 +25,7 @@ var bark_critical := false @export var think_max_time := 5.0 var current_ask: int +var latest_bidder: ArtCollector func _ready() -> void: desk.numpad.ask_proposed.connect(_handle_ask_proposed) @@ -38,11 +39,12 @@ func raise_paddle(): game_manager.current_bid = desk.numpad.proposed_ask var collectors: Array[Node] = get_tree().get_nodes_in_group("ArtCollectors") collectors.shuffle() + latest_bidder = collectors[0] if bark_critical: - collectors[0].critical_paddle() + latest_bidder.critical_paddle() print("play crit paddle") else: - collectors[0].normal_paddle() + latest_bidder.normal_paddle() print("play norm paddle") bark_critical = false ask_accepted.emit() diff --git a/audience_manager.tscn b/audience_manager.tscn index 8a60c01..9df8132 100644 --- a/audience_manager.tscn +++ b/audience_manager.tscn @@ -18,7 +18,7 @@ texture = ExtResource("2_rhx06") [node name="BidDelayTimer" type="Timer" parent="."] one_shot = true -[node name="ArtCollector" parent="." instance=ExtResource("3_rhx06")] +[node name="ArtCollector1" parent="." instance=ExtResource("3_rhx06")] position = Vector2(182, 135) [node name="ArtCollector2" parent="." instance=ExtResource("3_rhx06")] diff --git a/game_manager.gd b/game_manager.gd index 478d875..c02bd43 100644 --- a/game_manager.gd +++ b/game_manager.gd @@ -4,58 +4,55 @@ class_name GameManager extends Node2D @export var desk: Desk @export var turn_manager: TurnManager +enum bidding_state {CLOSED, READY, ASKING, BID} + signal lost signal won -var paintings_sold = 0 -@export var paintings_total = 7 +var paintings_sold := 0 +const PAINTINGS_TOTAL := 7 -var paintings: Array = Array() -var current_painting = 0 +var paintings: Array[PaintingInfo] = [] +var current_painting_idx := 0 # tracker variables for bid markers, proposing bids happens between numpad and audience -var current_bid = 0 -var starting_price = 0 -var final_bid = 0 +var current_bid := 0 +var starting_price := 0 +var final_bid := 0 @export var current_bid_display: RichTextLabel -var target_sales: int = 0 -var total_sales: int = 0 -@export var sales_magnitude = 100000 -@export var single_painting_magnitude = 1000 -@export var initial_value_reduction: float = 0.6 +var target_sales := 0 +#var total_sales: int = 0 +@export var sales_magnitude := 100000 +@export var single_painting_magnitude := 1000 +@export var initial_value_reduction := 0.6 # state tracker for a given painting's auction -var bidding_open: bool = false -enum bidding_state {CLOSED, READY, ASKING, BID} -var state: int = bidding_state.CLOSED -signal new_painting_displayed +var bidding_open := false +var state := bidding_state.CLOSED func _ready() -> void: audience_manager.ask_accepted.connect(_handle_ask_accepted) desk.gavel.gavel_hit.connect(_handle_gavel_hit) - #paintings_total = randi_range(7,10) - target_sales = randi_range(2, 5) * sales_magnitude + # Associate collectors with their collections + var collectors: Array[Node] = get_tree().get_nodes_in_group("ArtCollectors") + assert(%PaintingPiles.get_child_count() == collectors.size()) + for idx in collectors.size(): collectors[idx].painting_pile = %PaintingPiles.get_child(idx) - var new_painting := 0 - var new_painting_value: int - while new_painting < paintings_total: - @warning_ignore('integer_division') - new_painting_value = target_sales / randi_range(paintings_total - 2, paintings_total + 2) - new_painting_value = snappedi(new_painting_value, single_painting_magnitude) - print(str(new_painting_value)) - paintings.append(new_painting_value) - new_painting += 1 + randomize_auction() + for idx in PAINTINGS_TOTAL: + var pd: PaintingDisplay = %Paintings.get_child(idx) + pd.configure_painting(paintings[idx].id) - print(paintings) - var intro_msg := "You have %s paintings. Sell them fast for at least $%s or face the consequences!" % [paintings_total, target_sales] + next_painting() + + var intro_msg := "You have %s paintings. Sell them fast for at least $%s or face the consequences!" % [PAINTINGS_TOTAL, target_sales] intro_msg += "\nHit the gavel and input the starting price to begin!" turn_manager.speak(intro_msg) - next_painting(0) #build out the initialization process, which should: # -- generate paintings and assign values # -- start the turn timer/auction timer @@ -64,56 +61,114 @@ func _ready() -> void: func _handle_gavel_hit(): - if state == bidding_state.CLOSED: - state = bidding_state.READY - print(str(state)) - current_bid_display.set_text("Starting price: $" + str(starting_price)) - elif state == bidding_state.ASKING: - if current_bid != 0: - state = bidding_state.CLOSED - desk.numpad.reminder_timer.stop() - current_bid_display.set_text("Sold for $" + str(current_bid) + "!") - sell_painting() - print("Congrats on selling your painting for $" + str(current_bid) + "! You have made $" + str(total_sales) + " so far.") - current_painting += 1 - if current_painting <= paintings_total - 1: - next_painting((current_painting)) - print("The next painting is valued at $" + str(starting_price) + " (should be $" + str(paintings[current_painting]) + ")") - (print(str(state))) - else: - end_auction() + match state: + bidding_state.CLOSED: + state = bidding_state.READY + current_bid_display.set_text("Starting price: $%s" % [starting_price]) + bidding_state.ASKING: + if current_bid != 0: + sell_painting() + if next_painting(): + print("The next painting is valued at $%s (should be $%s)" % [starting_price, paintings[current_painting_idx].value]) + else: + end_auction() func destroy_painting(): - # Painting destruction animation/particle effect $FailedPainting.play() - current_painting += 1 - turn_manager.speak("Oh nooooooo! Took too long!\nTry to make it up on the next painting!") - desk.numpad.reminder_timer.stop() - next_painting(current_painting) + if get_painting_display().damage_deal(): + cancel_bidding() + get_painting_display().move_painting_to_pile(%PaintingPileDiscard) + next_painting() + turn_manager.speak("Oh nooooooo! Took too long!\nTry to make it up on the next painting!") + else: + turn_manager.restart_turn() + turn_manager.speak("Oops! Took too long! Quickly, try again!") + func sell_painting(): - total_sales = total_sales + current_bid + cancel_bidding() + move_painting_to_bidders_pile() + paintings[current_painting_idx].sold_for = current_bid + current_bid_display.set_text("Sold for $%s!" % [current_bid]) + turn_manager.speak("Sold for $%s!" % [current_bid]) + print("Congrats on selling your painting for $%s! You have made $%s so far." % [current_bid, get_total_sales()]) -func next_painting(a: int): - $NextPainting.play() - starting_price = paintings[a] + +func move_painting_to_bidders_pile() -> void: + get_painting_display().move_painting_to_pile(audience_manager.latest_bidder.painting_pile) + + +func get_painting_display() -> PaintingDisplay: + return %Paintings.get_child(current_painting_idx) + + +func next_painting() -> bool: + current_painting_idx += 1 + if current_painting_idx >= PAINTINGS_TOTAL: return false + var info := paintings[current_painting_idx] + starting_price = info.value current_bid = 0 - # will need to add animation/image swap - new_painting_displayed.emit() + $NextPainting.play() + get_painting_display().animate_show_painting() + return true + func _handle_ask_accepted(): current_bid_display.set_text("Current bid: $" + str(current_bid)) + func end_auction(): #add in logic for displaying/transitioning to score screen - if total_sales >= target_sales: + if get_total_sales() >= target_sales: #add context specific score text? turn_manager.speak("Congratulations! The auction house will run another day.") else: #add context specific score text? turn_manager.speak("You have failed. We must find a new auctioneer.") + +func sum_total_sales(acculator: int, info: PaintingInfo) -> int: + return acculator + info.sold_for + + +func get_total_sales() -> int: + return paintings.reduce(sum_total_sales, 0) + + +func randomize_auction() -> void: + #paintings_total = randi_range(7,10) + target_sales = randi_range(2, 5) * sales_magnitude + var custom_ids: Array[int] = %PaintingDisplay1.get_n_unique_custom_paintings(3) + for idx in PAINTINGS_TOTAL: + var info := PaintingInfo.new() + info.id = custom_ids.pop_back() if not custom_ids.is_empty() else -absi(randi()) + @warning_ignore('integer_division') + info.value = target_sales / randi_range(PAINTINGS_TOTAL - 2, PAINTINGS_TOTAL + 2) + info.value = snappedi(info.value, single_painting_magnitude) + paintings.append(info) + paintings.shuffle() + + +class PaintingInfo: + var id := 0 + var value := 0 + var sold_for := 0 + var is_sold: bool: + get(): return sold_for > 0 + + # OTHER THINGS TO ADD: # UI elements for score # Bark manager + + +func _on_turn_manager_timer_timeout() -> void: + destroy_painting() + + +func cancel_bidding() -> void: + if not (state == bidding_state.ASKING or state == bidding_state.BID): + push_error('bidding state should not be ', state) + state = bidding_state.CLOSED + desk.numpad.reminder_timer.stop() diff --git a/main.tscn b/main.tscn index 337ba76..1a54169 100644 --- a/main.tscn +++ b/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3 uid="uid://dt4nq0nkmjiit"] +[gd_scene load_steps=27 format=3 uid="uid://dt4nq0nkmjiit"] [ext_resource type="Script" uid="uid://b5tcsve1oo5ht" path="res://game_manager.gd" id="1_ig7tw"] [ext_resource type="Texture2D" uid="uid://cvqsf1nlfqwpr" path="res://assets/background/background.png" id="1_lquwl"] @@ -6,12 +6,13 @@ [ext_resource type="FontFile" uid="uid://cm28kqtqj3a6n" path="res://assets/amiga4ever pro.ttf" id="2_5vw27"] [ext_resource type="Texture2D" uid="uid://cpj3xw8js3h3" path="res://assets/chairs/chairs_back.png" id="2_7mycd"] [ext_resource type="Texture2D" uid="uid://d03ot1f34pyhu" path="res://assets/chairs/chairs_front.png" id="3_272bh"] +[ext_resource type="PackedScene" uid="uid://dpcsom2ps588j" path="res://paintings/layout/painting_pile.tscn" id="4_1u8w0"] +[ext_resource type="PackedScene" uid="uid://csugksrssibrp" path="res://paintings/layout/painting_display.tscn" id="4_d13ii"] [ext_resource type="AudioStream" uid="uid://db67ob7kkhsc0" path="res://assets/game sfx/failed-round.wav" id="5_cegan"] [ext_resource type="AudioStream" uid="uid://cicodo74wnevu" path="res://assets/game sfx/next-round.wav" id="6_82xsv"] [ext_resource type="PackedScene" uid="uid://c1acpop6amvcl" path="res://audience_manager.tscn" id="6_272bh"] [ext_resource type="PackedScene" uid="uid://b8key4hjaldui" path="res://turn_manager.tscn" id="7_272bh"] [ext_resource type="Texture2D" uid="uid://d2142cf22t1lv" path="res://assets/buttons/button1.png" id="9_2cqfq"] -[ext_resource type="PackedScene" uid="uid://donkfeu1x888o" path="res://paintings/painting.tscn" id="9_kek77"] [ext_resource type="Script" uid="uid://bg1vk1o2eq3fg" path="res://bark_buttons.gd" id="9_yaehf"] [ext_resource type="Script" uid="uid://sfhg7pkumnwa" path="res://captions.gd" id="10_ryguw"] [ext_resource type="Texture2D" uid="uid://ut655l8y8xmi" path="res://assets/buttons/button1pressed.png" id="10_yaehf"] @@ -49,9 +50,30 @@ texture = ExtResource("2_7mycd") position = Vector2(640, 360) texture = ExtResource("3_272bh") -[node name="Painting" parent="." instance=ExtResource("9_kek77")] -position = Vector2(1075, 130) -rng_seed = 1262753571 +[node name="Paintings" type="Node2D" parent="."] +unique_name_in_owner = true + +[node name="PaintingDisplay7" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay6" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay5" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay4" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay3" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay2" parent="Paintings" instance=ExtResource("4_d13ii")] +position = Vector2(1074, 136) + +[node name="PaintingDisplay1" parent="Paintings" instance=ExtResource("4_d13ii")] +unique_name_in_owner = true +position = Vector2(1074, 136) [node name="GameManager" type="Node2D" parent="." node_paths=PackedStringArray("audience_manager", "desk", "turn_manager", "current_bid_display")] unique_name_in_owner = true @@ -108,11 +130,10 @@ desk = NodePath("../Desk") game_manager = NodePath("../GameManager") bark_buttons = NodePath("../BarkButtons") -[node name="TurnManager" parent="." node_paths=PackedStringArray("desk", "captions", "game_manager", "audience_manager") instance=ExtResource("7_272bh")] +[node name="TurnManager" parent="." node_paths=PackedStringArray("desk", "captions", "audience_manager") instance=ExtResource("7_272bh")] tts_sentence_speed = 4.5 desk = NodePath("../Desk") captions = NodePath("../UI/Captions") -game_manager = NodePath("../GameManager") audience_manager = NodePath("../AudienceManager") [node name="BarkButtons" type="Node2D" parent="." node_paths=PackedStringArray("turn_manager")] @@ -163,6 +184,44 @@ stream = ExtResource("22_ryguw") volume_db = -14.0 autoplay = true +[node name="PaintingPileDiscard" parent="." instance=ExtResource("4_1u8w0")] +unique_name_in_owner = true +offset_left = 1159.0 +offset_top = 377.0 +offset_right = 1260.0 +offset_bottom = 442.1613 +size_flags_horizontal = 3 + +[node name="PaintingPiles" type="HBoxContainer" parent="."] +unique_name_in_owner = true +offset_left = 142.0 +offset_top = 242.0 +offset_right = 759.0 +offset_bottom = 310.0 +theme_override_constants/separation = 24 +metadata/_edit_group_ = true + +[node name="PaintingPile1" parent="PaintingPiles" instance=ExtResource("4_1u8w0")] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PaintingPile2" parent="PaintingPiles" instance=ExtResource("4_1u8w0")] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PaintingPile3" parent="PaintingPiles" instance=ExtResource("4_1u8w0")] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PaintingPile4" parent="PaintingPiles" instance=ExtResource("4_1u8w0")] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PaintingPile5" parent="PaintingPiles" instance=ExtResource("4_1u8w0")] +layout_mode = 2 +size_flags_horizontal = 3 + +[connection signal="timer_timeout" from="TurnManager" to="GameManager" method="_on_turn_manager_timer_timeout"] [connection signal="button_down" from="BarkButtons/GreatBuy" to="BarkButtons" method="_on_great_buy_button_down"] [connection signal="button_down" from="BarkButtons/InvestmentPiece" to="BarkButtons" method="_on_investment_piece_button_down"] [connection signal="button_down" from="BarkButtons/StunningMessage" to="BarkButtons" method="_on_stunning_message_button_down"] diff --git a/paintings/layout/painting_display.gd b/paintings/layout/painting_display.gd new file mode 100644 index 0000000..5851dc1 --- /dev/null +++ b/paintings/layout/painting_display.gd @@ -0,0 +1,114 @@ +@tool +extends Node2D +class_name PaintingDisplay + + +const PAINTING_SIZE := Vector2(310, 200) + +@export var custom_paintings: Array[Texture2D] + +@export_tool_button('Next Custom') var next_custom_action = func next_custom(): + configure_painting(absi(%Painting.painting_id + 1) % custom_paintings.size()) + animate_show_painting() + +@export_tool_button('Random Procedual') var random_procedual_action = func random_procedual(): + configure_painting(-absi(randi())) + animate_show_painting() + + +@export var shake_distance := 12.0 +@export var shake_duration := 0.3 +@export var shake_step_count := 5 +@export_tool_button('damage_deal') var damage_deal_action = damage_deal +@export_tool_button('damage_undo') var damage_undo_action = damage_undo + + +func get_n_unique_custom_paintings(count: int) -> Array[int]: + var list: Array[int] = [] + for idx in custom_paintings.size(): list.push_back(idx) + list.shuffle() + list.resize(count) + return list + + +var _shake_tween: Tween + +func animate_shake(): + if _shake_tween: _shake_tween.kill() + var shake_step := shake_duration / shake_step_count + _shake_tween = create_tween() + for i in shake_step_count: + var pos := Vector2(randf_range(-shake_distance, shake_distance), randf_range(-shake_distance, shake_distance)) + _shake_tween.set_ease(Tween.EASE_OUT_IN) + _shake_tween.set_trans(Tween.TRANS_ELASTIC) + _shake_tween.tween_property(%Shaker, ^'position', pos, shake_step) + _shake_tween.set_ease(Tween.EASE_OUT) + _shake_tween.set_trans(Tween.TRANS_ELASTIC) + _shake_tween.tween_property(%Shaker, ^'position', Vector2.ZERO, shake_duration) + _shake_tween.tween_callback(func(): _shake_tween = null) + + +func damage_deal() -> bool: + animate_shake() + %Painting.damage += 1 + if %Painting.damage > 3: + $AnimationPlayer.play(&'broke') + return true + else: + return false + + +func damage_undo(): + %Painting.damage = 0 + $AnimationPlayer.play_backwards(&'broke') + + +#var _has_loaded_painting := false +#var _loaded_painting_id: int + +#func animate_prev_painting() -> void: + #if _has_loaded_painting: + #$AnimationPlayer.play_backwards(&'slide') + #await $AnimationPlayer.animation_finished + #$AnimationPlayer.play_backwards(&'broke') + #await $AnimationPlayer.animation_finished + #_has_loaded_painting = false + +#func animate_next_painting(id: int) -> void: + #_has_loaded_painting = true + #_loaded_painting_id = id + #%Painting.damage = 0 + #%Painting.painting_id = id + #%Painting.overwrite_texture = custom_paintings[id] if id >= 0 and id < custom_paintings.size() else null + #$AnimationPlayer.play(&'slide') + #await $AnimationPlayer.animation_finished + + +func configure_painting(id: int) -> void: + %Painting.damage = 0 + %Painting.painting_id = id + %Painting.overwrite_texture = custom_paintings[id] if id >= 0 and id < custom_paintings.size() else null + $AnimationPlayer.play(&'RESET') + + +func animate_show_painting() -> void: + $AnimationPlayer.play(&'slide') + await $AnimationPlayer.animation_finished + + +var _painting_pile: PaintingPile +var _pile_tween: Tween + + +func move_painting_to_pile(pile: PaintingPile) -> void: + assert(not _painting_pile) + _painting_pile = pile + animate_move(pile.push_tracking(self)) + + +func animate_move(rect: Rect2) -> void: + if _pile_tween: _pile_tween.kill() + _pile_tween = create_tween() + _pile_tween.parallel().tween_property($Root, ^'global_position', rect.get_center(), 1.2) + _pile_tween.parallel().tween_property($Root, ^'scale', rect.size / PAINTING_SIZE, 1.2) + _pile_tween.tween_callback(func(): _pile_tween = null) diff --git a/paintings/painting_display.gd.uid b/paintings/layout/painting_display.gd.uid similarity index 100% rename from paintings/painting_display.gd.uid rename to paintings/layout/painting_display.gd.uid diff --git a/paintings/painting_display.tscn b/paintings/layout/painting_display.tscn similarity index 50% rename from paintings/painting_display.tscn rename to paintings/layout/painting_display.tscn index d25702f..98efed0 100644 --- a/paintings/painting_display.tscn +++ b/paintings/layout/painting_display.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=20 format=3 uid="uid://csugksrssibrp"] +[gd_scene load_steps=27 format=3 uid="uid://csugksrssibrp"] -[ext_resource type="Script" uid="uid://cy636hseq5fo4" path="res://paintings/painting_display.gd" id="1_gy870"] +[ext_resource type="Script" uid="uid://cy636hseq5fo4" path="res://paintings/layout/painting_display.gd" id="1_gy870"] [ext_resource type="PackedScene" uid="uid://donkfeu1x888o" path="res://paintings/painting.tscn" id="2_5v8dq"] [ext_resource type="Texture2D" uid="uid://dj7wj38a447jn" path="res://paintings/veryart/1/F0.png" id="2_7o3cd"] [ext_resource type="Texture2D" uid="uid://drlta7bv52utw" path="res://paintings/veryart/2/F0.png" id="3_t05i8"] @@ -21,7 +21,7 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("Root1/Rela1:rotation") +tracks/0/path = NodePath("Root/Shaker:rotation") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -30,46 +30,119 @@ tracks/0/keys = { "update": 0, "values": [0.0] } - -[sub_resource type="Animation" id="Animation_5v8dq"] -resource_name = "shake" -tracks/0/type = "method" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Shaker/GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"animate_shake" -}] +"update": 1, +"values": [false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(600, 0)] } [sub_resource type="Animation" id="Animation_7o3cd"] resource_name = "broke" +length = 0.3 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("Root1/Rela1:rotation") +tracks/0/path = NodePath("Root/Shaker:rotation") tracks/0/interp = 2 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.3), -"transitions": PackedFloat32Array(1, 1), +"transitions": PackedFloat32Array(0.5, 1), "update": 0, "values": [0.0, 0.2617993877991494] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Shaker/GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} + +[sub_resource type="Animation" id="Animation_t05i8"] +resource_name = "slide" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(0.2, 1), +"update": 0, +"values": [Vector2(800, 0), Vector2(0, 0)] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_a2c10"] _data = { &"RESET": SubResource("Animation_a2c10"), &"broke": SubResource("Animation_7o3cd"), -&"shake": SubResource("Animation_5v8dq") +&"slide": SubResource("Animation_t05i8") } +[sub_resource type="Gradient" id="Gradient_7o3cd"] +offsets = PackedFloat32Array(0.92493296, 1) +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_t05i8"] +gradient = SubResource("Gradient_7o3cd") +width = 12 +height = 12 +fill = 1 +fill_from = Vector2(0.5, 0.5) +fill_to = Vector2(1, 0.5) + +[sub_resource type="Gradient" id="Gradient_t05i8"] +offsets = PackedFloat32Array(0, 0.2327044, 1) +colors = PackedColorArray(0.99999994, 0.57875466, 0.3272594, 1, 0.26293245, 0.26293245, 0.26293245, 1, 0, 0, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_k2el0"] +gradient = SubResource("Gradient_t05i8") + +[sub_resource type="Curve" id="Curve_238kw"] +_limits = [0.0, 4.0, 0.0, 1.0] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.08689458, 4), 0.0, 0.0, 0, 0, Vector2(1, 0.11427331), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_ugvm4"] +curve = SubResource("Curve_238kw") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_t05i8"] +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(150, 100, 1) +gravity = Vector3(0, -50, 0) +scale_min = 0.79999995 +scale_curve = SubResource("CurveTexture_ugvm4") +color_ramp = SubResource("GradientTexture1D_k2el0") +hue_variation_min = -2.2351742e-08 +hue_variation_max = 0.09999997 + [node name="PaintingDisplay" type="Node2D"] script = ExtResource("1_gy870") custom_paintings = Array[Texture2D]([ExtResource("2_7o3cd"), ExtResource("3_t05i8"), ExtResource("4_k2el0"), ExtResource("5_238kw"), ExtResource("6_ugvm4"), ExtResource("7_aqt5w"), ExtResource("8_dng8e"), ExtResource("9_mtyqy"), ExtResource("10_ybjp4"), ExtResource("11_q2yjp"), ExtResource("12_r4wn3"), ExtResource("13_v614m"), ExtResource("14_5sb26")]) @@ -79,16 +152,19 @@ libraries = { &"": SubResource("AnimationLibrary_a2c10") } -[node name="Root1" type="Node2D" parent="."] +[node name="Root" type="Node2D" parent="."] +position = Vector2(600, 0) -[node name="Rela1" type="Node2D" parent="Root1"] +[node name="Shaker" type="Node2D" parent="Root"] unique_name_in_owner = true -[node name="Painting" parent="Root1/Rela1" instance=ExtResource("2_5v8dq")] +[node name="Painting" parent="Root/Shaker" instance=ExtResource("2_5v8dq")] unique_name_in_owner = true -painting_id = 6 -overwrite_texture = ExtResource("8_dng8e") -[node name="Root2" type="Node2D" parent="."] - -[node name="Rela2" type="Node2D" parent="Root2"] +[node name="GPUParticles2D" type="GPUParticles2D" parent="Root/Shaker"] +emitting = false +amount = 32 +texture = SubResource("GradientTexture2D_t05i8") +lifetime = 2.0 +one_shot = true +process_material = SubResource("ParticleProcessMaterial_t05i8") diff --git a/paintings/layout/painting_pile.gd b/paintings/layout/painting_pile.gd new file mode 100644 index 0000000..692ce3e --- /dev/null +++ b/paintings/layout/painting_pile.gd @@ -0,0 +1,28 @@ +@tool +extends ReferenceRect +class_name PaintingPile + + +func _get_minimum_size() -> Vector2: + return Vector2(0, size.x * 20. / 31.) + + +func _set_height_from_width(): + size.y = size.x * 20. / 31. + update_minimum_size() + + +func _ready() -> void: + resized.connect(_set_height_from_width) + + +var tracking: Array[Node] + +func push_tracking(node: Node) -> Rect2: + tracking.push_back(node) + var rect := get_global_rect() + rect.position += Vector2(8, 4) * (tracking.size() - 1) + return rect + +func pop_tracking() -> Node: + return tracking.pop_back() diff --git a/paintings/layout/painting_pile.gd.uid b/paintings/layout/painting_pile.gd.uid new file mode 100644 index 0000000..7bed55e --- /dev/null +++ b/paintings/layout/painting_pile.gd.uid @@ -0,0 +1 @@ +uid://dcocb7413ofm3 diff --git a/paintings/layout/painting_pile.tscn b/paintings/layout/painting_pile.tscn new file mode 100644 index 0000000..7ad2941 --- /dev/null +++ b/paintings/layout/painting_pile.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://dpcsom2ps588j"] + +[ext_resource type="Script" uid="uid://dcocb7413ofm3" path="res://paintings/layout/painting_pile.gd" id="1_frs4q"] + +[node name="PaintingPile" type="ReferenceRect"] +custom_minimum_size = Vector2(31, 20) +offset_right = 310.0 +offset_bottom = 200.0 +mouse_filter = 2 +script = ExtResource("1_frs4q") diff --git a/paintings/noise.tscn b/paintings/noise.tscn deleted file mode 100644 index 0af8ed7..0000000 --- a/paintings/noise.tscn +++ /dev/null @@ -1,35 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://bjpharjtpysre"] - -[ext_resource type="Shader" uid="uid://b6jkek1qotcnf" path="res://paintings/noise.gdshader" id="1_2lnyf"] -[ext_resource type="Script" uid="uid://2jt34o1v7gbo" path="res://paintings/noise.gd" id="1_o4civ"] - -[sub_resource type="FastNoiseLite" id="FastNoiseLite_o4civ"] -resource_local_to_scene = true -seed = 1 -frequency = 0.0028707401 -offset = Vector3(1460.7504, 943.2602, 0) -fractal_type = 2 -fractal_octaves = 3 - -[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_2lnyf"] -width = 320 -height = 240 -noise = SubResource("FastNoiseLite_o4civ") - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_0uljq"] -shader = ExtResource("1_2lnyf") -shader_parameter/noise = SubResource("NoiseTexture2D_2lnyf") -shader_parameter/steps = 8.0 -shader_parameter/gradient_start = Color(0.56780183, 0.45513594, 0.630845, 1) -shader_parameter/gradient_end = Color(0.5222837, 0.45749915, 0.35617962, 1) - -[node name="Noise" type="ColorRect"] -material = SubResource("ShaderMaterial_0uljq") -custom_minimum_size = Vector2(32, 24) -offset_right = 320.0 -offset_bottom = 240.0 -script = ExtResource("1_o4civ") -noise = SubResource("FastNoiseLite_o4civ") -steps = 8 -gradient_start = Color(0.56780183, 0.45513594, 0.630845, 1) -gradient_end = Color(0.5222837, 0.45749915, 0.35617962, 1) diff --git a/paintings/painting.gd b/paintings/painting.gd index 96ffbe2..62f9720 100644 --- a/paintings/painting.gd +++ b/paintings/painting.gd @@ -15,14 +15,15 @@ class_name Painting queue_redraw() -@export_range(0, 3) var damage: int: +@export_range(0, 4) var damage: int: set(x): - damage = clampi(x, 0, 3) + damage = x queue_redraw() func _draw() -> void: + %Fail.visible = damage > 3 %Dmg.visible = damage > 0 - %Dmg.frame = damage - 1 if damage > 0 else 0 + %Dmg.frame = clampi(damage - 1, 0, 2) if damage > 0 else 0 %Noise.rng_seed = painting_id %TextureRect.texture = overwrite_texture diff --git a/paintings/painting.tscn b/paintings/painting.tscn index ddb07d0..c87de3b 100644 --- a/paintings/painting.tscn +++ b/paintings/painting.tscn @@ -1,16 +1,15 @@ -[gd_scene load_steps=6 format=3 uid="uid://donkfeu1x888o"] +[gd_scene load_steps=7 format=3 uid="uid://donkfeu1x888o"] [ext_resource type="Texture2D" uid="uid://b142kv367vbw7" path="res://paintings/frame.png" id="1_6chac"] [ext_resource type="Script" uid="uid://tqu2ms43fhis" path="res://paintings/painting.gd" id="1_465no"] -[ext_resource type="PackedScene" uid="uid://bjpharjtpysre" path="res://paintings/noise.tscn" id="2_oqt1c"] +[ext_resource type="PackedScene" uid="uid://bjpharjtpysre" path="res://paintings/procedual/noise.tscn" id="2_oqt1c"] [ext_resource type="Texture2D" uid="uid://d02jhn3d0pwir" path="res://paintings/dmg.png" id="4_t4wwa"] +[ext_resource type="FontFile" uid="uid://cm28kqtqj3a6n" path="res://assets/amiga4ever pro.ttf" id="5_l5l5f"] -[sub_resource type="FastNoiseLite" id="FastNoiseLite_465no"] -resource_local_to_scene = true -frequency = 0.002661236 -offset = Vector3(1460.7504, 943.2602, 0) -fractal_type = 3 -fractal_octaves = 2 +[sub_resource type="LabelSettings" id="LabelSettings_1sxlm"] +font = ExtResource("5_l5l5f") +font_size = 64 +font_color = Color(1, 0, 0, 1) [node name="Painting" type="Node2D"] texture_filter = 1 @@ -40,8 +39,10 @@ stretch_shrink = 4 [node name="SubViewport" type="SubViewport" parent="Control/SubViewportContainer"] transparent_bg = true handle_input_locally = false +snap_2d_transforms_to_pixel = true +snap_2d_vertices_to_pixel = true size = Vector2i(73, 45) -size_2d_override = Vector2i(480, 360) +size_2d_override = Vector2i(310, 200) size_2d_override_stretch = true render_target_update_mode = 4 @@ -54,10 +55,10 @@ offset_right = 0.0 offset_bottom = 0.0 grow_horizontal = 2 grow_vertical = 2 -noise = SubResource("FastNoiseLite_465no") steps = 24 gradient_start = Color(0.605822, 0.410077, 0.7508662, 1) gradient_end = Color(0.1471889, 0.25502726, 0.39230567, 1) +rng_seed = 0 [node name="TextureRect" type="TextureRect" parent="Control"] unique_name_in_owner = true @@ -74,3 +75,24 @@ unique_name_in_owner = true visible = false texture = ExtResource("4_t4wwa") hframes = 3 + +[node name="Fail" type="Label" parent="."] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -145.99998 +offset_top = -29.0 +offset_right = 124.000015 +offset_bottom = 102.0 +grow_horizontal = 2 +grow_vertical = 2 +rotation = -0.25212684 +text = "NOT +SOLD" +label_settings = SubResource("LabelSettings_1sxlm") +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/paintings/painting_display.gd b/paintings/painting_display.gd deleted file mode 100644 index 73aeb63..0000000 --- a/paintings/painting_display.gd +++ /dev/null @@ -1,54 +0,0 @@ -@tool -extends Node2D - - - -@export var shake_distance := 12.0 -@export var shake_duration := 0.3 -@export var shake_step_count := 5 -@export_tool_button('Damage Painting') var damage_painting_action = damage_painting - - -@export var custom_paintings: Array[Texture2D] -@export_tool_button('Next Custom') var next_custom_action = func next_custom(): - var idx: int = (%Painting.painting_id + 1) % custom_paintings.size() - %Painting.overwrite_texture = custom_paintings[idx] - %Painting.painting_id = idx - - -@export_tool_button('Random Procedual') var random_procedual_action = func random_procedual(): - %Painting.painting_id = randi() - %Painting.overwrite_texture = null - - -func get_n_unique_custom_paintings(count: int) -> Array[int]: - var list: Array[int] = [] - for idx in custom_paintings.size(): list.push_back(idx) - list.shuffle() - list.resize(count) - return list - - -var _shake_tween: Tween - -func animate_shake(): - if _shake_tween: _shake_tween.kill() - var shake_step := shake_duration / shake_step_count - _shake_tween = create_tween() - for i in shake_step_count: - var pos := Vector2(randf_range(-shake_distance, shake_distance), randf_range(-shake_distance, shake_distance)) - _shake_tween.set_ease(Tween.EASE_OUT_IN) - _shake_tween.set_trans(Tween.TRANS_ELASTIC) - _shake_tween.tween_property(%Rela1, ^'position', pos, shake_step) - _shake_tween.set_ease(Tween.EASE_OUT) - _shake_tween.set_trans(Tween.TRANS_ELASTIC) - _shake_tween.tween_property(%Rela1, ^'position', Vector2.ZERO, shake_duration) - _shake_tween.tween_callback(func(): _shake_tween = null) - - -func damage_painting(): - if %Painting.damage == 3: - %Painting.damage = 0 - else: - %Painting.damage += 1 - animate_shake() diff --git a/paintings/fractal.gd b/paintings/procedual/fractal.gd similarity index 100% rename from paintings/fractal.gd rename to paintings/procedual/fractal.gd diff --git a/paintings/fractal.gd.uid b/paintings/procedual/fractal.gd.uid similarity index 100% rename from paintings/fractal.gd.uid rename to paintings/procedual/fractal.gd.uid diff --git a/paintings/fractal.gdshader b/paintings/procedual/fractal.gdshader similarity index 100% rename from paintings/fractal.gdshader rename to paintings/procedual/fractal.gdshader diff --git a/paintings/fractal.gdshader.uid b/paintings/procedual/fractal.gdshader.uid similarity index 100% rename from paintings/fractal.gdshader.uid rename to paintings/procedual/fractal.gdshader.uid diff --git a/paintings/fractal.tscn b/paintings/procedual/fractal.tscn similarity index 93% rename from paintings/fractal.tscn rename to paintings/procedual/fractal.tscn index 9a1347c..a2cf595 100644 --- a/paintings/fractal.tscn +++ b/paintings/procedual/fractal.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=3 uid="uid://bx4upo2n66wke"] -[ext_resource type="Shader" uid="uid://b8yiyjkjgvful" path="res://paintings/fractal.gdshader" id="1_4re67"] -[ext_resource type="Script" uid="uid://bnmc3t0wxeayv" path="res://paintings/fractal.gd" id="2_o3htp"] +[ext_resource type="Shader" uid="uid://b8yiyjkjgvful" path="res://paintings/procedual/fractal.gdshader" id="1_4re67"] +[ext_resource type="Script" uid="uid://bnmc3t0wxeayv" path="res://paintings/procedual/fractal.gd" id="2_o3htp"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_o3htp"] resource_local_to_scene = true diff --git a/paintings/noise.gd b/paintings/procedual/noise.gd similarity index 77% rename from paintings/noise.gd rename to paintings/procedual/noise.gd index 80e08ab..f2fe933 100644 --- a/paintings/noise.gd +++ b/paintings/procedual/noise.gd @@ -1,16 +1,8 @@ @tool extends ColorRect - @export_tool_button('Randomize', 'RandomNumberGenerator') var randomize_action = randomize - -@export var noise: FastNoiseLite: - set(x): - if noise: noise.changed.disconnect(_changed_noise) - noise = x - if noise: noise.changed.connect(_changed_noise) - @export var steps := 12: set(x): material.set_shader_parameter('steps', x) get(): return material.get_shader_parameter('steps') @@ -29,32 +21,20 @@ extends ColorRect rng_seed = x _regenerate() - -var _noise_texture := NoiseTexture2D.new(): - set(x): - _noise_texture = x - _changed_noise() - - -func _changed_noise() -> void: - _noise_texture.noise = noise - material.set_shader_parameter('noise', _noise_texture) - - func _resized() -> void: - _noise_texture.width = ceili(size.x) - _noise_texture.height = ceili(size.y) - _changed_noise() - + var tex: NoiseTexture2D = material.get_shader_parameter('noise') + tex.width = ceili(size.x) + tex.height = ceili(size.y) + material.set_shader_parameter('noise', tex) func _ready() -> void: _resized() resized.connect(_resized) - func _regenerate() -> void: var rng := RandomNumberGenerator.new() rng.seed = rng_seed + var noise := FastNoiseLite.new() noise.fractal_type = rng.randi_range(0, 3) as FastNoiseLite.FractalType match noise.fractal_type: 3: noise.fractal_octaves = 2 @@ -62,6 +42,12 @@ func _regenerate() -> void: _: noise.fractal_octaves = 5 noise.frequency = rng.randf_range(0.002, 0.004) noise.seed = rng.seed + var tex := NoiseTexture2D.new() + tex.generate_mipmaps = false + tex.width = ceili(size.x) + tex.height = ceili(size.y) + tex.noise = noise + material.set_shader_parameter('noise', tex) match rng.randi_range(1, 5): 1: steps = 2 2: steps = 5 diff --git a/paintings/noise.gd.uid b/paintings/procedual/noise.gd.uid similarity index 100% rename from paintings/noise.gd.uid rename to paintings/procedual/noise.gd.uid diff --git a/paintings/noise.gdshader b/paintings/procedual/noise.gdshader similarity index 100% rename from paintings/noise.gdshader rename to paintings/procedual/noise.gdshader diff --git a/paintings/noise.gdshader.uid b/paintings/procedual/noise.gdshader.uid similarity index 100% rename from paintings/noise.gdshader.uid rename to paintings/procedual/noise.gdshader.uid diff --git a/paintings/procedual/noise.tscn b/paintings/procedual/noise.tscn new file mode 100644 index 0000000..4dc920c --- /dev/null +++ b/paintings/procedual/noise.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=6 format=3 uid="uid://bjpharjtpysre"] + +[ext_resource type="Shader" uid="uid://b6jkek1qotcnf" path="res://paintings/procedual/noise.gdshader" id="1_2lnyf"] +[ext_resource type="Script" uid="uid://2jt34o1v7gbo" path="res://paintings/procedual/noise.gd" id="1_o4civ"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_ula8d"] +seed = 573944325 +frequency = 0.0020331522 +fractal_type = 2 +fractal_octaves = 3 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_8rnnf"] +width = 310 +height = 200 +generate_mipmaps = false +noise = SubResource("FastNoiseLite_ula8d") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_0uljq"] +resource_local_to_scene = true +shader = ExtResource("1_2lnyf") +shader_parameter/noise = SubResource("NoiseTexture2D_8rnnf") +shader_parameter/steps = 8.0 +shader_parameter/gradient_start = Color(0.9170881, 0.52674425, 0.57822865, 1) +shader_parameter/gradient_end = Color(0.18847808, 0.004581891, 0.12525481, 1) + +[node name="Noise" type="ColorRect"] +material = SubResource("ShaderMaterial_0uljq") +custom_minimum_size = Vector2(31, 20) +offset_right = 310.0 +offset_bottom = 200.0 +script = ExtResource("1_o4civ") +gradient_start = Color(0.9170881, 0.52674425, 0.57822865, 1) +gradient_end = Color(0.18847808, 0.004581891, 0.12525481, 1) +rng_seed = 573944325 diff --git a/turn_manager.gd b/turn_manager.gd index 57dc43d..297d7bb 100644 --- a/turn_manager.gd +++ b/turn_manager.gd @@ -1,5 +1,7 @@ class_name TurnManager extends Node2D +signal timer_timeout + @export var turn_timer := 7.0 @export var tts_number_speed = 7.0 @export var tts_sentence_speed = 5.0 @@ -9,7 +11,6 @@ class_name TurnManager extends Node2D @export var desk: Desk @export var captions: CaptionLabel var timer: Timer -@export var game_manager: GameManager @export var audience_manager: AudienceManager @@ -25,9 +26,6 @@ func _ready() -> void: print('voices available: ', _voices.size()) -func turn_timer_animation(): - pass - func speak(text: String) -> void: print('tts: ', text) captions.display_caption(text) @@ -46,11 +44,18 @@ func _speak_ask_proposed(amount): else: speak('Can I get a %s?' % [amount]) + func _handle_ask_accepted(): timer.start() - turn_timer_animation() + func _handle_reminder_timer_timeout() -> void: - if game_manager.state == game_manager.bidding_state.ASKING or game_manager.state == game_manager.bidding_state.BID: - game_manager.state = game_manager.bidding_state.CLOSED - game_manager.destroy_painting() + timer_timeout.emit() + + +func end_turn() -> void: + timer.stop() + + +func restart_turn() -> void: + timer.start()