mirror of
https://github.com/Steffo99/swear-jar.git
synced 2024-11-25 00:54:19 +00:00
Merge branch 'main' of https://github.com/Steffo99/ld54
This commit is contained in:
commit
225dc96954
38 changed files with 1223 additions and 76 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,7 +5,6 @@
|
|||
.import/
|
||||
.export/
|
||||
export.cfg
|
||||
export_presets.cfg
|
||||
|
||||
# Imported translations (automatically generated from CSV files)
|
||||
*.translation
|
||||
|
|
5
.vscode/extensions.json
vendored
Normal file
5
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"geequlim.godot-tools",
|
||||
]
|
||||
}
|
13
.vscode/settings.json
vendored
Normal file
13
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"files.exclude": {
|
||||
".godot": true,
|
||||
"**/*.godot": true,
|
||||
"**/*.tres": true,
|
||||
"**/*.tscn": true,
|
||||
"**/*.import": true,
|
||||
},
|
||||
"files.associations": {
|
||||
"*.gdignore": "ignore",
|
||||
},
|
||||
"editor.insertSpaces": false,
|
||||
}
|
8
Game.gd
Normal file
8
Game.gd
Normal file
|
@ -0,0 +1,8 @@
|
|||
extends Node2D
|
||||
|
||||
func _on_roller_failure():
|
||||
print("failure")
|
||||
|
||||
|
||||
func _on_roller_success():
|
||||
print("success")
|
11
bottle/bottle.gd
Normal file
11
bottle/bottle.gd
Normal file
|
@ -0,0 +1,11 @@
|
|||
extends TileMap
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
pass
|
|
@ -4,6 +4,8 @@ class_name GravityFromGyro
|
|||
|
||||
func _physics_process(_delta):
|
||||
var accel_3d = Input.get_accelerometer()
|
||||
if accel_3d == Vector3.ZERO: # If accelerometer is not supported
|
||||
accel_3d = Vector3.DOWN * 9.8
|
||||
|
||||
var accel_2d = Vector2(accel_3d.x, -accel_3d.y) / 9.8
|
||||
PhysicsServer2D.area_set_param(get_viewport().find_world_2d().space, PhysicsServer2D.AREA_PARAM_GRAVITY_VECTOR, accel_2d)
|
||||
|
||||
|
|
18
collector/collectible.gd
Normal file
18
collector/collectible.gd
Normal file
|
@ -0,0 +1,18 @@
|
|||
extends Node
|
||||
class_name Collectible
|
||||
## A marker for collectible entities.
|
||||
##
|
||||
## Used by [Collector]s to determine which entities to pick up.
|
||||
|
||||
|
||||
## The type of collectible entity the parent entity represents.
|
||||
@export var type: StringName
|
||||
|
||||
## Emitted when this entity has been collected by a collector.
|
||||
signal collected
|
||||
|
||||
## Mark this entity as collected.
|
||||
##
|
||||
## You'll probably want to connect this to an AudioSource2D, which will disable the node and play a sound, and when the sound is over a new signal will queue_free it.
|
||||
func collect():
|
||||
emit_signal("collected")
|
9
collector/collectible.tscn
Normal file
9
collector/collectible.tscn
Normal file
|
@ -0,0 +1,9 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://bk1vvq5rug01m"]
|
||||
|
||||
[ext_resource type="Script" path="res://collector/collectible.gd" id="1_qilbk"]
|
||||
[ext_resource type="PackedScene" uid="uid://ujpra0s1kpqi" path="res://value/valuable.tscn" id="2_2nvfu"]
|
||||
|
||||
[node name="Collectible" type="Node"]
|
||||
script = ExtResource("1_qilbk")
|
||||
|
||||
[node name="Valuable" parent="." instance=ExtResource("2_2nvfu")]
|
39
collector/collector.gd
Normal file
39
collector/collector.gd
Normal file
|
@ -0,0 +1,39 @@
|
|||
extends Area2D
|
||||
class_name Collector
|
||||
## Area that will pick up [Collectible]s with a given name, keeping track of the amount collected.
|
||||
|
||||
|
||||
## The current amount of collected entities.
|
||||
var collected_count: int = 0
|
||||
|
||||
## The types of [Collectible]s to pick up.
|
||||
##
|
||||
## The strings will match only if exactly the same.
|
||||
@export var collecting_types: Array[StringName]
|
||||
|
||||
## The collision mask to check colliding body against.
|
||||
@export_flags_2d_physics var collecting_collision_mask: int
|
||||
|
||||
## The goal amount of entities to collect.
|
||||
##
|
||||
## When [collected_count] reaches it, it will be reset to zero, and the "goal" signal will be emitted.
|
||||
@export var collecting_amount: int
|
||||
|
||||
## The collector has picked up an object.
|
||||
signal collected(what: PhysicsBody2D)
|
||||
|
||||
## The collector has received its collection goal and is about to reset.
|
||||
signal goal
|
||||
|
||||
|
||||
func _on_body_entered(body: Node2D):
|
||||
if body is PhysicsBody2D:
|
||||
if body.collision_layer & collecting_collision_mask:
|
||||
var collectible: Collectible = body.get_node("Collectible")
|
||||
if collectible.type in collecting_types:
|
||||
collected_count += 1
|
||||
collectible.collect()
|
||||
emit_signal("collected", body)
|
||||
if collected_count >= collecting_amount:
|
||||
emit_signal("goal")
|
||||
collected_count = 0
|
8
collector/collector.tscn
Normal file
8
collector/collector.tscn
Normal file
|
@ -0,0 +1,8 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://c5w3b55aiui6c"]
|
||||
|
||||
[ext_resource type="Script" path="res://collector/collector.gd" id="1_1xtt5"]
|
||||
|
||||
[node name="Collector" type="Area2D"]
|
||||
script = ExtResource("1_1xtt5")
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
|
26
convertitore.tscn
Normal file
26
convertitore.tscn
Normal file
|
@ -0,0 +1,26 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://ei1b0ity3nwg"]
|
||||
|
||||
[ext_resource type="Script" path="res://Convertitore.gd" id="1_7de38"]
|
||||
[ext_resource type="Texture2D" uid="uid://cxsl5yvdhswc7" path="res://icon.png" id="2_8bfs6"]
|
||||
|
||||
[node name="Convertitore" type="Node2D"]
|
||||
script = ExtResource("1_7de38")
|
||||
|
||||
[node name="Icon" type="Sprite2D" parent="."]
|
||||
position = Vector2(61, 76)
|
||||
rotation = 1.5708
|
||||
scale = Vector2(0.2, 0.2)
|
||||
texture = ExtResource("2_8bfs6")
|
||||
|
||||
[node name="StaticBody2D" type="StaticBody2D" parent="."]
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="StaticBody2D"]
|
||||
polygon = PackedVector2Array(36, 114, 36, 38, 42, 56, 61, 57, 79, 56, 85, 38, 85, 115, 61, 91)
|
||||
|
||||
[node name="Ingresso" type="Area2D" parent="."]
|
||||
position = Vector2(56, 42)
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Ingresso"]
|
||||
polygon = PackedVector2Array(-20, -6, 29, -6, 23, 11, 5, 14, -12, 12)
|
||||
|
||||
[connection signal="body_shape_entered" from="Ingresso" to="." method="_on_ingresso_body_shape_entered"]
|
|
@ -1,8 +1,10 @@
|
|||
[gd_scene load_steps=5 format=3 uid="uid://c3kitncwpi42j"]
|
||||
[gd_scene load_steps=7 format=3 uid="uid://c3kitncwpi42j"]
|
||||
|
||||
[ext_resource type="PhysicsMaterial" uid="uid://c6kn1an85lccr" path="res://entity/coin_physics_material.tres" id="1_8k46m"]
|
||||
[ext_resource type="Texture2D" uid="uid://dbdkb4vt7dh85" path="res://entity/coin_copper_4.png" id="1_wedw1"]
|
||||
[ext_resource type="Texture2D" uid="uid://2vtvoj6ua3cb" path="res://entity/coin_copper_outline_2.png" id="2_2ifq3"]
|
||||
[ext_resource type="PackedScene" uid="uid://bk1vvq5rug01m" path="res://collector/collectible.tscn" id="4_yefrx"]
|
||||
[ext_resource type="PackedScene" uid="uid://ujpra0s1kpqi" path="res://value/valuable.tscn" id="5_jdvvd"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_c6byl"]
|
||||
size = Vector2(16, 5)
|
||||
|
@ -28,3 +30,9 @@ texture = ExtResource("1_wedw1")
|
|||
z_index = -10
|
||||
texture_filter = 1
|
||||
texture = ExtResource("2_2ifq3")
|
||||
|
||||
[node name="Collectible" parent="." instance=ExtResource("4_yefrx")]
|
||||
type = &"Copper"
|
||||
|
||||
[node name="Valuable" parent="." instance=ExtResource("5_jdvvd")]
|
||||
value = 1
|
||||
|
|
201
export_presets.cfg
Normal file
201
export_presets.cfg
Normal file
|
@ -0,0 +1,201 @@
|
|||
[preset.0]
|
||||
|
||||
name="Android"
|
||||
platform="Android"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path=""
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
gradle_build/use_gradle_build=false
|
||||
gradle_build/export_format=0
|
||||
gradle_build/min_sdk=""
|
||||
gradle_build/target_sdk=""
|
||||
architectures/armeabi-v7a=false
|
||||
architectures/arm64-v8a=true
|
||||
architectures/x86=false
|
||||
architectures/x86_64=false
|
||||
version/code=1
|
||||
version/name="1.0"
|
||||
package/unique_name="org.godotengine.$genname"
|
||||
package/name=""
|
||||
package/signed=true
|
||||
package/app_category=2
|
||||
package/retain_data_on_uninstall=false
|
||||
package/exclude_from_recents=false
|
||||
launcher_icons/main_192x192=""
|
||||
launcher_icons/adaptive_foreground_432x432=""
|
||||
launcher_icons/adaptive_background_432x432=""
|
||||
graphics/opengl_debug=false
|
||||
xr_features/xr_mode=0
|
||||
xr_features/hand_tracking=0
|
||||
xr_features/hand_tracking_frequency=0
|
||||
xr_features/passthrough=0
|
||||
screen/immersive_mode=true
|
||||
screen/support_small=true
|
||||
screen/support_normal=true
|
||||
screen/support_large=true
|
||||
screen/support_xlarge=true
|
||||
user_data_backup/allow=false
|
||||
command_line/extra_args=""
|
||||
apk_expansion/enable=false
|
||||
apk_expansion/SALT=""
|
||||
apk_expansion/public_key=""
|
||||
permissions/custom_permissions=PackedStringArray()
|
||||
permissions/access_checkin_properties=false
|
||||
permissions/access_coarse_location=false
|
||||
permissions/access_fine_location=false
|
||||
permissions/access_location_extra_commands=false
|
||||
permissions/access_mock_location=false
|
||||
permissions/access_network_state=false
|
||||
permissions/access_surface_flinger=false
|
||||
permissions/access_wifi_state=false
|
||||
permissions/account_manager=false
|
||||
permissions/add_voicemail=false
|
||||
permissions/authenticate_accounts=false
|
||||
permissions/battery_stats=false
|
||||
permissions/bind_accessibility_service=false
|
||||
permissions/bind_appwidget=false
|
||||
permissions/bind_device_admin=false
|
||||
permissions/bind_input_method=false
|
||||
permissions/bind_nfc_service=false
|
||||
permissions/bind_notification_listener_service=false
|
||||
permissions/bind_print_service=false
|
||||
permissions/bind_remoteviews=false
|
||||
permissions/bind_text_service=false
|
||||
permissions/bind_vpn_service=false
|
||||
permissions/bind_wallpaper=false
|
||||
permissions/bluetooth=false
|
||||
permissions/bluetooth_admin=false
|
||||
permissions/bluetooth_privileged=false
|
||||
permissions/brick=false
|
||||
permissions/broadcast_package_removed=false
|
||||
permissions/broadcast_sms=false
|
||||
permissions/broadcast_sticky=false
|
||||
permissions/broadcast_wap_push=false
|
||||
permissions/call_phone=false
|
||||
permissions/call_privileged=false
|
||||
permissions/camera=false
|
||||
permissions/capture_audio_output=false
|
||||
permissions/capture_secure_video_output=false
|
||||
permissions/capture_video_output=false
|
||||
permissions/change_component_enabled_state=false
|
||||
permissions/change_configuration=false
|
||||
permissions/change_network_state=false
|
||||
permissions/change_wifi_multicast_state=false
|
||||
permissions/change_wifi_state=false
|
||||
permissions/clear_app_cache=false
|
||||
permissions/clear_app_user_data=false
|
||||
permissions/control_location_updates=false
|
||||
permissions/delete_cache_files=false
|
||||
permissions/delete_packages=false
|
||||
permissions/device_power=false
|
||||
permissions/diagnostic=false
|
||||
permissions/disable_keyguard=false
|
||||
permissions/dump=false
|
||||
permissions/expand_status_bar=false
|
||||
permissions/factory_test=false
|
||||
permissions/flashlight=false
|
||||
permissions/force_back=false
|
||||
permissions/get_accounts=false
|
||||
permissions/get_package_size=false
|
||||
permissions/get_tasks=false
|
||||
permissions/get_top_activity_info=false
|
||||
permissions/global_search=false
|
||||
permissions/hardware_test=false
|
||||
permissions/inject_events=false
|
||||
permissions/install_location_provider=false
|
||||
permissions/install_packages=false
|
||||
permissions/install_shortcut=false
|
||||
permissions/internal_system_window=false
|
||||
permissions/internet=false
|
||||
permissions/kill_background_processes=false
|
||||
permissions/location_hardware=false
|
||||
permissions/manage_accounts=false
|
||||
permissions/manage_app_tokens=false
|
||||
permissions/manage_documents=false
|
||||
permissions/manage_external_storage=false
|
||||
permissions/master_clear=false
|
||||
permissions/media_content_control=false
|
||||
permissions/modify_audio_settings=false
|
||||
permissions/modify_phone_state=false
|
||||
permissions/mount_format_filesystems=false
|
||||
permissions/mount_unmount_filesystems=false
|
||||
permissions/nfc=false
|
||||
permissions/persistent_activity=false
|
||||
permissions/process_outgoing_calls=false
|
||||
permissions/read_calendar=false
|
||||
permissions/read_call_log=false
|
||||
permissions/read_contacts=false
|
||||
permissions/read_external_storage=false
|
||||
permissions/read_frame_buffer=false
|
||||
permissions/read_history_bookmarks=false
|
||||
permissions/read_input_state=false
|
||||
permissions/read_logs=false
|
||||
permissions/read_phone_state=false
|
||||
permissions/read_profile=false
|
||||
permissions/read_sms=false
|
||||
permissions/read_social_stream=false
|
||||
permissions/read_sync_settings=false
|
||||
permissions/read_sync_stats=false
|
||||
permissions/read_user_dictionary=false
|
||||
permissions/reboot=false
|
||||
permissions/receive_boot_completed=false
|
||||
permissions/receive_mms=false
|
||||
permissions/receive_sms=false
|
||||
permissions/receive_wap_push=false
|
||||
permissions/record_audio=false
|
||||
permissions/reorder_tasks=false
|
||||
permissions/restart_packages=false
|
||||
permissions/send_respond_via_message=false
|
||||
permissions/send_sms=false
|
||||
permissions/set_activity_watcher=false
|
||||
permissions/set_alarm=false
|
||||
permissions/set_always_finish=false
|
||||
permissions/set_animation_scale=false
|
||||
permissions/set_debug_app=false
|
||||
permissions/set_orientation=false
|
||||
permissions/set_pointer_speed=false
|
||||
permissions/set_preferred_applications=false
|
||||
permissions/set_process_limit=false
|
||||
permissions/set_time=false
|
||||
permissions/set_time_zone=false
|
||||
permissions/set_wallpaper=false
|
||||
permissions/set_wallpaper_hints=false
|
||||
permissions/signal_persistent_processes=false
|
||||
permissions/status_bar=false
|
||||
permissions/subscribed_feeds_read=false
|
||||
permissions/subscribed_feeds_write=false
|
||||
permissions/system_alert_window=false
|
||||
permissions/transmit_ir=false
|
||||
permissions/uninstall_shortcut=false
|
||||
permissions/update_device_stats=false
|
||||
permissions/use_credentials=false
|
||||
permissions/use_sip=false
|
||||
permissions/vibrate=false
|
||||
permissions/wake_lock=false
|
||||
permissions/write_apn_settings=false
|
||||
permissions/write_calendar=false
|
||||
permissions/write_call_log=false
|
||||
permissions/write_contacts=false
|
||||
permissions/write_external_storage=false
|
||||
permissions/write_gservices=false
|
||||
permissions/write_history_bookmarks=false
|
||||
permissions/write_profile=false
|
||||
permissions/write_secure_settings=false
|
||||
permissions/write_settings=false
|
||||
permissions/write_sms=false
|
||||
permissions/write_social_stream=false
|
||||
permissions/write_sync_settings=false
|
||||
permissions/write_user_dictionary=false
|
9
game/game.gd
Normal file
9
game/game.gd
Normal file
|
@ -0,0 +1,9 @@
|
|||
extends Node2D
|
||||
class_name Game
|
||||
|
||||
|
||||
@onready var button_spawner = $ButtonSpawner
|
||||
|
||||
|
||||
func trigger_spawn():
|
||||
button_spawner.spawn()
|
37
game/game.tscn
Normal file
37
game/game.tscn
Normal file
|
@ -0,0 +1,37 @@
|
|||
[gd_scene load_steps=6 format=3 uid="uid://c3rxmcwa5nqng"]
|
||||
|
||||
[ext_resource type="Script" path="res://game/game.gd" id="1_i3ly0"]
|
||||
[ext_resource type="PackedScene" uid="uid://bllsprv8orpn4" path="res://bottle/bottle.tscn" id="1_y7o2l"]
|
||||
[ext_resource type="PackedScene" uid="uid://d05b8jy3xmpcb" path="res://bottle/gravity_from_gyro.tscn" id="2_h2pfr"]
|
||||
[ext_resource type="PackedScene" uid="uid://c67lfbk4gf1ga" path="res://spawner/spawner.tscn" id="3_qwsty"]
|
||||
[ext_resource type="PackedScene" uid="uid://c3kitncwpi42j" path="res://entity/coin_copper.tscn" id="4_e5nwi"]
|
||||
|
||||
[node name="Game" type="Node2D"]
|
||||
texture_filter = 1
|
||||
script = ExtResource("1_i3ly0")
|
||||
|
||||
[node name="Bottle" parent="." instance=ExtResource("1_y7o2l")]
|
||||
|
||||
[node name="GravityFromGyro" parent="Bottle" instance=ExtResource("2_h2pfr")]
|
||||
|
||||
[node name="TimeSpawner" parent="." instance=ExtResource("3_qwsty")]
|
||||
position = Vector2(0, -480)
|
||||
scene = ExtResource("4_e5nwi")
|
||||
buffer_cap = 1
|
||||
spawn_position_range_x = 32.0
|
||||
spawn_rotation_range = 15.0
|
||||
overlapping_bodies_collision_mask = 4
|
||||
overlapping_body_count_limit = 4
|
||||
|
||||
[node name="Timer" type="Timer" parent="TimeSpawner"]
|
||||
|
||||
[node name="ButtonSpawner" parent="." instance=ExtResource("3_qwsty")]
|
||||
position = Vector2(0, -480)
|
||||
scene = ExtResource("4_e5nwi")
|
||||
buffer_cap = 50
|
||||
spawn_position_range_x = 32.0
|
||||
spawn_rotation_range = 15.0
|
||||
overlapping_bodies_collision_mask = 4
|
||||
overlapping_body_count_limit = 4
|
||||
|
||||
[connection signal="timeout" from="TimeSpawner/Timer" to="TimeSpawner" method="spawn"]
|
15
interface/game_container.tscn
Normal file
15
interface/game_container.tscn
Normal file
|
@ -0,0 +1,15 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://c0uce7ssweke"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://c3rxmcwa5nqng" path="res://game/game.tscn" id="1_dbqdv"]
|
||||
|
||||
[node name="GameContainer" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 7
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="Game" parent="." instance=ExtResource("1_dbqdv")]
|
21
interface/game_ui.gd
Normal file
21
interface/game_ui.gd
Normal file
|
@ -0,0 +1,21 @@
|
|||
extends VBoxContainer
|
||||
class_name GameUI
|
||||
|
||||
## Emitted when the Score button is pressed.
|
||||
signal score_button_pressed
|
||||
|
||||
## Emitted when the Spawn button is pressed.
|
||||
signal spawn_button_pressed
|
||||
|
||||
## Emitted when the Shop button is presesd.
|
||||
signal shop_button_pressed
|
||||
|
||||
|
||||
func _on_score_button_pressed():
|
||||
score_button_pressed.emit()
|
||||
|
||||
func _on_spawn_button_pressed():
|
||||
spawn_button_pressed.emit()
|
||||
|
||||
func _on_shop_button_pressed():
|
||||
shop_button_pressed.emit()
|
51
interface/game_ui.tscn
Normal file
51
interface/game_ui.tscn
Normal file
|
@ -0,0 +1,51 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://bo5unrhqpoyim"]
|
||||
|
||||
[ext_resource type="Theme" uid="uid://ba5utvfhnxa5i" path="res://interface/interface_theme.tres" id="1_ppf8y"]
|
||||
[ext_resource type="Script" path="res://interface/game_ui.gd" id="2_33nqa"]
|
||||
|
||||
[node name="GameUI" type="VBoxContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme = ExtResource("1_ppf8y")
|
||||
script = ExtResource("2_33nqa")
|
||||
|
||||
[node name="UpperButtons" type="HBoxContainer" parent="."]
|
||||
custom_minimum_size = Vector2(0, 54)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 8
|
||||
alignment = 1
|
||||
|
||||
[node name="ScoreButton" type="Button" parent="UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
text = "$0"
|
||||
alignment = 0
|
||||
|
||||
[node name="UpperButtonsSpacerLeft" type="Control" parent="UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="SpawnButton" type="Button" parent="UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
text = "Drop"
|
||||
|
||||
[node name="UpperButtonsSpacerRight" type="Control" parent="UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="ShopButton" type="Button" parent="UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
text = "Shop"
|
||||
alignment = 2
|
||||
|
||||
[connection signal="pressed" from="UpperButtons/ScoreButton" to="." method="_on_score_button_pressed"]
|
||||
[connection signal="pressed" from="UpperButtons/SpawnButton" to="." method="_on_spawn_button_pressed"]
|
||||
[connection signal="pressed" from="UpperButtons/ShopButton" to="." method="_on_shop_button_pressed"]
|
6
interface/interface_theme.tres
Normal file
6
interface/interface_theme.tres
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://ba5utvfhnxa5i"]
|
||||
|
||||
[ext_resource type="FontFile" uid="uid://cs8tiwyb76gig" path="res://font/press-start/prstart.ttf" id="1_mtdor"]
|
||||
|
||||
[resource]
|
||||
default_font = ExtResource("1_mtdor")
|
95
interface/purchasable_item.gd
Normal file
95
interface/purchasable_item.gd
Normal file
|
@ -0,0 +1,95 @@
|
|||
extends Panel
|
||||
class_name PurchasableItem
|
||||
|
||||
## Icon of the item that can be purchased.
|
||||
@export var item_icon: Texture2D:
|
||||
get:
|
||||
return item_icon
|
||||
set(value):
|
||||
item_icon = value
|
||||
$Contents/Header/IconRect.texture = item_icon
|
||||
|
||||
## Name of the item that can be purchased.
|
||||
@export var item_name: String:
|
||||
get:
|
||||
return item_name
|
||||
set(value):
|
||||
item_name = value
|
||||
$Contents/Header/NameLabel.text = value
|
||||
|
||||
## Description of the item that can be purchased.
|
||||
@export var item_description: String:
|
||||
get:
|
||||
return item_description
|
||||
set(value):
|
||||
item_description = value
|
||||
$Contents/Header/DescriptionLabel.text = value
|
||||
|
||||
## Text to be displayed on the cost label of the item.
|
||||
@export var item_cost_text: String:
|
||||
get:
|
||||
return item_cost_text
|
||||
set(value):
|
||||
item_cost_text = value
|
||||
$Contents/Action/CostLabel.text = value
|
||||
|
||||
## Collectible type of the item required to buy the item.
|
||||
@export var item_cost_type: StringName
|
||||
|
||||
## Amount of items of the given type to collect to buy the item.
|
||||
@export var item_cost_goal: int
|
||||
|
||||
## Whether the player can click or not the Buy button.
|
||||
##
|
||||
## Used to prevent two items from getting bought at the same time.
|
||||
@export var can_buy: bool = true:
|
||||
get:
|
||||
return can_buy
|
||||
set(value):
|
||||
can_buy = value
|
||||
$Contents/Action/BuyButton.disabled = not (can_buy && has_unlocked)
|
||||
|
||||
## Whether the player has unlocked this item for purchase.
|
||||
##
|
||||
## Used to force the player to follow the tech tree.
|
||||
@export var has_unlocked: bool = true:
|
||||
get:
|
||||
return has_unlocked
|
||||
set(value):
|
||||
has_unlocked = value
|
||||
$Contents/Action/BuyButton.disabled = not (can_buy && has_unlocked)
|
||||
|
||||
## Whether the player is currently buying this item.
|
||||
##
|
||||
## Used to cancel the purchase.
|
||||
var is_buying: bool:
|
||||
get:
|
||||
return is_buying
|
||||
set(value):
|
||||
is_buying = value
|
||||
$Contents/Action/BuyButton.text = "Cancel" if value else "Buy"
|
||||
|
||||
|
||||
## Emitted when a purchase has started.
|
||||
signal purchase_begin
|
||||
|
||||
## Emitted when a purchase is cancelled.
|
||||
signal purchase_cancel
|
||||
|
||||
## Emitted when a purchase is completed.
|
||||
##
|
||||
## Emitted by complete_purchase().
|
||||
signal purchase_success
|
||||
|
||||
|
||||
func _on_buy_button_pressed():
|
||||
if is_buying:
|
||||
is_buying = false
|
||||
purchase_cancel.emit()
|
||||
else:
|
||||
is_buying = true
|
||||
purchase_begin.emit()
|
||||
|
||||
func complete_purchase():
|
||||
is_buying = false
|
||||
purchase_success.emit()
|
118
interface/purchasable_item.tscn
Normal file
118
interface/purchasable_item.tscn
Normal file
|
@ -0,0 +1,118 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://dul1fpyh733t7"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://cxsl5yvdhswc7" path="res://icon.png" id="1_drwcj"]
|
||||
[ext_resource type="Script" path="res://interface/purchasable_item.gd" id="1_h8jix"]
|
||||
[ext_resource type="Theme" uid="uid://ba5utvfhnxa5i" path="res://interface/interface_theme.tres" id="1_r2qbu"]
|
||||
|
||||
[node name="PurchasableItem" type="Panel"]
|
||||
custom_minimum_size = Vector2(0, 182)
|
||||
anchors_preset = 10
|
||||
anchor_right = 1.0
|
||||
grow_horizontal = 2
|
||||
size_flags_horizontal = 3
|
||||
theme = ExtResource("1_r2qbu")
|
||||
script = ExtResource("1_h8jix")
|
||||
|
||||
[node name="Contents" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="HeaderPaddingTop" type="Control" parent="Contents"]
|
||||
custom_minimum_size = Vector2(0, 4)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Header" type="HBoxContainer" parent="Contents"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 8
|
||||
|
||||
[node name="IconPaddingLeft" type="Control" parent="Contents/Header"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="IconRect" type="TextureRect" parent="Contents/Header"]
|
||||
custom_minimum_size = Vector2(54, 54)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("1_drwcj")
|
||||
expand_mode = 2
|
||||
|
||||
[node name="IconNameSeparator" type="Control" parent="Contents/Header"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="NameLabel" type="Label" parent="Contents/Header"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "ITEMNAME"
|
||||
uppercase = true
|
||||
|
||||
[node name="NamePaddingRight" type="Control" parent="Contents/Header"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HeaderDescriptionPadding" type="Control" parent="Contents"]
|
||||
custom_minimum_size = Vector2(0, 4)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Description" type="HBoxContainer" parent="Contents"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 4
|
||||
|
||||
[node name="DescriptionPaddingLeft" type="Control" parent="Contents/Description"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DescriptionLabel" type="Label" parent="Contents/Description"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "What does this item do? Nobody knows."
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="DescriptionPaddingRight" type="Control" parent="Contents/Description"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DescriptionActionPadding" type="Control" parent="Contents"]
|
||||
custom_minimum_size = Vector2(0, 4)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Action" type="HBoxContainer" parent="Contents"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 0
|
||||
|
||||
[node name="BuyButtonPaddingLeft" type="Control" parent="Contents/Action"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="BuyButton" type="Button" parent="Contents/Action"]
|
||||
layout_mode = 2
|
||||
text = "Buy"
|
||||
|
||||
[node name="BuyCostPadding" type="Control" parent="Contents/Action"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="CostLabel" type="Label" parent="Contents/Action"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 10
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "3 fiorygi"
|
||||
horizontal_alignment = 2
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="CostLabelPaddingRight" type="Control" parent="Contents/Action"]
|
||||
custom_minimum_size = Vector2(8, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ActionPaddingBottom" type="Control" parent="Contents"]
|
||||
custom_minimum_size = Vector2(0, 4)
|
||||
layout_mode = 2
|
||||
|
||||
[connection signal="pressed" from="Contents/Action/BuyButton" to="." method="_on_buy_button_pressed"]
|
6
interface/purchasable_item_padding.tscn
Normal file
6
interface/purchasable_item_padding.tscn
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_scene format=3 uid="uid://wodgj6rp2ewm"]
|
||||
|
||||
[node name="PurchasableItemPadding" type="Control"]
|
||||
custom_minimum_size = Vector2(0, 8)
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
71
interface/shop_ui.gd
Normal file
71
interface/shop_ui.gd
Normal file
|
@ -0,0 +1,71 @@
|
|||
extends Panel
|
||||
class_name ShopUI
|
||||
|
||||
## Emitted when the Score button is pressed.
|
||||
signal score_button_pressed
|
||||
|
||||
## Emitted when the Delete button is pressed.
|
||||
signal delete_button_pressed
|
||||
|
||||
## Emitted when the Back button is presesd.
|
||||
signal back_button_pressed
|
||||
|
||||
## Emitted when any purchase has started.
|
||||
signal purchase_begin(what: PurchasableItem)
|
||||
|
||||
## Emitted when any purchase is cancelled.
|
||||
signal purchase_cancel(what: PurchasableItem)
|
||||
|
||||
## Emitted when any purchase is completed.
|
||||
##
|
||||
## Emitted by complete_purchase().
|
||||
signal purchase_success(what: PurchasableItem)
|
||||
|
||||
## Array of all PurchasableItems that this ShopUI should control.
|
||||
@onready var purchasable_items: Array[Node] = find_children("*", "PurchasableItem") as Array[Node]
|
||||
|
||||
|
||||
func _ready():
|
||||
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))
|
||||
|
||||
func _on_any_purchase_begin(what: Node):
|
||||
if not what is PurchasableItem:
|
||||
push_error("Purchase began outside a PurchasableItem")
|
||||
return
|
||||
purchase_begin.emit(what)
|
||||
for item in purchasable_items:
|
||||
if item == what:
|
||||
continue
|
||||
item.can_buy = false
|
||||
|
||||
func _on_any_purchase_cancel(what: Node):
|
||||
if not what is PurchasableItem:
|
||||
push_error("Purchase cancelled outside a PurchasableItem")
|
||||
return
|
||||
purchase_cancel.emit(what)
|
||||
for item in purchasable_items:
|
||||
if item == what:
|
||||
continue
|
||||
item.can_buy = true
|
||||
|
||||
func _on_any_purchase_success(what: Node):
|
||||
if not what is PurchasableItem:
|
||||
push_error("Purchase succeeded outside a PurchasableItem")
|
||||
return
|
||||
purchase_success.emit(what)
|
||||
for item in purchasable_items:
|
||||
if item == what:
|
||||
continue
|
||||
item.can_buy = true
|
||||
|
||||
func _on_score_button_pressed():
|
||||
score_button_pressed.emit()
|
||||
|
||||
func _on_delete_button_pressed():
|
||||
delete_button_pressed.emit()
|
||||
|
||||
func _on_back_button_pressed():
|
||||
back_button_pressed.emit()
|
181
interface/shop_ui.tscn
Normal file
181
interface/shop_ui.tscn
Normal file
|
@ -0,0 +1,181 @@
|
|||
[gd_scene load_steps=5 format=3 uid="uid://cklkdygv61bny"]
|
||||
|
||||
[ext_resource type="Theme" uid="uid://ba5utvfhnxa5i" path="res://interface/interface_theme.tres" id="1_qdf0y"]
|
||||
[ext_resource type="PackedScene" uid="uid://dul1fpyh733t7" path="res://interface/purchasable_item.tscn" id="2_2dtc0"]
|
||||
[ext_resource type="Script" path="res://interface/shop_ui.gd" id="2_iyr7m"]
|
||||
[ext_resource type="PackedScene" uid="uid://wodgj6rp2ewm" path="res://interface/purchasable_item_padding.tscn" id="3_4feaj"]
|
||||
|
||||
[node name="ShopUI" type="Panel"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme = ExtResource("1_qdf0y")
|
||||
script = ExtResource("2_iyr7m")
|
||||
|
||||
[node name="Rows" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="UpperButtons" type="HBoxContainer" parent="Rows"]
|
||||
custom_minimum_size = Vector2(0, 54)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ScoreButton" type="Button" parent="Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
text = "$0"
|
||||
alignment = 0
|
||||
|
||||
[node name="UpperButtonsSpacerLeft" type="Control" parent="Rows/UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="DeleteButton" type="Button" parent="Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
text = "Del"
|
||||
|
||||
[node name="UpperButtonsSpacerRight" type="Control" parent="Rows/UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="BackButton" type="Button" parent="Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(72, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
text = "Back"
|
||||
alignment = 2
|
||||
|
||||
[node name="Scrollable" type="ScrollContainer" parent="Rows"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
horizontal_scroll_mode = 0
|
||||
vertical_scroll_mode = 2
|
||||
|
||||
[node name="ScrollableItems" type="VBoxContainer" parent="Rows/Scrollable"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ConvertCategory" type="VBoxContainer" parent="Rows/Scrollable/ScrollableItems"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding5" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="EarnCoinsLabel" type="Label" parent="Rows/Scrollable/ScrollableItems/ConvertCategory"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Convert your coins"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 2
|
||||
uppercase = true
|
||||
|
||||
[node name="PurchasableItemPadding3" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem2" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding2" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem3" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
has_unlocked = false
|
||||
|
||||
[node name="PurchasableItemPadding4" parent="Rows/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ManualCategory" type="VBoxContainer" parent="Rows/Scrollable/ScrollableItems"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding5" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="EarnCoinsLabel" type="Label" parent="Rows/Scrollable/ScrollableItems/ManualCategory"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Automatic coin dropper"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 2
|
||||
uppercase = true
|
||||
|
||||
[node name="PurchasableItemPadding3" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem2" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding2" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem3" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
has_unlocked = false
|
||||
|
||||
[node name="PurchasableItemPadding4" parent="Rows/Scrollable/ScrollableItems/ManualCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AutomaticCategory" type="VBoxContainer" parent="Rows/Scrollable/ScrollableItems"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding5" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="EarnCoinsLabel" type="Label" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Automatic coin dropper"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 2
|
||||
uppercase = true
|
||||
|
||||
[node name="PurchasableItemPadding3" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem2" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItemPadding2" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PurchasableItem3" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("2_2dtc0")]
|
||||
layout_mode = 2
|
||||
has_unlocked = false
|
||||
|
||||
[node name="PurchasableItemPadding4" parent="Rows/Scrollable/ScrollableItems/AutomaticCategory" instance=ExtResource("3_4feaj")]
|
||||
layout_mode = 2
|
||||
|
||||
[connection signal="pressed" from="Rows/UpperButtons/ScoreButton" to="." method="_on_score_button_pressed"]
|
||||
[connection signal="pressed" from="Rows/UpperButtons/DeleteButton" to="." method="_on_delete_button_pressed"]
|
||||
[connection signal="pressed" from="Rows/UpperButtons/BackButton" to="." method="_on_back_button_pressed"]
|
3
random/randomizer.gd
Normal file
3
random/randomizer.gd
Normal file
|
@ -0,0 +1,3 @@
|
|||
extends Node
|
||||
class_name Randomizer
|
||||
static var rng : RandomNumberGenerator = RandomNumberGenerator.new()
|
6
random/randomizer.tscn
Normal file
6
random/randomizer.tscn
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://cldl3smm1c2pm"]
|
||||
|
||||
[ext_resource type="Script" path="res://random/randomizer.gd" id="1_nvy1v"]
|
||||
|
||||
[node name="Randomizer" type="Node"]
|
||||
script = ExtResource("1_nvy1v")
|
14
random/roller.gd
Normal file
14
random/roller.gd
Normal file
|
@ -0,0 +1,14 @@
|
|||
extends Node2D
|
||||
|
||||
@export_range(0,1) var slider : float = 0
|
||||
|
||||
signal success()
|
||||
|
||||
signal failure()
|
||||
|
||||
func roll():
|
||||
if Randomizer.rng.randf() < slider:
|
||||
success.emit()
|
||||
else:
|
||||
failure.emit()
|
||||
|
6
random/roller.tscn
Normal file
6
random/roller.tscn
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://dvgxb0ichkoe7"]
|
||||
|
||||
[ext_resource type="Script" path="res://random/roller.gd" id="1_vetpi"]
|
||||
|
||||
[node name="Roller" type="Node2D"]
|
||||
script = ExtResource("1_vetpi")
|
53
root.gd
Normal file
53
root.gd
Normal file
|
@ -0,0 +1,53 @@
|
|||
extends Node
|
||||
class_name Root
|
||||
|
||||
|
||||
@onready var tree: SceneTree = get_tree()
|
||||
@onready var game: Game = $UI/GameContainer/Game
|
||||
@onready var game_ui: GameUI = $UI/GameUI
|
||||
@onready var shop_ui: ShopUI = $UI/ShopUI
|
||||
|
||||
|
||||
enum UIState {
|
||||
GAME,
|
||||
SHOP,
|
||||
SCORE,
|
||||
}
|
||||
|
||||
@export var ui_state: UIState:
|
||||
get:
|
||||
return ui_state
|
||||
set(value):
|
||||
match value:
|
||||
UIState.GAME:
|
||||
tree.paused = false
|
||||
game_ui.show()
|
||||
shop_ui.hide()
|
||||
UIState.SHOP:
|
||||
tree.paused = true
|
||||
game_ui.hide()
|
||||
shop_ui.show()
|
||||
UIState.SCORE:
|
||||
pass
|
||||
|
||||
|
||||
func _on_game_ui_score_button_pressed():
|
||||
ui_state = UIState.SCORE
|
||||
|
||||
func _on_shop_ui_back_button_pressed():
|
||||
ui_state = UIState.GAME
|
||||
|
||||
func _on_shop_ui_delete_button_pressed():
|
||||
ui_state = UIState.GAME
|
||||
|
||||
func _on_shop_ui_score_button_pressed():
|
||||
ui_state = UIState.SCORE
|
||||
|
||||
func _on_game_ui_shop_button_pressed():
|
||||
ui_state = UIState.SHOP
|
||||
|
||||
func _on_game_ui_spawn_button_pressed():
|
||||
game.trigger_spawn()
|
||||
|
||||
func _on_shop_ui_purchase_begin(_what):
|
||||
ui_state = UIState.GAME
|
83
root.tscn
83
root.tscn
|
@ -1,13 +1,16 @@
|
|||
[gd_scene load_steps=5 format=3 uid="uid://cbccs6kwwf265"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://cbccs6kwwf265"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://bllsprv8orpn4" path="res://bottle/bottle.tscn" id="1_4fmd3"]
|
||||
[ext_resource type="PackedScene" uid="uid://c3kitncwpi42j" path="res://entity/coin_copper.tscn" id="2_dv01l"]
|
||||
[ext_resource type="PackedScene" path="res://bottle/gravity_from_gyro.tscn" id="2_m7p4p"]
|
||||
[ext_resource type="PackedScene" uid="uid://c67lfbk4gf1ga" path="res://spawner/spawner.tscn" id="3_pubxn"]
|
||||
[ext_resource type="Script" path="res://root.gd" id="1_8jrhk"]
|
||||
[ext_resource type="Theme" uid="uid://ba5utvfhnxa5i" path="res://interface/interface_theme.tres" id="1_h26ax"]
|
||||
[ext_resource type="PackedScene" uid="uid://c3rxmcwa5nqng" path="res://game/game.tscn" id="3_hrdyr"]
|
||||
[ext_resource type="PackedScene" uid="uid://cklkdygv61bny" path="res://interface/shop_ui.tscn" id="3_lvefk"]
|
||||
[ext_resource type="PackedScene" uid="uid://bo5unrhqpoyim" path="res://interface/game_ui.tscn" id="5_2cc15"]
|
||||
|
||||
[node name="Root" type="Node"]
|
||||
script = ExtResource("1_8jrhk")
|
||||
|
||||
[node name="UI" type="Control" parent="."]
|
||||
texture_filter = 1
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
|
@ -15,53 +18,10 @@ anchor_bottom = 1.0
|
|||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_vertical = 8
|
||||
|
||||
[node name="Rows" type="VBoxContainer" parent="UI"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="NotchSpacer" type="PanelContainer" parent="UI/Rows"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="UpperButtons" type="HBoxContainer" parent="UI/Rows"]
|
||||
custom_minimum_size = Vector2(0, 54)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 8
|
||||
|
||||
[node name="MoneyButton" type="Button" parent="UI/Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(54, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
text = "$0"
|
||||
alignment = 0
|
||||
|
||||
[node name="UpperButtonsSpacerLeft" type="PanelContainer" parent="UI/Rows/UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="SpawnButton" type="Button" parent="UI/Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(54, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
text = "Drop"
|
||||
|
||||
[node name="UpperButtonsSpacerRight" type="PanelContainer" parent="UI/Rows/UpperButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="ShopButton" type="Button" parent="UI/Rows/UpperButtons"]
|
||||
custom_minimum_size = Vector2(54, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
text = "Shop"
|
||||
alignment = 2
|
||||
theme = ExtResource("1_h26ax")
|
||||
|
||||
[node name="GameContainer" type="Control" parent="UI"]
|
||||
process_mode = 1
|
||||
layout_mode = 1
|
||||
anchors_preset = 7
|
||||
anchor_left = 0.5
|
||||
|
@ -71,14 +31,21 @@ anchor_bottom = 1.0
|
|||
grow_horizontal = 2
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="Game" type="Node2D" parent="UI/GameContainer"]
|
||||
texture_filter = 1
|
||||
[node name="Game" parent="UI/GameContainer" instance=ExtResource("3_hrdyr")]
|
||||
|
||||
[node name="Bottle" parent="UI/GameContainer/Game" instance=ExtResource("1_4fmd3")]
|
||||
[node name="GameUI" parent="UI" instance=ExtResource("5_2cc15")]
|
||||
process_mode = 3
|
||||
layout_mode = 1
|
||||
|
||||
[node name="GravityFromGyro" parent="UI/GameContainer/Game/Bottle" instance=ExtResource("2_m7p4p")]
|
||||
[node name="ShopUI" parent="UI" instance=ExtResource("3_lvefk")]
|
||||
process_mode = 3
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
|
||||
[node name="Spawner" parent="UI/GameContainer/Game" instance=ExtResource("3_pubxn")]
|
||||
position = Vector2(0, -400)
|
||||
scene = ExtResource("2_dv01l")
|
||||
target_parent = NodePath("..")
|
||||
[connection signal="score_button_pressed" from="UI/GameUI" to="." method="_on_game_ui_score_button_pressed"]
|
||||
[connection signal="shop_button_pressed" from="UI/GameUI" to="." method="_on_game_ui_shop_button_pressed"]
|
||||
[connection signal="spawn_button_pressed" from="UI/GameUI" to="." method="_on_game_ui_spawn_button_pressed"]
|
||||
[connection signal="back_button_pressed" from="UI/ShopUI" to="." method="_on_shop_ui_back_button_pressed"]
|
||||
[connection signal="delete_button_pressed" from="UI/ShopUI" to="." method="_on_shop_ui_delete_button_pressed"]
|
||||
[connection signal="purchase_begin" from="UI/ShopUI" to="." method="_on_shop_ui_purchase_begin"]
|
||||
[connection signal="score_button_pressed" from="UI/ShopUI" to="." method="_on_shop_ui_score_button_pressed"]
|
||||
|
|
14
score/scoreboard.gd
Normal file
14
score/scoreboard.gd
Normal file
|
@ -0,0 +1,14 @@
|
|||
extends Control
|
||||
|
||||
class_name ScoreBoard
|
||||
|
||||
@export var score: int = 0
|
||||
|
||||
func _ready():
|
||||
$Label.text = "Score: " + str(score)
|
||||
|
||||
func _process(delta):
|
||||
pass
|
||||
|
||||
func _on_evaluator_score_changed(total_value):
|
||||
$Label.text = "Score: " + str(total_value)
|
23
score/scoreboard.tscn
Normal file
23
score/scoreboard.tscn
Normal file
|
@ -0,0 +1,23 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://bokcnc0q0qqj3"]
|
||||
|
||||
[ext_resource type="Script" path="res://score/scoreboard.gd" id="1_of77n"]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_of77n")
|
||||
|
||||
[node name="Label" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_right = 40.0
|
||||
offset_bottom = 23.0
|
||||
text = "SCORE: "
|
||||
|
||||
[node name="VSlider" type="VSlider" parent="."]
|
||||
layout_mode = 0
|
||||
offset_right = 16.0
|
||||
offset_bottom = 8.0
|
|
@ -1,11 +1,55 @@
|
|||
extends Node2D
|
||||
class_name Spawner
|
||||
|
||||
|
||||
@export var scene: PackedScene
|
||||
@export var target_parent: NodePath
|
||||
|
||||
var buffer: int = 0
|
||||
@export var buffer_cap: int
|
||||
|
||||
@onready var area: Area2D = $Area
|
||||
|
||||
@export var spawn_position_range_x: float
|
||||
@export_range(0, 90) var spawn_rotation_range: float
|
||||
@onready var rng: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
|
||||
@export_flags_2d_physics var overlapping_bodies_collision_mask: int
|
||||
@export_range(0, 16) var overlapping_body_count_limit: int
|
||||
|
||||
signal spawned(what: Node2D)
|
||||
|
||||
|
||||
func spawn():
|
||||
if len($Area2D.get_overlapping_bodies()) > 0:
|
||||
buffer += 1
|
||||
if buffer > buffer_cap:
|
||||
buffer = buffer_cap
|
||||
|
||||
func _count_overlapping_bodies() -> int:
|
||||
var overlapping_bodies = area.get_overlapping_bodies()
|
||||
var overlapping_body_count = 0
|
||||
for overlapping_body in overlapping_bodies:
|
||||
if overlapping_body.collision_layer & overlapping_bodies_collision_mask:
|
||||
overlapping_body_count += 1
|
||||
return overlapping_body_count
|
||||
|
||||
|
||||
func _select_spawn_position() -> Vector2:
|
||||
return Vector2(rng.randf_range(-spawn_position_range_x, +spawn_position_range_x), 0)
|
||||
|
||||
func _select_spawn_rotation() -> float:
|
||||
return rng.randf_range(-spawn_rotation_range, spawn_rotation_range)
|
||||
|
||||
func _do_spawn():
|
||||
if _count_overlapping_bodies() > overlapping_body_count_limit:
|
||||
return
|
||||
var scene_instant = scene.instantiate()
|
||||
scene_instant.position=Vector2.ZERO
|
||||
scene_instant.position = _select_spawn_position()
|
||||
scene_instant.rotation_degrees = _select_spawn_rotation()
|
||||
add_child(scene_instant)
|
||||
emit_signal("spawned", scene_instant)
|
||||
buffer -= 1
|
||||
|
||||
|
||||
func _physics_process(_delta):
|
||||
if buffer > 0:
|
||||
_do_spawn()
|
||||
|
|
|
@ -2,21 +2,14 @@
|
|||
|
||||
[ext_resource type="Script" path="res://spawner/spawner.gd" id="1_xqfmg"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xnebx"]
|
||||
size = Vector2(100, 20)
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_p13i4"]
|
||||
size = Vector2(96, 96)
|
||||
|
||||
[node name="Spawner" type="Node2D"]
|
||||
script = ExtResource("1_xqfmg")
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
wait_time = 0.1
|
||||
autostart = true
|
||||
|
||||
[node name="Area2D" type="Area2D" parent="."]
|
||||
[node name="Area" type="Area2D" parent="."]
|
||||
collision_mask = 4
|
||||
|
||||
[node name="Shape" type="CollisionShape2D" parent="Area2D"]
|
||||
position = Vector2(0, -15)
|
||||
shape = SubResource("RectangleShape2D_xnebx")
|
||||
|
||||
[connection signal="timeout" from="Timer" to="." method="spawn"]
|
||||
[node name="Shape" type="CollisionShape2D" parent="Area"]
|
||||
shape = SubResource("RectangleShape2D_p13i4")
|
||||
|
|
39
value/evaluator.gd
Normal file
39
value/evaluator.gd
Normal file
|
@ -0,0 +1,39 @@
|
|||
extends Area2D
|
||||
class_name Evaluator
|
||||
## aggiunge al totale i valori dei Valuable che ci body_enterano e sottrae quelli che ci body_exitano
|
||||
|
||||
|
||||
## The current amount of value evaluated.
|
||||
var total_value: int = 0
|
||||
|
||||
## The types of [Collectible]s to value.
|
||||
##
|
||||
## The strings will match only if exactly the same.
|
||||
#@export var collecting_types: Array[StringName]
|
||||
|
||||
## The collision mask to check colliding body against.
|
||||
@export_flags_2d_physics var collecting_collision_mask: int
|
||||
|
||||
## The evaluator has added the value of an object to the total.
|
||||
signal added(what: PhysicsBody2D, total_value: int)
|
||||
## The evaluator has removed the value of an object to the total.
|
||||
signal removed(what: PhysicsBody2D)
|
||||
|
||||
signal score_changed(total_value: int)
|
||||
|
||||
func _on_body_entered(body):
|
||||
if body is PhysicsBody2D:
|
||||
if body.collision_layer & collecting_collision_mask:
|
||||
var evaluable: Valuable = body.get_node("Valuable")
|
||||
total_value += evaluable.value
|
||||
evaluable.evaluate()
|
||||
score_changed.emit(total_value)
|
||||
|
||||
func _on_body_exited(body):
|
||||
if body is PhysicsBody2D:
|
||||
if body.collision_layer & collecting_collision_mask:
|
||||
var evaluable: Valuable = body.get_node("Valuable")
|
||||
total_value -= evaluable.value
|
||||
evaluable.evaluate()
|
||||
score_changed.emit(total_value)
|
||||
|
9
value/evaluator.tscn
Normal file
9
value/evaluator.tscn
Normal file
|
@ -0,0 +1,9 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://beg758fa6o0cs"]
|
||||
|
||||
[ext_resource type="Script" path="res://value/evaluator.gd" id="1_sjx78"]
|
||||
|
||||
[node name="Evaluator" type="Area2D"]
|
||||
script = ExtResource("1_sjx78")
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
|
||||
[connection signal="body_exited" from="." to="." method="_on_body_exited"]
|
13
value/valuable.gd
Normal file
13
value/valuable.gd
Normal file
|
@ -0,0 +1,13 @@
|
|||
extends Node
|
||||
class_name Valuable
|
||||
|
||||
@export var value: int
|
||||
|
||||
## Emitted when this entity has been counted.
|
||||
signal evaluated
|
||||
|
||||
## Mark this entity as evaluated.
|
||||
##
|
||||
func evaluate():
|
||||
emit_signal("evaluated")
|
||||
|
6
value/valuable.tscn
Normal file
6
value/valuable.tscn
Normal file
|
@ -0,0 +1,6 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://ujpra0s1kpqi"]
|
||||
|
||||
[ext_resource type="Script" path="res://value/valuable.gd" id="1_mr62g"]
|
||||
|
||||
[node name="Valuable" type="Node2D"]
|
||||
script = ExtResource("1_mr62g")
|
Loading…
Reference in a new issue