summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--SoundManager.tscn2
-rw-r--r--character/assets/character_spritesheet.pngbin4629 -> 4726 bytes
-rw-r--r--character/assets/character_spritesheet.png~bin4764 -> 0 bytes
-rw-r--r--character/character.tscn2
-rw-r--r--character/character_sprite_frames.tres25
-rw-r--r--export_presets.cfg207
-rw-r--r--icon.krabin0 -> 23696 bytes
-rw-r--r--icon.pngbin0 -> 282 bytes
-rw-r--r--icon.png.import34
-rw-r--r--icon.svg14
-rw-r--r--icon.svg.import2
-rw-r--r--item/item.gd4
-rw-r--r--player/opponent.gd2
-rw-r--r--player/opponent.tscn5
-rw-r--r--player/player.gd32
-rw-r--r--player/player.tscn5
-rw-r--r--project.godot6
-rw-r--r--stage/assets/tileset-01.krabin0 -> 122897 bytes
-rw-r--r--stage/assets/tileset-01.pngbin635 -> 1825 bytes
-rw-r--r--stage/stage.gd98
-rw-r--r--stage/stage.tscn1
-rw-r--r--stage/stage_01.gd82
-rw-r--r--stage/stage_01.tscn57
-rw-r--r--stage/tile_map_layer.tscn82
-rw-r--r--stage/tileset-01.krabin41461 -> 0 bytes
-rw-r--r--ui/assets/tilemap_white.pngbin0 -> 10054 bytes
-rw-r--r--ui/assets/tilemap_white.png.import34
-rw-r--r--ui/mobile/button.gd45
-rw-r--r--ui/mobile/button.tscn43
-rw-r--r--ui/mobile/mobile_controls.gd17
-rw-r--r--ui/mobile/mobile_controls.tscn78
-rw-r--r--ui/start_screen.tscn1
-rw-r--r--ui/theme.tres2
34 files changed, 772 insertions, 112 deletions
diff --git a/.gitignore b/.gitignore
index 0af181c..8ed4fde 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
# Godot 4+ specific ignores
.godot/
/android/
+
+# Krita
+*.kra~
+*.png~
diff --git a/SoundManager.tscn b/SoundManager.tscn
index 8ccfe6f..ae61ae1 100644
--- a/SoundManager.tscn
+++ b/SoundManager.tscn
@@ -12,9 +12,11 @@ stream = ExtResource("1_kgewx")
[node name="ItemPickUpCrown" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_silpf")
+volume_db = -8.0
[node name="OpponentHit" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_ihrpf")
+volume_db = -2.0
[node name="PlayerKO" type="AudioStreamPlayer" parent="."]
stream = ExtResource("4_fu3vr")
diff --git a/character/assets/character_spritesheet.png b/character/assets/character_spritesheet.png
index 9c1b844..a1839cd 100644
--- a/character/assets/character_spritesheet.png
+++ b/character/assets/character_spritesheet.png
Binary files differ
diff --git a/character/assets/character_spritesheet.png~ b/character/assets/character_spritesheet.png~
deleted file mode 100644
index 2136c69..0000000
--- a/character/assets/character_spritesheet.png~
+++ /dev/null
Binary files differ
diff --git a/character/character.tscn b/character/character.tscn
index 3a1b0e8..7fb9776 100644
--- a/character/character.tscn
+++ b/character/character.tscn
@@ -13,7 +13,7 @@ script = ExtResource("1_wqxem")
texture_filter = 1
position = Vector2(-10, -10)
sprite_frames = ExtResource("2_xbkcg")
-animation = &"scissors_idle"
+animation = &"paper_walk"
centered = false
[node name="Collision" type="Area2D" parent="."]
diff --git a/character/character_sprite_frames.tres b/character/character_sprite_frames.tres
index 6aa4352..0381f4a 100644
--- a/character/character_sprite_frames.tres
+++ b/character/character_sprite_frames.tres
@@ -1,4 +1,4 @@
-[gd_resource type="SpriteFrames" load_steps=29 format=3 uid="uid://cvbw222po7psr"]
+[gd_resource type="SpriteFrames" load_steps=32 format=3 uid="uid://cvbw222po7psr"]
[ext_resource type="Texture2D" uid="uid://d3cp58o1j55au" path="res://character/assets/character_spritesheet.png" id="1_0ukqc"]
@@ -14,6 +14,18 @@ region = Rect2(20, 60, 20, 20)
atlas = ExtResource("1_0ukqc")
region = Rect2(40, 60, 20, 20)
+[sub_resource type="AtlasTexture" id="AtlasTexture_nugvc"]
+atlas = ExtResource("1_0ukqc")
+region = Rect2(60, 60, 20, 20)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_85mcf"]
+atlas = ExtResource("1_0ukqc")
+region = Rect2(80, 60, 20, 20)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_igbcl"]
+atlas = ExtResource("1_0ukqc")
+region = Rect2(120, 60, 20, 20)
+
[sub_resource type="AtlasTexture" id="AtlasTexture_ad1cw"]
atlas = ExtResource("1_0ukqc")
region = Rect2(100, 40, 20, 20)
@@ -121,10 +133,19 @@ animations = [{
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_a33vs")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_nugvc")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_85mcf")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_igbcl")
}],
"loop": false,
"name": &"ko",
-"speed": 6.0
+"speed": 8.0
}, {
"frames": [{
"duration": 1.0,
diff --git a/export_presets.cfg b/export_presets.cfg
new file mode 100644
index 0000000..967834f
--- /dev/null
+++ b/export_presets.cfg
@@ -0,0 +1,207 @@
+[preset.0]
+
+name="Android"
+platform="Android"
+runnable=true
+advanced_options=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+export_path="../../../../Applications/Godot/Exports/Magical Tower.apk"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+gradle_build/use_gradle_build=false
+gradle_build/gradle_build_directory=""
+gradle_build/android_source_template=""
+gradle_build/compress_native_libraries=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=""
+package/unique_name="com.example.$genname"
+package/name=""
+package/signed=true
+package/app_category=2
+package/retain_data_on_uninstall=false
+package/exclude_from_recents=false
+package/show_in_android_tv=false
+package/show_in_app_library=true
+package/show_as_launcher_app=false
+launcher_icons/main_192x192=""
+launcher_icons/adaptive_foreground_432x432=""
+launcher_icons/adaptive_background_432x432=""
+graphics/opengl_debug=false
+xr_features/xr_mode=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/post_notifications=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
diff --git a/icon.kra b/icon.kra
new file mode 100644
index 0000000..fef5ade
--- /dev/null
+++ b/icon.kra
Binary files differ
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..026bf33
--- /dev/null
+++ b/icon.png
Binary files differ
diff --git a/icon.png.import b/icon.png.import
new file mode 100644
index 0000000..88418bd
--- /dev/null
+++ b/icon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0cy7qa8h8b2e"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/icon.svg b/icon.svg
index 9d8b7fa..734edba 100644
--- a/icon.svg
+++ b/icon.svg
@@ -1 +1,13 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg> \ No newline at end of file
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created using Krita: https://krita.org -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:krita="http://krita.org/namespaces/svg/krita"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ width="15.998pt"
+ height="15.998pt"
+ viewBox="0 0 15.998 15.998">
+<defs/>
+<rect id="shape0" transform="translate(5.99926048048942, 0.999876746748237)" fill="none" width="1.99975349349647" height="0.999876746748237"/><rect id="shape1" transform="translate(5.99926048048942, 0.999876746748237)" fill="none" width="5.99926048048942" height="3.99950698699295"/><rect id="shape2" transform="translate(1.99975349349647, 0.999876746748237)" fill="#12424c" fill-rule="evenodd" width="1.99975349349647" height="0.999876746748237"/><rect id="shape3" transform="translate(0.999876746748237, 1.99975349349647)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="2.99963024024471"/><rect id="shape4" transform="translate(1.99975349349647, 4.99938373374118)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape5" transform="translate(2.99963024024471, 6.99913722723766)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748236"/><rect id="shape6" transform="translate(1.99975349349647, 7.99901397398589)" fill="#12424c" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748237"/><rect id="shape7" transform="translate(5.99926048048942, 8.99889072073413)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape8" transform="translate(2.99963024024471, 10.9986442142306)" fill="#12424c" fill-rule="evenodd" width="2.99963024024471" height="1e-06"/><rect id="shape9" transform="translate(1.99975349349647, 7.99901397398589)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="3.99950698699295"/><rect id="shape10" transform="translate(4.99938373374118, 7.99901397398589)" fill="#12424c" fill-rule="evenodd" width="0.999876746748236" height="0.999876746748237"/><rect id="shape11" transform="translate(3.99950698699295, 1.99975349349647)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape12" transform="translate(4.99938373374118, 3.99950698699295)" fill="#12424c" fill-rule="evenodd" width="0.999876746748236" height="1.99975349349647"/><rect id="shape13" transform="translate(5.99926048048942, 5.99926048048942)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748237"/><rect id="shape14" transform="translate(6.99913722723766, 3.99950698699295)" fill="#12424c" fill-rule="evenodd" width="0.999876746748236" height="1.99975349349647"/><rect id="shape15" transform="translate(7.99901397398589, 1.99975349349647)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748237"/><rect id="shape16" transform="translate(8.99889072073413, 0.999876746748237)" fill="#12424c" fill-rule="evenodd" width="1.99975349349647" height="0.999876746748237"/><rect id="shape17" transform="translate(7.99901397398589, 2.99963024024471)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748237"/><rect id="shape18" transform="translate(10.9986442142306, 1.99975349349647)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="2.99963024024471"/><rect id="shape19" transform="translate(9.99876746748237, 4.99938373374118)" fill="#12424c" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748236"/><rect id="shape20" transform="translate(9.99876746748237, 5.99926048048942)" fill="#12424c" fill-rule="evenodd" width="0.999876746748235" height="0.999876746748237"/><rect id="shape21" transform="translate(8.99889072073413, 6.99913722723766)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape22" transform="translate(9.99876746748237, 8.99889072073413)" fill="#12424c" fill-rule="evenodd" width="1.99975349349647" height="0.999876746748237"/><rect id="shape23" transform="translate(10.9986442142306, 9.99876746748237)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape24" transform="translate(11.9985209609788, 7.99901397398589)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748237"/><rect id="shape25" transform="translate(12.9983977077271, 5.99926048048942)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape26" transform="translate(13.9982744544753, 6.99913722723766)" fill="#12424c" fill-rule="evenodd" width="0.999876746748235" height="2.99963024024471"/><rect id="shape27" transform="translate(12.9983977077271, 9.99876746748237)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape28" transform="translate(11.9985209609788, 10.9986442142306)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748237"/><rect id="shape29" transform="translate(2.99963024024471, 10.9986442142306)" fill="#12424c" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748237"/><rect id="shape30" transform="translate(2.99963024024471, 11.9985209609788)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape31" transform="translate(2.99963024024471, 12.9983977077271)" fill="#12424c" fill-rule="evenodd" width="7.99901397398589" height="0.999876746748237"/><rect id="shape32" transform="translate(10.9986442142306, 11.9985209609788)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape33" transform="translate(0.999876746748237, 14.9981512012235)" fill="#12424c" fill-rule="evenodd" width="5.99926048048942" height="0.999876746748237"/><rect id="shape34" transform="translate(5.99926048048942, 13.9982744544753)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape35" transform="translate(1.99975349349647, 13.9982744544753)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape36" transform="translate(7.99901397398589, 13.9982744544753)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape37" transform="translate(7.99901397398589, 14.9981512012235)" fill="#12424c" fill-rule="evenodd" width="5.99926048048942" height="0.999876746748237"/><rect id="shape38" transform="translate(11.9985209609788, 13.9982744544753)" fill="#12424c" fill-rule="evenodd" width="0.999876746748237" height="0.999876746748235"/><rect id="shape39" transform="translate(2.99963024024471, 13.9982744544753)" fill="#6ba64a" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748235"/><rect id="shape40" transform="translate(8.99889072073413, 13.9982744544753)" fill="#6ba64a" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748235"/><rect id="shape41" transform="translate(2.99963024024471, 8.99889072073413)" fill="#437a63" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748237"/><rect id="shape42" transform="translate(2.99963024024471, 9.99876746748237)" fill="#437a63" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748235"/><rect id="shape43" transform="translate(3.99950698699295, 11.9985209609788)" fill="#437a63" fill-rule="evenodd" width="6.99913722723766" height="0.999876746748237"/><rect id="shape44" transform="translate(5.99926048048942, 10.9986442142306)" fill="#437a63" fill-rule="evenodd" width="5.99926048048942" height="0.999876746748237"/><rect id="shape45" transform="translate(6.99913722723766, 9.99876746748237)" fill="#437a63" fill-rule="evenodd" width="3.99950698699295" height="0.999876746748235"/><rect id="shape46" transform="translate(6.99913722723766, 8.99889072073413)" fill="#437a63" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748237"/><rect id="shape47" transform="translate(5.99926048048942, 7.99901397398589)" fill="#437a63" fill-rule="evenodd" width="2.99963024024471" height="0.999876746748237"/><rect id="shape48" transform="translate(3.99950698699295, 6.99913722723766)" fill="#437a63" fill-rule="evenodd" width="4.99938373374118" height="0.999876746748236"/><rect id="shape49" transform="translate(10.9986442142306, 5.99926048048942)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="1.99975349349647"/><rect id="shape50" transform="translate(9.99876746748237, 6.99913722723766)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="1.99975349349647"/><rect id="shape51" transform="translate(12.9983977077271, 7.99901397398589)" fill="#437a63" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape52" transform="translate(12.9983977077271, 8.99889072073413)" fill="#437a63" fill-rule="evenodd" width="1e-06" height="1.99975349349647"/><rect id="shape53" transform="translate(11.9985209609788, 8.99889072073413)" fill="#437a63" fill-rule="evenodd" width="0.999876746748237" height="1.99975349349647"/><rect id="shape54" transform="translate(8.99889072073413, 1.99975349349647)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="2.99963024024471"/><rect id="shape55" transform="translate(7.99901397398589, 3.99950698699295)" fill="#437a63" fill-rule="evenodd" width="0.999876746748237" height="2.99963024024471"/><rect id="shape56" transform="translate(6.99913722723766, 5.99926048048942)" fill="#437a63" fill-rule="evenodd" width="0.999876746748236" height="1.99975349349647"/><rect id="shape57" transform="translate(7.99901397398589, 4.99938373374118)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="1.99975349349647"/><rect id="shape58" transform="translate(1.99975349349647, 1.99975349349647)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="2.99963024024471"/><rect id="shape59" transform="translate(2.99963024024471, 3.99950698699295)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="2.99963024024471"/><rect id="shape60" transform="translate(3.99950698699295, 5.99926048048942)" fill="#437a63" fill-rule="evenodd" width="1.99975349349647" height="0.999876746748237"/>
+</svg>
diff --git a/icon.svg.import b/icon.svg.import
index 287fee7..8f8bf13 100644
--- a/icon.svg.import
+++ b/icon.svg.import
@@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://dwt6h37ll70f"
+uid="uid://cfukswpayfb06"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
diff --git a/item/item.gd b/item/item.gd
index 4f99999..fa00841 100644
--- a/item/item.gd
+++ b/item/item.gd
@@ -2,5 +2,9 @@ class_name Item
extends Node2D
+func _ready() -> void:
+ $Sprite2D.modulate = Color(max(0.1, randf()), max(0.1, randf()), max(0.1, randf()))
+
+
func apply(_player: Player):
pass
diff --git a/player/opponent.gd b/player/opponent.gd
index ec20cd1..7fc2ebf 100644
--- a/player/opponent.gd
+++ b/player/opponent.gd
@@ -51,7 +51,7 @@ func _on_vertical_timer_timeout() -> void:
if randi_range(0, 100) > 75 and is_below_ledge():
await jump()
- elif randi_range(0, 100) > 75 and not is_on_bottom_floor():
+ elif randi_range(0, 100) > 50 and not is_on_bottom_floor():
await fall()
$VerticalTimer.start()
diff --git a/player/opponent.tscn b/player/opponent.tscn
index 92d0af6..74a8b2a 100644
--- a/player/opponent.tscn
+++ b/player/opponent.tscn
@@ -4,6 +4,7 @@
[ext_resource type="Script" path="res://player/opponent.gd" id="2_pkqiw"]
[node name="Opponent" instance=ExtResource("1_ykya6")]
+process_mode = 4
script = ExtResource("2_pkqiw")
random_start_type = false
@@ -24,4 +25,8 @@ collision_mask = 512
one_shot = true
autostart = true
+[node name="VisibleOnScreenEnabler2D" type="VisibleOnScreenEnabler2D" parent="." index="11"]
+position = Vector2(2.38419e-07, -2.38419e-07)
+scale = Vector2(1.6, 1.6)
+
[connection signal="timeout" from="VerticalTimer" to="." method="_on_vertical_timer_timeout"]
diff --git a/player/player.gd b/player/player.gd
index 4257f2a..9d1d6ee 100644
--- a/player/player.gd
+++ b/player/player.gd
@@ -4,6 +4,8 @@ extends Character
var is_invincible := false
+var mobile_controls: MobileControls
+
@onready var camera := $Camera2D
@@ -14,25 +16,7 @@ func _ready() -> void:
func _process(_delta: float) -> void:
- if current_state == State.Idle:
- if Input.is_action_pressed("ui_left"):
- walk(Direction.Left)
- elif Input.is_action_pressed("ui_right"):
- walk(Direction.Right)
- else:
- idle()
-
- if Input.is_action_pressed("ui_up"):
- jump()
- if Input.is_action_pressed("ui_down"):
- if not is_on_bottom_floor():
- fall()
-
- if not is_on_floor():
- fall()
-
-
- elif current_state == State.Walk:
+ if current_state == State.Idle or current_state == State.Walk:
if Input.is_action_pressed("ui_left"):
walk(Direction.Left)
elif Input.is_action_pressed("ui_right"):
@@ -63,6 +47,11 @@ func invincible(duration: float):
await tween.finished
is_invincible = false
+
+ (func(): # re-trigger area entered
+ $Collision.monitoring = false
+ $Collision.monitoring = true
+ ).call_deferred()
enum Result {
@@ -101,10 +90,13 @@ func _on_collision_area_entered(area: Area2D) -> void:
var opponent: Character = area.get_parent()
var result := Player.is_rock_paper_scissors_win(self, opponent)
+
if result == Result.Draw:
type_change_finished.connect(func():
change_type_random()
+ invincible(1.0)
)
+ is_invincible = true
animate_type_change()
elif result == Result.Win:
@@ -116,6 +108,7 @@ func _on_collision_area_entered(area: Area2D) -> void:
change_type_random()
invincible(1.0)
)
+ is_invincible = true
animate_type_change()
opponent.process_mode = Node.PROCESS_MODE_DISABLED
@@ -145,4 +138,5 @@ func _on_collision_area_entered(area: Area2D) -> void:
await $AnimatedSprite2D.animation_finished
SoundManager.get_node("PlayerKO").stop()
visible = false
+ await get_tree().create_timer(0.3).timeout
get_tree().change_scene_to_file("res://stage/stage_01.tscn")
diff --git a/player/player.tscn b/player/player.tscn
index b213030..4e0417f 100644
--- a/player/player.tscn
+++ b/player/player.tscn
@@ -7,9 +7,12 @@
[sub_resource type="AudioStreamMP3" id="AudioStreamMP3_sy3f5"]
data = PackedByteArray("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")
-[node name="Player" instance=ExtResource("1_eixx6")]
+[node name="Player" groups=["player"] instance=ExtResource("1_eixx6")]
script = ExtResource("1_wqxem")
+[node name="AnimatedSprite2D" parent="." index="0"]
+animation = &"scissors_walk"
+
[node name="Collision" parent="." index="1"]
collision_layer = 1
collision_mask = 18
diff --git a/project.godot b/project.godot
index 3001e57..275d129 100644
--- a/project.godot
+++ b/project.godot
@@ -13,6 +13,8 @@ config_version=5
config/name="Magical Tower"
run/main_scene="res://ui/start_screen.tscn"
config/features=PackedStringArray("4.3", "GL Compatibility")
+boot_splash/bg_color=Color(0.419608, 0.65098, 0.290196, 1)
+boot_splash/show_image=false
config/icon="res://icon.svg"
[autoload]
@@ -27,7 +29,9 @@ gdscript/warnings/integer_division=0
window/size/viewport_width=160
window/size/viewport_height=144
+window/size/mode=2
window/stretch/mode="viewport"
+window/handheld/orientation=1
[global_group]
@@ -35,6 +39,7 @@ item=""
tilemap=""
opponent=""
hud=""
+player=""
[layer_names]
@@ -48,3 +53,4 @@ hud=""
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
+textures/vram_compression/import_etc2_astc=true
diff --git a/stage/assets/tileset-01.kra b/stage/assets/tileset-01.kra
new file mode 100644
index 0000000..de87533
--- /dev/null
+++ b/stage/assets/tileset-01.kra
Binary files differ
diff --git a/stage/assets/tileset-01.png b/stage/assets/tileset-01.png
index f2006f8..6a6d3c9 100644
--- a/stage/assets/tileset-01.png
+++ b/stage/assets/tileset-01.png
Binary files differ
diff --git a/stage/stage.gd b/stage/stage.gd
index 8d72ee1..2115c0a 100644
--- a/stage/stage.gd
+++ b/stage/stage.gd
@@ -2,6 +2,11 @@ class_name Stage
extends Node2D
+var item_pool: Array = []
+var reserved_item_positions: Array = []
+@export var item_pool_max_size := 3
+
+
func get_world_boundaries() -> Dictionary: #Dictionary[Vector2, float]
return {
Vector2.LEFT: 0.0,
@@ -13,3 +18,96 @@ func get_world_boundaries() -> Dictionary: #Dictionary[Vector2, float]
func has_win_condition() -> bool:
return false
+
+
+func set_mobile_controls():
+ var mobile_controls: MobileControls = get_node("%MobileControls")
+
+ if OS.has_feature("android"):
+ mobile_controls.enable()
+
+ var player: Player = get_node("%Player")
+ player.camera.limit_bottom += mobile_controls.size.y
+ get_window().content_scale_size = Vector2i(
+ ProjectSettings.get_setting("display/window/size/viewport_width"),
+ ProjectSettings.get_setting("display/window/size/viewport_height") + mobile_controls.size.y
+ )
+
+
+func _on_tick_timer_timeout() -> void:
+ if randf() > 0.9 and item_pool.size() < item_pool_max_size:
+ var item_scene: PackedScene = [
+ load("res://item/shoe.tscn"),
+ load("res://item/crown.tscn"),
+ ].pick_random()
+
+ var item: Item = item_scene.instantiate()
+ var map: TileMapLayer = get_tree().get_first_node_in_group("tilemap")
+
+ var size_x := map.get_used_rect().position.x + map.get_used_rect().size.x
+ var size_y := map.get_used_rect().position.y + map.get_used_rect().size.y
+
+ var start_x: int = max(map.get_used_rect().position.x, range(size_x).pick_random())
+ var start_y: int = max(map.get_used_rect().position.y, range(size_y).pick_random())
+
+ var get_map_position = func() -> Vector2i:
+ for x in range(start_x, size_x):
+ for y in range(start_y, size_y):
+ var data = map.get_cell_tile_data(Vector2(x, y))
+ if not data:
+ return Vector2i(x, y)
+ return Vector2i.ZERO
+
+ # find appropriate position
+ var map_position = get_map_position.call()
+ if reserved_item_positions.has(map_position) or map_position == Vector2i.ZERO:
+ $TickTimer.start()
+ return
+
+ var local_position = map.map_to_local(map_position)
+
+ var _was_shifted := false
+ var collide_top = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_TOP_SIDE))
+ var collide_bottom = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_BOTTOM_SIDE))
+ var collide_right = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_RIGHT_SIDE))
+ if collide_top:
+ local_position += Vector2(0, map.tile_set.tile_size.y / 2)
+ _was_shifted = true
+ if collide_bottom:
+ local_position += Vector2(0, -map.tile_set.tile_size.y / 2)
+ _was_shifted = true
+ if collide_right:
+ local_position += Vector2(-map.tile_set.tile_size.x, 0)
+ _was_shifted = true
+ if not collide_top and not collide_right:
+ if map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER)):
+ local_position += Vector2(-map.tile_set.tile_size.x, map.tile_set.tile_size.y / 2)
+ _was_shifted = true
+
+ #if not was_shifted:
+ local_position += Vector2(map.tile_set.tile_size.x / 2, 0)
+
+ item.position = local_position
+ add_child(item)
+
+ var get_reserved_positions = func() -> Array[Vector2i]:
+ var rp := [] as Array[Vector2i]
+ for x in range(0, 3):
+ for y in range(0, 3):
+ rp.append(Vector2i(x, y))
+ rp.append(Vector2i(-x, y))
+ rp.append(Vector2i(x, -y))
+ rp.append(Vector2i(-x, -y))
+ return rp
+
+ item.tree_exiting.connect(func():
+ item_pool.erase(item)
+ for v in get_reserved_positions.call():
+ reserved_item_positions.erase(map_position + v)
+ )
+ item_pool.append(item)
+ for v in get_reserved_positions.call():
+ reserved_item_positions.append(map_position + v)
+
+ # restart timer
+ $TickTimer.start()
diff --git a/stage/stage.tscn b/stage/stage.tscn
index 9c8e256..8e57066 100644
--- a/stage/stage.tscn
+++ b/stage/stage.tscn
@@ -23,6 +23,7 @@ unique_name_in_owner = true
[node name="TickTimer" type="Timer" parent="."]
wait_time = 2.0
+one_shot = true
autostart = true
[connection signal="timeout" from="TickTimer" to="." method="_on_tick_timer_timeout"]
diff --git a/stage/stage_01.gd b/stage/stage_01.gd
index 01cc558..f622716 100644
--- a/stage/stage_01.gd
+++ b/stage/stage_01.gd
@@ -1,10 +1,6 @@
extends Stage
-var item_pool: Array = []
-var reserved_item_positions: Array = []
-
-
func _ready() -> void:
$Player.camera.limit_left = get_world_boundaries()[Vector2.LEFT]
$Player.camera.limit_right = get_world_boundaries()[Vector2.RIGHT]
@@ -12,6 +8,8 @@ func _ready() -> void:
$Player.camera.limit_bottom = get_world_boundaries()[Vector2.DOWN]
$TileMapLayer.modulate = Color(max(0.1, randf()), max(0.1, randf()), max(0.1, randf()))
+
+ set_mobile_controls()
func get_world_boundaries() -> Dictionary:
@@ -25,79 +23,3 @@ func get_world_boundaries() -> Dictionary:
func has_win_condition() -> bool:
return %Opponents.get_child_count() == 0
-
-
-func _on_tick_timer_timeout() -> void:
- if randf() > 0.8 and item_pool.size() < 3:
- var item_scene: PackedScene = [
- preload("res://item/shoe.tscn"),
- preload("res://item/crown.tscn"),
- ].pick_random()
-
- var item: Item = item_scene.instantiate()
- var map: TileMapLayer = get_tree().get_first_node_in_group("tilemap")
-
- var size_x := map.get_used_rect().position.x + map.get_used_rect().size.x
- var size_y := map.get_used_rect().position.y + map.get_used_rect().size.y
-
- var start_x: int = max(map.get_used_rect().position.x, range(size_x / 2).pick_random())
- var start_y: int = max(map.get_used_rect().position.y, range(size_y / 2).pick_random())
-
- var get_map_position = func() -> Vector2i:
- for x in range(start_x, size_x):
- for y in range(start_y, size_y):
- var data = map.get_cell_tile_data(Vector2(x, y))
- if not data:
- return Vector2i(x, y)
- return Vector2i.ZERO
-
- var map_position = get_map_position.call()
-
- #print(map_position)
- if reserved_item_positions.has(map_position):
- return
-
- var local_position = map.map_to_local(map_position)
-
- var _was_shifted := false
- var collide_top = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_TOP_SIDE))
- var collide_bottom = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_BOTTOM_SIDE))
- var collide_right = map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_RIGHT_SIDE))
- if collide_top:
- local_position += Vector2(0, map.tile_set.tile_size.y / 2)
- _was_shifted = true
- if collide_bottom:
- local_position += Vector2(0, -map.tile_set.tile_size.y / 2)
- _was_shifted = true
- if collide_right:
- local_position += Vector2(-map.tile_set.tile_size.x, 0)
- _was_shifted = true
- if not collide_top and not collide_right:
- if map.get_cell_tile_data(map.get_neighbor_cell(map_position, TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER)):
- local_position += Vector2(-map.tile_set.tile_size.x, map.tile_set.tile_size.y / 2)
- _was_shifted = true
-
- #if not was_shifted:
- local_position += Vector2(map.tile_set.tile_size.x / 2, 0)
-
- item.position = local_position
- add_child(item)
-
- var get_reserved_positions = func() -> Array[Vector2i]:
- var rp := [] as Array[Vector2i]
- for x in range(0, 3):
- for y in range(0, 3):
- rp.append(Vector2i(x, y))
- rp.append(Vector2i(-x, y))
- rp.append(Vector2i(x, -y))
- rp.append(Vector2i(-x, -y))
- return rp
-
- item.tree_exiting.connect(func():
- item_pool.erase(item)
- for v in get_reserved_positions.call():
- reserved_item_positions.erase(map_position + v)
- )
- item_pool.append(item)
- for v in get_reserved_positions.call():
- reserved_item_positions.append(map_position + v)
diff --git a/stage/stage_01.tscn b/stage/stage_01.tscn
index 6b0d67c..54f94e4 100644
--- a/stage/stage_01.tscn
+++ b/stage/stage_01.tscn
@@ -1,29 +1,76 @@
-[gd_scene load_steps=6 format=4 uid="uid://yb0no7vyekil"]
+[gd_scene load_steps=7 format=4 uid="uid://yb0no7vyekil"]
[ext_resource type="Script" path="res://stage/stage_01.gd" id="1_2ycoy"]
[ext_resource type="PackedScene" uid="uid://dfioemvleakyt" path="res://stage/tile_map_layer.tscn" id="1_4iotk"]
[ext_resource type="PackedScene" uid="uid://ivf0v2snsls5" path="res://stage/stage.tscn" id="1_uanw1"]
[ext_resource type="PackedScene" uid="uid://b4t3ipnq8vq2p" path="res://player/player.tscn" id="2_34lp1"]
[ext_resource type="PackedScene" uid="uid://d1h8psjxqge0a" path="res://player/opponent.tscn" id="4_h35rr"]
+[ext_resource type="PackedScene" uid="uid://cvx1vj47uf5k2" path="res://ui/mobile/mobile_controls.tscn" id="6_v35ah"]
[node name="Stage01" instance=ExtResource("1_uanw1")]
script = ExtResource("1_2ycoy")
+item_pool_max_size = 15
+
+[node name="ColorRect" parent="." index="0"]
+offset_right = 776.0
[node name="TileMapLayer" parent="." index="1" groups=["tilemap"] instance=ExtResource("1_4iotk")]
-tile_map_data = PackedByteArray("AAAIAAIAAAADAAAAAAAIAAMAAAAAAAAAAAAJAAIAAAAEAAAAAAAJAAMAAAACAAAAAAAKAAsAAAAAAAAAAAAKAAwAAAAAAAEAAAALAAsAAAACAAAAAAALAAwAAAACAAEAAAASAAgAAAAAAAAAAAASAAkAAAAAAAEAAAASAAoAAAAAAAEAAAASAAsAAAAAAAEAAAASAAwAAAAAAAEAAAATAAgAAAACAAAAAAATAAkAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAAAAAIAAAADAAAAAAAAAAUAAAADAAEAAAAAAAgAAAADAAEAAAAAAAsAAAADAAEAAAAAAA4AAAADAAEAAAAAABEAAAADAAAAAAABAAIAAAAEAAAAAAABAAUAAAADAAEAAAABAAgAAAADAAEAAAABAAsAAAADAAEAAAABAA4AAAADAAEAAAABABEAAAAEAAAAAAACAAIAAAADAAAAAAACAAUAAAADAAEAAAACAAgAAAADAAEAAAACAAsAAAADAAEAAAACAA4AAAADAAEAAAACABEAAAADAAAAAAADAAIAAAAEAAAAAAADAAUAAAADAAEAAAADAAgAAAADAAEAAAADAAsAAAADAAEAAAADAA4AAAADAAEAAAADABEAAAAEAAAAAAAEAAIAAAADAAAAAAAEAAUAAAADAAEAAAAEAAgAAAADAAEAAAAEAAsAAAADAAEAAAAEABEAAAADAAAAAAAFAAIAAAAEAAAAAAAFAAUAAAADAAEAAAAFAAgAAAADAAEAAAAFAAsAAAADAAEAAAAFABEAAAAEAAAAAAAGAAIAAAADAAAAAAAGAAgAAAADAAEAAAAGAAsAAAADAAEAAAAGAA4AAAADAAEAAAAGABEAAAADAAAAAAAHAAIAAAAEAAAAAAAHAAgAAAADAAEAAAAHAAsAAAADAAEAAAAHAA4AAAADAAEAAAAHABEAAAAEAAAAAAAIAAQAAAAAAAEAAAAIAAUAAAAAAAIAAAAIAAsAAAADAAEAAAAIAA4AAAADAAEAAAAIABEAAAADAAAAAAAJAAQAAAACAAEAAAAJAAUAAAACAAIAAAAJAAsAAAADAAEAAAAJAA4AAAADAAEAAAAJABEAAAAEAAAAAAAKAAIAAAADAAAAAAAKAAgAAAADAAEAAAAKAA0AAAAAAAEAAAAKAA4AAAAAAAIAAAAKABEAAAADAAAAAAALAAIAAAAEAAAAAAALAAgAAAADAAEAAAALAA0AAAACAAEAAAALAA4AAAACAAIAAAALABEAAAAEAAAAAAAMAAIAAAADAAAAAAAMAAUAAAADAAEAAAAMAAgAAAADAAEAAAAMAA4AAAADAAEAAAAMABEAAAADAAAAAAANAAIAAAAEAAAAAAANAAUAAAADAAEAAAANAAgAAAADAAEAAAANAA4AAAADAAEAAAANABEAAAAEAAAAAAAOAAIAAAADAAAAAAAOAAUAAAADAAEAAAAOAAgAAAADAAEAAAAOAAsAAAADAAEAAAAOAA4AAAADAAEAAAAOABEAAAADAAAAAAAPAAIAAAAEAAAAAAAPAAUAAAADAAEAAAAPAAgAAAADAAEAAAAPAAsAAAADAAEAAAAPAA4AAAADAAEAAAAPABEAAAAEAAAAAAAQAAIAAAADAAAAAAAQAAUAAAADAAEAAAAQAAgAAAADAAEAAAAQAAsAAAADAAEAAAAQABEAAAADAAAAAAARAAIAAAAEAAAAAAARAAUAAAADAAEAAAARAAgAAAADAAEAAAARAAsAAAADAAEAAAARABEAAAAEAAAAAAASAAIAAAADAAAAAAASAAUAAAADAAEAAAASAA0AAAAAAAEAAAASAA4AAAAAAAIAAAASABEAAAADAAAAAAATAAIAAAAEAAAAAAATAAUAAAADAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAIAAAATABEAAAAEAAAAAAAUAAIAAAADAAAAAAAUAAUAAAADAAEAAAAUAAgAAAADAAEAAAAUABEAAAADAAAAAAAVAAIAAAAEAAAAAAAVAAUAAAADAAEAAAAVAAgAAAADAAEAAAAVABEAAAAEAAAAAAAWAAIAAAADAAAAAAAWAAUAAAADAAEAAAAWAAgAAAADAAEAAAAWABEAAAADAAAAAAAXAAIAAAAEAAAAAAAXAAUAAAADAAEAAAAXAAgAAAADAAEAAAAXABEAAAAEAAAAAAAYAAIAAAADAAAAAAAYABEAAAADAAAAAAAZAAIAAAAEAAAAAAAZABEAAAAEAAAAAAAaAAIAAAADAAAAAAAaABEAAAADAAAAAAAbAAIAAAAEAAAAAAAbABEAAAAEAAAAAAAcAAIAAAADAAAAAAAcABEAAAADAAAAAAAdAAIAAAAEAAAAAAAdABEAAAAEAAAAAAAeAAIAAAADAAAAAAAeABEAAAADAAAAAAAfAAIAAAAEAAAAAAAfABEAAAAEAAAAAAAWAA4AAAADAAEAAAAXAA4AAAADAAEAAAAYAA4AAAADAAEAAAAZAA4AAAADAAEAAAAaAA4AAAADAAEAAAAUAAsAAAADAAEAAAAVAAsAAAADAAEAAAAYAAsAAAADAAEAAAAZAAsAAAADAAEAAAAaAAsAAAADAAEAAAAaAAgAAAADAAEAAAAbAAgAAAADAAEAAAAcAAgAAAADAAEAAAAdAAgAAAADAAEAAAAeAAgAAAADAAEAAAAfAAgAAAADAAEAAAAYAAUAAAADAAEAAAAZAAUAAAADAAEAAAAcAAUAAAADAAEAAAAdAAUAAAADAAEAAAAfAAUAAAADAAEAAAAeAAUAAAADAAEAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAEAAAAcAA0AAAAAAAEAAAAcAA4AAAAAAAIAAAAdAAsAAAACAAAAAAAdAAwAAAACAAEAAAAdAA0AAAACAAEAAAAdAA4AAAACAAIAAAAbAAsAAAADAAEAAAAbAA4AAAADAAEAAAAeAAsAAAADAAEAAAAfAAsAAAADAAEAAAAeAA4AAAADAAEAAAAfAA4AAAADAAEAAAA=")
+tile_map_data = PackedByteArray("AAAIAAIAAAADAAAAAAAIAAMAAAAAAAAAAAAJAAIAAAAEAAAAAAAJAAMAAAACAAAAAAAKAAsAAAAAAAAAAAAKAAwAAAAAAAEAAAALAAsAAAACAAAAAAALAAwAAAACAAEAAAASAAgAAAAAAAAAAAASAAkAAAAAAAEAAAASAAoAAAAAAAEAAAASAAsAAAAAAAEAAAASAAwAAAAAAAEAAAATAAgAAAACAAAAAAATAAkAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAAAAAIAAAADAAAAAAAAAAUAAAADAAEAAAAAAAgAAAADAAEAAAAAAAsAAAADAAEAAAAAAA4AAAADAAEAAAAAABEAAAADAAAAAAABAAIAAAAEAAAAAAABAAUAAAADAAEAAAABAAgAAAADAAEAAAABAAsAAAADAAEAAAABAA4AAAADAAEAAAABABEAAAAEAAAAAAACAAIAAAADAAAAAAACAAUAAAADAAEAAAACAAgAAAADAAEAAAACAAsAAAADAAEAAAACAA4AAAADAAEAAAACABEAAAADAAAAAAADAAIAAAAEAAAAAAADAAUAAAADAAEAAAADAAgAAAADAAEAAAADAAsAAAADAAEAAAADAA4AAAADAAEAAAADABEAAAAEAAAAAAAEAAIAAAADAAAAAAAEAAUAAAADAAEAAAAEAAgAAAADAAEAAAAEAAsAAAADAAEAAAAEABEAAAADAAAAAAAFAAIAAAAEAAAAAAAFAAUAAAADAAEAAAAFAAgAAAADAAEAAAAFAAsAAAADAAEAAAAFABEAAAAEAAAAAAAGAAIAAAADAAAAAAAGAAgAAAADAAEAAAAGAAsAAAADAAEAAAAGAA4AAAADAAEAAAAGABEAAAADAAAAAAAHAAIAAAAEAAAAAAAHAAgAAAADAAEAAAAHAAsAAAADAAEAAAAHAA4AAAADAAEAAAAHABEAAAAEAAAAAAAIAAQAAAAAAAEAAAAIAAUAAAAAAAIAAAAIAAsAAAADAAEAAAAIAA4AAAADAAEAAAAIABEAAAADAAAAAAAJAAQAAAACAAEAAAAJAAUAAAACAAIAAAAJAAsAAAADAAEAAAAJAA4AAAADAAEAAAAJABEAAAAEAAAAAAAKAAIAAAADAAAAAAAKAAgAAAADAAEAAAAKAA0AAAAAAAEAAAAKAA4AAAAAAAIAAAAKABEAAAADAAAAAAALAAIAAAAEAAAAAAALAAgAAAADAAEAAAALAA0AAAACAAEAAAALAA4AAAACAAIAAAALABEAAAAEAAAAAAAMAAIAAAADAAAAAAAMAAUAAAADAAEAAAAMAAgAAAADAAEAAAAMAA4AAAADAAEAAAAMABEAAAADAAAAAAANAAIAAAAEAAAAAAANAAUAAAADAAEAAAANAAgAAAADAAEAAAANAA4AAAADAAEAAAANABEAAAAEAAAAAAAOAAIAAAADAAAAAAAOAAUAAAADAAEAAAAOAAgAAAADAAEAAAAOAAsAAAADAAEAAAAOAA4AAAADAAEAAAAOABEAAAADAAAAAAAPAAIAAAAEAAAAAAAPAAUAAAADAAEAAAAPAAgAAAADAAEAAAAPAAsAAAADAAEAAAAPAA4AAAADAAEAAAAPABEAAAAEAAAAAAAQAAIAAAADAAAAAAAQAAUAAAADAAEAAAAQAAgAAAADAAEAAAAQAAsAAAADAAEAAAAQABEAAAADAAAAAAARAAIAAAAEAAAAAAARAAUAAAADAAEAAAARAAgAAAADAAEAAAARAAsAAAADAAEAAAARABEAAAAEAAAAAAASAAIAAAADAAAAAAASAAUAAAADAAEAAAASAA0AAAAAAAEAAAASAA4AAAAAAAIAAAASABEAAAADAAAAAAATAAIAAAAEAAAAAAATAAUAAAADAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAIAAAATABEAAAAEAAAAAAAUAAIAAAADAAAAAAAUAAUAAAADAAEAAAAUAAgAAAADAAEAAAAUABEAAAADAAAAAAAVAAIAAAAEAAAAAAAVAAUAAAADAAEAAAAVAAgAAAADAAEAAAAVABEAAAAEAAAAAAAWAAIAAAADAAAAAAAWAAUAAAADAAEAAAAWAAgAAAADAAEAAAAWABEAAAADAAAAAAAXAAIAAAAEAAAAAAAXAAUAAAADAAEAAAAXAAgAAAADAAEAAAAXABEAAAAEAAAAAAAYAAIAAAADAAAAAAAYABEAAAADAAAAAAAZAAIAAAAEAAAAAAAZABEAAAAEAAAAAAAaAAIAAAADAAAAAAAaABEAAAADAAAAAAAbAAIAAAAEAAAAAAAbABEAAAAEAAAAAAAcAAIAAAADAAAAAAAcABEAAAADAAAAAAAdAAIAAAAEAAAAAAAdABEAAAAEAAAAAAAeAAIAAAADAAAAAAAeABEAAAADAAAAAAAfAAIAAAAEAAAAAAAfABEAAAAEAAAAAAAWAA4AAAADAAEAAAAXAA4AAAADAAEAAAAYAA4AAAADAAEAAAAZAA4AAAADAAEAAAAaAA4AAAADAAEAAAAUAAsAAAADAAEAAAAVAAsAAAADAAEAAAAYAAsAAAADAAEAAAAZAAsAAAADAAEAAAAaAAsAAAADAAEAAAAaAAgAAAADAAEAAAAbAAgAAAADAAEAAAAcAAgAAAADAAEAAAAdAAgAAAADAAEAAAAeAAgAAAADAAEAAAAfAAgAAAADAAEAAAAYAAUAAAADAAEAAAAZAAUAAAADAAEAAAAcAAUAAAADAAEAAAAdAAUAAAADAAEAAAAfAAUAAAADAAEAAAAeAAUAAAADAAEAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAEAAAAcAA0AAAAAAAEAAAAcAA4AAAAAAAIAAAAdAAsAAAACAAAAAAAdAAwAAAACAAEAAAAdAA0AAAACAAEAAAAdAA4AAAACAAIAAAAbAAsAAAADAAEAAAAbAA4AAAADAAEAAAAeAAsAAAADAAEAAAAfAAsAAAADAAEAAAAeAA4AAAADAAEAAAAfAA4AAAADAAEAAAAgAAIAAAAIAAAAAAAhAAIAAAAJAAAAAAAiAAIAAAAIAAAAAAAjAAIAAAAJAAAAAAAkAAIAAAAIAAAAAAAlAAIAAAAJAAAAAAAmAAIAAAAIAAAAAAAnAAIAAAAJAAAAAAAoAAIAAAAIAAAAAAApAAIAAAAJAAAAAAAqAAIAAAAIAAAAAAArAAIAAAAJAAAAAAAsAAIAAAAIAAAAAAAtAAIAAAAJAAAAAAAuAAIAAAAIAAAAAAAvAAIAAAAJAAAAAAAgABEAAAAIAAAAAAAhABEAAAAJAAAAAAAiABEAAAAIAAAAAAAjABEAAAAJAAAAAAAkABEAAAAIAAAAAAAlABEAAAAJAAAAAAAmABEAAAAIAAAAAAAnABEAAAAJAAAAAAAoABEAAAAIAAAAAAApABEAAAAJAAAAAAAqABEAAAAIAAAAAAArABEAAAAJAAAAAAAsABEAAAAIAAAAAAAtABEAAAAJAAAAAAAuABEAAAAIAAAAAAAvABEAAAAJAAAAAAAgAAsAAAAFAAEAAAAgAAwAAAAFAAEAAAAgAA0AAAAFAAEAAAAgAA4AAAAFAAEAAAAhAAsAAAAHAAEAAAAhAA4AAAAHAAEAAAAhAAwAAAAHAAEAAAAhAA0AAAAHAAEAAAAiAAsAAAAIAAEAAAAjAAsAAAAIAAEAAAAiAA4AAAAIAAEAAAAjAA4AAAAIAAEAAAAgAAgAAAAFAAEAAAAhAAgAAAAHAAEAAAAiAAgAAAAIAAEAAAAjAAgAAAAIAAEAAAAgAAUAAAAFAAAAAAAhAAUAAAAHAAAAAAAiAAUAAAAIAAEAAAAjAAUAAAAIAAEAAAAkAAgAAAAIAAEAAAAlAAgAAAAIAAEAAAAkAAsAAAAFAAAAAAAlAAsAAAAHAAAAAAAmAAsAAAAIAAEAAAAnAAsAAAAIAAEAAAAkAA4AAAAFAAIAAAAlAA4AAAAHAAIAAAAmAA4AAAAIAAEAAAAnAA4AAAAIAAEAAAAoAA4AAAAIAAEAAAApAA4AAAAIAAEAAAAgABAAAAAFAAIAAAAhABAAAAAHAAIAAAAgAA8AAAAFAAEAAAAhAA8AAAAHAAEAAAAhAAoAAAAHAAEAAAAhAAkAAAAHAAEAAAAhAAcAAAAHAAEAAAAhAAYAAAAHAAEAAAAgAAoAAAAFAAEAAAAgAAkAAAAFAAEAAAAgAAcAAAAFAAEAAAAgAAYAAAAFAAEAAAAkAAUAAAAIAAEAAAAlAAUAAAAIAAEAAAAmAAgAAAAIAAEAAAAnAAgAAAAIAAEAAAApAAsAAAAIAAEAAAAoAAsAAAAIAAEAAAAqAA4AAAAIAAEAAAArAA4AAAAIAAEAAAAkAAwAAAAFAAEAAAAkAA0AAAAFAAEAAAAlAAwAAAAHAAEAAAAlAA0AAAAHAAEAAAAwAAIAAAADAAMAAAAxAAIAAAADAAMAAAAyAAIAAAADAAMAAAAzAAIAAAADAAMAAAA0AAIAAAADAAMAAAA1AAIAAAADAAMAAAA2AAIAAAADAAMAAAA3AAIAAAADAAMAAAA4AAIAAAADAAMAAAA5AAIAAAADAAMAAAA6AAIAAAADAAMAAAA7AAIAAAADAAMAAAA8AAIAAAADAAMAAAA9AAIAAAADAAMAAAA+AAIAAAADAAMAAAA/AAIAAAADAAMAAAAwABEAAAADAAMAAAAxABEAAAADAAMAAAAyABEAAAADAAMAAAAzABEAAAADAAMAAAA0ABEAAAADAAMAAAA1ABEAAAADAAMAAAA2ABEAAAADAAMAAAA3ABEAAAADAAMAAAA4ABEAAAADAAMAAAA5ABEAAAADAAMAAAA6ABEAAAADAAMAAAA7ABEAAAADAAMAAAA8ABEAAAADAAMAAAA9ABEAAAADAAMAAAA+ABEAAAADAAMAAAA/ABEAAAADAAMAAAAwAAMAAAAAAAMAAAAxAAMAAAACAAMAAAAwAAQAAAAAAAQAAAAwAAUAAAAAAAQAAAAwAAYAAAAAAAQAAAAwAAcAAAAAAAQAAAAwAAgAAAAAAAQAAAAwAAkAAAAAAAQAAAAwAAoAAAAAAAQAAAAwAAsAAAAAAAQAAAAwAAwAAAAAAAQAAAAwAA0AAAAAAAQAAAAwAA4AAAAAAAUAAAAxAA4AAAACAAUAAAAxAA0AAAACAAQAAAAxAAwAAAACAAQAAAAxAAsAAAACAAQAAAAxAAoAAAACAAQAAAAxAAkAAAACAAQAAAAxAAgAAAACAAQAAAAxAAcAAAACAAQAAAAxAAYAAAACAAQAAAAxAAUAAAACAAQAAAAxAAQAAAACAAQAAAAyAA4AAAADAAQAAAAzAA4AAAADAAQAAAA0AA4AAAADAAQAAAA1AA4AAAADAAQAAAA0AAsAAAADAAQAAAA1AAsAAAADAAQAAAA2AAsAAAADAAQAAAA3AAsAAAADAAQAAAA1AAgAAAADAAQAAAA0AAgAAAADAAQAAAAzAAgAAAADAAQAAAAyAAgAAAADAAQAAAA0AAUAAAADAAQAAAA1AAUAAAADAAQAAAA2AAUAAAADAAQAAAA3AAUAAAADAAQAAAA4AAgAAAAAAAMAAAA5AAgAAAACAAMAAAA6AAgAAAADAAQAAAA7AAgAAAADAAQAAAA6AAsAAAADAAQAAAA7AAsAAAADAAQAAAA8AAsAAAADAAQAAAA9AAsAAAADAAQAAAA6AAUAAAADAAQAAAA7AAUAAAADAAQAAAA8AAUAAAADAAQAAAA9AAUAAAADAAQAAAA4AA4AAAAAAAQAAAA5AA4AAAACAAQAAAA6AA4AAAADAAQAAAA7AA4AAAADAAQAAAA+AA4AAAADAAQAAAA/AA4AAAADAAQAAAA+AAgAAAADAAQAAAA/AAgAAAADAAQAAAA4AAkAAAAAAAQAAAA4AAoAAAAAAAQAAAA4AAsAAAAAAAQAAAA4AAwAAAAAAAQAAAA4AA0AAAAAAAQAAAA5AAkAAAACAAQAAAA5AAoAAAACAAQAAAA5AAsAAAACAAQAAAA5AAwAAAACAAQAAAA5AA0AAAACAAQAAAA5ABAAAAACAAUAAAA4ABAAAAAAAAUAAAA5AA8AAAACAAQAAAA4AA8AAAAAAAQAAABAAAIAAAAJAAMAAABBAAIAAAAIAAMAAABCAAIAAAAJAAMAAABDAAIAAAAIAAMAAABEAAIAAAAJAAMAAABFAAIAAAAIAAMAAABGAAIAAAAJAAMAAABHAAIAAAAIAAMAAABIAAIAAAAJAAMAAABJAAIAAAAIAAMAAABKAAIAAAAJAAMAAABLAAIAAAAIAAMAAABMAAIAAAAJAAMAAABNAAIAAAAIAAMAAABOAAIAAAAJAAMAAABPAAIAAAAIAAMAAABQAAIAAAAJAAMAAABAABEAAAAJAAMAAABQABEAAAAJAAMAAABPABEAAAAIAAMAAABNABEAAAAIAAMAAABOABEAAAAJAAMAAABLABEAAAAIAAMAAABMABEAAAAJAAMAAABJABEAAAAIAAMAAABKABEAAAAJAAMAAABHABEAAAAIAAMAAABIABEAAAAJAAMAAABFABEAAAAIAAMAAABGABEAAAAJAAMAAABDABEAAAAIAAMAAABEABEAAAAJAAMAAABBABEAAAAIAAMAAABCABEAAAAJAAMAAABAAAUAAAAFAAMAAABBAAUAAAAHAAMAAABAAAYAAAAFAAQAAABAAAcAAAAFAAQAAABAAAgAAAAFAAQAAABAAAkAAAAFAAQAAABAAAoAAAAFAAQAAABAAAsAAAAFAAQAAABAAAwAAAAFAAQAAABAAA0AAAAFAAQAAABAAA4AAAAFAAMAAABBAA4AAAAHAAMAAABBAA0AAAAHAAQAAABBAAwAAAAHAAQAAABBAAsAAAAHAAQAAABBAAoAAAAHAAQAAABBAAkAAAAHAAQAAABBAAgAAAAHAAQAAABBAAcAAAAHAAQAAABBAAYAAAAHAAQAAABCAA4AAAAIAAQAAABDAA4AAAAIAAQAAABCAAUAAAAIAAQAAABDAAUAAAAIAAQAAABEAAgAAAAIAAQAAABFAAgAAAAIAAQAAABEAAsAAAAIAAQAAABFAAsAAAAIAAQAAABGAAgAAAAIAAQAAABHAAgAAAAIAAQAAABGAAsAAAAIAAQAAABHAAsAAAAIAAQAAABGAAUAAAAIAAQAAABHAAUAAAAIAAQAAABIAAUAAAAIAAQAAABJAAUAAAAIAAQAAABGAA4AAAAIAAQAAABHAA4AAAAIAAQAAABIAA4AAAAIAAQAAABJAA4AAAAIAAQAAABKAAgAAAAIAAQAAABLAAgAAAAIAAQAAABMAAgAAAAIAAQAAABNAAgAAAAIAAQAAABKAAsAAAAIAAQAAABLAAsAAAAIAAQAAABMAA4AAAAIAAQAAABNAA4AAAAIAAQAAABOAA4AAAAFAAMAAABPAA4AAAAHAAMAAABMAAUAAAAIAAQAAABNAAUAAAAIAAQAAABOAAUAAAAIAAQAAABPAAUAAAAIAAQAAABOAAsAAAAFAAMAAABPAAsAAAAHAAMAAABRAAIAAAADAAYAAABSAAIAAAAEAAYAAABTAAIAAAADAAYAAABUAAIAAAAEAAYAAABVAAIAAAADAAYAAABWAAIAAAAEAAYAAABXAAIAAAADAAYAAABYAAIAAAAEAAYAAABZAAIAAAADAAYAAABaAAIAAAAEAAYAAABbAAIAAAADAAYAAABcAAIAAAAEAAYAAABdAAIAAAADAAYAAABeAAIAAAAEAAYAAABfAAIAAAADAAYAAABgAAIAAAAEAAYAAABRABEAAAADAAYAAABSABEAAAAEAAYAAABTABEAAAADAAYAAABUABEAAAAEAAYAAABVABEAAAADAAYAAABWABEAAAAEAAYAAABXABEAAAADAAYAAABYABEAAAAEAAYAAABZABEAAAADAAYAAABaABEAAAAEAAYAAABbABEAAAADAAYAAABcABEAAAAEAAYAAABdABEAAAADAAYAAABeABEAAAAEAAYAAABfABEAAAADAAYAAABgABEAAAAEAAYAAABOAAwAAAAFAAQAAABOAA0AAAAFAAQAAABPAAwAAAAHAAQAAABPAA0AAAAHAAQAAABQAAsAAAADAAcAAABRAAsAAAADAAcAAABQAA4AAAADAAcAAABRAA4AAAADAAcAAABQAAUAAAADAAcAAABRAAUAAAADAAcAAABQAAgAAAADAAcAAABRAAgAAAADAAcAAABUAAUAAAADAAcAAABVAAUAAAADAAcAAABUAAgAAAADAAcAAABVAAgAAAADAAcAAABUAAsAAAADAAcAAABVAAsAAAADAAcAAABUAA4AAAAAAAYAAABVAA4AAAACAAYAAABYAA4AAAADAAcAAABZAA4AAAADAAcAAABYAAsAAAAAAAYAAABZAAsAAAACAAYAAABYAAgAAAAAAAYAAABZAAgAAAACAAYAAABYAAUAAAADAAcAAABZAAUAAAADAAcAAABcAAUAAAAAAAYAAABdAAUAAAACAAYAAABcAAgAAAAAAAYAAABdAAgAAAACAAYAAABcAAsAAAAAAAYAAABdAAsAAAACAAYAAABcAA4AAAAAAAYAAABdAA4AAAACAAYAAABeAAUAAAADAAcAAABfAAUAAAADAAcAAABgAAUAAAADAAcAAABeAAgAAAADAAcAAABfAAgAAAADAAcAAABgAAgAAAADAAcAAABeAAsAAAADAAcAAABfAAsAAAADAAcAAABgAAsAAAADAAcAAABeAA4AAAADAAcAAABfAA4AAAADAAcAAABgAA4AAAADAAcAAABYAAkAAAAAAAcAAABYAAoAAAAAAAcAAABZAAoAAAACAAcAAABZAAkAAAACAAcAAABcAAYAAAAAAAcAAABcAAcAAAAAAAcAAABdAAYAAAACAAcAAABdAAcAAAACAAcAAABVABAAAAACAAYAAABUABAAAAAAAAYAAABUAA8AAAAAAAcAAABVAA8AAAACAAcAAABcAAwAAAAAAAcAAABcAA0AAAAAAAcAAABdAAwAAAACAAcAAABdAA0AAAACAAcAAABSAAgAAAADAAcAAABTAAgAAAADAAcAAABaAAsAAAADAAcAAABbAAsAAAADAAcAAABKAAMAAAAFAAMAAABLAAMAAAAHAAMAAABKAAUAAAAFAAMAAABLAAUAAAAHAAMAAABKAAQAAAAFAAQAAABLAAQAAAAHAAQAAAAuAA4AAAAIAAEAAAAvAA4AAAAIAAEAAAAvAAsAAAAIAAEAAAAuAAsAAAAIAAEAAAAtAAsAAAAIAAEAAAAsAAsAAAAIAAEAAAAvAAgAAAAIAAEAAAAuAAgAAAAIAAEAAAAtAAgAAAAIAAEAAAAsAAgAAAAIAAEAAAArAAgAAAAHAAIAAAAqAAgAAAAFAAIAAAAvAAUAAAAIAAEAAAAuAAUAAAAIAAEAAAAtAAUAAAAIAAEAAAAsAAUAAAAIAAEAAAArAAUAAAAHAAAAAAAqAAUAAAAFAAAAAAApAAUAAAAIAAEAAAAoAAUAAAAIAAEAAAAqAAYAAAAFAAEAAAAqAAcAAAAFAAEAAAArAAYAAAAHAAEAAAArAAcAAAAHAAEAAABbAAUAAAADAAcAAABaAAUAAAADAAcAAABWAA4AAAADAAcAAABXAA4AAAADAAcAAABSAAsAAAADAAcAAABTAAsAAAADAAcAAAA=")
[node name="Opponent" parent="Opponents" index="0" instance=ExtResource("4_h35rr")]
position = Vector2(105, 128)
-current_type = null
+current_type = 1
[node name="Opponent2" parent="Opponents" index="1" instance=ExtResource("4_h35rr")]
position = Vector2(52, 80)
-current_type = 1
+current_type = 2
[node name="Opponent3" parent="Opponents" index="2" instance=ExtResource("4_h35rr")]
position = Vector2(120, 80)
-current_type = 2
+
+[node name="Opponent4" parent="Opponents" index="3" instance=ExtResource("4_h35rr")]
+position = Vector2(328, 80)
+random_start_type = true
+
+[node name="Opponent5" parent="Opponents" index="4" instance=ExtResource("4_h35rr")]
+position = Vector2(304, 128)
+random_start_type = true
+
+[node name="Opponent6" parent="Opponents" index="5" instance=ExtResource("4_h35rr")]
+position = Vector2(424, 80)
+random_start_type = true
+
+[node name="Opponent7" parent="Opponents" index="6" instance=ExtResource("4_h35rr")]
+position = Vector2(488, 128)
+random_start_type = true
+
+[node name="Opponent8" parent="Opponents" index="7" instance=ExtResource("4_h35rr")]
+position = Vector2(600, 56)
+random_start_type = true
+
+[node name="Opponent9" parent="Opponents" index="8" instance=ExtResource("4_h35rr")]
+position = Vector2(616, 104)
+random_start_type = true
+
+[node name="Opponent10" parent="Opponents" index="9" instance=ExtResource("4_h35rr")]
+position = Vector2(728, 80)
+random_start_type = true
+
+[node name="Opponent11" parent="Opponents" index="10" instance=ExtResource("4_h35rr")]
+position = Vector2(712, 128)
+random_start_type = true
+
+[node name="Opponent12" parent="Opponents" index="11" instance=ExtResource("4_h35rr")]
+position = Vector2(744, 32)
+random_start_type = true
[node name="Player" parent="." index="3" instance=ExtResource("2_34lp1")]
+unique_name_in_owner = true
position = Vector2(16, 128)
current_type = 2
+
+[node name="MobileControls" parent="." index="5" instance=ExtResource("6_v35ah")]
+unique_name_in_owner = true
+
+[node name="TickTimer" parent="." index="6"]
+wait_time = 0.5
diff --git a/stage/tile_map_layer.tscn b/stage/tile_map_layer.tscn
index 6fd9df1..4e9583e 100644
--- a/stage/tile_map_layer.tscn
+++ b/stage/tile_map_layer.tscn
@@ -30,6 +30,88 @@ texture_region_size = Vector2i(8, 8)
4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
3:1/0 = 0
3:1/0/physics_layer_1/polygon_0/points = PackedVector2Array(-4, -4, -4, 4, 4, 4, 4, -4)
+5:0/0 = 0
+5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+6:0/0 = 0
+6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+7:0/0 = 0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+8:0/0 = 0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+9:0/0 = 0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+5:1/0 = 0
+5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+6:1/0 = 0
+6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+7:1/0 = 0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+8:1/0 = 0
+8:1/0/physics_layer_1/polygon_0/points = PackedVector2Array(-4, -4, -4, 4, 4, 4, 4, -4)
+5:2/0 = 0
+5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+6:2/0 = 0
+6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+7:2/0 = 0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+0:3/0 = 0
+0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+1:3/0 = 0
+1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+2:3/0 = 0
+2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+3:3/0 = 0
+3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+5:3/0 = 0
+5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+6:3/0 = 0
+6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+7:3/0 = 0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+8:3/0 = 0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+9:3/0 = 0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+0:4/0 = 0
+0:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+1:4/0 = 0
+1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+2:4/0 = 0
+2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+3:4/0 = 0
+3:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-4, -4, -4, 4, 4, 4, 4, -4)
+5:4/0 = 0
+5:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+6:4/0 = 0
+6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+7:4/0 = 0
+7:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+8:4/0 = 0
+8:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-4, -4, -4, 4, 4, 4, 4, -4)
+0:5/0 = 0
+0:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+1:5/0 = 0
+1:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+2:5/0 = 0
+2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+0:6/0 = 0
+0:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+1:6/0 = 0
+1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+2:6/0 = 0
+2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+3:6/0 = 0
+3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+4:6/0 = 0
+4:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+0:7/0 = 0
+0:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+1:7/0 = 0
+1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+2:7/0 = 0
+2:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -4, 4, -4, 4, 4, -4, 4)
+3:7/0 = 0
+3:7/0/physics_layer_1/polygon_0/points = PackedVector2Array(-4, -4, -4, 4, 4, 4, 4, -4)
[sub_resource type="TileSet" id="TileSet_277cy"]
tile_size = Vector2i(8, 8)
diff --git a/stage/tileset-01.kra b/stage/tileset-01.kra
deleted file mode 100644
index 68a3bf4..0000000
--- a/stage/tileset-01.kra
+++ /dev/null
Binary files differ
diff --git a/ui/assets/tilemap_white.png b/ui/assets/tilemap_white.png
new file mode 100644
index 0000000..207208e
--- /dev/null
+++ b/ui/assets/tilemap_white.png
Binary files differ
diff --git a/ui/assets/tilemap_white.png.import b/ui/assets/tilemap_white.png.import
new file mode 100644
index 0000000..4a91aca
--- /dev/null
+++ b/ui/assets/tilemap_white.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cywefso7qpdan"
+path="res://.godot/imported/tilemap_white.png-0d4219020eb50271e0e65cbcc8eff609.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/tilemap_white.png"
+dest_files=["res://.godot/imported/tilemap_white.png-0d4219020eb50271e0e65cbcc8eff609.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/ui/mobile/button.gd b/ui/mobile/button.gd
new file mode 100644
index 0000000..2e3653c
--- /dev/null
+++ b/ui/mobile/button.gd
@@ -0,0 +1,45 @@
+@tool
+extends Panel
+
+
+@export var texture: Texture2D:
+ set(value):
+ texture = value
+ $TouchScreenButton.texture_normal = value
+ _on_resized()
+
+@export var label: String:
+ set(value):
+ label = value
+ $Label.text = value
+
+@export var action: StringName = "":
+ set(value):
+ action = value
+ $TouchScreenButton.action = value
+
+
+func _ready() -> void:
+ _on_resized()
+
+
+func _on_resized() -> void:
+ $TouchScreenButton.shape.size = size
+
+ var texture_size := Vector2.ZERO
+ if texture:
+ texture_size = texture.get_size()
+
+ $TouchScreenButton.position = Vector2(
+ (size.x - texture_size.x) / 2,
+ (size.y - texture_size.y) / 2
+ )
+
+ $Label.size = size
+
+
+func _on_touch_screen_button_pressed() -> void:
+ modulate = Color(0.5, 0.5, 0.5, 1.0)
+
+func _on_touch_screen_button_released() -> void:
+ modulate = Color(1.0, 1.0, 1.0, 1.0)
diff --git a/ui/mobile/button.tscn b/ui/mobile/button.tscn
new file mode 100644
index 0000000..64a413f
--- /dev/null
+++ b/ui/mobile/button.tscn
@@ -0,0 +1,43 @@
+[gd_scene load_steps=5 format=3 uid="uid://evppekv62x0g"]
+
+[ext_resource type="Script" path="res://ui/mobile/button.gd" id="1_2pd68"]
+[ext_resource type="Theme" uid="uid://b067xhqktnmhr" path="res://ui/theme.tres" id="2_rnfal"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qy0ya"]
+bg_color = Color(0.0297164, 0.155372, 0.181691, 1)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0, 0, 0, 1)
+border_blend = true
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_cuu3o"]
+resource_local_to_scene = true
+size = Vector2(160, 20)
+
+[node name="Button" type="Panel"]
+texture_filter = 1
+offset_right = 160.0
+offset_bottom = 20.0
+theme_override_styles/panel = SubResource("StyleBoxFlat_qy0ya")
+script = ExtResource("1_2pd68")
+
+[node name="TouchScreenButton" type="TouchScreenButton" parent="."]
+position = Vector2(80, 10)
+shape = SubResource("RectangleShape2D_cuu3o")
+shape_visible = false
+visibility_mode = 1
+
+[node name="Label" type="Label" parent="."]
+layout_mode = 0
+offset_right = 160.0
+offset_bottom = 20.0
+theme = ExtResource("2_rnfal")
+theme_override_colors/font_color = Color(1, 1, 1, 1)
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[connection signal="resized" from="." to="." method="_on_resized"]
+[connection signal="pressed" from="TouchScreenButton" to="." method="_on_touch_screen_button_pressed"]
+[connection signal="released" from="TouchScreenButton" to="." method="_on_touch_screen_button_released"]
diff --git a/ui/mobile/mobile_controls.gd b/ui/mobile/mobile_controls.gd
new file mode 100644
index 0000000..a87ceea
--- /dev/null
+++ b/ui/mobile/mobile_controls.gd
@@ -0,0 +1,17 @@
+class_name MobileControls
+extends CanvasLayer
+
+
+var size: Vector2:
+ get():
+ return (get_child(0) as Control).size
+
+
+func _init() -> void:
+ visible = false
+ process_mode = ProcessMode.PROCESS_MODE_DISABLED
+
+
+func enable() -> void:
+ process_mode = ProcessMode.PROCESS_MODE_ALWAYS
+ visible = true
diff --git a/ui/mobile/mobile_controls.tscn b/ui/mobile/mobile_controls.tscn
new file mode 100644
index 0000000..333b0ad
--- /dev/null
+++ b/ui/mobile/mobile_controls.tscn
@@ -0,0 +1,78 @@
+[gd_scene load_steps=7 format=3 uid="uid://cvx1vj47uf5k2"]
+
+[ext_resource type="Script" path="res://ui/mobile/mobile_controls.gd" id="1_ts8mv"]
+[ext_resource type="PackedScene" uid="uid://evppekv62x0g" path="res://ui/mobile/button.tscn" id="2_7um2b"]
+[ext_resource type="Texture2D" uid="uid://cywefso7qpdan" path="res://ui/assets/tilemap_white.png" id="2_n84be"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_e3qjv"]
+bg_color = Color(0.0313726, 0.156863, 0.180392, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hxyr7"]
+bg_color = Color(0.0297164, 0.155372, 0.181691, 1)
+border_width_left = 1
+border_width_top = 2
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0, 0, 0, 1)
+border_blend = true
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_kr7mh"]
+atlas = ExtResource("2_n84be")
+region = Rect2(445, 292, 10, 10)
+filter_clip = true
+
+[node name="MobileControls" type="CanvasLayer"]
+script = ExtResource("1_ts8mv")
+
+[node name="Control" type="Panel" parent="."]
+offset_top = 144.0
+offset_right = 160.0
+offset_bottom = 249.0
+theme_override_styles/panel = SubResource("StyleBoxFlat_e3qjv")
+
+[node name="Up" parent="Control" instance=ExtResource("2_7um2b")]
+layout_mode = 0
+offset_bottom = 26.0
+theme_override_styles/panel = SubResource("StyleBoxFlat_hxyr7")
+texture = SubResource("AtlasTexture_kr7mh")
+label = ""
+action = &"ui_up"
+
+[node name="Down" parent="Control" instance=ExtResource("2_7um2b")]
+layout_mode = 0
+offset_left = 160.0
+offset_top = 92.0
+offset_right = 320.0
+offset_bottom = 118.0
+rotation = 3.14159
+texture = SubResource("AtlasTexture_kr7mh")
+label = ""
+action = &"ui_down"
+
+[node name="Left" parent="Control" instance=ExtResource("2_7um2b")]
+layout_mode = 0
+offset_left = 160.0
+offset_top = 26.0
+offset_right = 200.0
+offset_bottom = 106.0
+rotation = 1.5708
+texture = SubResource("AtlasTexture_kr7mh")
+label = ""
+action = &"ui_right"
+
+[node name="Right" parent="Control" instance=ExtResource("2_7um2b")]
+layout_mode = 0
+offset_top = 66.0
+offset_right = 40.0
+offset_bottom = 146.0
+rotation = -1.5708
+texture = SubResource("AtlasTexture_kr7mh")
+label = ""
+action = &"ui_left"
+
+[node name="Start" parent="Control" instance=ExtResource("2_7um2b")]
+layout_mode = 0
+offset_top = 92.0
+offset_bottom = 105.0
+label = "Start"
+action = &"ui_accept"
diff --git a/ui/start_screen.tscn b/ui/start_screen.tscn
index 6d40d01..5b19aa3 100644
--- a/ui/start_screen.tscn
+++ b/ui/start_screen.tscn
@@ -45,7 +45,6 @@ text = "0"
[node name="CountdownTimer" type="Timer" parent="."]
unique_name_in_owner = true
-wait_time = 3.0
one_shot = true
[connection signal="timeout" from="CountdownTimer" to="." method="_on_countdown_timer_timeout"]
diff --git a/ui/theme.tres b/ui/theme.tres
index eb181eb..d4ee617 100644
--- a/ui/theme.tres
+++ b/ui/theme.tres
@@ -3,6 +3,8 @@
[ext_resource type="FontFile" uid="uid://16usq1tjtauh" path="res://ui/assets/Minimal3x5.ttf" id="1_qtw8w"]
[resource]
+Button/font_sizes/font_size = 8
+Button/fonts/font = ExtResource("1_qtw8w")
Label/colors/font_color = Color(0.12549, 0.345098, 0.313726, 1)
Label/font_sizes/font_size = 8
Label/fonts/font = ExtResource("1_qtw8w")