mirror of
https://github.com/Steffo99/swear-jar.git
synced 2024-11-21 23:34:18 +00:00
Complete Ghost
refactor
This commit is contained in:
parent
a6650e6140
commit
d78f353431
10 changed files with 79 additions and 32 deletions
|
@ -89,6 +89,7 @@ func update_counter_icon():
|
||||||
store_collector_texturerect.texture = null
|
store_collector_texturerect.texture = null
|
||||||
|
|
||||||
func _on_ghost_requested(item: PurchasableItem):
|
func _on_ghost_requested(item: PurchasableItem):
|
||||||
|
print("[Game] Requested ghost for: ", item)
|
||||||
ghost.COMPAT_set_to_purchasable_item(item)
|
ghost.COMPAT_set_to_purchasable_item(item)
|
||||||
ghost.process_mode = Node.PROCESS_MODE_INHERIT
|
ghost.process_mode = Node.PROCESS_MODE_INHERIT
|
||||||
ghost.show()
|
ghost.show()
|
||||||
|
|
|
@ -57,17 +57,23 @@ func _ready():
|
||||||
|
|
||||||
## Update the value of [can_place].
|
## Update the value of [can_place].
|
||||||
func update_state():
|
func update_state():
|
||||||
|
overlap_checker.update_is_overlapping_with()
|
||||||
|
placeable_area_checker.update_is_overlapping_with()
|
||||||
# DIRTY HACK: Relies on the placeable area being perfectly surrounded by solid bodies.
|
# DIRTY HACK: Relies on the placeable area being perfectly surrounded by solid bodies.
|
||||||
can_place = overlap_checker.is_overlapping_with == null and placeable_area_checker.is_overlapping_with != null
|
can_place = overlap_checker.is_overlapping_with == null and placeable_area_checker.is_overlapping_with != null
|
||||||
|
|
||||||
## For retro-compatibility, configure this for the placement of a [PurchasableItem].
|
## For retro-compatibility, configure this for the placement of a [PurchasableItem].
|
||||||
func COMPAT_set_to_purchasable_item(pi: PurchasableItem):
|
func COMPAT_set_to_purchasable_item(pi: PurchasableItem):
|
||||||
|
push_warning("COMPAT_set_to_purchasable_item is deprecated.")
|
||||||
instantiator.scene_to_instantiate = pi.item_scene
|
instantiator.scene_to_instantiate = pi.item_scene
|
||||||
placement_shape.shape = pi.get_node("ConverterPlacementBody").get_node("FullConverterShape").shape
|
var item_scene = pi.item_scene.instantiate()
|
||||||
placement_shape.scale = pi.item_scene.scale
|
placement_shape.shape = item_scene.get_node("ConverterPlacementBody/FullConverterShape").shape
|
||||||
|
placement_shape.scale = item_scene.scale
|
||||||
|
item_scene.queue_free()
|
||||||
preview_sprite.texture = pi.item_icon
|
preview_sprite.texture = pi.item_icon
|
||||||
position = starting_position
|
position = starting_position
|
||||||
rotation = starting_rotation_radians
|
rotation = starting_rotation_radians
|
||||||
|
update_state()
|
||||||
|
|
||||||
|
|
||||||
## Configure this for the placement of a [ShopItem].
|
## Configure this for the placement of a [ShopItem].
|
||||||
|
@ -78,6 +84,7 @@ func set_to_shop_item(si: ShopItem):
|
||||||
preview_sprite.texture = si.placement_texture
|
preview_sprite.texture = si.placement_texture
|
||||||
position = starting_position
|
position = starting_position
|
||||||
rotation = starting_rotation_radians
|
rotation = starting_rotation_radians
|
||||||
|
update_state()
|
||||||
|
|
||||||
## Emitted when [materialize] is called.
|
## Emitted when [materialize] is called.
|
||||||
signal materialized(what: Node)
|
signal materialized(what: Node)
|
||||||
|
@ -88,7 +95,16 @@ signal materialized(what: Node)
|
||||||
func materialize() -> Node:
|
func materialize() -> Node:
|
||||||
if not can_place:
|
if not can_place:
|
||||||
return null
|
return null
|
||||||
|
overlap_freer.update_is_overlapping_with()
|
||||||
overlap_freer.area_queue_free()
|
overlap_freer.area_queue_free()
|
||||||
var inst = instantiator.instantiate()
|
var inst = instantiator.instantiate()
|
||||||
materialized.emit(inst)
|
materialized.emit(inst)
|
||||||
return inst
|
return inst
|
||||||
|
|
||||||
|
|
||||||
|
func _on_moved(_from, _to):
|
||||||
|
update_state()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_rotated_radians(_from, _to):
|
||||||
|
update_state()
|
||||||
|
|
|
@ -26,13 +26,17 @@ z_index = 10
|
||||||
[node name="Instantiator" parent="." instance=ExtResource("4_f7fmh")]
|
[node name="Instantiator" parent="." instance=ExtResource("4_f7fmh")]
|
||||||
|
|
||||||
[node name="OverlapChecker" parent="." instance=ExtResource("5_twds7")]
|
[node name="OverlapChecker" parent="." instance=ExtResource("5_twds7")]
|
||||||
|
overlap_mask = 8
|
||||||
[node name="OverlapFreer" parent="." instance=ExtResource("6_y1rxa")]
|
|
||||||
|
|
||||||
[node name="PlaceableAreaChecker" parent="." instance=ExtResource("7_wemqm")]
|
[node name="PlaceableAreaChecker" parent="." instance=ExtResource("7_wemqm")]
|
||||||
|
overlap_mask = 16
|
||||||
|
|
||||||
|
[node name="OverlapFreer" parent="." instance=ExtResource("6_y1rxa")]
|
||||||
|
overlap_mask = 4
|
||||||
|
|
||||||
[connection signal="area_entered" from="." to="PlaceableAreaChecker" method="update_is_overlapping_with"]
|
[connection signal="area_entered" from="." to="PlaceableAreaChecker" method="update_is_overlapping_with"]
|
||||||
[connection signal="area_exited" from="." to="PlaceableAreaChecker" method="update_is_overlapping_with"]
|
[connection signal="area_exited" from="." to="PlaceableAreaChecker" method="update_is_overlapping_with"]
|
||||||
[connection signal="body_entered" from="." to="OverlapChecker" method="update_is_overlapping_with"]
|
[connection signal="body_entered" from="." to="OverlapChecker" method="update_is_overlapping_with"]
|
||||||
[connection signal="body_exited" from="." to="OverlapChecker" method="update_is_overlapping_with"]
|
[connection signal="body_exited" from="." to="OverlapChecker" method="update_is_overlapping_with"]
|
||||||
[connection signal="overlap_changing" from="OverlapChecker" to="." method="update_state"]
|
[connection signal="moved" from="PreciseTouchPlacer" to="." method="_on_moved"]
|
||||||
|
[connection signal="rotated_radians" from="PreciseTouchPlacer" to="." method="_on_rotated_radians"]
|
||||||
|
|
|
@ -34,6 +34,7 @@ func get_first_overlapping_body() -> Node2D:
|
||||||
func update_is_overlapping_with() -> void:
|
func update_is_overlapping_with() -> void:
|
||||||
var current_overlap = get_first_overlapping_body()
|
var current_overlap = get_first_overlapping_body()
|
||||||
if current_overlap != is_overlapping_with:
|
if current_overlap != is_overlapping_with:
|
||||||
|
print("[OverlapChecker] Now overlapping with: ", current_overlap)
|
||||||
overlap_changing.emit(current_overlap)
|
overlap_changing.emit(current_overlap)
|
||||||
is_overlapping_with = current_overlap
|
is_overlapping_with = current_overlap
|
||||||
|
|
||||||
|
|
|
@ -29,5 +29,6 @@ signal overlap_changing(to: PlaceableArea)
|
||||||
func update_is_overlapping_with() -> void:
|
func update_is_overlapping_with() -> void:
|
||||||
var current_overlap = get_first_overlapping_placeable_area()
|
var current_overlap = get_first_overlapping_placeable_area()
|
||||||
if current_overlap != is_overlapping_with:
|
if current_overlap != is_overlapping_with:
|
||||||
|
print("[PlaceableAreaChecker] Now overlapping with: ", current_overlap)
|
||||||
overlap_changing.emit(current_overlap)
|
overlap_changing.emit(current_overlap)
|
||||||
is_overlapping_with = current_overlap
|
is_overlapping_with = current_overlap
|
||||||
|
|
|
@ -26,6 +26,10 @@ var last_touch_events: Array[InputEvent] = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
signal moved(from: Vector2, to: Vector2)
|
||||||
|
signal rotated_radians(from: float, to: float)
|
||||||
|
|
||||||
|
|
||||||
## Count the number of non-[null] [last_touch_events].
|
## Count the number of non-[null] [last_touch_events].
|
||||||
func count_active_touch_events() -> int:
|
func count_active_touch_events() -> int:
|
||||||
var total = 0
|
var total = 0
|
||||||
|
@ -43,12 +47,18 @@ func _input(event: InputEvent):
|
||||||
if count == 0:
|
if count == 0:
|
||||||
# Mouse drag
|
# Mouse drag
|
||||||
if event is InputEventMouseMotion and last_mouse_event:
|
if event is InputEventMouseMotion and last_mouse_event:
|
||||||
|
var from = target.position
|
||||||
target.position += event.relative
|
target.position += event.relative
|
||||||
|
var to = target.position
|
||||||
|
moved.emit(from, to)
|
||||||
# Touch drag
|
# Touch drag
|
||||||
elif count == 1:
|
elif count == 1:
|
||||||
# Touch drag
|
# Touch drag
|
||||||
if event is InputEventScreenDrag:
|
if event is InputEventScreenDrag:
|
||||||
|
var from = target.position
|
||||||
target.position += event.relative
|
target.position += event.relative
|
||||||
|
var to = target.position
|
||||||
|
moved.emit(from, to)
|
||||||
# Handle rotation
|
# Handle rotation
|
||||||
elif count == 2:
|
elif count == 2:
|
||||||
# Find the previous event
|
# Find the previous event
|
||||||
|
@ -77,7 +87,10 @@ func _input(event: InputEvent):
|
||||||
# Find the angle between the two vectors
|
# Find the angle between the two vectors
|
||||||
var rotation_radians = previous_vec.angle_to(current_vec)
|
var rotation_radians = previous_vec.angle_to(current_vec)
|
||||||
# Apply the rotation
|
# Apply the rotation
|
||||||
target.rotation += rotation_radians
|
var from = target.rotation
|
||||||
|
target.rotation += rotation_radians
|
||||||
|
var to = target.rotation
|
||||||
|
rotated_radians.emit(from, to)
|
||||||
|
|
||||||
# Store last events
|
# Store last events
|
||||||
if event is InputEventMouseButton:
|
if event is InputEventMouseButton:
|
||||||
|
|
|
@ -90,25 +90,25 @@ var has_bought: bool:
|
||||||
|
|
||||||
|
|
||||||
## Emitted when a purchase has started.
|
## Emitted when a purchase has started.
|
||||||
signal purchase_begin(what: PurchasableItem)
|
signal purchase_begin
|
||||||
|
|
||||||
## Emitted when a purchase is cancelled.
|
## Emitted when a purchase is cancelled.
|
||||||
signal purchase_cancel(what: PurchasableItem)
|
signal purchase_cancel
|
||||||
|
|
||||||
## Emitted when a purchase is completed.
|
## Emitted when a purchase is completed.
|
||||||
##
|
##
|
||||||
## Emitted by complete_purchase().
|
## Emitted by complete_purchase().
|
||||||
signal purchase_success(what: PurchasableItem)
|
signal purchase_success
|
||||||
|
|
||||||
|
|
||||||
func _on_buy_button_pressed():
|
func _on_buy_button_pressed():
|
||||||
if is_buying:
|
if is_buying:
|
||||||
is_buying = false
|
is_buying = false
|
||||||
purchase_cancel.emit(self)
|
purchase_cancel.emit()
|
||||||
else:
|
else:
|
||||||
is_buying = true
|
is_buying = true
|
||||||
purchase_begin.emit(self)
|
purchase_begin.emit()
|
||||||
|
|
||||||
func complete_purchase():
|
func complete_purchase():
|
||||||
is_buying = false
|
is_buying = false
|
||||||
purchase_success.emit(self)
|
purchase_success.emit()
|
||||||
|
|
|
@ -10,6 +10,16 @@ class_name ScoreUI
|
||||||
@onready var request: HTTPRequest = $SubmissionRequest
|
@onready var request: HTTPRequest = $SubmissionRequest
|
||||||
|
|
||||||
|
|
||||||
|
@onready var parent: Node = get_parent()
|
||||||
|
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
if parent is SafeUI:
|
||||||
|
parent.process_mode = PROCESS_MODE_DISABLED
|
||||||
|
else:
|
||||||
|
process_mode = PROCESS_MODE_DISABLED
|
||||||
|
|
||||||
|
|
||||||
func _on_game_score_changed(total: int):
|
func _on_game_score_changed(total: int):
|
||||||
score_button.set_score(total)
|
score_button.set_score(total)
|
||||||
|
|
||||||
|
|
|
@ -21,39 +21,41 @@ signal purchase_cancel(what: PurchasableItem)
|
||||||
signal purchase_success(what: PurchasableItem)
|
signal purchase_success(what: PurchasableItem)
|
||||||
|
|
||||||
## Array of all PurchasableItems that this ShopUI should control.
|
## Array of all PurchasableItems that this ShopUI should control.
|
||||||
@onready var purchasable_items: Array[Node] = find_children("*", "PurchasableItem")
|
var purchasable_items: Array[Node] = []
|
||||||
|
|
||||||
signal ghost_requested(what: PurchasableItem)
|
signal ghost_requested(what: PurchasableItem)
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
@onready var parent: Node = get_parent()
|
||||||
for item in purchasable_items:
|
|
||||||
item.purchase_begin.connect(_on_any_purchase_begin)
|
|
||||||
item.purchase_cancel.connect(_on_any_purchase_cancel)
|
|
||||||
item.purchase_success.connect(_on_any_purchase_success)
|
|
||||||
|
|
||||||
func _on_any_purchase_begin(what: Node):
|
|
||||||
if not what is PurchasableItem:
|
func _ready():
|
||||||
push_error("Purchase began outside a PurchasableItem")
|
purchasable_items = find_children("*", "PurchasableItem", true, false)
|
||||||
return
|
for item in purchasable_items:
|
||||||
|
item.purchase_begin.connect(_on_any_purchase_begin.bind(item))
|
||||||
|
item.purchase_cancel.connect(_on_any_purchase_cancel.bind(item))
|
||||||
|
item.purchase_success.connect(_on_any_purchase_success.bind(item))
|
||||||
|
if parent is SafeUI:
|
||||||
|
parent.process_mode = PROCESS_MODE_DISABLED
|
||||||
|
else:
|
||||||
|
process_mode = PROCESS_MODE_DISABLED
|
||||||
|
|
||||||
|
func _on_any_purchase_begin(what: PurchasableItem):
|
||||||
|
print("[ShopUI] Beginning purchase of: ", what)
|
||||||
delete_button.disabled = true
|
delete_button.disabled = true
|
||||||
if what.item_scene:
|
if what.item_scene:
|
||||||
ghost_requested.emit(what)
|
ghost_requested.emit(what)
|
||||||
purchase_begin.emit(what)
|
purchase_begin.emit(what)
|
||||||
set_all_can_buy(false, what)
|
set_all_can_buy(false, what)
|
||||||
|
|
||||||
func _on_any_purchase_cancel(what: Node):
|
func _on_any_purchase_cancel(what: PurchasableItem):
|
||||||
if not what is PurchasableItem:
|
print("[ShopUI] Cancelling purchase of: ", what)
|
||||||
push_error("Purchase cancelled outside a PurchasableItem")
|
|
||||||
return
|
|
||||||
delete_button.disabled = false
|
delete_button.disabled = false
|
||||||
purchase_cancel.emit(what)
|
purchase_cancel.emit(what)
|
||||||
set_all_can_buy(true, what)
|
set_all_can_buy(true, what)
|
||||||
|
|
||||||
func _on_any_purchase_success(what: Node):
|
func _on_any_purchase_success(what: PurchasableItem):
|
||||||
if not what is PurchasableItem:
|
print("[ShopUI] Succeeded purchase of: ", what)
|
||||||
push_error("Purchase succeeded outside a PurchasableItem")
|
|
||||||
return
|
|
||||||
if what.item_scene:
|
if what.item_scene:
|
||||||
ghost_materialize.emit()
|
ghost_materialize.emit()
|
||||||
delete_button.disabled = false
|
delete_button.disabled = false
|
||||||
|
|
|
@ -72,7 +72,7 @@ apply_margin_top = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
|
||||||
[node name="ShopSafeUI" parent="CustomUI" instance=ExtResource("5_2uxda")]
|
[node name="ShopSafeUI" parent="CustomUI" instance=ExtResource("5_2uxda")]
|
||||||
process_mode = 4
|
process_mode = 3
|
||||||
visible = false
|
visible = false
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
apply_margin_left = true
|
apply_margin_left = true
|
||||||
|
@ -84,7 +84,6 @@ apply_margin_bottom = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
|
||||||
[node name="ScoreSafeUI" parent="CustomUI" instance=ExtResource("5_2uxda")]
|
[node name="ScoreSafeUI" parent="CustomUI" instance=ExtResource("5_2uxda")]
|
||||||
process_mode = 4
|
|
||||||
visible = false
|
visible = false
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
apply_margin_left = true
|
apply_margin_left = true
|
||||||
|
|
Loading…
Reference in a new issue