From 9cf6944ac85e7c1b9644b9f8c3b655f767281f5d Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Fri, 17 Nov 2023 20:49:38 +1100 Subject: [PATCH] multiplayer pretty much works now i think --- Assets/TextureAtlases/funbox.glb | Bin 0 -> 13044 bytes Assets/TextureAtlases/funbox.glb.import | 32 ++ .../ClassCards/Assault/tower_stats.tres | 4 +- .../ClassCards/Blowdart/card_blowdart.tres | 2 +- .../BombLauncher/bomb_projectile.gd | 2 + .../DamageEnhancer/card_damage_enhancer.tres | 11 - .../Flamethrower/card_flamethrower.tres | 26 +- .../Flamethrower/flame_particles.tres | 19 ++ .../Flamethrower/tower_flamethrower.gd | 31 +- .../Flamethrower/tower_flamethrower.tscn | 104 ++---- .../ClassCards/Flamethrower/tower_stats.tres | 25 ++ .../Flamethrower/weapon_flamethrower.gd | 35 +-- .../Flamethrower/weapon_flamethrower.tscn | 113 ++----- .../ClassCards/Flamethrower/weapon_stats.tres | 25 ++ .../GammaLaser/card_gamma_laser.tres | 11 - .../ClassCards/Lightning/card_lightning.tres | 11 - .../ClassCards/Reactor/card_reactor.tres | 30 +- .../Reactor/radiation_particles.tres | 19 ++ .../ClassCards/Reactor/reactortower.gd | 17 - .../ClassCards/Reactor/reactorweapon.gd | 30 -- .../ClassCards/Reactor/tower_reactor.gd | 15 + .../ClassCards/Reactor/tower_reactor.tscn | 85 ++--- .../ClassCards/Reactor/tower_stats.tres | 25 ++ .../ClassCards/Reactor/weapon_reactor.gd | 7 + .../ClassCards/Reactor/weapon_reactor.tscn | 112 ++----- .../ClassCards/Reactor/weapon_stats.tres | 25 ++ .../Refridgerator/card_refridgerator.tres | 19 -- .../ClassCards/Refridgerator/fridgetower.gd | 17 - .../Refridgerator/refridgeratorweapon.gd | 30 -- .../Refridgerator/tower_refridgerator.tscn | 76 ----- .../Refridgerator/weapon_refridgerator.tscn | 100 ------ .../Refrigerator/card_refrigerator.tres | 23 ++ .../Refrigerator/cold_particles.tres | 19 ++ .../Refrigerator/tower_refrigerator.gd | 15 + .../Refrigerator/tower_refrigerator.tscn | 43 +++ .../ClassCards/Refrigerator/tower_stats.tres | 25 ++ .../Refrigerator/weapon_refrigerator.tscn | 21 ++ .../ClassCards/Refrigerator/weapon_stats.tres | 25 ++ .../RocketLauncher/rocket_projectile.tscn | 2 - .../RocketLauncher/weapon_rocket_launcher.gd | 1 + .../ClassCards/Sniper/weapon_stats.tres | 2 +- PCs/hero.gd | 2 +- PCs/hero.tscn | 4 +- Scenes/Menus/audio_options.tscn | 4 + Scenes/Menus/gameplay_options.tscn | 167 ++++++++++ Scenes/Menus/graphics_options.tscn | 125 ++++++++ Scenes/Menus/keybind_options.tscn | 22 ++ Scenes/Menus/multiplayer_lobby.tscn | 1 - Scenes/Menus/options_menu.tscn | 297 +----------------- Scenes/Menus/singleplayer_lobby.tscn | 2 - Scenes/Towers/range_affecting_tower.tscn | 7 + Scenes/Towers/shapecast_tower.tscn | 14 + Scenes/UI/chatbox.tscn | 40 ++- Scenes/Weapons/shapecast_weapon.tscn | 44 +++ Scenes/tower_base.tscn | 15 +- Scenes/tower_frame.tscn | 16 +- Scripts/Projectiles/explosive_projectile.gd | 9 + Scripts/Projectiles/homing_projectile.gd | 7 +- Scripts/Projectiles/projectile.gd | 10 + Scripts/Resources/player_graphics_settings.gd | 38 +++ Scripts/Resources/player_preferences.gd | 25 -- Scripts/Towers/hitscan_tower.gd | 2 + Scripts/Towers/projectile_tower.gd | 1 + Scripts/Towers/range_affecting_tower.gd | 32 ++ Scripts/Towers/shapecast_tower.gd | 48 +++ Scripts/Towers/tower.gd | 9 + Scripts/Weapons/projectile_weapon.gd | 1 + Scripts/Weapons/shapecast_weapon.gd | 55 ++++ Scripts/card_hand.gd | 2 +- Scripts/chatbox.gd | 56 +++- Scripts/data.gd | 10 +- Scripts/game.gd | 10 +- Scripts/gameplay_options.gd | 46 +++ Scripts/graphics_options.gd | 36 +++ Scripts/keybind_options.gd | 63 ++++ Scripts/multiplayer_lobby.gd | 5 +- Scripts/options_menu.gd | 127 +------- Scripts/singleplayer_lobby.gd | 1 + Scripts/tower_base.gd | 6 +- Worlds/GreenPlanet/Levels/first_level.tscn | 6 +- Worlds/GreenPlanet/tilemap.tres | 8 +- funbox.glb | Bin 0 -> 13044 bytes funbox.glb.import | 45 +++ funbox.tscn | 13 + funboxtex.png | Bin 0 -> 1801 bytes funboxtex.png.import | 34 ++ textmesh.res | Bin 0 -> 7420 bytes 87 files changed, 1476 insertions(+), 1223 deletions(-) create mode 100644 Assets/TextureAtlases/funbox.glb create mode 100644 Assets/TextureAtlases/funbox.glb.import delete mode 100644 PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres create mode 100644 PCs/Universal/ClassCards/Flamethrower/flame_particles.tres create mode 100644 PCs/Universal/ClassCards/Flamethrower/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres delete mode 100644 PCs/Universal/ClassCards/Lightning/card_lightning.tres create mode 100644 PCs/Universal/ClassCards/Reactor/radiation_particles.tres delete mode 100644 PCs/Universal/ClassCards/Reactor/reactortower.gd delete mode 100644 PCs/Universal/ClassCards/Reactor/reactorweapon.gd create mode 100644 PCs/Universal/ClassCards/Reactor/tower_reactor.gd create mode 100644 PCs/Universal/ClassCards/Reactor/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/Reactor/weapon_reactor.gd create mode 100644 PCs/Universal/ClassCards/Reactor/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres delete mode 100644 PCs/Universal/ClassCards/Refridgerator/fridgetower.gd delete mode 100644 PCs/Universal/ClassCards/Refridgerator/refridgeratorweapon.gd delete mode 100644 PCs/Universal/ClassCards/Refridgerator/tower_refridgerator.tscn delete mode 100644 PCs/Universal/ClassCards/Refridgerator/weapon_refridgerator.tscn create mode 100644 PCs/Universal/ClassCards/Refrigerator/card_refrigerator.tres create mode 100644 PCs/Universal/ClassCards/Refrigerator/cold_particles.tres create mode 100644 PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.gd create mode 100644 PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.tscn create mode 100644 PCs/Universal/ClassCards/Refrigerator/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/Refrigerator/weapon_refrigerator.tscn create mode 100644 PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres create mode 100644 Scenes/Menus/audio_options.tscn create mode 100644 Scenes/Menus/gameplay_options.tscn create mode 100644 Scenes/Menus/graphics_options.tscn create mode 100644 Scenes/Menus/keybind_options.tscn create mode 100644 Scenes/Towers/range_affecting_tower.tscn create mode 100644 Scenes/Towers/shapecast_tower.tscn create mode 100644 Scenes/Weapons/shapecast_weapon.tscn create mode 100644 Scripts/Resources/player_graphics_settings.gd create mode 100644 Scripts/Towers/range_affecting_tower.gd create mode 100644 Scripts/Towers/shapecast_tower.gd create mode 100644 Scripts/Weapons/shapecast_weapon.gd create mode 100644 Scripts/gameplay_options.gd create mode 100644 Scripts/graphics_options.gd create mode 100644 Scripts/keybind_options.gd create mode 100644 funbox.glb create mode 100644 funbox.glb.import create mode 100644 funbox.tscn create mode 100644 funboxtex.png create mode 100644 funboxtex.png.import create mode 100644 textmesh.res diff --git a/Assets/TextureAtlases/funbox.glb b/Assets/TextureAtlases/funbox.glb new file mode 100644 index 0000000000000000000000000000000000000000..592f730ce2ef3ea9f794297dcd4385c0a70d5f40 GIT binary patch literal 13044 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 aMpnjY46KZd49^%`8TA>TG3Ya{X8-`RfTJJ) literal 0 HcmV?d00001 diff --git a/Assets/TextureAtlases/funbox.glb.import b/Assets/TextureAtlases/funbox.glb.import new file mode 100644 index 0000000..76c09c2 --- /dev/null +++ b/Assets/TextureAtlases/funbox.glb.import @@ -0,0 +1,32 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dunbllusdlmcb" +path="res://.godot/imported/funbox.glb-41e82e7ba643b674dacd582affc5d422.scn" + +[deps] + +source_file="res://Assets/TextureAtlases/funbox.glb" +dest_files=["res://.godot/imported/funbox.glb-41e82e7ba643b674dacd582affc5d422.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={} +gltf/embedded_image_handling=1 diff --git a/PCs/Universal/ClassCards/Assault/tower_stats.tres b/PCs/Universal/ClassCards/Assault/tower_stats.tres index 2779bea..6500c95 100644 --- a/PCs/Universal/ClassCards/Assault/tower_stats.tres +++ b/PCs/Universal/ClassCards/Assault/tower_stats.tres @@ -6,12 +6,12 @@ [sub_resource type="Resource" id="Resource_bukji"] script = ExtResource("1_cwxf1") key = "Fire Delay" -value = 1.0 +value = 0.5 [sub_resource type="Resource" id="Resource_2e75s"] script = ExtResource("1_cwxf1") key = "Damage" -value = 0.5 +value = 1.0 [sub_resource type="Resource" id="Resource_1vpnf"] script = ExtResource("1_cwxf1") diff --git a/PCs/Universal/ClassCards/Blowdart/card_blowdart.tres b/PCs/Universal/ClassCards/Blowdart/card_blowdart.tres index fc603e3..d07e90e 100644 --- a/PCs/Universal/ClassCards/Blowdart/card_blowdart.tres +++ b/PCs/Universal/ClassCards/Blowdart/card_blowdart.tres @@ -14,7 +14,7 @@ region = Rect2(0, 0, 64, 64) [resource] script = ExtResource("1_nobd8") title = "Blowdart" -rarity = 2 +rarity = 1 faction = 0 sprite = SubResource("AtlasTexture_jl74p") turret_scene = ExtResource("4_wvh75") diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd index 5fd6b89..3262567 100644 --- a/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd +++ b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd @@ -7,6 +7,8 @@ var bounces := 0 func _ready() -> void: apply_central_impulse(direction * force) + if owner_id == 0: + max_bounces = 0 func _on_body_entered(_body: Node) -> void: diff --git a/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres b/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres deleted file mode 100644 index 114da6a..0000000 --- a/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=3 format=3 uid="uid://0p0i7m5ciwtq"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_hj6hq"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_irvam"] - -[resource] -script = ExtResource("1_hj6hq") -title = "Damage Enhancer" -rarity = 2 -faction = 0 -sprite = ExtResource("2_irvam") diff --git a/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres b/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres index 7e1f403..678a4ed 100644 --- a/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres +++ b/PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres @@ -1,19 +1,23 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://1xke2uy2vfuf"] +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://dg4pjt47q8xpw"] [ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_xmwih"] -[ext_resource type="Resource" uid="uid://5ywipj3632u8" path="res://Resources/TurretStats/flametower.tres" id="2_80w0f"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="2_ukaax"] -[ext_resource type="PackedScene" uid="uid://dvqk2lysu02gf" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn" id="3_yfmjg"] -[ext_resource type="Resource" uid="uid://c4ihsd13o1esd" path="res://Resources/WeaponStats/flamethrower.tres" id="4_rdoaa"] -[ext_resource type="PackedScene" uid="uid://cprppqfd2wf6s" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn" id="5_6v5br"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="2_ocjdv"] +[ext_resource type="Resource" uid="uid://cdtjbxs21peqg" path="res://PCs/Universal/ClassCards/Flamethrower/tower_stats.tres" id="3_sjxkl"] +[ext_resource type="PackedScene" uid="uid://dhv7m4lky7bd8" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn" id="4_800j1"] +[ext_resource type="PackedScene" uid="uid://dkoj1766ygo3f" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn" id="4_rgkdc"] +[ext_resource type="Resource" uid="uid://yjknwdimtm8g" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres" id="5_qi4e4"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_bcolm"] +atlas = ExtResource("2_ocjdv") +region = Rect2(0, 0, 64, 64) [resource] script = ExtResource("1_xmwih") title = "Flamethrower" rarity = 2 faction = 0 -sprite = ExtResource("2_ukaax") -turret = ExtResource("3_yfmjg") -weapon = ExtResource("5_6v5br") -weapon_stats = ExtResource("4_rdoaa") -tower_stats = ExtResource("2_80w0f") +sprite = SubResource("AtlasTexture_bcolm") +turret_scene = ExtResource("4_rgkdc") +weapon_scene = ExtResource("4_800j1") +weapon_stats = ExtResource("5_qi4e4") +tower_stats = ExtResource("3_sjxkl") diff --git a/PCs/Universal/ClassCards/Flamethrower/flame_particles.tres b/PCs/Universal/ClassCards/Flamethrower/flame_particles.tres new file mode 100644 index 0000000..b178753 --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/flame_particles.tres @@ -0,0 +1,19 @@ +[gd_resource type="ParticleProcessMaterial" load_steps=3 format=3 uid="uid://gyeamtekshor"] + +[sub_resource type="Gradient" id="Gradient_eiw3y"] +interpolation_color_space = 2 +offsets = PackedFloat32Array(0, 0.178862, 0.455285, 1) +colors = PackedColorArray(0.94, 0.830333, 0, 1, 1, 0.222923, 0.00252032, 1, 0.517571, 0.0343237, 0.0001635, 1, 0.0352941, 0, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_arw7j"] +gradient = SubResource("Gradient_eiw3y") + +[resource] +direction = Vector3(0, 0, -1) +spread = 15.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 3.0 +initial_velocity_max = 3.0 +scale_min = 0.3 +scale_max = 0.3 +color_ramp = SubResource("GradientTexture1D_arw7j") diff --git a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd index 3ea4405..7dfa2c4 100644 --- a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd +++ b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd @@ -1,27 +1,8 @@ -extends Tower -class_name FlameyTower - -@export var shapecast : ShapeCast3D -@export var particlesystem : GPUParticles3D -@export var status_stats : StatusStats +extends ShapecastTower +class_name FlamethrowerTower -func _process(delta: float) -> void: - super._process(delta) - if targeted_enemy: - particlesystem.emitting = true - else: - particlesystem.emitting = false - - -func shoot(): - for index in shapecast.get_collision_count(): - var target = shapecast.get_collider(index) as CharacterBody3D - var status = StatusOnFire.new() - status.stats = status_stats - target.status_manager.add_effect(status) - - -func aim(): - model.look_at(targeted_enemy.global_position) - model.rotation.x = 0.0 +func build_status_object() -> StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn index e41e51a..416b8c6 100644 --- a/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn +++ b/PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.tscn @@ -1,83 +1,47 @@ -[gd_scene load_steps=10 format=3 uid="uid://dvqk2lysu02gf"] +[gd_scene load_steps=11 format=3 uid="uid://dkoj1766ygo3f"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd" id="1_6dcsj"] -[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="2_yo2b7"] +[ext_resource type="PackedScene" uid="uid://8uxu72vjo0cv" path="res://Scenes/Towers/shapecast_tower.tscn" id="1_jagpf"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Flamethrower/tower_flamethrower.gd" id="2_7vewc"] +[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="3_aop2h"] +[ext_resource type="Resource" uid="uid://cdtjbxs21peqg" path="res://PCs/Universal/ClassCards/Flamethrower/tower_stats.tres" id="4_by7c8"] -[sub_resource type="Gradient" id="Gradient_kkqms"] -offsets = PackedFloat32Array(0.00591716, 1) -colors = PackedColorArray(0.898039, 0.447059, 0, 1, 1, 0, 0, 0.34902) +[sub_resource type="BoxShape3D" id="BoxShape3D_r367g"] +size = Vector3(2, 2, 3) -[sub_resource type="GradientTexture1D" id="GradientTexture1D_4cwgw"] -gradient = SubResource("Gradient_kkqms") +[sub_resource type="Gradient" id="Gradient_ay233"] +offsets = PackedFloat32Array(0, 0.178862, 0.455285, 1) +colors = PackedColorArray(0.94, 0.830333, 0, 1, 1, 0.222923, 0.00252032, 1, 0.517571, 0.0343237, 0.0001635, 1, 0.0352941, 0, 0, 1) -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_2nhns"] -direction = Vector3(0, 1, 0) -spread = 20.0 +[sub_resource type="GradientTexture1D" id="GradientTexture1D_7rrxx"] +gradient = SubResource("Gradient_ay233") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_r7587"] +direction = Vector3(0, 0, -1) +spread = 15.0 gravity = Vector3(0, 0, 0) -initial_velocity_min = 5.0 -initial_velocity_max = 5.0 -damping_min = 4.464 -damping_max = 4.464 -color_ramp = SubResource("GradientTexture1D_4cwgw") +initial_velocity_min = 3.0 +initial_velocity_max = 3.0 +color_ramp = SubResource("GradientTexture1D_7rrxx") -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ycjd1"] -transparency = 1 +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p8aw8"] vertex_color_use_as_albedo = true -[sub_resource type="BoxMesh" id="BoxMesh_q83y7"] -material = SubResource("StandardMaterial3D_ycjd1") +[sub_resource type="BoxMesh" id="BoxMesh_h4c6o"] +material = SubResource("StandardMaterial3D_p8aw8") size = Vector3(0.3, 0.3, 0.3) -[sub_resource type="BoxShape3D" id="BoxShape3D_vck5q"] -size = Vector3(2.145, 3.125, 2.415) +[node name="ShapecastTower" instance=ExtResource("1_jagpf")] +script = ExtResource("2_7vewc") +status_stats = ExtResource("3_aop2h") +stats = ExtResource("4_by7c8") -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_imgrm"] -transparency = 1 -cull_mode = 2 -shading_mode = 0 -albedo_color = Color(0.686275, 0, 0, 0.278431) - -[node name="Node3D" type="Node3D" node_paths=PackedStringArray("shapecast", "particlesystem", "model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_6dcsj") -shapecast = NodePath("Model/Node3D/ShapeCast3D") -particlesystem = NodePath("Model/Node3D/GPUParticles3D") -status_stats = ExtResource("2_yo2b7") -model = NodePath("Model") -range_sphere = NodePath("Model/CSGSphere3D") -minimap_range_sphere = NodePath("Model/CSGSphere3D2") - -[node name="Model" type="Node3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) - -[node name="CSGBox3D" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.968366, 0) -size = Vector3(1, 1.25244, 1) - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00567371, -0.780982, -0.514041) -size = Vector3(0.481654, 0.427749, 1.38438) - -[node name="Node3D" type="Node3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, -0.807848, -1.2154) - -[node name="GPUParticles3D" type="GPUParticles3D" parent="Model/Node3D"] -amount = 48 -visibility_aabb = AABB(-2.2922, -3.14731, -1.92995, 4.5844, 6.29461, 3.85991) -process_material = SubResource("ParticleProcessMaterial_2nhns") -draw_pass_1 = SubResource("BoxMesh_q83y7") - -[node name="ShapeCast3D" type="ShapeCast3D" parent="Model/Node3D"] -shape = SubResource("BoxShape3D_vck5q") -target_position = Vector3(0, 1.51, 0) +[node name="ShapeCast3D" parent="Yaw" index="0"] +shape = SubResource("BoxShape3D_r367g") +target_position = Vector3(0, 0, -2) collision_mask = 4 -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") +[node name="GPUParticles3D" parent="Yaw/ShapeCast3D" index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.534666) +amount = 16 +process_material = SubResource("ParticleProcessMaterial_r7587") +draw_pass_1 = SubResource("BoxMesh_h4c6o") diff --git a/PCs/Universal/ClassCards/Flamethrower/tower_stats.tres b/PCs/Universal/ClassCards/Flamethrower/tower_stats.tres new file mode 100644 index 0000000..06e0374 --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://cdtjbxs21peqg"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_jc00v"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_mmknc"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_jc00v") +key = "Fire Delay" +value = 0.5 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_jc00v") +key = "Damage" +value = 0.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_jc00v") +key = "Range" +value = 3.0 + +[resource] +script = ExtResource("2_mmknc") +target_type = 1 +attributes = Array[ExtResource("1_jc00v")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Hold to apply Burning to enemies in front of you" diff --git a/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd b/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd index 66ce08f..c658aeb 100644 --- a/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd +++ b/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd @@ -1,30 +1,7 @@ -extends Weapon +extends ShapecastWeapon +class_name FlamethrowerWeapon -@export var shapecast : ShapeCast3D -@export var particlesystem : GPUParticles3D -@export var status_stats : StatusStats - - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - - -func set_raycast_origin(_node): - pass - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - particlesystem.emitting = true - $AnimationPlayer.play("shoot") - for index in shapecast.get_collision_count(): - var target = shapecast.get_collider(index) as CharacterBody3D - var status = StatusOnFire.new() - status.stats = status_stats - target.status_manager.add_effect(status) - - -func release_trigger(): - trigger_held = false - particlesystem.emitting = false +func build_status_object() -> StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn b/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn index 9529caf..0500a8a 100644 --- a/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn +++ b/PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.tscn @@ -1,100 +1,23 @@ -[gd_scene load_steps=14 format=3 uid="uid://cprppqfd2wf6s"] +[gd_scene load_steps=8 format=3 uid="uid://dhv7m4lky7bd8"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_kpb2q"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd" id="2_18t5l"] -[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="3_2sa8l"] -[ext_resource type="Resource" uid="uid://c4ihsd13o1esd" path="res://Resources/WeaponStats/flamethrower.tres" id="4_ih15j"] +[ext_resource type="PackedScene" uid="uid://dp4gfr5h0tbcd" path="res://Scenes/Weapons/shapecast_weapon.tscn" id="1_ovmdp"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_flamethrower.gd" id="2_227rf"] +[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="3_fqch8"] +[ext_resource type="Resource" uid="uid://yjknwdimtm8g" path="res://PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres" id="4_oafdt"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="5_wdw3e"] +[ext_resource type="Material" uid="uid://gyeamtekshor" path="res://PCs/Universal/ClassCards/Flamethrower/flame_particles.tres" id="6_idhp2"] -[sub_resource type="Animation" id="Animation_n8b32"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Rect2(0, 0, 64, 64)] -} +[sub_resource type="AtlasTexture" id="AtlasTexture_3hank"] +atlas = ExtResource("5_wdw3e") +region = Rect2(0, 0, 64, 64) -[sub_resource type="Animation" id="Animation_g0h8q"] -resource_name = "shoot" -length = 0.15 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.15), -"transitions": PackedFloat32Array(0, 0), -"update": 0, -"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] -} +[node name="FlamethrowerWeapon" instance=ExtResource("1_ovmdp")] +script = ExtResource("2_227rf") +status_stats = ExtResource("3_fqch8") +stats = ExtResource("4_oafdt") -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_3hank") -[sub_resource type="BoxShape3D" id="BoxShape3D_q7gll"] -size = Vector3(3, 3, 4) - -[sub_resource type="Gradient" id="Gradient_nneoo"] -offsets = PackedFloat32Array(0.00591716, 1) -colors = PackedColorArray(0.898039, 0.447059, 0, 1, 1, 0, 0, 0.34902) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_gpquw"] -gradient = SubResource("Gradient_nneoo") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_cp5dw"] -direction = Vector3(0, 1, 0) -spread = 20.0 -gravity = Vector3(0, 0, 0) -initial_velocity_min = 5.0 -initial_velocity_max = 5.0 -damping_min = 1.9 -damping_max = 1.9 -color_ramp = SubResource("GradientTexture1D_gpquw") - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2yd7w"] -transparency = 1 -vertex_color_use_as_albedo = true - -[sub_resource type="BoxMesh" id="BoxMesh_ggcx2"] -material = SubResource("StandardMaterial3D_2yd7w") -size = Vector3(0.3, 0.3, 0.3) - -[node name="Weapon" type="Sprite3D" node_paths=PackedStringArray("shapecast", "particlesystem")] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_kpb2q") -script = ExtResource("2_18t5l") -shapecast = NodePath("ShapeCast3D") -particlesystem = NodePath("GPUParticles3D") -status_stats = ExtResource("3_2sa8l") -stats = ExtResource("4_ih15j") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="ShapeCast3D" type="ShapeCast3D" parent="."] -transform = Transform3D(0.975695, 0, 0.219131, 0, 1, 0, -0.219131, 0, 0.975695, 0, 0, 0) -shape = SubResource("BoxShape3D_q7gll") -target_position = Vector3(0, 0, -2) -collision_mask = 4 - -[node name="GPUParticles3D" type="GPUParticles3D" parent="."] -transform = Transform3D(0.975695, -0.219131, -9.57852e-09, 0, -4.37114e-08, 1, -0.219131, -0.975695, -4.2649e-08, 0, 0, 0) -amount = 32 -visibility_aabb = AABB(-2.2922, -3.14731, -1.92995, 4.5844, 6.29461, 3.85991) -process_material = SubResource("ParticleProcessMaterial_cp5dw") -draw_pass_1 = SubResource("BoxMesh_ggcx2") +[node name="GPUParticles3D" parent="ShapeCast3D" index="0"] +process_material = ExtResource("6_idhp2") diff --git a/PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres b/PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres new file mode 100644 index 0000000..3227da7 --- /dev/null +++ b/PCs/Universal/ClassCards/Flamethrower/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://yjknwdimtm8g"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_7qcx8"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_g5aby"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_g5aby") +key = "Fire Delay" +value = 0.4 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_g5aby") +key = "Damage" +value = 1.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_g5aby") +key = "Range" +value = 3.0 + +[resource] +script = ExtResource("1_7qcx8") +target_type = 0 +attributes = Array[ExtResource("1_g5aby")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Hold to apply Burning to enemies in front of you" diff --git a/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres b/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres deleted file mode 100644 index d9b3277..0000000 --- a/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=3 format=3 uid="uid://qyhlpglghda3"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_goeex"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_a7b2p"] - -[resource] -script = ExtResource("1_goeex") -title = "Gamma Laser" -rarity = 3 -faction = 0 -sprite = ExtResource("2_a7b2p") diff --git a/PCs/Universal/ClassCards/Lightning/card_lightning.tres b/PCs/Universal/ClassCards/Lightning/card_lightning.tres deleted file mode 100644 index 3198dc7..0000000 --- a/PCs/Universal/ClassCards/Lightning/card_lightning.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=3 format=3 uid="uid://biy2kw34h5t8n"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_oj1u6"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_eyg7w"] - -[resource] -script = ExtResource("1_oj1u6") -title = "Lightning" -rarity = 4 -faction = 0 -sprite = ExtResource("2_eyg7w") diff --git a/PCs/Universal/ClassCards/Reactor/card_reactor.tres b/PCs/Universal/ClassCards/Reactor/card_reactor.tres index 56a55cc..bfe3b56 100644 --- a/PCs/Universal/ClassCards/Reactor/card_reactor.tres +++ b/PCs/Universal/ClassCards/Reactor/card_reactor.tres @@ -1,19 +1,23 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://dra640am6ykri"] +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://b3o112jw3loiu"] -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_7065k"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_8hvde"] -[ext_resource type="Resource" uid="uid://baa8sauri4218" path="res://Resources/TurretStats/reactor.tres" id="3_ikj6b"] -[ext_resource type="PackedScene" uid="uid://byglhh0etuy6" path="res://PCs/Universal/ClassCards/Reactor/tower_reactor.tscn" id="4_y3lkh"] -[ext_resource type="PackedScene" uid="uid://cpe3b700kwj48" path="res://PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn" id="5_atmmn"] -[ext_resource type="Resource" uid="uid://b5eakeawu3gle" path="res://Resources/WeaponStats/reactor.tres" id="5_erecn"] +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_0ciid"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="2_as4jg"] +[ext_resource type="Resource" uid="uid://cssdyxk8oefsd" path="res://PCs/Universal/ClassCards/Reactor/tower_stats.tres" id="3_7vuex"] +[ext_resource type="PackedScene" uid="uid://yymj42pp6v1t" path="res://PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn" id="3_de72q"] +[ext_resource type="PackedScene" uid="uid://dqrkn0vp2tmrh" path="res://PCs/Universal/ClassCards/Reactor/tower_reactor.tscn" id="4_1krig"] +[ext_resource type="Resource" uid="uid://ipfr7emuarbj" path="res://PCs/Universal/ClassCards/Reactor/weapon_stats.tres" id="4_wilo7"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_7aw4q"] +atlas = ExtResource("2_as4jg") +region = Rect2(0, 0, 64, 64) [resource] -script = ExtResource("1_7065k") +script = ExtResource("1_0ciid") title = "Reactor" rarity = 4 faction = 0 -sprite = ExtResource("2_8hvde") -turret = ExtResource("4_y3lkh") -weapon = ExtResource("5_atmmn") -weapon_stats = ExtResource("5_erecn") -tower_stats = ExtResource("3_ikj6b") +sprite = SubResource("AtlasTexture_7aw4q") +turret_scene = ExtResource("4_1krig") +weapon_scene = ExtResource("3_de72q") +weapon_stats = ExtResource("4_wilo7") +tower_stats = ExtResource("3_7vuex") diff --git a/PCs/Universal/ClassCards/Reactor/radiation_particles.tres b/PCs/Universal/ClassCards/Reactor/radiation_particles.tres new file mode 100644 index 0000000..c10582a --- /dev/null +++ b/PCs/Universal/ClassCards/Reactor/radiation_particles.tres @@ -0,0 +1,19 @@ +[gd_resource type="ParticleProcessMaterial" load_steps=3 format=3 uid="uid://bjab6t4n0s5ac"] + +[sub_resource type="Gradient" id="Gradient_eiw3y"] +interpolation_color_space = 2 +offsets = PackedFloat32Array(0, 0.0894309, 1) +colors = PackedColorArray(0, 0.831373, 0, 1, 4.21144e-08, 0.320987, -4.81308e-08, 0.721201, 0, 0.254902, 0, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_arw7j"] +gradient = SubResource("Gradient_eiw3y") + +[resource] +direction = Vector3(0, 0, -1) +spread = 15.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 3.0 +initial_velocity_max = 3.0 +scale_min = 0.3 +scale_max = 0.3 +color_ramp = SubResource("GradientTexture1D_arw7j") diff --git a/PCs/Universal/ClassCards/Reactor/reactortower.gd b/PCs/Universal/ClassCards/Reactor/reactortower.gd deleted file mode 100644 index 25c10f3..0000000 --- a/PCs/Universal/ClassCards/Reactor/reactortower.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends Tower -class_name ReactorTower - -@export var status_stats : StatusStats -@export var particlesystem : GPUParticles3D - - -func aim(): - pass - - -func shoot(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= stats.fire_range: - var status = StatusRadioactive.new() - status.stats = status_stats - enemy.status_manager.add_effect(status) diff --git a/PCs/Universal/ClassCards/Reactor/reactorweapon.gd b/PCs/Universal/ClassCards/Reactor/reactorweapon.gd deleted file mode 100644 index 07a5577..0000000 --- a/PCs/Universal/ClassCards/Reactor/reactorweapon.gd +++ /dev/null @@ -1,30 +0,0 @@ -extends Weapon - -@export var shapecast : ShapeCast3D -@export var particlesystem : GPUParticles3D -@export var status_stats : StatusStats - - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - - -func set_raycast_origin(_node): - pass - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - particlesystem.emitting = true - $AnimationPlayer.play("shoot") - for index in shapecast.get_collision_count(): - var target = shapecast.get_collider(index) as CharacterBody3D - var status = StatusRadioactive.new() - status.stats = status_stats - target.status_manager.add_effect(status) - - -func release_trigger(): - trigger_held = false - particlesystem.emitting = false diff --git a/PCs/Universal/ClassCards/Reactor/tower_reactor.gd b/PCs/Universal/ClassCards/Reactor/tower_reactor.gd new file mode 100644 index 0000000..624303e --- /dev/null +++ b/PCs/Universal/ClassCards/Reactor/tower_reactor.gd @@ -0,0 +1,15 @@ +extends RangeAffectingTower +class_name ReactorTower + +@export var particles : GPUParticles3D + + +func _ready() -> void: + super._ready() + particles.process_material.emission_ring_radius = target_range + + +func build_status_object() -> StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Reactor/tower_reactor.tscn b/PCs/Universal/ClassCards/Reactor/tower_reactor.tscn index 0a2fb6d..bb99aec 100644 --- a/PCs/Universal/ClassCards/Reactor/tower_reactor.tscn +++ b/PCs/Universal/ClassCards/Reactor/tower_reactor.tscn @@ -1,72 +1,43 @@ -[gd_scene load_steps=10 format=3 uid="uid://byglhh0etuy6"] +[gd_scene load_steps=10 format=3 uid="uid://dqrkn0vp2tmrh"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Reactor/reactortower.gd" id="1_rb733"] -[ext_resource type="Resource" uid="uid://dxlisoas4xlmo" path="res://Resources/StatusEffects/radioactive.tres" id="2_vyodb"] -[ext_resource type="Resource" uid="uid://baa8sauri4218" path="res://Resources/TurretStats/reactor.tres" id="3_a6b2i"] +[ext_resource type="PackedScene" uid="uid://bi6b2r6wek7he" path="res://Scenes/Towers/range_affecting_tower.tscn" id="1_afsqn"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Reactor/tower_reactor.gd" id="2_6w83m"] +[ext_resource type="Resource" uid="uid://dxlisoas4xlmo" path="res://Resources/StatusEffects/radioactive.tres" id="3_xhrj0"] +[ext_resource type="Resource" uid="uid://cssdyxk8oefsd" path="res://PCs/Universal/ClassCards/Reactor/tower_stats.tres" id="4_rkhup"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_imgrm"] -transparency = 1 -cull_mode = 2 -shading_mode = 0 -albedo_color = Color(0.686275, 0, 0, 0.278431) +[sub_resource type="Gradient" id="Gradient_ranod"] +interpolation_color_space = 2 +offsets = PackedFloat32Array(0.252033, 1) +colors = PackedColorArray(0, 0.533333, 0, 1, 0, 1, 0, 0.34902) -[sub_resource type="Gradient" id="Gradient_kkqms"] -colors = PackedColorArray(0.376471, 0.976471, 0, 0.435294, 0.127613, 0.391512, 0, 0.870588) +[sub_resource type="GradientTexture1D" id="GradientTexture1D_iinp2"] +gradient = SubResource("Gradient_ranod") -[sub_resource type="GradientTexture1D" id="GradientTexture1D_4cwgw"] -gradient = SubResource("Gradient_kkqms") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_2nhns"] +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_q1hpa"] emission_shape = 6 emission_ring_axis = Vector3(0, 1, 0) -emission_ring_height = 0.5 -emission_ring_radius = 20.0 +emission_ring_height = 0.1 +emission_ring_radius = 30.0 emission_ring_inner_radius = 0.0 -gravity = Vector3(0, 1, 0) -color_ramp = SubResource("GradientTexture1D_4cwgw") +gravity = Vector3(0, 3, 0) +color_ramp = SubResource("GradientTexture1D_iinp2") -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ycjd1"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rl0f7"] transparency = 1 vertex_color_use_as_albedo = true -[sub_resource type="BoxMesh" id="BoxMesh_q83y7"] -material = SubResource("StandardMaterial3D_ycjd1") +[sub_resource type="BoxMesh" id="BoxMesh_fr4f1"] +material = SubResource("StandardMaterial3D_rl0f7") size = Vector3(0.3, 0.3, 0.3) -[node name="Node3D" type="Node3D" node_paths=PackedStringArray("particlesystem", "model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_rb733") -status_stats = ExtResource("2_vyodb") -particlesystem = NodePath("Model/GPUParticles3D") -stats = ExtResource("3_a6b2i") -model = NodePath("Model") -range_sphere = NodePath("Model/CSGSphere3D") -minimap_range_sphere = NodePath("Model/CSGSphere3D2") +[node name="ReactorTower" node_paths=PackedStringArray("particles") instance=ExtResource("1_afsqn")] +script = ExtResource("2_6w83m") +particles = NodePath("GPUParticles3D") +status_stats = ExtResource("3_xhrj0") +stats = ExtResource("4_rkhup") -[node name="Model" type="Node3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) - -[node name="CSGBox3D" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.968366, 0) -size = Vector3(1, 1.25244, 1) - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.426601, 0) -size = Vector3(0.661144, 1.25244, 0.721315) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") - -[node name="GPUParticles3D" type="GPUParticles3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0) +[node name="GPUParticles3D" type="GPUParticles3D" parent="." index="5"] amount = 12 -visibility_aabb = AABB(-110.773, -4, -105.31, 221.547, 8, 210.62) -process_material = SubResource("ParticleProcessMaterial_2nhns") -draw_pass_1 = SubResource("BoxMesh_q83y7") +lifetime = 0.6 +process_material = SubResource("ParticleProcessMaterial_q1hpa") +draw_pass_1 = SubResource("BoxMesh_fr4f1") diff --git a/PCs/Universal/ClassCards/Reactor/tower_stats.tres b/PCs/Universal/ClassCards/Reactor/tower_stats.tres new file mode 100644 index 0000000..44376d4 --- /dev/null +++ b/PCs/Universal/ClassCards/Reactor/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://cssdyxk8oefsd"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_ppnfm"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_5jdx5"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_ppnfm") +key = "Fire Delay" +value = 2.0 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_ppnfm") +key = "Damage" +value = 0.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_ppnfm") +key = "Range" +value = 30.0 + +[resource] +script = ExtResource("2_5jdx5") +target_type = 1 +attributes = Array[ExtResource("1_ppnfm")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Slowly applies Radioactive to enemies around itself at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/Reactor/weapon_reactor.gd b/PCs/Universal/ClassCards/Reactor/weapon_reactor.gd new file mode 100644 index 0000000..fccac20 --- /dev/null +++ b/PCs/Universal/ClassCards/Reactor/weapon_reactor.gd @@ -0,0 +1,7 @@ +extends ShapecastWeapon +class_name ReactorWeapon + +func build_status_object() -> StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn b/PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn index 0dc1737..b36d5ff 100644 --- a/PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn +++ b/PCs/Universal/ClassCards/Reactor/weapon_reactor.tscn @@ -1,99 +1,31 @@ -[gd_scene load_steps=14 format=3 uid="uid://cpe3b700kwj48"] +[gd_scene load_steps=10 format=3 uid="uid://yymj42pp6v1t"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_lmai4"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Reactor/reactorweapon.gd" id="2_mpd2q"] -[ext_resource type="Resource" uid="uid://dxlisoas4xlmo" path="res://Resources/StatusEffects/radioactive.tres" id="3_x464r"] -[ext_resource type="Resource" uid="uid://b5eakeawu3gle" path="res://Resources/WeaponStats/reactor.tres" id="4_lclha"] +[ext_resource type="PackedScene" uid="uid://dp4gfr5h0tbcd" path="res://Scenes/Weapons/shapecast_weapon.tscn" id="1_du35a"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Reactor/weapon_reactor.gd" id="2_oe7hd"] +[ext_resource type="Resource" uid="uid://dxlisoas4xlmo" path="res://Resources/StatusEffects/radioactive.tres" id="3_hsfwd"] +[ext_resource type="Resource" uid="uid://ipfr7emuarbj" path="res://PCs/Universal/ClassCards/Reactor/weapon_stats.tres" id="4_83mkk"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="5_bawfy"] +[ext_resource type="Material" uid="uid://bjab6t4n0s5ac" path="res://PCs/Universal/ClassCards/Reactor/radiation_particles.tres" id="6_0sgt1"] -[sub_resource type="Animation" id="Animation_n8b32"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Rect2(0, 0, 64, 64)] -} +[sub_resource type="AtlasTexture" id="AtlasTexture_0dpt5"] +atlas = ExtResource("5_bawfy") +region = Rect2(0, 0, 64, 64) -[sub_resource type="Animation" id="Animation_g0h8q"] -resource_name = "shoot" -length = 0.15 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.15), -"transitions": PackedFloat32Array(0, 0), -"update": 0, -"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[sub_resource type="BoxShape3D" id="BoxShape3D_q7gll"] -size = Vector3(3, 3, 4) - -[sub_resource type="Gradient" id="Gradient_kkqms"] -colors = PackedColorArray(0.376471, 0.976471, 0, 0.435294, 0.127613, 0.391512, 0, 0.870588) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_gpquw"] -gradient = SubResource("Gradient_kkqms") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_cp5dw"] -direction = Vector3(0, 1, 0) -spread = 20.0 -gravity = Vector3(0, 0, 0) -initial_velocity_min = 5.0 -initial_velocity_max = 5.0 -damping_min = 1.9 -damping_max = 1.9 -color_ramp = SubResource("GradientTexture1D_gpquw") - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2yd7w"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_l4nsh"] transparency = 1 vertex_color_use_as_albedo = true -[sub_resource type="BoxMesh" id="BoxMesh_ggcx2"] -material = SubResource("StandardMaterial3D_2yd7w") -size = Vector3(0.3, 0.3, 0.3) +[sub_resource type="BoxMesh" id="BoxMesh_5o1ws"] +material = SubResource("StandardMaterial3D_l4nsh") -[node name="Weapon" type="Sprite3D" node_paths=PackedStringArray("shapecast", "particlesystem")] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_lmai4") -script = ExtResource("2_mpd2q") -shapecast = NodePath("ShapeCast3D") -particlesystem = NodePath("GPUParticles3D") -status_stats = ExtResource("3_x464r") -stats = ExtResource("4_lclha") +[node name="ReactorWeapon" instance=ExtResource("1_du35a")] +script = ExtResource("2_oe7hd") +status_stats = ExtResource("3_hsfwd") +stats = ExtResource("4_83mkk") -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_0dpt5") -[node name="ShapeCast3D" type="ShapeCast3D" parent="."] -transform = Transform3D(0.975695, 0, 0.219131, 0, 1, 0, -0.219131, 0, 0.975695, 0, 0, 0) -shape = SubResource("BoxShape3D_q7gll") -target_position = Vector3(0, 0, -2) -collision_mask = 4 - -[node name="GPUParticles3D" type="GPUParticles3D" parent="."] -transform = Transform3D(0.975695, -0.219131, -9.57852e-09, 0, -4.37114e-08, 1, -0.219131, -0.975695, -4.2649e-08, 0, 0, 0) -amount = 32 -visibility_aabb = AABB(-2.2922, -3.14731, -1.92995, 4.5844, 6.29461, 3.85991) -process_material = SubResource("ParticleProcessMaterial_cp5dw") -draw_pass_1 = SubResource("BoxMesh_ggcx2") +[node name="GPUParticles3D" parent="ShapeCast3D" index="0"] +process_material = ExtResource("6_0sgt1") +draw_pass_1 = SubResource("BoxMesh_5o1ws") diff --git a/PCs/Universal/ClassCards/Reactor/weapon_stats.tres b/PCs/Universal/ClassCards/Reactor/weapon_stats.tres new file mode 100644 index 0000000..fb5dd45 --- /dev/null +++ b/PCs/Universal/ClassCards/Reactor/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://ipfr7emuarbj"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_biwk3"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_62mnm"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_biwk3") +key = "Fire Delay" +value = 0.5 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_biwk3") +key = "Damage" +value = 1.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_biwk3") +key = "Range" +value = 3.0 + +[resource] +script = ExtResource("2_62mnm") +target_type = 0 +attributes = Array[ExtResource("1_biwk3")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Hold to apply Radioactive to enemies in front of you" diff --git a/PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres b/PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres deleted file mode 100644 index 4b683b4..0000000 --- a/PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres +++ /dev/null @@ -1,19 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://dmd5730tvyp6a"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_yreyk"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_fgsd3"] -[ext_resource type="Resource" uid="uid://ugpxwdjfvssu" path="res://Resources/TurretStats/refridgerator.tres" id="3_b48s2"] -[ext_resource type="PackedScene" uid="uid://bxjyrqs8bvi41" path="res://PCs/Universal/ClassCards/Refridgerator/tower_refridgerator.tscn" id="4_t5vm7"] -[ext_resource type="PackedScene" uid="uid://b1457hrmd4xm7" path="res://PCs/Universal/ClassCards/Refridgerator/weapon_refridgerator.tscn" id="5_axlkp"] -[ext_resource type="Resource" uid="uid://cpyrdja71sboe" path="res://Resources/WeaponStats/refridgerator.tres" id="5_xe410"] - -[resource] -script = ExtResource("1_yreyk") -title = "Refridgerator" -rarity = 1 -faction = 0 -sprite = ExtResource("2_fgsd3") -turret = ExtResource("4_t5vm7") -weapon = ExtResource("5_axlkp") -weapon_stats = ExtResource("5_xe410") -tower_stats = ExtResource("3_b48s2") diff --git a/PCs/Universal/ClassCards/Refridgerator/fridgetower.gd b/PCs/Universal/ClassCards/Refridgerator/fridgetower.gd deleted file mode 100644 index c9b1adf..0000000 --- a/PCs/Universal/ClassCards/Refridgerator/fridgetower.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends Tower -class_name RefridgeratorTower - -@export var status_stats : StatusStats -@export var particlesystem : GPUParticles3D - - -func aim(): - pass - - -func shoot(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= stats.fire_range: - var status = StatusCold.new() - status.stats = status_stats - enemy.status_manager.add_effect(status) diff --git a/PCs/Universal/ClassCards/Refridgerator/refridgeratorweapon.gd b/PCs/Universal/ClassCards/Refridgerator/refridgeratorweapon.gd deleted file mode 100644 index c6518cb..0000000 --- a/PCs/Universal/ClassCards/Refridgerator/refridgeratorweapon.gd +++ /dev/null @@ -1,30 +0,0 @@ -extends Weapon - -@export var shapecast : ShapeCast3D -@export var particlesystem : GPUParticles3D -@export var status_stats : StatusStats - - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - - -func set_raycast_origin(_node): - pass - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - particlesystem.emitting = true - $AnimationPlayer.play("shoot") - for index in shapecast.get_collision_count(): - var target = shapecast.get_collider(index) as CharacterBody3D - var status = StatusCold.new() - status.stats = status_stats - target.status_manager.add_effect(status) - - -func release_trigger(): - trigger_held = false - particlesystem.emitting = false diff --git a/PCs/Universal/ClassCards/Refridgerator/tower_refridgerator.tscn b/PCs/Universal/ClassCards/Refridgerator/tower_refridgerator.tscn deleted file mode 100644 index 5e81737..0000000 --- a/PCs/Universal/ClassCards/Refridgerator/tower_refridgerator.tscn +++ /dev/null @@ -1,76 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://bxjyrqs8bvi41"] - -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Refridgerator/fridgetower.gd" id="1_wo1ar"] -[ext_resource type="Resource" uid="uid://fed6kimfbcwv" path="res://Resources/StatusEffects/cold.tres" id="2_ccxwb"] -[ext_resource type="Resource" uid="uid://ugpxwdjfvssu" path="res://Resources/TurretStats/refridgerator.tres" id="3_hmanw"] - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_imgrm"] -transparency = 1 -cull_mode = 2 -shading_mode = 0 -albedo_color = Color(0.686275, 0, 0, 0.278431) - -[sub_resource type="Gradient" id="Gradient_kkqms"] -offsets = PackedFloat32Array(0, 0.512195, 1) -colors = PackedColorArray(1, 1, 1, 1, 0.189479, 0.632903, 0.66198, 0.818269, 0.12549, 0.603922, 0.635294, 0.803922) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_4cwgw"] -gradient = SubResource("Gradient_kkqms") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_2nhns"] -spread = 180.0 -flatness = 1.0 -gravity = Vector3(0, -3, 0) -initial_velocity_min = 7.0 -initial_velocity_max = 7.0 -tangential_accel_min = 5.0 -tangential_accel_max = 13.48 -damping_min = 8.0 -damping_max = 8.0 -color_ramp = SubResource("GradientTexture1D_4cwgw") - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ycjd1"] -transparency = 1 -vertex_color_use_as_albedo = true - -[sub_resource type="BoxMesh" id="BoxMesh_q83y7"] -material = SubResource("StandardMaterial3D_ycjd1") -size = Vector3(0.3, 0.3, 0.3) - -[node name="Node3D" type="Node3D" node_paths=PackedStringArray("particlesystem", "model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_wo1ar") -status_stats = ExtResource("2_ccxwb") -particlesystem = NodePath("Model/GPUParticles3D") -stats = ExtResource("3_hmanw") -model = NodePath("Model") -range_sphere = NodePath("Model/CSGSphere3D") -minimap_range_sphere = NodePath("Model/CSGSphere3D2") - -[node name="Model" type="Node3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) - -[node name="CSGBox3D" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.968366, 0) -size = Vector3(1, 1.25244, 1) - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.991506, 0) -size = Vector3(1.25687, 0.204013, 1.29481) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_imgrm") - -[node name="GPUParticles3D" type="GPUParticles3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.984682, 0) -amount = 48 -visibility_aabb = AABB(-7.20412, -4, -6.98341, 14.4082, 8, 13.9668) -process_material = SubResource("ParticleProcessMaterial_2nhns") -draw_pass_1 = SubResource("BoxMesh_q83y7") diff --git a/PCs/Universal/ClassCards/Refridgerator/weapon_refridgerator.tscn b/PCs/Universal/ClassCards/Refridgerator/weapon_refridgerator.tscn deleted file mode 100644 index eca25b0..0000000 --- a/PCs/Universal/ClassCards/Refridgerator/weapon_refridgerator.tscn +++ /dev/null @@ -1,100 +0,0 @@ -[gd_scene load_steps=14 format=3 uid="uid://b1457hrmd4xm7"] - -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_edx8q"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Refridgerator/refridgeratorweapon.gd" id="2_uadfd"] -[ext_resource type="Resource" uid="uid://fed6kimfbcwv" path="res://Resources/StatusEffects/cold.tres" id="3_saiop"] -[ext_resource type="Resource" uid="uid://cpyrdja71sboe" path="res://Resources/WeaponStats/refridgerator.tres" id="4_f60ka"] - -[sub_resource type="Animation" id="Animation_n8b32"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Rect2(0, 0, 64, 64)] -} - -[sub_resource type="Animation" id="Animation_g0h8q"] -resource_name = "shoot" -length = 0.15 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture:region") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.15), -"transitions": PackedFloat32Array(0, 0), -"update": 0, -"values": [Rect2(64, 0, 64, 64), Rect2(0, 0, 64, 64)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[sub_resource type="BoxShape3D" id="BoxShape3D_q7gll"] -size = Vector3(3, 3, 4) - -[sub_resource type="Gradient" id="Gradient_kkqms"] -offsets = PackedFloat32Array(0, 0.512195, 1) -colors = PackedColorArray(1, 1, 1, 1, 0.189479, 0.632903, 0.66198, 0.818269, 0.12549, 0.603922, 0.635294, 0.803922) - -[sub_resource type="GradientTexture1D" id="GradientTexture1D_gpquw"] -gradient = SubResource("Gradient_kkqms") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_cp5dw"] -direction = Vector3(0, 1, 0) -spread = 20.0 -gravity = Vector3(0, 0, 0) -initial_velocity_min = 5.0 -initial_velocity_max = 5.0 -damping_min = 1.9 -damping_max = 1.9 -color_ramp = SubResource("GradientTexture1D_gpquw") - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2yd7w"] -transparency = 1 -vertex_color_use_as_albedo = true - -[sub_resource type="BoxMesh" id="BoxMesh_ggcx2"] -material = SubResource("StandardMaterial3D_2yd7w") -size = Vector3(0.3, 0.3, 0.3) - -[node name="Weapon" type="Sprite3D" node_paths=PackedStringArray("shapecast", "particlesystem")] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_edx8q") -script = ExtResource("2_uadfd") -shapecast = NodePath("ShapeCast3D") -particlesystem = NodePath("GPUParticles3D") -status_stats = ExtResource("3_saiop") -stats = ExtResource("4_f60ka") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="ShapeCast3D" type="ShapeCast3D" parent="."] -transform = Transform3D(0.975695, 0, 0.219131, 0, 1, 0, -0.219131, 0, 0.975695, 0, 0, 0) -shape = SubResource("BoxShape3D_q7gll") -target_position = Vector3(0, 0, -2) -collision_mask = 4 - -[node name="GPUParticles3D" type="GPUParticles3D" parent="."] -transform = Transform3D(0.975695, -0.219131, -9.57852e-09, 0, -4.37114e-08, 1, -0.219131, -0.975695, -4.2649e-08, 0, 0, 0) -amount = 32 -visibility_aabb = AABB(-2.2922, -3.14731, -1.92995, 4.5844, 6.29461, 3.85991) -process_material = SubResource("ParticleProcessMaterial_cp5dw") -draw_pass_1 = SubResource("BoxMesh_ggcx2") diff --git a/PCs/Universal/ClassCards/Refrigerator/card_refrigerator.tres b/PCs/Universal/ClassCards/Refrigerator/card_refrigerator.tres new file mode 100644 index 0000000..d88de8a --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/card_refrigerator.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://ds8qx4ggmqetk"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_84afc"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="2_kdslp"] +[ext_resource type="Resource" uid="uid://st0qrut5nxrm" path="res://PCs/Universal/ClassCards/Refrigerator/tower_stats.tres" id="3_bihii"] +[ext_resource type="PackedScene" uid="uid://b0vi11kj3lxng" path="res://PCs/Universal/ClassCards/Refrigerator/weapon_refrigerator.tscn" id="4_0oufq"] +[ext_resource type="PackedScene" uid="uid://bqaynyhxdr4to" path="res://PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.tscn" id="4_7x6qx"] +[ext_resource type="Resource" uid="uid://5l758yxfpi1e" path="res://PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres" id="5_dqmyh"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_fuxlt"] +atlas = ExtResource("2_kdslp") +region = Rect2(0, 0, 64, 64) + +[resource] +script = ExtResource("1_84afc") +title = "Refrigerator" +rarity = 1 +faction = 0 +sprite = SubResource("AtlasTexture_fuxlt") +turret_scene = ExtResource("4_7x6qx") +weapon_scene = ExtResource("4_0oufq") +weapon_stats = ExtResource("5_dqmyh") +tower_stats = ExtResource("3_bihii") diff --git a/PCs/Universal/ClassCards/Refrigerator/cold_particles.tres b/PCs/Universal/ClassCards/Refrigerator/cold_particles.tres new file mode 100644 index 0000000..62d4e31 --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/cold_particles.tres @@ -0,0 +1,19 @@ +[gd_resource type="ParticleProcessMaterial" load_steps=3 format=3 uid="uid://ckung57mij7ue"] + +[sub_resource type="Gradient" id="Gradient_eiw3y"] +interpolation_color_space = 2 +offsets = PackedFloat32Array(0, 0.325203, 1) +colors = PackedColorArray(0.827004, 0.826193, 0.823983, 1, 0.338333, 0.810555, 0.85349, 1, 0.0352941, 0.803922, 0.858824, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_arw7j"] +gradient = SubResource("Gradient_eiw3y") + +[resource] +direction = Vector3(0, 0, -1) +spread = 15.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 3.0 +initial_velocity_max = 3.0 +scale_min = 0.3 +scale_max = 0.3 +color_ramp = SubResource("GradientTexture1D_arw7j") diff --git a/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.gd b/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.gd new file mode 100644 index 0000000..c9e798e --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.gd @@ -0,0 +1,15 @@ +extends RangeAffectingTower +class_name RefrigeratorTower + +@export var particles : GPUParticles3D + + +func _ready() -> void: + super._ready() + particles.process_material.emission_ring_radius = target_range + + +func build_status_object() -> StatusEffect: + var status = StatusSlow.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.tscn b/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.tscn new file mode 100644 index 0000000..663ad9a --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=10 format=3 uid="uid://bqaynyhxdr4to"] + +[ext_resource type="PackedScene" uid="uid://bi6b2r6wek7he" path="res://Scenes/Towers/range_affecting_tower.tscn" id="1_4hvoi"] +[ext_resource type="Resource" uid="uid://fed6kimfbcwv" path="res://Resources/StatusEffects/cold.tres" id="2_u4dux"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Refrigerator/tower_refrigerator.gd" id="2_yhcmv"] +[ext_resource type="Resource" uid="uid://st0qrut5nxrm" path="res://PCs/Universal/ClassCards/Refrigerator/tower_stats.tres" id="3_jjh3a"] + +[sub_resource type="Gradient" id="Gradient_lm6vx"] +offsets = PackedFloat32Array(0, 0.682927, 1) +colors = PackedColorArray(0, 1, 1, 1, 0.430894, 1, 1, 1, 1, 1, 1, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_wv576"] +gradient = SubResource("Gradient_lm6vx") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ijefe"] +spread = 180.0 +flatness = 1.0 +gravity = Vector3(0, -8, 0) +initial_velocity_min = 7.0 +initial_velocity_max = 7.0 +tangential_accel_min = 6.0 +tangential_accel_max = 6.0 +damping_min = 10.0 +damping_max = 10.0 +color_ramp = SubResource("GradientTexture1D_wv576") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_niq28"] +vertex_color_use_as_albedo = true + +[sub_resource type="BoxMesh" id="BoxMesh_btdsr"] +material = SubResource("StandardMaterial3D_niq28") +size = Vector3(0.3, 0.3, 0.3) + +[node name="RefrigeratorTower" node_paths=PackedStringArray("particles") instance=ExtResource("1_4hvoi")] +script = ExtResource("2_yhcmv") +particles = NodePath("GPUParticles3D") +status_stats = ExtResource("2_u4dux") +stats = ExtResource("3_jjh3a") + +[node name="GPUParticles3D" type="GPUParticles3D" parent="." index="5"] +amount = 32 +process_material = SubResource("ParticleProcessMaterial_ijefe") +draw_pass_1 = SubResource("BoxMesh_btdsr") diff --git a/PCs/Universal/ClassCards/Refrigerator/tower_stats.tres b/PCs/Universal/ClassCards/Refrigerator/tower_stats.tres new file mode 100644 index 0000000..2c9efe0 --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://st0qrut5nxrm"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_ti2i3"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_e8yt2"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_ti2i3") +key = "Fire Delay" +value = 1.0 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_ti2i3") +key = "Damage" +value = 0.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_ti2i3") +key = "Range" +value = 3.0 + +[resource] +script = ExtResource("2_e8yt2") +target_type = 1 +attributes = Array[ExtResource("1_ti2i3")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Applies Cold to enemies around itself" diff --git a/PCs/Universal/ClassCards/Refrigerator/weapon_refrigerator.tscn b/PCs/Universal/ClassCards/Refrigerator/weapon_refrigerator.tscn new file mode 100644 index 0000000..d86664d --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/weapon_refrigerator.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=7 format=3 uid="uid://b0vi11kj3lxng"] + +[ext_resource type="PackedScene" uid="uid://dp4gfr5h0tbcd" path="res://Scenes/Weapons/shapecast_weapon.tscn" id="1_g3e4a"] +[ext_resource type="Resource" uid="uid://fed6kimfbcwv" path="res://Resources/StatusEffects/cold.tres" id="2_pranv"] +[ext_resource type="Resource" uid="uid://5l758yxfpi1e" path="res://PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres" id="3_ihljm"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="4_y5ps0"] +[ext_resource type="Material" uid="uid://ckung57mij7ue" path="res://PCs/Universal/ClassCards/Refrigerator/cold_particles.tres" id="5_8q1lc"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_0yua2"] +atlas = ExtResource("4_y5ps0") +region = Rect2(0, 0, 64, 64) + +[node name="RefrigeratorWeapon" instance=ExtResource("1_g3e4a")] +status_stats = ExtResource("2_pranv") +stats = ExtResource("3_ihljm") + +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_0yua2") + +[node name="GPUParticles3D" parent="ShapeCast3D" index="0"] +process_material = ExtResource("5_8q1lc") diff --git a/PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres b/PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres new file mode 100644 index 0000000..997cfa8 --- /dev/null +++ b/PCs/Universal/ClassCards/Refrigerator/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://5l758yxfpi1e"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_v7ces"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_1d5nm"] + +[sub_resource type="Resource" id="Resource_j28f4"] +script = ExtResource("1_v7ces") +key = "Fire Delay" +value = 0.5 + +[sub_resource type="Resource" id="Resource_likes"] +script = ExtResource("1_v7ces") +key = "Damage" +value = 1.0 + +[sub_resource type="Resource" id="Resource_b65mk"] +script = ExtResource("1_v7ces") +key = "Range" +value = 3.0 + +[resource] +script = ExtResource("2_1d5nm") +target_type = 0 +attributes = Array[ExtResource("1_v7ces")]([SubResource("Resource_j28f4"), SubResource("Resource_likes"), SubResource("Resource_b65mk")]) +text = "Hold to apply Cold to enemies in front of you" diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn b/PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn index 82ca005..d1d03e8 100644 --- a/PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn +++ b/PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn @@ -6,8 +6,6 @@ [node name="Rocket" instance=ExtResource("1_fnn4i")] script = ExtResource("2_86up0") -acceleration = 40.0 -max_speed = 14.0 [node name="Sprite3D" parent="." index="1"] pixel_size = 0.013 diff --git a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd index b399597..0dbda9e 100644 --- a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd +++ b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd @@ -66,6 +66,7 @@ func networked_spawn_rocket(target_node_path, peer_id): projectile.position = global_position projectile.damage = damage projectile.target = target + projectile.owner_id = peer_id projectile.name = str(peer_id) + str(projectile_id) get_tree().root.add_child(projectile) projectile.apply_central_impulse(Vector3.UP * 3.0) diff --git a/PCs/Universal/ClassCards/Sniper/weapon_stats.tres b/PCs/Universal/ClassCards/Sniper/weapon_stats.tres index a75e53d..f71622b 100644 --- a/PCs/Universal/ClassCards/Sniper/weapon_stats.tres +++ b/PCs/Universal/ClassCards/Sniper/weapon_stats.tres @@ -6,7 +6,7 @@ [sub_resource type="Resource" id="Resource_58kde"] script = ExtResource("1_7xbx2") key = "Fire Delay" -value = 1.2 +value = 0.9 [sub_resource type="Resource" id="Resource_jl4jv"] script = ExtResource("1_7xbx2") diff --git a/PCs/hero.gd b/PCs/hero.gd index d5eb983..0f9ba12 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -133,7 +133,7 @@ func _process(delta: float) -> void: movement.zoom_factor -= sprint_zoom_speed * delta if movement.zoom_factor <= 1.0 - movement.sprint_zoom_factor: movement.zoom_factor = 1.0 - movement.sprint_zoom_factor - camera.fov = Data.preferences.hfov * (1.0 / movement.zoom_factor) + camera.fov = Data.graphics.hfov * (1.0 / movement.zoom_factor) if Input.is_action_just_pressed("View Map"): hud.maximise_minimap(Game.level) diff --git a/PCs/hero.tscn b/PCs/hero.tscn index d74e57a..5553d30 100644 --- a/PCs/hero.tscn +++ b/PCs/hero.tscn @@ -22,7 +22,7 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jbu13"] -[sub_resource type="AtlasTexture" id="AtlasTexture_oyv4e"] +[sub_resource type="AtlasTexture" id="AtlasTexture_kr8sn"] resource_local_to_scene = true atlas = ExtResource("6_yyp8i") region = Rect2(0, 0, 96, 96) @@ -103,7 +103,7 @@ collision_mask = 24 [node name="EightDirectionSprite" parent="." instance=ExtResource("2_ib0t5")] transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0.915529, 0) -texture = SubResource("AtlasTexture_oyv4e") +texture = SubResource("AtlasTexture_kr8sn") [node name="Inventory" type="Node" parent="."] script = ExtResource("6_cf5ap") diff --git a/Scenes/Menus/audio_options.tscn b/Scenes/Menus/audio_options.tscn new file mode 100644 index 0000000..c867dbd --- /dev/null +++ b/Scenes/Menus/audio_options.tscn @@ -0,0 +1,4 @@ +[gd_scene format=3 uid="uid://bwc45ogto8thn"] + +[node name="Audio" type="VBoxContainer"] +visible = false diff --git a/Scenes/Menus/gameplay_options.tscn b/Scenes/Menus/gameplay_options.tscn new file mode 100644 index 0000000..fcb30b3 --- /dev/null +++ b/Scenes/Menus/gameplay_options.tscn @@ -0,0 +1,167 @@ +[gd_scene load_steps=3 format=3 uid="uid://bjk7jf0bau5lv"] + +[ext_resource type="Script" path="res://Scripts/gameplay_options.gd" id="1_sy26f"] + +[sub_resource type="ImageTexture" id="ImageTexture_03x6q"] + +[node name="Gameplay" type="VBoxContainer" node_paths=PackedStringArray("look_sens_slider", "look_sens_input", "toggle_sprint_checkbox", "invert_lookY", "invert_lookX", "fixed_minimap", "tower_damage", "self_damage", "party_damage", "status_damage")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_sy26f") +look_sens_slider = NodePath("MouseSens/HBoxContainer/HSlider") +look_sens_input = NodePath("MouseSens/HBoxContainer/SpinBox") +toggle_sprint_checkbox = NodePath("ToggleSprint/CenterContainer/CheckButton") +invert_lookY = NodePath("InvertMouseY/CenterContainer/CheckButton") +invert_lookX = NodePath("InvertMouseX/CenterContainer/CheckButton") +fixed_minimap = NodePath("FixedMinimap/CenterContainer/CheckButton") +tower_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/TowerDamage") +self_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/SelfDamage") +party_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/PartyDamage") +status_damage = NodePath("FloatingDamageIndicators/CenterContainer/HBoxContainer/StatusDamage") + +[node name="MouseSens" type="HBoxContainer" parent="."] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="MouseSens"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Look Sensitivity" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MouseSens"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="SpinBox" type="SpinBox" parent="MouseSens/HBoxContainer"] +layout_mode = 2 +theme_override_icons/updown = SubResource("ImageTexture_03x6q") +step = 0.01 +alignment = 1 +update_on_text_changed = true + +[node name="HSlider" type="HSlider" parent="MouseSens/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +step = 0.01 +scrollable = false + +[node name="ToggleSprint" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="ToggleSprint"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Toggle Sprint" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="ToggleSprint"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="ToggleSprint/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InvertMouseY" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="InvertMouseY"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Invert Look Y" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="InvertMouseY"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="InvertMouseY/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InvertMouseX" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="InvertMouseX"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Invert Look X" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="InvertMouseX"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="InvertMouseX/CenterContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="FixedMinimap" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="FixedMinimap"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Fixed Minimap" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="FixedMinimap"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CheckButton" type="CheckButton" parent="FixedMinimap/CenterContainer"] +layout_mode = 2 + +[node name="FloatingDamageIndicators" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="FloatingDamageIndicators"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Floating Damage Indicators" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CenterContainer" type="CenterContainer" parent="FloatingDamageIndicators"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="FloatingDamageIndicators/CenterContainer"] +layout_mode = 2 + +[node name="TowerDamage" type="Button" parent="FloatingDamageIndicators/CenterContainer/HBoxContainer"] +layout_mode = 2 +toggle_mode = true +button_pressed = true +text = "Tower Damage" + +[node name="SelfDamage" type="Button" parent="FloatingDamageIndicators/CenterContainer/HBoxContainer"] +layout_mode = 2 +toggle_mode = true +button_pressed = true +text = "Self Damage" + +[node name="PartyDamage" type="Button" parent="FloatingDamageIndicators/CenterContainer/HBoxContainer"] +layout_mode = 2 +toggle_mode = true +button_pressed = true +text = "Party Damage" + +[node name="StatusDamage" type="Button" parent="FloatingDamageIndicators/CenterContainer/HBoxContainer"] +layout_mode = 2 +toggle_mode = true +button_pressed = true +text = "Status Effect Damage" + +[connection signal="value_changed" from="MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"] +[connection signal="value_changed" from="MouseSens/HBoxContainer/HSlider" to="." method="_on_mouse_sens_h_slider_value_changed"] diff --git a/Scenes/Menus/graphics_options.tscn b/Scenes/Menus/graphics_options.tscn new file mode 100644 index 0000000..1c8f776 --- /dev/null +++ b/Scenes/Menus/graphics_options.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=3 format=3 uid="uid://bmd4mawasoc11"] + +[ext_resource type="Script" path="res://Scripts/graphics_options.gd" id="1_85rh6"] + +[sub_resource type="ImageTexture" id="ImageTexture_03x6q"] + +[node name="Graphics" type="VBoxContainer" node_paths=PackedStringArray("fov_input", "fov_slider", "vsync_dropdown", "aa_dropdown", "window_dropdown")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_85rh6") +fov_input = NodePath("FOV/HBoxContainer/SpinBox") +fov_slider = NodePath("FOV/HBoxContainer/HSlider") +vsync_dropdown = NodePath("VSync/OptionButton") +aa_dropdown = NodePath("AntiAliasing/OptionButton") +window_dropdown = NodePath("Windowed/OptionButton") + +[node name="FOV" type="HBoxContainer" parent="."] +layout_mode = 2 +alignment = 1 + +[node name="Label" type="Label" parent="FOV"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Field Of View" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="FOV"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="SpinBox" type="SpinBox" parent="FOV/HBoxContainer"] +layout_mode = 2 +theme_override_icons/updown = SubResource("ImageTexture_03x6q") +min_value = 40.0 +max_value = 160.0 +value = 100.0 +allow_greater = true +allow_lesser = true +alignment = 1 +update_on_text_changed = true + +[node name="HSlider" type="HSlider" parent="FOV/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +min_value = 40.0 +max_value = 160.0 +value = 100.0 +scrollable = false + +[node name="VSync" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="VSync"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "V-Sync" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="VSync"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 4 +selected = 1 +popup/item_0/text = "Off" +popup/item_0/id = 0 +popup/item_1/text = "On" +popup/item_1/id = 1 +popup/item_2/text = "Adaptive" +popup/item_2/id = 2 +popup/item_3/text = "Triple Buffered" +popup/item_3/id = 3 + +[node name="AntiAliasing" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="AntiAliasing"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Anti-Aliasing +" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="AntiAliasing"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 3 +selected = 0 +popup/item_0/text = "Off" +popup/item_0/id = 0 +popup/item_1/text = "FXAA" +popup/item_1/id = 1 +popup/item_2/text = "TAA" +popup/item_2/id = 2 + +[node name="Windowed" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="Windowed"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Window Mode" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="OptionButton" type="OptionButton" parent="Windowed"] +layout_mode = 2 +size_flags_horizontal = 3 +item_count = 3 +selected = 0 +popup/item_0/text = "Windowed" +popup/item_0/id = 0 +popup/item_1/text = "Borderless Windowed" +popup/item_1/id = 1 +popup/item_2/text = "Fullscreen" +popup/item_2/id = 2 + +[connection signal="value_changed" from="FOV/HBoxContainer/SpinBox" to="." method="_on_fov_spin_box_value_changed"] +[connection signal="value_changed" from="FOV/HBoxContainer/HSlider" to="." method="_on_fov_h_slider_value_changed"] diff --git a/Scenes/Menus/keybind_options.tscn b/Scenes/Menus/keybind_options.tscn new file mode 100644 index 0000000..f7af891 --- /dev/null +++ b/Scenes/Menus/keybind_options.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=3 uid="uid://bf2nosqt5f82e"] + +[ext_resource type="Script" path="res://Scripts/keybind_options.gd" id="1_oxg0p"] + +[node name="Keybinds" type="VBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_oxg0p") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 diff --git a/Scenes/Menus/multiplayer_lobby.tscn b/Scenes/Menus/multiplayer_lobby.tscn index 2f74cc8..523fd1c 100644 --- a/Scenes/Menus/multiplayer_lobby.tscn +++ b/Scenes/Menus/multiplayer_lobby.tscn @@ -64,7 +64,6 @@ text = "Ready" [node name="Chatbox" parent="." instance=ExtResource("6_wtqwd")] layout_mode = 1 -offset_bottom = -507.0 [connection signal="player_connected" from="." to="Scoreboard" method="add_player"] [connection signal="player_disconnected" from="." to="Scoreboard" method="remove_player"] diff --git a/Scenes/Menus/options_menu.tscn b/Scenes/Menus/options_menu.tscn index 0ea02ed..3977bd7 100644 --- a/Scenes/Menus/options_menu.tscn +++ b/Scenes/Menus/options_menu.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=4 format=3 uid="uid://clulh7v8c7h85"] +[gd_scene load_steps=6 format=3 uid="uid://clulh7v8c7h85"] [ext_resource type="Script" path="res://Scripts/options_menu.gd" id="1_bievw"] -[ext_resource type="PackedScene" uid="uid://clsdko6ttudu8" path="res://Scenes/UI/keybind_popup.tscn" id="2_bq25i"] +[ext_resource type="PackedScene" uid="uid://bjk7jf0bau5lv" path="res://Scenes/Menus/gameplay_options.tscn" id="3_25wuw"] +[ext_resource type="PackedScene" uid="uid://bmd4mawasoc11" path="res://Scenes/Menus/graphics_options.tscn" id="4_ckcvq"] +[ext_resource type="PackedScene" uid="uid://bf2nosqt5f82e" path="res://Scenes/Menus/keybind_options.tscn" id="5_4k33c"] +[ext_resource type="PackedScene" uid="uid://bwc45ogto8thn" path="res://Scenes/Menus/audio_options.tscn" id="6_4vs8p"] -[sub_resource type="ImageTexture" id="ImageTexture_03x6q"] - -[node name="OptionsMenu" type="PanelContainer" node_paths=PackedStringArray("look_sens_slider", "look_sens_input", "toggle_sprint_checkbox", "vsync_dropdown", "aa_dropdown", "window_dropdown", "invert_lookY", "invert_lookX", "fov_input", "fov_slider", "fixed_minimap", "tower_damage", "self_damage", "party_damage")] +[node name="OptionsMenu" type="PanelContainer"] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -16,21 +17,6 @@ offset_bottom = -30.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_bievw") -keybind_popup = ExtResource("2_bq25i") -look_sens_slider = NodePath("VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/HSlider") -look_sens_input = NodePath("VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/SpinBox") -toggle_sprint_checkbox = NodePath("VBoxContainer/TabContainer/Gameplay/ToggleSprint/CenterContainer/CheckButton") -vsync_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/VSync/OptionButton") -aa_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/AntiAliasing/OptionButton") -window_dropdown = NodePath("VBoxContainer/TabContainer/Graphics/Windowed/OptionButton") -invert_lookY = NodePath("VBoxContainer/TabContainer/Gameplay/InvertMouseY/CenterContainer/CheckButton") -invert_lookX = NodePath("VBoxContainer/TabContainer/Gameplay/InvertMouseX/CenterContainer/CheckButton") -fov_input = NodePath("VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/SpinBox") -fov_slider = NodePath("VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/HSlider") -fixed_minimap = NodePath("VBoxContainer/TabContainer/Gameplay/FixedMinimap/CenterContainer/CheckButton") -tower_damage = NodePath("VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer/Button") -self_damage = NodePath("VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer/Button2") -party_damage = NodePath("VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer/Button3") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 2 @@ -39,275 +25,18 @@ layout_mode = 2 layout_mode = 2 size_flags_vertical = 3 -[node name="Gameplay" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +[node name="Gameplay" parent="VBoxContainer/TabContainer" instance=ExtResource("3_25wuw")] layout_mode = 2 -[node name="MouseSens" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 -alignment = 1 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/MouseSens"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Look Sensitivity" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay/MouseSens"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer"] -layout_mode = 2 -theme_override_icons/updown = SubResource("ImageTexture_03x6q") -step = 0.01 -alignment = 1 -update_on_text_changed = true - -[node name="HSlider" type="HSlider" parent="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 1 -step = 0.01 -scrollable = false - -[node name="ToggleSprint" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Toggle Sprint" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/ToggleSprint/CenterContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="InvertMouseY" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Invert Look Y" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseY/CenterContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="InvertMouseX" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Invert Look X" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/InvertMouseX/CenterContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="FixedMinimap" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/FixedMinimap"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Fixed Minimap" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/FixedMinimap"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="CheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Gameplay/FixedMinimap/CenterContainer"] -layout_mode = 2 - -[node name="FloatingDamageIndicators" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Floating Damage Indicators" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer"] -layout_mode = 2 - -[node name="Button" type="Button" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer"] -layout_mode = 2 -toggle_mode = true -button_pressed = true -text = "Tower Damage" - -[node name="Button2" type="Button" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer"] -layout_mode = 2 -toggle_mode = true -button_pressed = true -text = "Self Damage" - -[node name="Button3" type="Button" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer"] -layout_mode = 2 -toggle_mode = true -button_pressed = true -text = "Party Damage" - -[node name="Button4" type="Button" parent="VBoxContainer/TabContainer/Gameplay/FloatingDamageIndicators/CenterContainer/HBoxContainer"] -layout_mode = 2 -toggle_mode = true -button_pressed = true -text = "Status Effect Damage" - -[node name="Graphics" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +[node name="Graphics" parent="VBoxContainer/TabContainer" instance=ExtResource("4_ckcvq")] visible = false layout_mode = 2 -[node name="FOV" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] -layout_mode = 2 -alignment = 1 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/FOV"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Field Of View" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics/FOV"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer"] -layout_mode = 2 -theme_override_icons/updown = SubResource("ImageTexture_03x6q") -min_value = 40.0 -max_value = 160.0 -value = 100.0 -allow_greater = true -allow_lesser = true -alignment = 1 -update_on_text_changed = true - -[node name="HSlider" type="HSlider" parent="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 1 -min_value = 40.0 -max_value = 160.0 -value = 100.0 -scrollable = false - -[node name="VSync" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/VSync"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "V-Sync" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/VSync"] -layout_mode = 2 -size_flags_horizontal = 3 -item_count = 4 -selected = 1 -popup/item_0/text = "Off" -popup/item_0/id = 0 -popup/item_1/text = "On" -popup/item_1/id = 1 -popup/item_2/text = "Adaptive" -popup/item_2/id = 2 -popup/item_3/text = "Triple Buffered" -popup/item_3/id = 3 - -[node name="AntiAliasing" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/AntiAliasing"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Anti-Aliasing -" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/AntiAliasing"] -layout_mode = 2 -size_flags_horizontal = 3 -item_count = 3 -selected = 0 -popup/item_0/text = "Off" -popup/item_0/id = 0 -popup/item_1/text = "FXAA" -popup/item_1/id = 1 -popup/item_2/text = "TAA" -popup/item_2/id = 2 - -[node name="Windowed" type="HBoxContainer" parent="VBoxContainer/TabContainer/Graphics"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Graphics/Windowed"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Window Mode" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="OptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Graphics/Windowed"] -layout_mode = 2 -size_flags_horizontal = 3 -item_count = 3 -selected = 0 -popup/item_0/text = "Windowed" -popup/item_0/id = 0 -popup/item_1/text = "Borderless Windowed" -popup/item_1/id = 1 -popup/item_2/text = "Fullscreen" -popup/item_2/id = 2 - -[node name="Keybinds" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +[node name="Keybinds" parent="VBoxContainer/TabContainer" instance=ExtResource("5_4k33c")] visible = false layout_mode = 2 -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Keybinds"] -layout_mode = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/TabContainer/Keybinds"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Keybinds/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Audio" type="VBoxContainer" parent="VBoxContainer/TabContainer"] -visible = false +[node name="Audio" parent="VBoxContainer/TabContainer" instance=ExtResource("6_4vs8p")] layout_mode = 2 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] @@ -322,11 +51,5 @@ text = "Discard" layout_mode = 2 text = "Confirm" -[connection signal="value_changed" from="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/SpinBox" to="." method="_on_mouse_sens_spin_box_value_changed"] -[connection signal="value_changed" from="VBoxContainer/TabContainer/Gameplay/MouseSens/HBoxContainer/HSlider" to="." method="_on_mouse_sens_h_slider_value_changed"] -[connection signal="value_changed" from="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/SpinBox" to="." method="_on_fov_spin_box_value_changed"] -[connection signal="value_changed" from="VBoxContainer/TabContainer/Graphics/FOV/HBoxContainer/HSlider" to="." method="_on_fov_h_slider_value_changed"] -[connection signal="item_selected" from="VBoxContainer/TabContainer/Graphics/VSync/OptionButton" to="." method="_on_vsync_option_button_item_selected"] -[connection signal="item_selected" from="VBoxContainer/TabContainer/Graphics/AntiAliasing/OptionButton" to="." method="_on_AA_option_button_item_selected"] [connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_pressed"] [connection signal="pressed" from="VBoxContainer/HBoxContainer/Confirm" to="." method="_on_confirm_pressed"] diff --git a/Scenes/Menus/singleplayer_lobby.tscn b/Scenes/Menus/singleplayer_lobby.tscn index a79f77e..c586e2f 100644 --- a/Scenes/Menus/singleplayer_lobby.tscn +++ b/Scenes/Menus/singleplayer_lobby.tscn @@ -54,9 +54,7 @@ grow_vertical = 2 text = "Ready" [node name="Chatbox" parent="." instance=ExtResource("3_l8xy3")] -visible = false layout_mode = 1 -offset_bottom = -507.0 [connection signal="pressed" from="ReadyButton" to="Scoreboard" method="set_player_ready_state" binds= [1, true]] [connection signal="pressed" from="ReadyButton" to="ReadyButton" method="set_visible" binds= [false]] diff --git a/Scenes/Towers/range_affecting_tower.tscn b/Scenes/Towers/range_affecting_tower.tscn new file mode 100644 index 0000000..3d00b32 --- /dev/null +++ b/Scenes/Towers/range_affecting_tower.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=3 format=3 uid="uid://bi6b2r6wek7he"] + +[ext_resource type="PackedScene" uid="uid://dxwtlvv632ae8" path="res://Scenes/Towers/status_applying_tower.tscn" id="1_x852w"] +[ext_resource type="Script" path="res://Scripts/Towers/range_affecting_tower.gd" id="2_wc1xf"] + +[node name="RangeAffectingTower" instance=ExtResource("1_x852w")] +script = ExtResource("2_wc1xf") diff --git a/Scenes/Towers/shapecast_tower.tscn b/Scenes/Towers/shapecast_tower.tscn new file mode 100644 index 0000000..65d0e27 --- /dev/null +++ b/Scenes/Towers/shapecast_tower.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://8uxu72vjo0cv"] + +[ext_resource type="PackedScene" uid="uid://bvqu1heobgboe" path="res://Scenes/Towers/tower.tscn" id="1_ljc02"] +[ext_resource type="Script" path="res://Scripts/Towers/shapecast_tower.gd" id="2_qh834"] + +[node name="ShapecastTower" node_paths=PackedStringArray("shapecast", "particlesystem") instance=ExtResource("1_ljc02")] +script = ExtResource("2_qh834") +shapecast = NodePath("Yaw/ShapeCast3D") +particlesystem = NodePath("Yaw/ShapeCast3D/GPUParticles3D") +status_stats = null + +[node name="ShapeCast3D" type="ShapeCast3D" parent="Yaw" index="0"] + +[node name="GPUParticles3D" type="GPUParticles3D" parent="Yaw/ShapeCast3D" index="0"] diff --git a/Scenes/UI/chatbox.tscn b/Scenes/UI/chatbox.tscn index a1b1ee7..dd7b1ab 100644 --- a/Scenes/UI/chatbox.tscn +++ b/Scenes/UI/chatbox.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=2 format=3 uid="uid://ddmg342ff2qaq"] +[gd_scene load_steps=3 format=3 uid="uid://ddmg342ff2qaq"] [ext_resource type="Script" path="res://Scripts/chatbox.gd" id="1_k3g22"] -[node name="Chatbox" type="Control"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c3kb6"] +bg_color = Color(0.223529, 0.211765, 0.184314, 0.462745) + +[node name="Chatbox" type="Control" node_paths=PackedStringArray("input_line", "textbox", "text_panel", "fade_timer")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -11,24 +14,32 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 script = ExtResource("1_k3g22") +input_line = NodePath("VBoxContainer/LineEdit") +textbox = NodePath("VBoxContainer/PanelContainer/RichTextLabel") +text_panel = NodePath("VBoxContainer/PanelContainer") +fade_timer = NodePath("Timer") [node name="VBoxContainer" type="VBoxContainer" parent="."] -layout_mode = 1 -anchors_preset = -1 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 15.0 -offset_top = -210.0 -offset_right = 350.0 -offset_bottom = -10.0 -grow_vertical = 0 +layout_mode = 2 +offset_left = 40.0 +offset_top = 100.0 +offset_right = 375.0 +offset_bottom = 300.0 mouse_filter = 2 alignment = 2 -[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer"] +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"] +modulate = Color(1, 1, 1, 0) +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_c3kb6") + +[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer/PanelContainer"] +modulate = Color(1, 1, 1, 0) layout_mode = 2 size_flags_vertical = 3 mouse_filter = 2 +bbcode_enabled = true scroll_following = true [node name="LineEdit" type="LineEdit" parent="VBoxContainer"] @@ -37,3 +48,8 @@ layout_mode = 2 mouse_filter = 2 context_menu_enabled = false selecting_enabled = false + +[node name="Timer" type="Timer" parent="."] +wait_time = 3.5 + +[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] diff --git a/Scenes/Weapons/shapecast_weapon.tscn b/Scenes/Weapons/shapecast_weapon.tscn new file mode 100644 index 0000000..2387863 --- /dev/null +++ b/Scenes/Weapons/shapecast_weapon.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=7 format=3 uid="uid://dp4gfr5h0tbcd"] + +[ext_resource type="PackedScene" uid="uid://b7nargdyg28fj" path="res://Scenes/Weapons/weapon.tscn" id="1_gfchc"] +[ext_resource type="Script" path="res://Scripts/Weapons/shapecast_weapon.gd" id="2_lg6v5"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_uk6ey"] +size = Vector3(2, 2, 3) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vi555"] +vertex_color_use_as_albedo = true + +[sub_resource type="BoxMesh" id="BoxMesh_o37rs"] +material = SubResource("StandardMaterial3D_vi555") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_sgbeo"] +transparency = 1 +cull_mode = 1 +shading_mode = 0 +albedo_color = Color(1, 0, 0.415686, 0.223529) + +[node name="ShapecastWeapon" node_paths=PackedStringArray("shapecast", "range_debug_indicator", "particles") instance=ExtResource("1_gfchc")] +script = ExtResource("2_lg6v5") +shapecast = NodePath("ShapeCast3D") +range_debug_indicator = NodePath("CSGSphere3D") +status_stats = null +particles = NodePath("ShapeCast3D/GPUParticles3D") + +[node name="ShapeCast3D" type="ShapeCast3D" parent="." index="2"] +transform = Transform3D(0.984808, 0, 0.173648, 0, 1, 0, -0.173648, 0, 0.984808, 0, 0, 0) +shape = SubResource("BoxShape3D_uk6ey") +target_position = Vector3(0, 0, -1.5) +collision_mask = 4 + +[node name="GPUParticles3D" type="GPUParticles3D" parent="ShapeCast3D" index="0"] +amount = 36 +visibility_aabb = AABB(-1.02851, -1.00566, -3.03983, 2.05703, 2.01132, 6.07966) +draw_pass_1 = SubResource("BoxMesh_o37rs") + +[node name="CSGSphere3D" type="CSGSphere3D" parent="." index="3"] +visible = false +radius = 4.104 +radial_segments = 16 +rings = 16 +material = SubResource("StandardMaterial3D_sgbeo") diff --git a/Scenes/tower_base.tscn b/Scenes/tower_base.tscn index aaf4606..6c66290 100644 --- a/Scenes/tower_base.tscn +++ b/Scenes/tower_base.tscn @@ -1,28 +1,27 @@ -[gd_scene load_steps=5 format=3 uid="uid://ddbbwx0yy16lh"] +[gd_scene load_steps=6 format=3 uid="uid://ddbbwx0yy16lh"] [ext_resource type="Script" path="res://Scripts/tower_base.gd" id="1_tghvd"] [ext_resource type="Script" path="res://Scripts/inventory.gd" id="2_p5c7g"] [ext_resource type="Texture2D" uid="uid://ba85u6i558x4w" path="res://Assets/Textures/minimap_node.png" id="3_01hk3"] +[ext_resource type="ArrayMesh" uid="uid://cr83c74ys8rll" path="res://textmesh.res" id="4_hosgw"] [sub_resource type="BoxShape3D" id="BoxShape3D_lc72v"] +size = Vector3(1.1, 1.1, 1.1) [node name="Node3D" type="StaticBody3D" node_paths=PackedStringArray("inventory", "block", "collider", "minimap_icon")] collision_layer = 17 script = ExtResource("1_tghvd") inventory = NodePath("Inventory") -block = NodePath("CSGBox3D") +block = NodePath("MeshInstance3D") collider = NodePath("CollisionShape3D") minimap_icon = NodePath("Sprite3D") -[node name="CSGBox3D" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) - [node name="Inventory" type="Node" parent="."] script = ExtResource("2_p5c7g") max_size = 1 [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 0) shape = SubResource("BoxShape3D_lc72v") [node name="Sprite3D" type="Sprite3D" parent="."] @@ -31,3 +30,7 @@ layers = 4 modulate = Color(0, 1, 0, 1) texture_filter = 0 texture = ExtResource("3_01hk3") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 0) +mesh = ExtResource("4_hosgw") diff --git a/Scenes/tower_frame.tscn b/Scenes/tower_frame.tscn index 33b991c..dcba23b 100644 --- a/Scenes/tower_frame.tscn +++ b/Scenes/tower_frame.tscn @@ -17,23 +17,23 @@ albedo_color = Color(0.0980392, 0.309804, 0.180392, 1) [node name="Node3D" type="Node3D"] [node name="CSGBox3D2" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, 0.525) -size = Vector3(1, 0.04, 0.05) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, 0.575) +size = Vector3(0.525, 0.04, 0.05) material = SubResource("StandardMaterial3D_xt3aj") [node name="CSGBox3D3" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, -0.525) -size = Vector3(1, 0.04, 0.05) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.02, -0.575) +size = Vector3(0.525, 0.04, 0.05) material = SubResource("StandardMaterial3D_gbm1j") [node name="CSGBox3D4" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.525, 0.02, 0) -size = Vector3(0.05, 0.04, 1.1) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.575, 0.02, 0) +size = Vector3(0.05, 0.04, 0.525) material = SubResource("StandardMaterial3D_18qg8") [node name="CSGBox3D5" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.525, 0.02, 0) -size = Vector3(0.05, 0.04, 1.1) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.575, 0.02, 0) +size = Vector3(0.05, 0.04, 0.525) material = SubResource("StandardMaterial3D_ip8b2") [node name="Sprite3D" type="Sprite3D" parent="."] diff --git a/Scripts/Projectiles/explosive_projectile.gd b/Scripts/Projectiles/explosive_projectile.gd index 01d3970..0a1ec30 100644 --- a/Scripts/Projectiles/explosive_projectile.gd +++ b/Scripts/Projectiles/explosive_projectile.gd @@ -26,6 +26,15 @@ func explode(): func hit(target): target.damage(damage) + if owner_id == 0: + if Data.preferences.display_tower_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) + if owner_id == multiplayer.get_unique_id(): + if Data.preferences.display_self_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) + if owner_id != 0 and owner_id != multiplayer.get_unique_id(): + if Data.preferences.display_party_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) @rpc("reliable") diff --git a/Scripts/Projectiles/homing_projectile.gd b/Scripts/Projectiles/homing_projectile.gd index 6a5d099..fca909d 100644 --- a/Scripts/Projectiles/homing_projectile.gd +++ b/Scripts/Projectiles/homing_projectile.gd @@ -2,16 +2,17 @@ extends ExplosiveProjectile class_name HomingProjectile var target : Node3D -@export var acceleration := 40.0 -@export var max_speed := 14.0 +var acceleration := 50.0 +var max_speed := 13.0 func _physics_process(_delta: float) -> void: if is_instance_valid(target): - direction = global_position.direction_to(target.global_position) + direction = global_position.direction_to(target.sprite.global_position) #apply_central_force(direction * acceleration) func _integrate_forces(state: PhysicsDirectBodyState3D) -> void: + state.linear_velocity = state.linear_velocity.limit_length(state.linear_velocity.length() * (1.0 - 0.08)) state.linear_velocity += direction * acceleration * state.step state.linear_velocity = state.linear_velocity.limit_length(max_speed) diff --git a/Scripts/Projectiles/projectile.gd b/Scripts/Projectiles/projectile.gd index 31f35b8..da0715c 100644 --- a/Scripts/Projectiles/projectile.gd +++ b/Scripts/Projectiles/projectile.gd @@ -3,6 +3,8 @@ class_name Projectile @export var collision_shape : CollisionShape3D +var damage_particle_scene = preload("res://Scenes/damage_particle.tscn") +var owner_id = 0 #should be left unchanged by towers, 1 for host, peer_id on peers var direction := Vector3.FORWARD var force := 2.0 var damage := 0.0 @@ -18,6 +20,14 @@ func _process(delta: float) -> void: time_alive += delta +func spawn_damage_indicator(pos): + if damage > 0: + var marker = damage_particle_scene.instantiate() + get_tree().root.add_child(marker) + marker.set_number(damage) + marker.position = pos + + func _on_body_entered(_body: Node) -> void: pass # Replace with function body. diff --git a/Scripts/Resources/player_graphics_settings.gd b/Scripts/Resources/player_graphics_settings.gd new file mode 100644 index 0000000..1e99178 --- /dev/null +++ b/Scripts/Resources/player_graphics_settings.gd @@ -0,0 +1,38 @@ +extends Resource +class_name PlayerGraphicsSettings + +const SAVE_PATH := "user://graphics_settings.tres" + +@export var hfov := 100.0 +@export var vsync_mode := 1 +@export var aa_mode := 0 +@export var windowed_mode := 0 + + +func apply_graphical_settings(viewport): + DisplayServer.window_set_vsync_mode(vsync_mode) + match aa_mode: + 0: + viewport.use_taa = false + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED + 1: + viewport.use_taa = false + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA + 2: + viewport.use_taa = true + viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED + match windowed_mode: + 0: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + 1: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + 2: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN) + + +func save_profile_to_disk(): + ResourceSaver.save(self, SAVE_PATH) +static func load_profile_from_disk() -> PlayerGraphicsSettings: + if ResourceLoader.exists(SAVE_PATH): + return ResourceLoader.load(SAVE_PATH) + return PlayerGraphicsSettings.new() diff --git a/Scripts/Resources/player_preferences.gd b/Scripts/Resources/player_preferences.gd index 9ef494b..bbc6efc 100644 --- a/Scripts/Resources/player_preferences.gd +++ b/Scripts/Resources/player_preferences.gd @@ -7,10 +7,6 @@ const SAVE_PATH := "user://preferences.tres" @export var invert_lookY := false @export var invert_lookX := false @export var toggle_sprint := false -@export var vsync_mode := 1 -@export var aa_mode := 0 -@export var windowed_mode := 0 -@export var hfov := 100.0 @export var fixed_minimap := false @export var display_tower_damage_indicators := true @export var display_self_damage_indicators := true @@ -18,27 +14,6 @@ const SAVE_PATH := "user://preferences.tres" @export var display_status_effect_damage_indicators := true -func apply_graphical_settings(viewport): - DisplayServer.window_set_vsync_mode(vsync_mode) - match aa_mode: - 0: - viewport.use_taa = false - viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED - 1: - viewport.use_taa = false - viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA - 2: - viewport.use_taa = true - viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED - match windowed_mode: - 0: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - 1: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) - 2: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN) - - func save_profile_to_disk(): ResourceSaver.save(self, SAVE_PATH) static func load_profile_from_disk() -> PlayerPreferences: diff --git a/Scripts/Towers/hitscan_tower.gd b/Scripts/Towers/hitscan_tower.gd index 45b5d51..5ef45be 100644 --- a/Scripts/Towers/hitscan_tower.gd +++ b/Scripts/Towers/hitscan_tower.gd @@ -6,6 +6,8 @@ func shoot(): super.shoot() if targeted_enemy and is_instance_valid(targeted_enemy) and targeted_enemy.alive: targeted_enemy.damage(damage) + if Data.preferences.display_tower_damage_indicators: + spawn_damage_indicator(targeted_enemy.sprite.global_position) @rpc("reliable") diff --git a/Scripts/Towers/projectile_tower.gd b/Scripts/Towers/projectile_tower.gd index 1d65c24..3320054 100644 --- a/Scripts/Towers/projectile_tower.gd +++ b/Scripts/Towers/projectile_tower.gd @@ -28,3 +28,4 @@ func networked_spawn_projectile(peer_id): projectile.name = base_name + str(peer_id) + str(projectile_id) get_tree().root.add_child(projectile) projectile_id += 1 + return projectile diff --git a/Scripts/Towers/range_affecting_tower.gd b/Scripts/Towers/range_affecting_tower.gd new file mode 100644 index 0000000..68454c3 --- /dev/null +++ b/Scripts/Towers/range_affecting_tower.gd @@ -0,0 +1,32 @@ +extends StatusApplyingTower +class_name RangeAffectingTower + + +func _physics_process(_delta: float) -> void: + if !is_multiplayer_authority(): + return + var enemies_in_range = [] + for enemy in get_tree().get_nodes_in_group("Enemies"): + if !is_instance_valid(enemy) or !enemy.alive or global_position.distance_to(enemy.global_position) > target_range: + continue + enemies_in_range.append(enemy) + if time_since_firing >= time_between_shots: + time_since_firing -= time_between_shots + for enemy in enemies_in_range: + fire(enemy) + + +func fire(target): + if is_instance_valid(target) and target.alive: + target.damage(damage) + target.status_manager.add_effect(build_status_object()) + if Data.preferences.display_tower_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) + if is_multiplayer_authority(): + networked_fire.rpc(get_tree().root.get_path_to(target)) + + +@rpc("reliable") +func networked_fire(target_node_path): + var target = get_tree().root.get_node(target_node_path) + fire(target) diff --git a/Scripts/Towers/shapecast_tower.gd b/Scripts/Towers/shapecast_tower.gd new file mode 100644 index 0000000..4188d33 --- /dev/null +++ b/Scripts/Towers/shapecast_tower.gd @@ -0,0 +1,48 @@ +extends Tower +class_name ShapecastTower + +@export var shapecast : ShapeCast3D +@export var particlesystem : GPUParticles3D +@export var status_stats : StatusStats + + +func _process(delta: float) -> void: + super._process(delta) + if targeted_enemy: + particlesystem.emitting = true + else: + particlesystem.emitting = false + + +func shoot(): + for index in shapecast.get_collision_count(): + var target = shapecast.get_collider(index) as CharacterBody3D + hit(target) + + +func aim(): + yaw_model.look_at(targeted_enemy.global_position) + pitch_model.look_at(targeted_enemy.global_position) + pitch_model.rotation.x = 0.0 + + +func hit(target): + if is_instance_valid(target) and target.alive: + target.damage(damage) + if Data.preferences.display_tower_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) + target.status_manager.add_effect(build_status_object()) + if is_multiplayer_authority(): + networked_hit.rpc(get_tree().root.get_path_to(target)) + + +func build_status_object() -> StatusEffect: + var status = StatusEffect.new() + status.stats = status_stats + return status + + +@rpc("reliable") +func networked_hit(target_node_path): + var target = get_tree().root.get_node(target_node_path) + hit(target) diff --git a/Scripts/Towers/tower.gd b/Scripts/Towers/tower.gd index 3a2167f..e7e76de 100644 --- a/Scripts/Towers/tower.gd +++ b/Scripts/Towers/tower.gd @@ -7,6 +7,7 @@ class_name Tower @export var yaw_model : MeshInstance3D @export var range_indicator : CSGSphere3D +var damage_particle_scene = preload("res://Scenes/damage_particle.tscn") var base_name var targeted_enemy var time_since_firing := 0.0 @@ -82,6 +83,14 @@ func shoot(): networked_shoot.rpc() +func spawn_damage_indicator(pos): + if damage > 0: + var marker = damage_particle_scene.instantiate() + get_tree().root.add_child(marker) + marker.set_number(damage) + marker.position = pos + + @rpc("reliable") func networked_shoot(): shoot() diff --git a/Scripts/Weapons/projectile_weapon.gd b/Scripts/Weapons/projectile_weapon.gd index 22b40fd..7178fab 100644 --- a/Scripts/Weapons/projectile_weapon.gd +++ b/Scripts/Weapons/projectile_weapon.gd @@ -24,6 +24,7 @@ func networked_spawn_projectile(peer_id, direction): projectile.damage = damage projectile.direction = direction projectile.force = force + projectile.owner_id = peer_id projectile.name = str(peer_id) + str(projectile_id) get_tree().root.add_child(projectile) projectile_id += 1 diff --git a/Scripts/Weapons/shapecast_weapon.gd b/Scripts/Weapons/shapecast_weapon.gd new file mode 100644 index 0000000..7895ada --- /dev/null +++ b/Scripts/Weapons/shapecast_weapon.gd @@ -0,0 +1,55 @@ +extends Weapon +class_name ShapecastWeapon + +@export var shapecast : ShapeCast3D +@export var range_debug_indicator : CSGSphere3D +@export var status_stats : StatusStats +@export var particles : GPUParticles3D + +var attack_range := 0.0 + + +func _ready() -> void: + super._ready() + attack_range = stats.get_attribute("Range") + range_debug_indicator.radius = attack_range + shapecast.shape.size.z = attack_range + shapecast.target_position = -hero.camera.basis.z * (attack_range / 2.0) + + +func _process(delta: float) -> void: + super._process(delta) + particles.emitting = trigger_held + + +func shoot(): + super.shoot() + for index in shapecast.get_collision_count(): + var target = shapecast.get_collider(index) + if target: + var target_hitbox = target.shape_owner_get_owner(shapecast.get_collider_shape(index)) + if target_hitbox is Hitbox: + hit(target, target_hitbox) + if Data.preferences.display_self_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) + networked_hit.rpc(get_tree().root.get_path_to(target), get_tree().root.get_path_to(target_hitbox)) + + +func build_status_object() -> StatusEffect: + var status = StatusEffect.new() + status.stats = status_stats + return status + + +func hit(target, target_hitbox : Hitbox): + target_hitbox.damage(damage) + target.status_manager.add_effect(build_status_object()) + + +@rpc("reliable") +func networked_hit(target_path : String, target_hitbox_path : String): + var target = get_tree().root.get_node(target_path) + var target_hitbox = get_tree().root.get_node(target_hitbox_path) as Hitbox + hit(target, target_hitbox) + if Data.preferences.display_party_damage_indicators: + spawn_damage_indicator(target.sprite.global_position) diff --git a/Scripts/card_hand.gd b/Scripts/card_hand.gd index aab9f3d..a28e0f2 100644 --- a/Scripts/card_hand.gd +++ b/Scripts/card_hand.gd @@ -30,4 +30,4 @@ func view_weapon(): func view_tower(): description.text = process_card_text(stats.tower_stats) - target_label.text = str(stats.tower_stats.target_type) + target_label.text = str(Data.TargetType.keys()[stats.tower_stats.target_type]) diff --git a/Scripts/chatbox.gd b/Scripts/chatbox.gd index 1fb2512..e42df04 100644 --- a/Scripts/chatbox.gd +++ b/Scripts/chatbox.gd @@ -4,42 +4,70 @@ class_name Chatbox signal opened signal closed +@export var input_line : LineEdit +@export var textbox : RichTextLabel +@export var text_panel : PanelContainer +@export var fade_timer : Timer + var text_selected := false var username := "default" +var color = Color.TOMATO +var fading = true +var time_to_fade = 2.0 +var time_since_started_fading = 2.0 + + +func _process(delta: float) -> void: + if fading: + time_since_started_fading += delta + else: + time_since_started_fading = 0.0 + textbox.modulate.a = lerpf(1.0, 0.0, time_since_started_fading / time_to_fade) + text_panel.modulate.a = lerpf(1.0, 0.0, time_since_started_fading / time_to_fade) + func _input(event: InputEvent) -> void: if !text_selected and event.is_action_pressed("Open Text Chat"): get_viewport().set_input_as_handled() opened.emit() - $VBoxContainer/LineEdit.visible = true - $VBoxContainer/LineEdit.grab_focus() + input_line.visible = true + input_line.grab_focus() text_selected = true + fading = false return if text_selected and event is InputEventKey and event.pressed == true: if event.keycode == KEY_ENTER: get_viewport().set_input_as_handled() closed.emit() - $VBoxContainer/LineEdit.deselect() - $VBoxContainer/LineEdit.visible = false + input_line.deselect() + input_line.visible = false text_selected = false - if $VBoxContainer/LineEdit.text.length() != 0: - if $VBoxContainer/LineEdit.text.begins_with("/"): - Game.parse_command($VBoxContainer/LineEdit.text, multiplayer.get_unique_id()) + if input_line.text.length() != 0: + if input_line.text.begins_with("/"): + Game.parse_command(input_line.text, multiplayer.get_unique_id()) + fade_timer.start() else: - rpc("append_message", username, $VBoxContainer/LineEdit.text) - $VBoxContainer/LineEdit.clear() + append_message.rpc(username, color, input_line.text) + input_line.clear() if event.keycode == KEY_ESCAPE: get_viewport().set_input_as_handled() closed.emit() - $VBoxContainer/LineEdit.deselect() - $VBoxContainer/LineEdit.visible = false + input_line.deselect() + input_line.visible = false text_selected = false + fade_timer.start() func change_username(old_name, new_name): - append_message("server", old_name + " has changed their display name to " + new_name) + append_message("SERVER", Color.TOMATO, old_name + " has changed their display name to " + new_name) @rpc("reliable","call_local","any_peer") -func append_message(user, content): - $VBoxContainer/RichTextLabel.append_text("[" + user + "] " + content + "\n") +func append_message(user, user_color, content): + textbox.append_text("[[color=" + user_color.to_html() + "]" + user + "[color=white]] " + content + "\n") + fading = false + fade_timer.start() + + +func _on_timer_timeout() -> void: + fading = true diff --git a/Scripts/data.gd b/Scripts/data.gd index 9ab9009..0853e31 100644 --- a/Scripts/data.gd +++ b/Scripts/data.gd @@ -4,6 +4,7 @@ var characters : Array[HeroClass] var cards : Array[Card] var enemies : Array[Enemy] var keymaps : Array[PlayerKeymap] +var graphics : PlayerGraphicsSettings var preferences : PlayerPreferences var player_profile : PlayerProfile var player_keymap : PlayerKeymap @@ -22,10 +23,11 @@ var rarity_weights = { } func _ready() -> void: + graphics = PlayerGraphicsSettings.load_profile_from_disk() + graphics.apply_graphical_settings(get_viewport()) player_profile = PlayerProfile.load_profile_from_disk() preferences = PlayerPreferences.load_profile_from_disk() player_keymap = PlayerKeymap.load_profile_from_disk() - preferences.apply_graphical_settings(get_viewport()) player_keymap.apply() characters.append(preload("res://PCs/Red/red.tres")) @@ -39,10 +41,10 @@ func _ready() -> void: cards.append(preload("res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres")) #Uncommon cards.append(preload("res://PCs/Universal/ClassCards/Blowdart/card_blowdart.tres")) - #cards.append(preload("res://PCs/Universal/ClassCards/Refridgerator/card_refridgerator.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/Refrigerator/card_refrigerator.tres")) cards.append(preload("res://PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres")) #Rare - #cards.append(preload("res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres")) #cards.append(preload("res://PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres")) #cards.append(preload("res://PCs/Universal/ClassCards/SpeedEnhancer/card_speed_enhancer.tres")) #Epic @@ -51,7 +53,7 @@ func _ready() -> void: #cards.append(preload("res://PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres")) #Legendary cards.append(preload("res://PCs/Universal/ClassCards/Sniper/card_sniper.tres")) - #cards.append(preload("res://PCs/Universal/ClassCards/Reactor/card_reactor.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/Reactor/card_reactor.tres")) #cards.append(preload("res://PCs/Universal/ClassCards/Lightning/card_lightning.tres")) enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog.tres")) diff --git a/Scripts/game.gd b/Scripts/game.gd index 9041fba..3c07854 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -25,6 +25,7 @@ var wave := 0 var upcoming_wave var pot : float var UILayer : CanvasLayer +var chatbox : Chatbox func _ready() -> void: @@ -41,6 +42,12 @@ func parse_command(text : String, peer_id : int): if x.title == gift_name: gift = x connected_players_nodes[peer_id].inventory.add(gift) + if text.substr(1, 2) == "tr": + chatbox.append_message("SERVER", Color.TOMATO, "[color=#f7a8b8]t[color=#55cdfc]r[color=#ffffff]a[color=#55cdfc]n[color=#f7a8b8]s [color=#e50000]r[color=#ff8d00]i[color=#ffee00]g[color=#028121]h[color=#004cff]t[color=#760088]s[color=white]!!") +# if text.substr(1, 17) == "show tower ranges": +# pass +# if text.substr(1, 20) = "show gauntlet ranges": +# pass func spawn_level(): @@ -63,7 +70,6 @@ func spawn_players(player_array, player_profiles, chatbox_open_signal, chatbox_c player.position = level.player_spawns[p_i].global_position player.profile = player_profiles[peer_id] player.hero_class = Data.characters[player_profiles[peer_id].preferred_class] - print(player.hero_class.hero_name) player.ready_state_changed.connect(ready_player) if peer_id == multiplayer.get_unique_id(): chatbox_open_signal.connect(player.pause) @@ -99,7 +105,7 @@ func set_upcoming_wave(): if is_multiplayer_authority(): var spawn_power = WaveManager.calculate_spawn_power(wave + 1, connected_players_nodes.size()) var new_wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) - networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 100)) + networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 50)) @rpc("reliable", "call_local") diff --git a/Scripts/gameplay_options.gd b/Scripts/gameplay_options.gd new file mode 100644 index 0000000..6dee586 --- /dev/null +++ b/Scripts/gameplay_options.gd @@ -0,0 +1,46 @@ +extends VBoxContainer +class_name GameplayOptionsMenu + +@export var look_sens_slider : HSlider +@export var look_sens_input : SpinBox +@export var toggle_sprint_checkbox : CheckButton +@export var invert_lookY : CheckButton +@export var invert_lookX : CheckButton +@export var fixed_minimap : CheckButton +@export var tower_damage : Button +@export var self_damage : Button +@export var party_damage : Button +@export var status_damage : Button + + +func _ready() -> void: + look_sens_slider.value = Data.preferences.mouse_sens + look_sens_input.value = Data.preferences.mouse_sens + toggle_sprint_checkbox.button_pressed = Data.preferences.toggle_sprint + invert_lookY.button_pressed = Data.preferences.invert_lookY + invert_lookX.button_pressed = Data.preferences.invert_lookX + fixed_minimap.button_pressed = Data.preferences.fixed_minimap + tower_damage.button_pressed = Data.preferences.display_tower_damage_indicators + self_damage.button_pressed = Data.preferences.display_self_damage_indicators + party_damage.button_pressed = Data.preferences.display_party_damage_indicators + status_damage.button_pressed = Data.preferences.display_status_effect_damage_indicators + + +func save() -> void: + Data.preferences.mouse_sens = look_sens_slider.value + Data.preferences.toggle_sprint = toggle_sprint_checkbox.button_pressed + Data.preferences.invert_lookY = invert_lookY.button_pressed + Data.preferences.invert_lookX = invert_lookX.button_pressed + Data.preferences.fixed_minimap = fixed_minimap.button_pressed + Data.preferences.display_tower_damage_indicators = tower_damage.button_pressed + Data.preferences.display_self_damage_indicators = self_damage.button_pressed + Data.preferences.display_party_damage_indicators = party_damage.button_pressed + Data.preferences.display_status_effect_damage_indicators = status_damage.button_pressed + + +func _on_mouse_sens_spin_box_value_changed(value: float) -> void: + look_sens_slider.value = value + + +func _on_mouse_sens_h_slider_value_changed(value: float) -> void: + look_sens_input.value = value diff --git a/Scripts/graphics_options.gd b/Scripts/graphics_options.gd new file mode 100644 index 0000000..b865714 --- /dev/null +++ b/Scripts/graphics_options.gd @@ -0,0 +1,36 @@ +extends VBoxContainer +class_name GraphicsOptionsMenu + +@export var fov_input : SpinBox +@export var fov_slider : HSlider +@export var vsync_dropdown : OptionButton +@export var aa_dropdown : OptionButton +@export var window_dropdown : OptionButton + + +func _ready(): + fov_input.value = Data.graphics.hfov + fov_slider.value = Data.graphics.hfov + vsync_dropdown.selected = Data.graphics.vsync_mode + aa_dropdown.selected = Data.graphics.aa_mode + + +func save(): + Data.graphics.hfov = fov_slider.value + Data.graphics.vsync_mode = vsync_dropdown.selected + Data.graphics.aa_mode = aa_dropdown.selected + Data.graphics.windowed_mode = window_dropdown.selected + + +func _on_fov_spin_box_value_changed(value: float) -> void: + if value < 40.0: + value = 40.0 + if value > 160.0: + value = 160.0 + fov_slider.value = value + Data.graphics.hfov = value + + +func _on_fov_h_slider_value_changed(value: float) -> void: + fov_input.value = value + Data.graphics.hfov = value diff --git a/Scripts/keybind_options.gd b/Scripts/keybind_options.gd new file mode 100644 index 0000000..154cf92 --- /dev/null +++ b/Scripts/keybind_options.gd @@ -0,0 +1,63 @@ +extends VBoxContainer + +var keybind_popup = load("res://Scenes/UI/keybind_popup.tscn") +var keybind_boxes = [] +var keybind_buttons = {} +var key_event +var selected_button +var selected_button_button +var listening_for_key := false + + +func _ready() -> void: + for index in Data.keymaps.size(): + var map = Data.keymaps[index] + var button = Button.new() + button.text = map.title + button.pressed.connect(set_keymap.bind(index)) + $HBoxContainer.add_child(button) + load_keybind_labels() + + +func set_keymap(keymap_index): + Data.player_keymap = Data.keymaps[keymap_index] + Data.player_keymap.apply() + load_keybind_labels() + + +func load_keybind_labels(): + for box in keybind_boxes: + box.queue_free() + keybind_boxes.clear() + for action in InputMap.get_actions(): + if !action.begins_with("ui_"): + var box = HBoxContainer.new() + var alabel = Label.new() + var elabel = Button.new() + alabel.text = action + if InputMap.action_get_events(action).size() > 0: + elabel.text = InputMap.action_get_events(action)[0].as_text() + elabel.size_flags_horizontal += Control.SIZE_EXPAND + alabel.size_flags_horizontal += Control.SIZE_EXPAND + alabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + alabel.size_flags_stretch_ratio = 2.0 + #elabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + box.add_child(alabel) + box.add_child(elabel) + elabel.pressed.connect(_on_keybind_button_pressed.bind(elabel)) + keybind_buttons[elabel] = action + $ScrollContainer/VBoxContainer.add_child(box) + keybind_boxes.append(box) + + +func _on_keybind_button_pressed(value: Button) -> void: + selected_button = keybind_buttons[value] + selected_button_button = value + var popup = keybind_popup.instantiate() + popup.event_detected.connect(change_key) + Game.UILayer.add_child(popup) + + +func change_key(event: InputEvent): + Data.player_keymap.replace_action_event(selected_button, event) + selected_button_button.text = event.as_text() diff --git a/Scripts/multiplayer_lobby.gd b/Scripts/multiplayer_lobby.gd index 6aab1a2..ffbf72c 100644 --- a/Scripts/multiplayer_lobby.gd +++ b/Scripts/multiplayer_lobby.gd @@ -32,7 +32,7 @@ func _on_player_connected(peer_id): func _on_player_disconnected(peer_id): if chatbox: - chatbox.append_message("SERVER", connected_players_profiles[peer_id].display_name + " has disconnected!") + chatbox.append_message("SERVER", Color.TOMATO, connected_players_profiles[peer_id].display_name + " has disconnected!") connected_players_profiles.erase(peer_id) player_disconnected.emit(peer_id) @@ -64,6 +64,7 @@ func setup_game(peer_id): Game.spawn_level() scoreboard.all_players_ready.connect(start_game) Game.game_restarted.connect(setup_the_ui) + Game.chatbox = chatbox setup_the_ui() chatbox.username = Data.player_profile.display_name Data.player_profile.display_name_changed.connect(chatbox.change_username) @@ -116,7 +117,7 @@ func add_player(new_player_profile_dict): var new_player_peer_id = multiplayer.get_remote_sender_id() var new_player_profile = PlayerProfile.from_dict(new_player_profile_dict) if chatbox: - chatbox.append_message("SERVER", new_player_profile.display_name + " has connected!") + chatbox.append_message("SERVER", Color.TOMATO, new_player_profile.display_name + " has connected!") connected_players_profiles[new_player_peer_id] = new_player_profile player_connected.emit(new_player_peer_id, new_player_profile) diff --git a/Scripts/options_menu.gd b/Scripts/options_menu.gd index 1229162..22dae47 100644 --- a/Scripts/options_menu.gd +++ b/Scripts/options_menu.gd @@ -1,137 +1,14 @@ extends Control class_name OptionsMenu -@export var keybind_popup : PackedScene -@export var look_sens_slider : HSlider -@export var look_sens_input : SpinBox -@export var toggle_sprint_checkbox : CheckButton -@export var vsync_dropdown : OptionButton -@export var aa_dropdown : OptionButton -@export var window_dropdown : OptionButton -@export var invert_lookY : CheckButton -@export var invert_lookX : CheckButton -@export var fov_input : SpinBox -@export var fov_slider : HSlider -@export var fixed_minimap : CheckButton -@export var tower_damage : Button -@export var self_damage : Button -@export var party_damage : Button -@export var status_damage : Button -var keybind_boxes = [] -var keybind_buttons = {} -var key_event -var selected_button -var selected_button_button -var listening_for_key := false - -func _ready(): - look_sens_slider.value = Data.preferences.mouse_sens - look_sens_input.value = Data.preferences.mouse_sens - toggle_sprint_checkbox.button_pressed = Data.preferences.toggle_sprint - vsync_dropdown.selected = Data.preferences.vsync_mode - aa_dropdown.selected = Data.preferences.aa_mode - invert_lookY.button_pressed = Data.preferences.invert_lookY - invert_lookX.button_pressed = Data.preferences.invert_lookX - fov_input.value = Data.preferences.hfov - fov_slider.value = Data.preferences.hfov - fixed_minimap.button_pressed = Data.preferences.fixed_minimap - tower_damage.button_pressed = Data.preferences.display_tower_damage_indicators - self_damage.button_pressed = Data.preferences.display_self_damage_indicators - party_damage.button_pressed = Data.preferences.display_party_damage_indicators - status_damage.button_pressed = Data.preferences.display_status_effect_damage_indicators - for index in Data.keymaps.size(): - var map = Data.keymaps[index] - var button = Button.new() - button.text = map.title - button.pressed.connect(set_keymap.bind(index)) - $VBoxContainer/TabContainer/Keybinds/HBoxContainer.add_child(button) - load_keybind_labels() - - -func set_keymap(keymap_index): - Data.player_keymap = Data.keymaps[keymap_index] - Data.player_keymap.apply() - load_keybind_labels() - - -func load_keybind_labels(): - for box in keybind_boxes: - box.queue_free() - keybind_boxes.clear() - for action in InputMap.get_actions(): - if !action.begins_with("ui_"): - var box = HBoxContainer.new() - var alabel = Label.new() - var elabel = Button.new() - alabel.text = action - if InputMap.action_get_events(action).size() > 0: - elabel.text = InputMap.action_get_events(action)[0].as_text() - elabel.size_flags_horizontal += Control.SIZE_EXPAND - alabel.size_flags_horizontal += Control.SIZE_EXPAND - alabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - alabel.size_flags_stretch_ratio = 2.0 - #elabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT - box.add_child(alabel) - box.add_child(elabel) - elabel.pressed.connect(_on_keybind_button_pressed.bind(elabel)) - keybind_buttons[elabel] = action - $VBoxContainer/TabContainer/Keybinds/ScrollContainer/VBoxContainer.add_child(box) - keybind_boxes.append(box) - func _on_cancel_pressed() -> void: queue_free() func _on_confirm_pressed() -> void: - Data.preferences.mouse_sens = look_sens_slider.value - Data.preferences.toggle_sprint = toggle_sprint_checkbox.button_pressed - Data.preferences.vsync_mode = vsync_dropdown.selected - Data.preferences.aa_mode = aa_dropdown.selected - Data.preferences.windowed_mode = window_dropdown.selected - Data.preferences.invert_lookY = invert_lookY.button_pressed - Data.preferences.invert_lookX = invert_lookX.button_pressed - Data.preferences.fixed_minimap = fixed_minimap.button_pressed - Data.preferences.display_tower_damage_indicators = tower_damage.button_pressed - Data.preferences.display_self_damage_indicators = self_damage.button_pressed - Data.preferences.display_party_damage_indicators = party_damage.button_pressed - Data.preferences.display_status_effect_damage_indicators = status_damage.button_pressed - Data.preferences.apply_graphical_settings(get_viewport()) + Data.graphics.apply_graphical_settings(get_viewport()) + Data.graphics.save_profile_to_disk() Data.preferences.save_profile_to_disk() Data.player_keymap.save_profile_to_disk() queue_free() - - -func _on_mouse_sens_spin_box_value_changed(value: float) -> void: - look_sens_slider.value = value - - -func _on_mouse_sens_h_slider_value_changed(value: float) -> void: - look_sens_input.value = value - - -func _on_fov_spin_box_value_changed(value: float) -> void: - if value < 40.0: - value = 40.0 - if value > 160.0: - value = 160.0 - fov_slider.value = value - Data.preferences.hfov = value - - -func _on_fov_h_slider_value_changed(value: float) -> void: - fov_input.value = value - Data.preferences.hfov = value - - -func _on_keybind_button_pressed(value: Button) -> void: - selected_button = keybind_buttons[value] - selected_button_button = value - var popup = keybind_popup.instantiate() - popup.event_detected.connect(change_key) - add_child(popup) - - -func change_key(event: InputEvent): - Data.player_keymap.replace_action_event(selected_button, event) - selected_button_button.text = event.as_text() diff --git a/Scripts/singleplayer_lobby.gd b/Scripts/singleplayer_lobby.gd index 1471dc3..36fbae4 100644 --- a/Scripts/singleplayer_lobby.gd +++ b/Scripts/singleplayer_lobby.gd @@ -19,6 +19,7 @@ func setup_game(): scoreboard.add_player(1, Data.player_profile) scoreboard.all_players_ready.connect(start_game) Game.game_restarted.connect(setup_the_ui) + Game.chatbox = chatbox setup_the_ui() chatbox.username = Data.player_profile.display_name Data.player_profile.display_name_changed.connect(chatbox.change_username) diff --git a/Scripts/tower_base.gd b/Scripts/tower_base.gd index dcac602..ab68ec3 100644 --- a/Scripts/tower_base.gd +++ b/Scripts/tower_base.gd @@ -2,7 +2,7 @@ extends StaticBody3D class_name TowerBase @export var inventory : Inventory -@export var block : CSGBox3D +@export var block : Node3D @export var collider : CollisionShape3D @export var minimap_icon : Sprite3D @@ -27,7 +27,7 @@ func remove_card() -> Card: func set_material(value: StandardMaterial3D): - block.material = value + block.material_override = value func toggle_collision(): @@ -40,7 +40,7 @@ func networked_spawn_tower(): tower.stats = inventory.selected_item.tower_stats tower.name = "tower" tower.base_name = name - tower.position = Vector3.UP + tower.position = Vector3(0, 1.2, 0) minimap_icon.modulate = Color.RED add_child(tower) diff --git a/Worlds/GreenPlanet/Levels/first_level.tscn b/Worlds/GreenPlanet/Levels/first_level.tscn index 63339a9..b01bc15 100644 --- a/Worlds/GreenPlanet/Levels/first_level.tscn +++ b/Worlds/GreenPlanet/Levels/first_level.tscn @@ -80,7 +80,7 @@ curve = SubResource("Curve3D_suxqu") script = ExtResource("11_d7ofl") [node name="GroundSpawn" parent="." node_paths=PackedStringArray("path", "dest", "enemy_path") instance=ExtResource("3_5imwp")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0.5, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -29.9396, 0.5, 0) path = NodePath("../VisualizedPath") type = 1 dest = NodePath("../EnemyGoal") @@ -541,8 +541,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1) [node name="AStarGraph3D" type="Node3D" parent="." node_paths=PackedStringArray("start", "end", "spawner", "visualized_path", "tower_path")] script = ExtResource("11_07ukk") -grid_size = Vector2i(19, 9) -point_gap = 1.5 +grid_size = Vector2i(15, 7) +point_gap = 2.0 start = NodePath("../GroundSpawn") end = NodePath("../EnemyGoal") spawner = NodePath("../GroundSpawn") diff --git a/Worlds/GreenPlanet/tilemap.tres b/Worlds/GreenPlanet/tilemap.tres index e68523a..51f6f6d 100644 --- a/Worlds/GreenPlanet/tilemap.tres +++ b/Worlds/GreenPlanet/tilemap.tres @@ -11,7 +11,7 @@ texture_filter = 0 material = SubResource("StandardMaterial3D_ulcfh") orientation = 1 -[sub_resource type="Image" id="Image_nskyb"] +[sub_resource type="Image" id="Image_s3x5u"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 61, 129, 57, 255, 74, 149, 70, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 129, 57, 255, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 129, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 60, 128, 57, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 74, 148, 70, 255, 74, 148, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 149, 70, 255, 74, 149, 70, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 95, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 70, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 74, 148, 70, 255, 74, 148, 70, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 74, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 179, 90, 255, 60, 128, 56, 255, 94, 179, 90, 255, 94, 179, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 74, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 60, 128, 56, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 73, 148, 69, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 60, 128, 56, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 90, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 128, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 127, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 128, 56, 255, 73, 147, 69, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 60, 127, 56, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 60, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 178, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 59, 127, 56, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 73, 147, 69, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 94, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 56, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 127, 56, 255, 73, 147, 69, 255, 73, 147, 69, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 68, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 59, 127, 55, 255, 59, 127, 55, 255, 73, 147, 68, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 93, 177, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 146, 68, 255, 72, 146, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -21,7 +21,7 @@ data = { } [sub_resource type="ImageTexture" id="ImageTexture_p1rdv"] -image = SubResource("Image_nskyb") +image = SubResource("Image_s3x5u") [sub_resource type="BoxShape3D" id="BoxShape3D_mtfk2"] @@ -32,7 +32,7 @@ albedo_texture = ExtResource("1_sntky") material = SubResource("StandardMaterial3D_jnpkd") orientation = 1 -[sub_resource type="Image" id="Image_kf41u"] +[sub_resource type="Image" id="Image_gn8c5"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 100, 92, 255, 103, 106, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 104, 97, 255, 110, 113, 108, 255, 117, 120, 115, 255, 112, 115, 110, 255, 106, 109, 103, 255, 101, 105, 97, 255, 105, 107, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 112, 107, 255, 106, 109, 103, 255, 101, 105, 98, 255, 98, 103, 96, 255, 106, 109, 103, 255, 105, 109, 102, 255, 104, 107, 100, 255, 105, 105, 98, 255, 102, 102, 94, 255, 103, 103, 96, 255, 107, 107, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 92, 255, 107, 106, 100, 255, 106, 106, 99, 255, 105, 107, 101, 255, 108, 110, 104, 255, 114, 116, 111, 255, 114, 117, 112, 255, 109, 111, 105, 255, 109, 109, 102, 255, 108, 107, 100, 255, 103, 104, 96, 255, 103, 103, 95, 255, 106, 105, 98, 255, 108, 108, 101, 255, 109, 109, 103, 255, 106, 108, 103, 255, 103, 105, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 108, 101, 255, 104, 104, 98, 255, 93, 94, 88, 255, 91, 92, 86, 255, 94, 95, 89, 255, 99, 100, 94, 255, 108, 107, 101, 255, 101, 102, 94, 255, 94, 96, 87, 255, 94, 96, 87, 255, 96, 97, 88, 255, 102, 102, 94, 255, 104, 104, 97, 255, 107, 107, 100, 255, 108, 109, 103, 255, 110, 111, 107, 255, 110, 112, 108, 255, 107, 109, 104, 255, 94, 97, 91, 255, 83, 87, 78, 255, 84, 88, 79, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 93, 255, 99, 100, 94, 255, 92, 94, 88, 255, 92, 93, 87, 255, 93, 95, 88, 255, 96, 97, 91, 255, 95, 96, 90, 255, 88, 90, 82, 255, 80, 83, 75, 255, 74, 78, 69, 255, 77, 81, 72, 255, 83, 86, 77, 255, 86, 89, 80, 255, 88, 91, 81, 255, 92, 94, 85, 255, 100, 102, 95, 255, 105, 107, 102, 255, 108, 110, 105, 255, 104, 106, 101, 255, 95, 98, 92, 255, 86, 89, 81, 255, 83, 87, 78, 255, 81, 86, 76, 255, 89, 93, 83, 255, 98, 102, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 97, 255, 101, 101, 97, 255, 103, 104, 99, 255, 98, 99, 94, 255, 93, 93, 87, 255, 90, 90, 84, 255, 81, 83, 78, 255, 84, 87, 80, 255, 85, 88, 79, 255, 83, 87, 77, 255, 78, 81, 73, 255, 72, 76, 68, 255, 66, 71, 63, 255, 69, 73, 66, 255, 68, 71, 66, 255, 67, 69, 66, 255, 74, 76, 72, 255, 83, 86, 80, 255, 93, 96, 90, 255, 95, 98, 91, 255, 97, 100, 94, 255, 102, 105, 97, 255, 100, 103, 93, 255, 103, 106, 96, 255, 106, 108, 99, 255, 109, 111, 102, 255, 105, 107, 98, 255, 98, 101, 91, 255, 101, 105, 94, 255, 113, 115, 107, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 94, 255, 101, 101, 97, 255, 99, 100, 95, 255, 99, 100, 96, 255, 102, 103, 99, 255, 92, 92, 86, 255, 88, 87, 81, 255, 91, 92, 86, 255, 91, 94, 87, 255, 84, 88, 81, 255, 73, 77, 70, 255, 70, 74, 66, 255, 71, 75, 67, 255, 71, 76, 69, 255, 72, 75, 71, 255, 72, 74, 71, 255, 73, 75, 73, 255, 69, 71, 69, 255, 66, 69, 66, 255, 72, 74, 72, 255, 77, 79, 75, 255, 89, 92, 85, 255, 98, 102, 93, 255, 102, 105, 95, 255, 109, 111, 101, 255, 114, 116, 106, 255, 111, 113, 104, 255, 105, 108, 98, 255, 110, 113, 104, 255, 124, 127, 122, 255, 125, 128, 123, 255, 127, 130, 125, 255, 123, 126, 120, 255, 118, 121, 113, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 107, 101, 255, 106, 104, 97, 255, 99, 99, 92, 255, 99, 100, 94, 255, 99, 100, 95, 255, 102, 102, 98, 255, 98, 99, 95, 255, 88, 88, 82, 255, 85, 84, 78, 255, 85, 84, 78, 255, 88, 89, 83, 255, 87, 87, 81, 255, 83, 83, 76, 255, 78, 80, 73, 255, 82, 84, 79, 255, 81, 83, 80, 255, 76, 78, 75, 255, 80, 83, 80, 255, 84, 86, 84, 255, 86, 88, 85, 255, 89, 92, 89, 255, 89, 92, 87, 255, 91, 95, 89, 255, 92, 96, 90, 255, 93, 97, 91, 255, 98, 101, 94, 255, 107, 109, 102, 255, 112, 114, 105, 255, 111, 114, 106, 255, 106, 111, 101, 255, 101, 106, 94, 255, 105, 110, 98, 255, 114, 119, 110, 255, 123, 127, 120, 255, 125, 128, 123, 255, 112, 116, 107, 255, 101, 104, 91, 255, 104, 109, 96, 255, 106, 110, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 105, 255, 113, 111, 104, 255, 111, 108, 102, 255, 116, 114, 106, 255, 122, 120, 111, 255, 126, 124, 114, 255, 120, 119, 109, 255, 105, 105, 98, 255, 95, 97, 91, 255, 89, 90, 84, 255, 90, 91, 85, 255, 92, 95, 88, 255, 90, 91, 85, 255, 85, 85, 79, 255, 84, 85, 77, 255, 84, 87, 77, 255, 85, 89, 78, 255, 89, 93, 82, 255, 83, 87, 78, 255, 79, 83, 76, 255, 79, 81, 77, 255, 82, 85, 81, 255, 90, 94, 89, 255, 97, 101, 96, 255, 102, 105, 100, 255, 97, 100, 95, 255, 89, 94, 87, 255, 93, 97, 91, 255, 100, 103, 98, 255, 97, 101, 94, 255, 98, 102, 95, 255, 104, 108, 100, 255, 110, 114, 106, 255, 122, 125, 119, 255, 121, 125, 118, 255, 120, 124, 117, 255, 107, 111, 101, 255, 96, 100, 86, 255, 96, 99, 85, 255, 96, 99, 85, 255, 105, 109, 95, 255, 112, 117, 104, 255, 114, 119, 106, 255, 106, 110, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 101, 96, 255, 109, 107, 101, 255, 118, 116, 108, 255, 122, 120, 111, 255, 117, 116, 108, 255, 120, 119, 110, 255, 125, 123, 113, 255, 119, 118, 110, 255, 107, 108, 102, 255, 94, 97, 90, 255, 85, 88, 82, 255, 88, 90, 84, 255, 93, 95, 89, 255, 95, 98, 92, 255, 96, 97, 90, 255, 92, 95, 85, 255, 95, 98, 88, 255, 96, 99, 89, 255, 91, 95, 84, 255, 86, 90, 79, 255, 89, 93, 82, 255, 95, 98, 89, 255, 92, 95, 88, 255, 91, 94, 87, 255, 90, 94, 87, 255, 90, 94, 88, 255, 94, 98, 93, 255, 99, 102, 97, 255, 101, 103, 99, 255, 89, 91, 84, 255, 84, 87, 78, 255, 86, 89, 80, 255, 93, 96, 88, 255, 100, 104, 96, 255, 104, 109, 100, 255, 106, 109, 102, 255, 109, 112, 103, 255, 108, 113, 101, 255, 104, 108, 96, 255, 101, 104, 91, 255, 99, 103, 89, 255, 105, 109, 96, 255, 110, 115, 102, 255, 111, 115, 103, 255, 111, 116, 104, 255, 97, 100, 90, 255, 88, 90, 81, 255, 83, 84, 77, 255, 81, 83, 75, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 104, 95, 255, 105, 106, 97, 255, 118, 117, 110, 255, 121, 120, 112, 255, 125, 123, 114, 255, 125, 123, 114, 255, 121, 119, 111, 255, 114, 114, 107, 255, 110, 111, 104, 255, 102, 104, 98, 255, 93, 96, 89, 255, 92, 94, 88, 255, 87, 90, 83, 255, 84, 88, 81, 255, 90, 92, 85, 255, 101, 101, 94, 255, 109, 110, 102, 255, 114, 115, 106, 255, 115, 115, 107, 255, 115, 116, 108, 255, 114, 115, 107, 255, 102, 104, 96, 255, 94, 97, 90, 255, 99, 100, 94, 255, 104, 104, 98, 255, 99, 100, 94, 255, 93, 96, 89, 255, 100, 101, 95, 255, 99, 100, 94, 255, 96, 99, 92, 255, 92, 95, 87, 255, 89, 92, 84, 255, 90, 93, 85, 255, 94, 97, 89, 255, 95, 99, 91, 255, 91, 94, 85, 255, 85, 86, 79, 255, 83, 83, 76, 255, 86, 85, 79, 255, 89, 88, 81, 255, 86, 87, 78, 255, 87, 89, 77, 255, 92, 95, 82, 255, 104, 108, 96, 255, 111, 115, 104, 255, 113, 117, 106, 255, 104, 107, 97, 255, 94, 96, 87, 255, 87, 89, 81, 255, 84, 86, 78, 255, 89, 91, 84, 255, 95, 99, 90, 255, 95, 99, 88, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 116, 108, 255, 110, 111, 103, 255, 105, 106, 97, 255, 107, 109, 100, 255, 117, 118, 110, 255, 124, 124, 116, 255, 126, 126, 119, 255, 120, 122, 114, 255, 113, 114, 108, 255, 110, 111, 104, 255, 110, 110, 104, 255, 104, 105, 99, 255, 91, 94, 88, 255, 86, 90, 84, 255, 90, 92, 85, 255, 93, 93, 87, 255, 94, 95, 89, 255, 98, 99, 94, 255, 102, 102, 98, 255, 107, 108, 103, 255, 109, 110, 103, 255, 108, 109, 101, 255, 107, 106, 100, 255, 100, 101, 95, 255, 96, 98, 91, 255, 97, 98, 92, 255, 101, 102, 96, 255, 103, 103, 96, 255, 100, 101, 94, 255, 101, 103, 94, 255, 97, 100, 90, 255, 90, 94, 83, 255, 90, 93, 83, 255, 87, 90, 80, 255, 87, 90, 81, 255, 95, 97, 90, 255, 94, 96, 88, 255, 88, 89, 81, 255, 87, 86, 80, 255, 76, 76, 69, 255, 70, 69, 63, 255, 70, 69, 64, 255, 69, 69, 63, 255, 67, 70, 64, 255, 78, 81, 74, 255, 91, 94, 85, 255, 96, 99, 90, 255, 95, 97, 88, 255, 97, 100, 91, 255, 100, 103, 93, 255, 99, 102, 93, 255, 101, 105, 97, 255, 104, 108, 101, 255, 103, 106, 99, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 100, 255, 108, 109, 100, 255, 113, 114, 106, 255, 118, 119, 111, 255, 119, 119, 112, 255, 120, 120, 112, 255, 117, 118, 110, 255, 118, 122, 114, 255, 114, 118, 111, 255, 102, 105, 97, 255, 97, 100, 91, 255, 99, 100, 92, 255, 107, 107, 101, 255, 114, 114, 108, 255, 107, 108, 103, 255, 103, 103, 99, 255, 105, 106, 102, 255, 103, 104, 100, 255, 99, 100, 96, 255, 99, 100, 95, 255, 102, 103, 98, 255, 109, 109, 104, 255, 110, 109, 104, 255, 113, 112, 107, 255, 112, 111, 105, 255, 106, 106, 100, 255, 97, 99, 92, 255, 95, 97, 90, 255, 98, 99, 92, 255, 97, 99, 90, 255, 97, 100, 90, 255, 101, 103, 93, 255, 99, 101, 92, 255, 94, 97, 87, 255, 92, 95, 85, 255, 90, 94, 84, 255, 95, 97, 90, 255, 101, 102, 95, 255, 104, 104, 97, 255, 92, 92, 85, 255, 76, 75, 69, 255, 74, 74, 68, 255, 75, 75, 69, 255, 71, 74, 67, 255, 69, 73, 67, 255, 64, 69, 63, 255, 73, 77, 70, 255, 79, 83, 75, 255, 90, 93, 85, 255, 99, 102, 93, 255, 101, 104, 96, 255, 106, 109, 103, 255, 109, 112, 106, 255, 107, 110, 104, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 106, 96, 255, 110, 112, 103, 255, 124, 124, 116, 255, 117, 118, 109, 255, 114, 115, 106, 255, 112, 113, 104, 255, 115, 117, 108, 255, 119, 122, 115, 255, 117, 121, 114, 255, 110, 113, 105, 255, 103, 106, 97, 255, 96, 98, 90, 255, 95, 98, 90, 255, 101, 103, 96, 255, 108, 107, 103, 255, 112, 110, 107, 255, 113, 112, 109, 255, 103, 104, 99, 255, 93, 94, 88, 255, 87, 88, 82, 255, 83, 84, 77, 255, 84, 85, 79, 255, 96, 97, 92, 255, 100, 101, 95, 255, 102, 102, 97, 255, 118, 116, 111, 255, 120, 118, 112, 255, 120, 118, 112, 255, 113, 113, 105, 255, 105, 107, 96, 255, 98, 101, 90, 255, 98, 101, 91, 255, 100, 103, 93, 255, 106, 108, 99, 255, 108, 110, 101, 255, 103, 106, 98, 255, 96, 100, 93, 255, 98, 101, 95, 255, 98, 102, 96, 255, 91, 95, 88, 255, 84, 87, 80, 255, 81, 83, 77, 255, 79, 81, 74, 255, 74, 77, 70, 255, 76, 80, 73, 255, 89, 92, 83, 255, 96, 98, 89, 255, 94, 97, 88, 255, 96, 99, 90, 255, 97, 100, 91, 255, 90, 94, 87, 255, 86, 90, 85, 255, 92, 96, 90, 255, 103, 106, 100, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 99, 88, 255, 97, 100, 89, 255, 96, 100, 89, 255, 101, 104, 94, 255, 108, 110, 101, 255, 117, 118, 109, 255, 122, 124, 116, 255, 121, 125, 118, 255, 113, 117, 109, 255, 101, 104, 95, 255, 102, 104, 96, 255, 108, 111, 103, 255, 114, 118, 111, 255, 118, 120, 115, 255, 117, 115, 112, 255, 119, 116, 114, 255, 118, 115, 113, 255, 113, 111, 108, 255, 100, 99, 94, 255, 90, 90, 83, 255, 87, 88, 81, 255, 84, 86, 79, 255, 85, 88, 82, 255, 97, 98, 92, 255, 100, 101, 95, 255, 103, 103, 97, 255, 112, 111, 105, 255, 113, 113, 107, 255, 109, 110, 102, 255, 111, 112, 102, 255, 118, 118, 108, 255, 124, 123, 112, 255, 127, 126, 114, 255, 119, 119, 108, 255, 111, 113, 103, 255, 109, 112, 104, 255, 110, 114, 108, 255, 107, 111, 104, 255, 102, 106, 100, 255, 103, 107, 100, 255, 101, 105, 99, 255, 95, 98, 92, 255, 87, 91, 85, 255, 86, 90, 84, 255, 87, 92, 86, 255, 84, 89, 82, 255, 81, 85, 79, 255, 79, 83, 76, 255, 89, 92, 84, 255, 95, 98, 89, 255, 98, 102, 95, 255, 96, 100, 94, 255, 91, 95, 89, 255, 92, 94, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 103, 94, 255, 103, 105, 95, 255, 109, 111, 101, 255, 107, 109, 100, 255, 95, 98, 87, 255, 91, 95, 84, 255, 93, 97, 86, 255, 99, 101, 91, 255, 106, 109, 99, 255, 107, 111, 100, 255, 105, 108, 97, 255, 100, 102, 91, 255, 94, 96, 84, 255, 100, 103, 93, 255, 105, 107, 100, 255, 109, 107, 103, 255, 110, 108, 105, 255, 111, 109, 106, 255, 106, 104, 100, 255, 100, 99, 94, 255, 101, 99, 94, 255, 103, 102, 97, 255, 101, 103, 95, 255, 98, 102, 92, 255, 102, 105, 96, 255, 103, 106, 97, 255, 100, 102, 95, 255, 97, 98, 93, 255, 100, 101, 95, 255, 112, 113, 104, 255, 116, 118, 107, 255, 116, 117, 107, 255, 117, 118, 108, 255, 121, 122, 111, 255, 122, 123, 112, 255, 119, 120, 109, 255, 115, 117, 106, 255, 105, 108, 98, 255, 99, 102, 94, 255, 99, 102, 95, 255, 105, 109, 103, 255, 105, 108, 102, 255, 98, 102, 96, 255, 94, 97, 92, 255, 93, 97, 92, 255, 94, 97, 93, 255, 88, 92, 86, 255, 85, 89, 83, 255, 87, 91, 85, 255, 90, 94, 88, 255, 90, 95, 88, 255, 88, 92, 85, 255, 87, 91, 85, 255, 91, 94, 89, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 93, 255, 103, 105, 94, 255, 103, 105, 94, 255, 103, 104, 94, 255, 103, 104, 94, 255, 96, 98, 88, 255, 91, 94, 84, 255, 94, 97, 87, 255, 95, 98, 86, 255, 96, 98, 87, 255, 102, 105, 95, 255, 109, 113, 105, 255, 103, 106, 97, 255, 92, 94, 82, 255, 91, 93, 84, 255, 91, 94, 88, 255, 91, 94, 89, 255, 92, 95, 90, 255, 91, 92, 86, 255, 91, 92, 85, 255, 89, 90, 83, 255, 91, 93, 85, 255, 96, 99, 90, 255, 101, 104, 95, 255, 104, 108, 99, 255, 109, 111, 104, 255, 112, 114, 107, 255, 107, 110, 102, 255, 108, 111, 103, 255, 121, 123, 114, 255, 123, 125, 115, 255, 124, 126, 115, 255, 124, 125, 113, 255, 121, 122, 111, 255, 114, 115, 105, 255, 113, 114, 104, 255, 111, 114, 103, 255, 110, 113, 102, 255, 102, 104, 95, 255, 94, 96, 87, 255, 90, 92, 83, 255, 89, 91, 82, 255, 95, 97, 89, 255, 102, 105, 98, 255, 109, 111, 108, 255, 112, 114, 112, 255, 112, 114, 112, 255, 110, 112, 110, 255, 104, 107, 104, 255, 92, 96, 91, 255, 92, 95, 89, 255, 102, 102, 96, 255, 97, 99, 92, 255, 92, 95, 88, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 120, 111, 255, 111, 112, 101, 255, 99, 101, 91, 255, 101, 103, 93, 255, 105, 106, 96, 255, 110, 111, 100, 255, 112, 113, 102, 255, 106, 106, 98, 255, 99, 99, 92, 255, 96, 97, 89, 255, 100, 101, 92, 255, 101, 103, 93, 255, 99, 101, 90, 255, 96, 98, 86, 255, 97, 100, 92, 255, 98, 100, 96, 255, 89, 93, 87, 255, 85, 89, 83, 255, 88, 92, 86, 255, 86, 90, 84, 255, 82, 86, 80, 255, 83, 86, 80, 255, 91, 94, 87, 255, 93, 96, 88, 255, 93, 97, 88, 255, 104, 107, 99, 255, 111, 113, 106, 255, 113, 115, 108, 255, 114, 116, 108, 255, 113, 114, 106, 255, 107, 107, 100, 255, 110, 111, 103, 255, 118, 120, 112, 255, 125, 127, 118, 255, 124, 127, 118, 255, 115, 117, 107, 255, 107, 110, 99, 255, 109, 112, 101, 255, 110, 114, 103, 255, 103, 106, 96, 255, 89, 91, 82, 255, 87, 88, 80, 255, 85, 87, 79, 255, 91, 94, 85, 255, 94, 97, 87, 255, 94, 97, 88, 255, 100, 103, 95, 255, 106, 109, 102, 255, 105, 109, 103, 255, 104, 106, 103, 255, 101, 103, 99, 255, 95, 99, 92, 255, 94, 98, 91, 255, 100, 101, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 97, 255, 110, 111, 101, 255, 119, 119, 108, 255, 127, 127, 115, 255, 128, 128, 116, 255, 120, 120, 109, 255, 107, 108, 99, 255, 106, 106, 98, 255, 112, 112, 105, 255, 112, 112, 105, 255, 108, 109, 101, 255, 107, 107, 100, 255, 111, 111, 104, 255, 110, 110, 103, 255, 101, 102, 95, 255, 97, 99, 93, 255, 98, 100, 96, 255, 94, 96, 92, 255, 85, 89, 83, 255, 79, 84, 77, 255, 82, 86, 79, 255, 86, 89, 83, 255, 88, 90, 85, 255, 89, 91, 85, 255, 92, 93, 88, 255, 98, 98, 94, 255, 102, 103, 98, 255, 104, 106, 99, 255, 104, 106, 98, 255, 107, 108, 101, 255, 113, 114, 106, 255, 116, 117, 109, 255, 118, 120, 112, 255, 118, 120, 112, 255, 119, 122, 114, 255, 114, 116, 107, 255, 103, 104, 93, 255, 97, 97, 85, 255, 96, 96, 84, 255, 101, 103, 91, 255, 106, 108, 97, 255, 109, 113, 102, 255, 103, 107, 97, 255, 99, 102, 93, 255, 99, 102, 93, 255, 100, 103, 94, 255, 96, 99, 90, 255, 102, 106, 97, 255, 108, 112, 103, 255, 109, 113, 104, 255, 109, 111, 104, 255, 111, 111, 106, 255, 109, 110, 105, 255, 102, 103, 97, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 110, 102, 255, 114, 114, 107, 255, 113, 113, 105, 255, 114, 114, 106, 255, 119, 119, 111, 255, 122, 122, 114, 255, 120, 120, 112, 255, 121, 120, 113, 255, 118, 118, 111, 255, 109, 109, 102, 255, 99, 99, 91, 255, 103, 103, 96, 255, 107, 107, 100, 255, 104, 104, 97, 255, 102, 103, 95, 255, 107, 107, 100, 255, 106, 106, 99, 255, 99, 99, 92, 255, 95, 97, 91, 255, 97, 99, 94, 255, 95, 97, 92, 255, 91, 93, 88, 255, 87, 90, 85, 255, 87, 89, 85, 255, 95, 96, 91, 255, 103, 103, 97, 255, 106, 106, 100, 255, 105, 106, 100, 255, 109, 111, 105, 255, 120, 122, 117, 255, 119, 121, 116, 255, 116, 117, 112, 255, 113, 115, 108, 255, 117, 119, 111, 255, 117, 120, 111, 255, 111, 114, 103, 255, 106, 109, 97, 255, 103, 105, 93, 255, 100, 101, 89, 255, 101, 102, 90, 255, 105, 108, 95, 255, 108, 111, 100, 255, 109, 112, 103, 255, 104, 107, 98, 255, 92, 95, 87, 255, 89, 91, 83, 255, 82, 83, 75, 255, 81, 82, 75, 255, 90, 92, 85, 255, 96, 98, 92, 255, 100, 101, 96, 255, 109, 109, 104, 255, 114, 113, 108, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 109, 100, 255, 109, 110, 102, 255, 110, 111, 104, 255, 112, 112, 106, 255, 117, 116, 110, 255, 108, 108, 102, 255, 99, 100, 93, 255, 97, 97, 90, 255, 98, 98, 90, 255, 100, 100, 93, 255, 102, 103, 95, 255, 108, 108, 101, 255, 111, 111, 104, 255, 115, 115, 108, 255, 116, 116, 109, 255, 106, 106, 99, 255, 93, 95, 89, 255, 93, 96, 91, 255, 100, 102, 98, 255, 98, 100, 95, 255, 92, 94, 89, 255, 96, 97, 91, 255, 100, 101, 95, 255, 96, 97, 90, 255, 93, 96, 86, 255, 97, 100, 91, 255, 103, 106, 98, 255, 110, 113, 107, 255, 119, 123, 118, 255, 125, 128, 124, 255, 118, 120, 114, 255, 108, 109, 100, 255, 101, 103, 92, 255, 102, 104, 93, 255, 111, 115, 104, 255, 113, 118, 106, 255, 113, 117, 106, 255, 114, 117, 107, 255, 119, 120, 112, 255, 118, 119, 111, 255, 104, 107, 99, 255, 94, 98, 91, 255, 85, 90, 82, 255, 83, 86, 79, 255, 85, 87, 80, 255, 96, 96, 90, 255, 100, 100, 94, 255, 104, 104, 99, 255, 111, 110, 104, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 100, 255, 102, 103, 97, 255, 89, 92, 86, 255, 86, 88, 82, 255, 87, 89, 80, 255, 93, 95, 87, 255, 98, 99, 92, 255, 105, 105, 97, 255, 110, 110, 103, 255, 111, 110, 103, 255, 109, 109, 102, 255, 102, 104, 98, 255, 95, 98, 92, 255, 92, 95, 89, 255, 97, 99, 94, 255, 99, 102, 97, 255, 99, 102, 97, 255, 100, 102, 96, 255, 102, 104, 97, 255, 106, 108, 101, 255, 96, 98, 89, 255, 91, 93, 82, 255, 91, 93, 83, 255, 94, 96, 87, 255, 103, 105, 97, 255, 107, 108, 102, 255, 104, 105, 97, 255, 100, 100, 92, 255, 96, 96, 88, 255, 96, 97, 88, 255, 101, 103, 93, 255, 101, 103, 92, 255, 100, 103, 93, 255, 103, 106, 98, 255, 103, 106, 98, 255, 97, 101, 93, 255, 96, 99, 92, 255, 99, 101, 94, 255, 99, 101, 94, 255, 97, 100, 92, 255, 102, 104, 95, 255, 107, 108, 100, 255, 109, 109, 102, 255, 103, 103, 96, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 93, 255, 96, 99, 93, 255, 98, 100, 95, 255, 95, 97, 91, 255, 93, 95, 88, 255, 100, 102, 96, 255, 105, 106, 100, 255, 103, 105, 99, 255, 107, 109, 104, 255, 110, 112, 108, 255, 105, 107, 102, 255, 101, 103, 98, 255, 99, 101, 96, 255, 99, 102, 96, 255, 101, 103, 94, 255, 98, 99, 90, 255, 100, 101, 91, 255, 98, 99, 89, 255, 92, 94, 84, 255, 93, 94, 84, 255, 92, 93, 83, 255, 99, 99, 91, 255, 105, 106, 99, 255, 113, 113, 106, 255, 107, 107, 100, 255, 97, 96, 88, 255, 94, 93, 84, 255, 93, 92, 84, 255, 91, 92, 85, 255, 90, 92, 87, 255, 88, 91, 85, 255, 89, 92, 85, 255, 87, 90, 84, 255, 85, 89, 82, 255, 92, 95, 88, 255, 98, 100, 92, 255, 103, 103, 95, 255, 110, 111, 102, 255, 111, 111, 103, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 89, 80, 255, 86, 90, 80, 255, 93, 97, 87, 255, 96, 99, 89, 255, 96, 99, 89, 255, 109, 111, 104, 255, 116, 117, 112, 255, 118, 120, 116, 255, 114, 115, 109, 255, 108, 109, 100, 255, 100, 101, 92, 255, 105, 105, 96, 255, 107, 107, 98, 255, 116, 116, 105, 255, 112, 113, 102, 255, 108, 108, 98, 255, 97, 98, 89, 255, 98, 99, 91, 255, 103, 103, 96, 255, 98, 98, 91, 255, 96, 96, 88, 255, 94, 93, 84, 255, 93, 92, 84, 255, 85, 86, 78, 255, 82, 84, 79, 255, 86, 88, 84, 255, 89, 91, 87, 255, 89, 91, 86, 255, 86, 88, 83, 255, 88, 91, 86, 255, 92, 94, 88, 255, 97, 98, 91, 255, 106, 106, 98, 255, 113, 113, 105, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 99, 88, 255, 102, 105, 95, 255, 108, 110, 101, 255, 109, 111, 102, 255, 108, 110, 101, 255, 110, 113, 104, 255, 119, 119, 110, 255, 119, 119, 109, 255, 122, 121, 111, 255, 115, 115, 105, 255, 107, 107, 98, 255, 107, 107, 98, 255, 108, 108, 100, 255, 105, 105, 98, 255, 100, 100, 93, 255, 106, 105, 98, 255, 107, 106, 99, 255, 101, 101, 93, 255, 97, 97, 90, 255, 99, 99, 94, 255, 96, 97, 94, 255, 87, 89, 84, 255, 83, 85, 80, 255, 75, 78, 72, 255, 82, 85, 80, 255, 86, 89, 84, 255, 89, 92, 86, 255, 89, 92, 85, 255, 96, 97, 91, 255, 100, 102, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 111, 255, 116, 117, 110, 255, 115, 115, 109, 255, 118, 117, 112, 255, 121, 119, 113, 255, 118, 118, 110, 255, 112, 112, 103, 255, 106, 106, 98, 255, 99, 100, 92, 255, 95, 96, 88, 255, 94, 95, 87, 255, 98, 99, 91, 255, 101, 101, 94, 255, 100, 101, 94, 255, 105, 106, 100, 255, 106, 108, 102, 255, 100, 102, 95, 255, 94, 96, 89, 255, 94, 96, 90, 255, 96, 97, 93, 255, 94, 96, 92, 255, 90, 92, 86, 255, 87, 90, 83, 255, 92, 94, 87, 255, 98, 100, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 111, 255, 109, 112, 104, 255, 103, 106, 99, 255, 93, 94, 88, 255, 86, 88, 80, 255, 88, 90, 82, 255, 87, 89, 81, 255, 89, 91, 81, 255, 91, 93, 84, 255, 96, 97, 89, 255, 99, 101, 93, 255, 106, 107, 102, 255, 112, 113, 109, 255, 110, 112, 108, 255, 107, 109, 104, 255, 94, 96, 88, 255, 90, 92, 83, 255, 96, 97, 90, 255, 97, 98, 92, 255, 91, 94, 87, 255, 92, 96, 87, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 103, 94, 255, 96, 98, 91, 255, 87, 89, 81, 255, 83, 86, 77, 255, 86, 89, 81, 255, 90, 92, 84, 255, 94, 96, 88, 255, 98, 99, 91, 255, 100, 102, 94, 255, 106, 107, 102, 255, 101, 103, 96, 255, 97, 100, 91, 255, 96, 97, 89, 255, 95, 96, 89, 255, 95, 95, 88, 255, 96, 97, 90, 255, 100, 101, 92, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 101, 92, 255, 100, 101, 93, 255, 97, 98, 90, 255, 95, 96, 88, 255, 98, 99, 91, 255, 104, 105, 98, 255, 103, 104, 98, 255, 105, 106, 100, 255, 112, 113, 109, 255, 111, 111, 107, 255, 107, 107, 102, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 87, 78, 255, 82, 85, 76, 255, 88, 90, 82, 255, 96, 98, 89, 255, 96, 98, 89, 255, 103, 105, 97, 255, 112, 114, 107, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 100, 90, 255, 102, 104, 95, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -42,7 +42,7 @@ data = { } [sub_resource type="ImageTexture" id="ImageTexture_35hew"] -image = SubResource("Image_kf41u") +image = SubResource("Image_gn8c5") [sub_resource type="BoxShape3D" id="BoxShape3D_d3j6k"] diff --git a/funbox.glb b/funbox.glb new file mode 100644 index 0000000000000000000000000000000000000000..592f730ce2ef3ea9f794297dcd4385c0a70d5f40 GIT binary patch literal 13044 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 aMpnjY46KZd49^%`8TA>TG3Ya{X8-`RfTJJ) literal 0 HcmV?d00001 diff --git a/funbox.glb.import b/funbox.glb.import new file mode 100644 index 0000000..9d60d1b --- /dev/null +++ b/funbox.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dx0ixlcxcxpcg" +path="res://.godot/imported/funbox.glb-d1e31206a7865f3af16dc0128c2d024a.scn" + +[deps] + +source_file="res://funbox.glb" +dest_files=["res://.godot/imported/funbox.glb-d1e31206a7865f3af16dc0128c2d024a.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"meshes": { +"funbox_Cube_001": { +"generate/lightmap_uv": 0, +"generate/lods": 0, +"generate/shadow_meshes": 0, +"lods/normal_merge_angle": 60.0, +"lods/normal_split_angle": 25.0, +"save_to_file/enabled": true, +"save_to_file/make_streamable": "", +"save_to_file/path": "res://textmesh.res" +} +} +} +gltf/embedded_image_handling=0 diff --git a/funbox.tscn b/funbox.tscn new file mode 100644 index 0000000..f182727 --- /dev/null +++ b/funbox.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=4 format=3 uid="uid://cbspcgdno2u5g"] + +[ext_resource type="PackedScene" uid="uid://dx0ixlcxcxpcg" path="res://funbox.glb" id="1_s5q5d"] +[ext_resource type="Texture2D" uid="uid://bmor4v4j7krgh" path="res://funboxtex.png" id="2_e8jej"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ppe8m"] +albedo_texture = ExtResource("2_e8jej") +texture_filter = 0 + +[node name="funbox" instance=ExtResource("1_s5q5d")] + +[node name="Cube" parent="." index="0"] +surface_material_override/0 = SubResource("StandardMaterial3D_ppe8m") diff --git a/funboxtex.png b/funboxtex.png new file mode 100644 index 0000000000000000000000000000000000000000..3b86f2b159ad2dc5bffe0d27f270d37b1f07da0c GIT binary patch literal 1801 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+%u*vf(|mmyv=|r|Bp4VN zJQx@l7~wP%qZ9)xRD^?38qOAAU|?XFQ1N~b0|NtRzMESyh!4iMw6>iC2^M%n7Bet# z3xP1>rMq>17#P@;JY5_^Dj46!?(dch6`A|qyXo37FCiB1hs*~Zytp^sI%~fnA$eh# zVz1&XCnts7(j4m=9Zc5h+*s0ayK_O4z!4>Z0GADdmuD>T>1uer@BE#I=WfsZ`RsW0 z=XbT=b0+@$S~sWo-OS(j_RKtc?i+s{*Pj`o33<~jJM={x7<;4{*%}yov=ipo88PrA z#4tYoGLbQX;W3xQ@_rr$W{L0v7PTo15(joL9eb(Fe1PGYsDYonBmrvFSq6FQb+(jOJSx%~n>b0FnNt-g2v z2gLavEPoryW3Z+9;MaHd(lMb?u4|uZ@J?ts@aV?>!ZRm0F7@o>^3QAtWnCPnuDqpW z(vbza6-7H$4l|s(dL`%FQpP0$D`p?m`rcOYL(AyExo@c-ow8V09Ae=A_s@IvzLSN! zO&R`0&fw4Zcl`bSpU+)n@Be-29#~Oh5Y*-`Ki&FSs4{AFm`#zD0#X+``R`pkG~z&l1DfNJUpXc{+JWiFK??8XZ5d0{iaKLgC9@8 ziwR88)9o~ONr|#qsKnc;@0!8Dc0&DL^Na%w%_)}ySDrql#j`+p+QooF3>TMNy=cI* zK-mw%@x5Pg`IEjo8*_mv&%476Y|ZC14>QE@Hvi7zF_?Xpr%l~1)s)TR2kW#SSrTs? zdl`9-rHQ20i*9&%b;FM92W2XzPnTRAA{B9y*FDHs==yqY+d{Si$M@cgxGxH%*2Dzy z-fCaHL$RUz%=h0DoNm73I-^)rzVXi_%M5ir<{wIrEqa)IPapDT_9)wwlA~vG>Eqf> z{6+_~T8(zz`yvq`mGJS{?4*@m`%f=)mblb5FIM4+Jb)*krk-{)+Uvh8^1*53iJ2_w!o${b}m;6~E^uy-L1r`F=A? z@rK7AcF0d(l)kxgW9{?jPd{Gy&tmM*rK4c`*PQh}>&;l}y`MiC-TVFf|2mn~$&$(^ z1O&L}94*VdWF}fJk)XA-^&2xY2k)7X4NW#|eyrEtFVEu(_|EhGdUxfS>)f}VG4L^; zWvsFBJ^!X|r@-;Z)P^eu%NZX^WGuU{9uUlS{~^~mkqhlhmTpR6n#cPhrtpKt3H93J zaTSF{nIZg)e!5a@Kjxb6>^g7#m6AX`Tl@3(j%`eaxEOAJWFKa?!8vY{ysn z7R>j4^|*^MsQKj5|Hu3P1vCtoSAWJA8*H%jxJ+ zwhc0CB<>_ONUYMz+MLuNB44I;Ny~eMD09k5fhAF*4UADwPyScpnNZ&oEjev|OX8pW ztC<&$azD4z*;baf?b_4%Ejye3h+C~p>M6crX2hT=m}qTZq~f$XakkB>x96T$#Mi%_ zx*>}t@9n9r(v8tP_hpP6Dttq?uK2b3L2qyGqkDJXALUy2Q2Sw#kVe>1v4q{bcej2? zT)}+N>4n& z;Pzf+?G{6pjNTZ9I|dF4id)SV-(r|Od-kFd``;H`11okl1m-pzP1^WGBlS_~qbI9l zO~gapwlcbCt`zaP(yH)})BJk-{)>;FZ?xabbb{e>w%)4aDr_02c#@|~G~$;ytmu08 bKLhiVX#W*6`i@bhW@7Mk^>bP0l+XkK-2w;B literal 0 HcmV?d00001 diff --git a/funboxtex.png.import b/funboxtex.png.import new file mode 100644 index 0000000..c58d65a --- /dev/null +++ b/funboxtex.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmor4v4j7krgh" +path="res://.godot/imported/funboxtex.png-08d477b8edff9115126116319e7f210a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://funboxtex.png" +dest_files=["res://.godot/imported/funboxtex.png-08d477b8edff9115126116319e7f210a.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=true +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=0 diff --git a/textmesh.res b/textmesh.res new file mode 100644 index 0000000000000000000000000000000000000000..47e4e1835d8b065967da01635f3ca2b3fdaa4bef GIT binary patch literal 7420 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%0A1)Wk=ueUP^F^v&;8E_& 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