From 1500c22ccc9a572f6d625b3469f0c3d01b90ed46 Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Wed, 15 Nov 2023 15:19:40 +1100 Subject: [PATCH] inching towards better class inheritence and multiplayer compatibility --- Assets/TextureAtlases/g_accelerator.tres | 7 -- Assets/TextureAtlases/g_assault.tres | 7 -- Assets/TextureAtlases/g_glue_gun.tres | 7 -- Assets/TextureAtlases/g_grenade_launcher.tres | 7 -- Assets/TextureAtlases/g_rocket_launcher.tres | 7 -- Assets/TextureAtlases/g_sniper.tres | 7 -- Assets/TextureAtlases/gun.tres | 8 -- Assets/TextureAtlases/target_list.tres | 2 +- Assets/Textures/8directionplayer.png | Bin 1552 -> 0 bytes PCs/Blue/blue.tres | 6 +- PCs/Green/green.tres | 8 +- PCs/Red/red.tres | 8 +- .../ClassCards/Assault/card_assault.tres | 26 ++--- .../ClassCards/Assault}/g_assault.png | Bin .../ClassCards/Assault}/g_assault.png.import | 6 +- .../ClassCards/Assault/tower_assault.gd | 2 + .../ClassCards/Assault/tower_assault.tscn | 46 ++------- .../ClassCards/Assault/tower_stats.tres | 25 +++++ PCs/Universal/ClassCards/Assault/weapon.gd | 73 -------------- .../ClassCards/Assault/weapon_assault.gd | 2 + .../ClassCards/Assault/weapon_assault.tscn | 65 +++---------- .../ClassCards/Assault/weapon_stats.tres | 25 +++++ .../ClassCards/Blowdart/blowdart.png | Bin 0 -> 1777 bytes .../ClassCards/Blowdart/blowdart.png.import | 35 +++++++ .../ClassCards/Blowdart/blowdartweapon.gd | 17 ---- .../ClassCards/Blowdart/card_blowdart.tres | 18 +--- .../ClassCards/Blowdart/weapon_blowdart.gd | 8 ++ .../ClassCards/Blowdart/weapon_blowdart.tscn | 73 ++++---------- .../ClassCards/Blowdart/weapon_stats.tres | 24 +++++ PCs/Universal/ClassCards/BombLauncher/bomb.gd | 20 ---- .../ClassCards/BombLauncher}/bomb.png | Bin .../ClassCards/BombLauncher}/bomb.png.import | 6 +- .../ClassCards/BombLauncher/bomb.tscn | 29 ------ .../BombLauncher/bomb_projectile.gd | 16 +++ .../BombLauncher/bomb_projectile.tscn | 17 ++++ .../ClassCards/BombLauncher/bombweapon.gd | 21 ---- .../BombLauncher/card_bomb_launcher.tres | 23 +++++ .../BombLauncher/card_grenade_launcher.tres | 19 ---- .../BombLauncher}/grenade_launcher.png | Bin .../BombLauncher}/grenade_launcher.png.import | 6 +- .../BombLauncher/tower_bomb_launcher.gd | 20 ++++ .../BombLauncher/tower_bomb_launcher.tscn | 46 ++------- .../ClassCards/BombLauncher/tower_stats.tres | 25 +++++ .../BombLauncher/weapon_bomb_launcher.gd | 8 ++ .../BombLauncher/weapon_bomb_launcher.tscn | 66 ++----------- .../ClassCards/BombLauncher/weapon_stats.tres | 25 +++++ .../DamageEnhancer/card_damage_enhancer.tres | 2 +- .../ClassCards/Fireball/card_fireball.tres | 26 ++--- PCs/Universal/ClassCards/Fireball/fireball.gd | 32 ------ .../ClassCards/Fireball/fireball.png | Bin 0 -> 2736 bytes .../ClassCards/Fireball/fireball.png.import | 34 +++++++ .../ClassCards/Fireball/fireball.tscn | 30 ------ .../Fireball/fireball_projectile.gd | 8 ++ .../Fireball/fireball_projectile.png | Bin 0 -> 1181 bytes .../Fireball/fireball_projectile.png.import | 34 +++++++ .../Fireball/fireball_projectile.tscn | 13 +++ .../ClassCards/Fireball/fireballweapon.gd | 16 --- .../ClassCards/Fireball/weapon_fireball.gd | 2 + .../ClassCards/Fireball/weapon_fireball.tscn | 90 +++-------------- .../ClassCards/Fireball/weapon_stats.tres | 8 ++ .../GammaLaser/card_gamma_laser.tres | 2 +- .../ClassCards/Gatling/card_gatling.tres | 26 ++--- .../Universal/ClassCards/Gatling/gatling.png | Bin .../ClassCards/Gatling/gatling.png.import | 6 +- .../ClassCards/Gatling/speedytower.gd | 32 ------ .../ClassCards/Gatling/speedyweapon.gd | 60 ------------ .../ClassCards/Gatling/tower_gatling.gd | 38 ++++++++ .../ClassCards/Gatling/tower_gatling.tscn | 62 ++---------- .../ClassCards/Gatling/tower_stats.tres | 37 +++++++ .../ClassCards/Gatling/weapon_gatling.gd | 36 +++++++ .../ClassCards/Gatling/weapon_gatling.tscn | 65 +++---------- .../ClassCards/Gatling/weapon_stats.tres | 37 +++++++ .../GlueLauncher/card_glue_launcher.tres | 20 +--- .../ClassCards/GlueLauncher}/glue_gun.png | Bin .../GlueLauncher}/glue_gun.png.import | 6 +- .../ClassCards/GlueLauncher/stickyweapon.gd | 17 ---- .../GlueLauncher/weapon_glue_launcher.gd | 7 ++ .../GlueLauncher/weapon_glue_launcher.tscn | 71 +++----------- .../ClassCards/GlueLauncher/weapon_stats.tres | 24 +++++ .../ClassCards/Icicle/card_icicle.tres | 26 ++--- PCs/Universal/ClassCards/Icicle/icicle.gd | 32 ------ PCs/Universal/ClassCards/Icicle/icicle.png | Bin 0 -> 2588 bytes .../ClassCards/Icicle/icicle.png.import | 34 +++++++ PCs/Universal/ClassCards/Icicle/icicle.tscn | 30 ------ .../ClassCards/Icicle/icicle_projectile.gd | 8 ++ .../ClassCards/Icicle/icicle_projectile.png | Bin 0 -> 969 bytes .../Icicle/icicle_projectile.png.import | 8 +- .../ClassCards/Icicle/icicle_projectile.tscn | 13 +++ .../ClassCards/Icicle/icicleweapon.gd | 16 --- .../ClassCards/Icicle/weapon_icicle.gd | 2 + .../ClassCards/Icicle/weapon_icicle.tscn | 90 +++-------------- .../ClassCards/Icicle/weapon_stats.tres | 8 ++ .../ClassCards/Lightning/card_lightning.tres | 2 +- .../ClassCards/Reactor/card_reactor.tres | 2 +- .../Refridgerator/card_refridgerator.tres | 2 +- .../RocketLauncher/card_rocket_launcher.tres | 30 +++--- .../ClassCards/RocketLauncher/rocket.gd | 33 ------- .../ClassCards/RocketLauncher/rocket.png | Bin 0 -> 835 bytes .../RocketLauncher/rocket.png.import | 34 +++++++ .../ClassCards/RocketLauncher/rocket.png.kra | Bin 0 -> 7619 bytes .../ClassCards/RocketLauncher/rocket.tscn | 30 ------ .../RocketLauncher}/rocket_launcher.png | Bin .../rocket_launcher.png.import | 6 +- .../RocketLauncher/rocket_projectile.gd | 2 + .../RocketLauncher/rocket_projectile.tscn | 14 +++ .../RocketLauncher/rocket_weapon.gd | 66 ------------- .../RocketLauncher}/target_icon.png | Bin .../RocketLauncher}/target_icon.png.import | 6 +- .../RocketLauncher}/target_icon.tscn | 4 +- .../RocketLauncher}/target_list.png | Bin .../RocketLauncher}/target_list.png.import | 6 +- .../RocketLauncher/tower_rocket_launcher.gd | 75 ++++++++++++++ .../RocketLauncher/tower_rocket_launcher.tscn | 48 ++------- .../RocketLauncher/tower_stats.tres | 30 ++++++ .../RocketLauncher/weapon_rocket_launcher.gd | 76 +++++++++++++++ .../weapon_rocket_launcher.tscn | 87 +++++------------ .../RocketLauncher/weapon_stats.tres | 25 +++++ .../ClassCards/Sniper/card_sniper.tres | 26 ++--- .../Universal/ClassCards/Sniper}/g_sniper.png | Bin .../ClassCards/Sniper}/g_sniper.png.import | 6 +- .../ClassCards/Sniper}/scopetest.png | Bin .../ClassCards/Sniper}/scopetest.png.import | 6 +- .../ClassCards/Sniper/tower_sniper.gd | 2 + .../ClassCards/Sniper/tower_sniper.tscn | 43 ++------ .../ClassCards/Sniper/tower_stats.tres | 25 +++++ .../{scopedweapon.gd => weapon_sniper.gd} | 10 +- .../ClassCards/Sniper/weapon_sniper.tscn | 91 ++++------------- .../ClassCards/Sniper/weapon_stats.tres | 25 +++++ .../SpeedEnhancer/card_speed_enhancer.tres | 11 --- PCs/hero.gd | 19 ++-- PCs/hero.tscn | 4 +- Resources/TurretStats/accelerator.tres | 10 -- Resources/TurretStats/assault.tres | 10 -- Resources/TurretStats/blowdart.tres | 10 -- Resources/TurretStats/bomblauncher.tres | 10 -- Resources/TurretStats/fireball.tres | 10 -- Resources/TurretStats/flametower.tres | 10 -- Resources/TurretStats/glue.tres | 10 -- Resources/TurretStats/icicle.tres | 10 -- Resources/TurretStats/reactor.tres | 10 -- Resources/TurretStats/refridgerator.tres | 10 -- Resources/TurretStats/rocketlauncher.tres | 10 -- Resources/TurretStats/sniper.tres | 10 -- Resources/WeaponStats/accelerator.tres | 9 -- Resources/WeaponStats/assault.tres | 9 -- Resources/WeaponStats/blowdart.tres | 9 -- Resources/WeaponStats/bomblauncher.tres | 9 -- Resources/WeaponStats/fireball.tres | 9 -- Resources/WeaponStats/flamethrower.tres | 9 -- Resources/WeaponStats/glue.tres | 9 -- Resources/WeaponStats/icicle.tres | 9 -- Resources/WeaponStats/reactor.tres | 9 -- Resources/WeaponStats/refridgerator.tres | 9 -- Resources/WeaponStats/rocketlauncher.tres | 9 -- Resources/WeaponStats/sniper.tres | 9 -- Scenes/Projectiles/explosive_projectile.tscn | 8 ++ Scenes/Projectiles/homing_projectile.tscn | 10 ++ Scenes/Projectiles/projectile.tscn | 24 +++++ .../status_applying_projectile.tscn | 9 ++ Scenes/Towers/hitscan_tower.tscn | 7 ++ Scenes/Towers/projectile_tower.tscn | 8 ++ Scenes/Towers/tower.tscn | 48 +++++++++ Scenes/UI/card_hand.tscn | 72 +++----------- Scenes/Weapons/hitscan_weapon.tscn | 26 +++++ Scenes/Weapons/projectile_weapon.tscn | 8 ++ Scenes/Weapons/status_applying_weapon.tscn | 8 ++ Scenes/Weapons/weapon.tscn | 54 ++++++++++ Scripts/AStarGraph3D.gd | 2 +- Scripts/{ => EnemyAI}/beelining_controller.gd | 0 Scripts/{ => EnemyAI}/enemy_movement.gd | 0 Scripts/{ => EnemyAI}/pathing_controller.gd | 0 Scripts/Projectiles/explosive_projectile.gd | 34 +++++++ Scripts/Projectiles/homing_projectile.gd | 17 ++++ Scripts/Projectiles/projectile.gd | 23 +++++ .../Projectiles/status_applying_projectile.gd | 15 +++ Scripts/Resources/TowerStats.gd | 7 -- Scripts/Resources/WeaponStats.gd | 6 -- Scripts/Resources/card.gd | 12 +-- Scripts/Resources/card_text.gd | 13 +++ Scripts/Resources/stat_attribute.gd | 5 + Scripts/StatusEffects/StatusOnFire.gd | 6 -- .../{status_poison.gd => status_dot.gd} | 2 +- Scripts/StatusEffects/status_radioactive.gd | 5 - .../{status_cold.gd => status_slow.gd} | 3 +- Scripts/StatusEffects/status_sticky.gd | 10 -- Scripts/Towers/hitscan_tower.gd | 13 +++ Scripts/Towers/projectile_tower.gd | 30 ++++++ Scripts/Towers/tower.gd | 92 ++++++++++++++++++ Scripts/Weapons/hitscan_weapon.gd | 37 +++++++ Scripts/Weapons/projectile_weapon.gd | 25 +++++ Scripts/Weapons/status_applying_weapon.gd | 15 +++ Scripts/Weapons/weapon.gd | 58 +++++++++++ Scripts/card_hand.gd | 27 +++-- Scripts/data.gd | 33 ++++--- Scripts/edit_tool.gd | 2 +- Scripts/game.gd | 7 +- Scripts/ground_enemy_controller.gd | 2 - .../ClassCards/Assault => Scripts}/tower.gd | 3 +- Scripts/tower_base.gd | 4 +- Scripts/wave_manager.gd | 8 +- Worlds/GreenPlanet/Enemies/air_enemy.tscn | 5 +- .../GreenPlanet/Enemies/enemy_controller.gd | 3 +- Worlds/GreenPlanet/Enemies/land_enemy.tscn | 9 +- Worlds/GreenPlanet/tilemap.tres | 8 +- 204 files changed, 1920 insertions(+), 1951 deletions(-) delete mode 100644 Assets/TextureAtlases/g_accelerator.tres delete mode 100644 Assets/TextureAtlases/g_assault.tres delete mode 100644 Assets/TextureAtlases/g_glue_gun.tres delete mode 100644 Assets/TextureAtlases/g_grenade_launcher.tres delete mode 100644 Assets/TextureAtlases/g_rocket_launcher.tres delete mode 100644 Assets/TextureAtlases/g_sniper.tres delete mode 100644 Assets/TextureAtlases/gun.tres delete mode 100644 Assets/Textures/8directionplayer.png rename {Assets/Textures => PCs/Universal/ClassCards/Assault}/g_assault.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/Assault}/g_assault.png.import (70%) create mode 100644 PCs/Universal/ClassCards/Assault/tower_assault.gd create mode 100644 PCs/Universal/ClassCards/Assault/tower_stats.tres delete mode 100644 PCs/Universal/ClassCards/Assault/weapon.gd create mode 100644 PCs/Universal/ClassCards/Assault/weapon_assault.gd create mode 100644 PCs/Universal/ClassCards/Assault/weapon_stats.tres create mode 100644 PCs/Universal/ClassCards/Blowdart/blowdart.png create mode 100644 PCs/Universal/ClassCards/Blowdart/blowdart.png.import delete mode 100644 PCs/Universal/ClassCards/Blowdart/blowdartweapon.gd create mode 100644 PCs/Universal/ClassCards/Blowdart/weapon_blowdart.gd create mode 100644 PCs/Universal/ClassCards/Blowdart/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/BombLauncher/bomb.gd rename {Assets/Textures => PCs/Universal/ClassCards/BombLauncher}/bomb.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/BombLauncher}/bomb.png.import (71%) delete mode 100644 PCs/Universal/ClassCards/BombLauncher/bomb.tscn create mode 100644 PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd create mode 100644 PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn delete mode 100644 PCs/Universal/ClassCards/BombLauncher/bombweapon.gd create mode 100644 PCs/Universal/ClassCards/BombLauncher/card_bomb_launcher.tres delete mode 100644 PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres rename {Assets/Textures => PCs/Universal/ClassCards/BombLauncher}/grenade_launcher.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/BombLauncher}/grenade_launcher.png.import (67%) create mode 100644 PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.gd create mode 100644 PCs/Universal/ClassCards/BombLauncher/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.gd create mode 100644 PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/Fireball/fireball.gd create mode 100644 PCs/Universal/ClassCards/Fireball/fireball.png create mode 100644 PCs/Universal/ClassCards/Fireball/fireball.png.import delete mode 100644 PCs/Universal/ClassCards/Fireball/fireball.tscn create mode 100644 PCs/Universal/ClassCards/Fireball/fireball_projectile.gd create mode 100644 PCs/Universal/ClassCards/Fireball/fireball_projectile.png create mode 100644 PCs/Universal/ClassCards/Fireball/fireball_projectile.png.import create mode 100644 PCs/Universal/ClassCards/Fireball/fireball_projectile.tscn delete mode 100644 PCs/Universal/ClassCards/Fireball/fireballweapon.gd create mode 100644 PCs/Universal/ClassCards/Fireball/weapon_fireball.gd create mode 100644 PCs/Universal/ClassCards/Fireball/weapon_stats.tres rename Assets/Textures/accelerator.png => PCs/Universal/ClassCards/Gatling/gatling.png (100%) rename Assets/Textures/accelerator.png.import => PCs/Universal/ClassCards/Gatling/gatling.png.import (70%) delete mode 100644 PCs/Universal/ClassCards/Gatling/speedytower.gd delete mode 100644 PCs/Universal/ClassCards/Gatling/speedyweapon.gd create mode 100644 PCs/Universal/ClassCards/Gatling/tower_gatling.gd create mode 100644 PCs/Universal/ClassCards/Gatling/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/Gatling/weapon_gatling.gd create mode 100644 PCs/Universal/ClassCards/Gatling/weapon_stats.tres rename {Assets/Textures => PCs/Universal/ClassCards/GlueLauncher}/glue_gun.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/GlueLauncher}/glue_gun.png.import (69%) delete mode 100644 PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd create mode 100644 PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.gd create mode 100644 PCs/Universal/ClassCards/GlueLauncher/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/Icicle/icicle.gd create mode 100644 PCs/Universal/ClassCards/Icicle/icicle.png create mode 100644 PCs/Universal/ClassCards/Icicle/icicle.png.import delete mode 100644 PCs/Universal/ClassCards/Icicle/icicle.tscn create mode 100644 PCs/Universal/ClassCards/Icicle/icicle_projectile.gd create mode 100644 PCs/Universal/ClassCards/Icicle/icicle_projectile.png rename Assets/Textures/8directionplayer.png.import => PCs/Universal/ClassCards/Icicle/icicle_projectile.png.import (64%) create mode 100644 PCs/Universal/ClassCards/Icicle/icicle_projectile.tscn delete mode 100644 PCs/Universal/ClassCards/Icicle/icicleweapon.gd create mode 100644 PCs/Universal/ClassCards/Icicle/weapon_icicle.gd create mode 100644 PCs/Universal/ClassCards/Icicle/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket.gd create mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket.png create mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket.png.import create mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket.png.kra delete mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket.tscn rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/rocket_launcher.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/rocket_launcher.png.import (70%) create mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.gd create mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn delete mode 100644 PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/target_icon.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/target_icon.png.import (68%) rename {Scenes => PCs/Universal/ClassCards/RocketLauncher}/target_icon.tscn (75%) rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/target_list.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/RocketLauncher}/target_list.png.import (69%) create mode 100644 PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.gd create mode 100644 PCs/Universal/ClassCards/RocketLauncher/tower_stats.tres create mode 100644 PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd create mode 100644 PCs/Universal/ClassCards/RocketLauncher/weapon_stats.tres rename {Assets/Textures => PCs/Universal/ClassCards/Sniper}/g_sniper.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/Sniper}/g_sniper.png.import (70%) rename {Assets/Textures => PCs/Universal/ClassCards/Sniper}/scopetest.png (100%) rename {Assets/Textures => PCs/Universal/ClassCards/Sniper}/scopetest.png.import (70%) create mode 100644 PCs/Universal/ClassCards/Sniper/tower_sniper.gd create mode 100644 PCs/Universal/ClassCards/Sniper/tower_stats.tres rename PCs/Universal/ClassCards/Sniper/{scopedweapon.gd => weapon_sniper.gd} (51%) create mode 100644 PCs/Universal/ClassCards/Sniper/weapon_stats.tres delete mode 100644 PCs/Universal/ClassCards/SpeedEnhancer/card_speed_enhancer.tres delete mode 100644 Resources/TurretStats/accelerator.tres delete mode 100644 Resources/TurretStats/assault.tres delete mode 100644 Resources/TurretStats/blowdart.tres delete mode 100644 Resources/TurretStats/bomblauncher.tres delete mode 100644 Resources/TurretStats/fireball.tres delete mode 100644 Resources/TurretStats/flametower.tres delete mode 100644 Resources/TurretStats/glue.tres delete mode 100644 Resources/TurretStats/icicle.tres delete mode 100644 Resources/TurretStats/reactor.tres delete mode 100644 Resources/TurretStats/refridgerator.tres delete mode 100644 Resources/TurretStats/rocketlauncher.tres delete mode 100644 Resources/TurretStats/sniper.tres delete mode 100644 Resources/WeaponStats/accelerator.tres delete mode 100644 Resources/WeaponStats/assault.tres delete mode 100644 Resources/WeaponStats/blowdart.tres delete mode 100644 Resources/WeaponStats/bomblauncher.tres delete mode 100644 Resources/WeaponStats/fireball.tres delete mode 100644 Resources/WeaponStats/flamethrower.tres delete mode 100644 Resources/WeaponStats/glue.tres delete mode 100644 Resources/WeaponStats/icicle.tres delete mode 100644 Resources/WeaponStats/reactor.tres delete mode 100644 Resources/WeaponStats/refridgerator.tres delete mode 100644 Resources/WeaponStats/rocketlauncher.tres delete mode 100644 Resources/WeaponStats/sniper.tres create mode 100644 Scenes/Projectiles/explosive_projectile.tscn create mode 100644 Scenes/Projectiles/homing_projectile.tscn create mode 100644 Scenes/Projectiles/projectile.tscn create mode 100644 Scenes/Projectiles/status_applying_projectile.tscn create mode 100644 Scenes/Towers/hitscan_tower.tscn create mode 100644 Scenes/Towers/projectile_tower.tscn create mode 100644 Scenes/Towers/tower.tscn create mode 100644 Scenes/Weapons/hitscan_weapon.tscn create mode 100644 Scenes/Weapons/projectile_weapon.tscn create mode 100644 Scenes/Weapons/status_applying_weapon.tscn create mode 100644 Scenes/Weapons/weapon.tscn rename Scripts/{ => EnemyAI}/beelining_controller.gd (100%) rename Scripts/{ => EnemyAI}/enemy_movement.gd (100%) rename Scripts/{ => EnemyAI}/pathing_controller.gd (100%) create mode 100644 Scripts/Projectiles/explosive_projectile.gd create mode 100644 Scripts/Projectiles/homing_projectile.gd create mode 100644 Scripts/Projectiles/projectile.gd create mode 100644 Scripts/Projectiles/status_applying_projectile.gd delete mode 100644 Scripts/Resources/TowerStats.gd delete mode 100644 Scripts/Resources/WeaponStats.gd create mode 100644 Scripts/Resources/card_text.gd create mode 100644 Scripts/Resources/stat_attribute.gd delete mode 100644 Scripts/StatusEffects/StatusOnFire.gd rename Scripts/StatusEffects/{status_poison.gd => status_dot.gd} (82%) delete mode 100644 Scripts/StatusEffects/status_radioactive.gd rename Scripts/StatusEffects/{status_cold.gd => status_slow.gd} (90%) delete mode 100644 Scripts/StatusEffects/status_sticky.gd create mode 100644 Scripts/Towers/hitscan_tower.gd create mode 100644 Scripts/Towers/projectile_tower.gd create mode 100644 Scripts/Towers/tower.gd create mode 100644 Scripts/Weapons/hitscan_weapon.gd create mode 100644 Scripts/Weapons/projectile_weapon.gd create mode 100644 Scripts/Weapons/status_applying_weapon.gd create mode 100644 Scripts/Weapons/weapon.gd delete mode 100644 Scripts/ground_enemy_controller.gd rename {PCs/Universal/ClassCards/Assault => Scripts}/tower.gd (97%) diff --git a/Assets/TextureAtlases/g_accelerator.tres b/Assets/TextureAtlases/g_accelerator.tres deleted file mode 100644 index fc7c31c..0000000 --- a/Assets/TextureAtlases/g_accelerator.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d1am28tgvwaa0"] - -[ext_resource type="Texture2D" uid="uid://cx5cwn11fuugq" path="res://Assets/Textures/accelerator.png" id="1_e3hoc"] - -[resource] -atlas = ExtResource("1_e3hoc") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_assault.tres b/Assets/TextureAtlases/g_assault.tres deleted file mode 100644 index 0c7b91e..0000000 --- a/Assets/TextureAtlases/g_assault.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://ca4lwwd3e0y73"] - -[ext_resource type="Texture2D" uid="uid://celay30i4soud" path="res://Assets/Textures/g_assault.png" id="1_5fof3"] - -[resource] -atlas = ExtResource("1_5fof3") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_glue_gun.tres b/Assets/TextureAtlases/g_glue_gun.tres deleted file mode 100644 index 49d6a69..0000000 --- a/Assets/TextureAtlases/g_glue_gun.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://jmxhiwsiw1f5"] - -[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://Assets/Textures/glue_gun.png" id="1_2wjjm"] - -[resource] -atlas = ExtResource("1_2wjjm") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_grenade_launcher.tres b/Assets/TextureAtlases/g_grenade_launcher.tres deleted file mode 100644 index 892a5b6..0000000 --- a/Assets/TextureAtlases/g_grenade_launcher.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bwufgga1pjyt"] - -[ext_resource type="Texture2D" uid="uid://3qcdx7n440sc" path="res://Assets/Textures/grenade_launcher.png" id="1_qc0g6"] - -[resource] -atlas = ExtResource("1_qc0g6") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_rocket_launcher.tres b/Assets/TextureAtlases/g_rocket_launcher.tres deleted file mode 100644 index 304659c..0000000 --- a/Assets/TextureAtlases/g_rocket_launcher.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://clr6kfyci5jqb"] - -[ext_resource type="Texture2D" uid="uid://by1y15lm0bppe" path="res://Assets/Textures/rocket_launcher.png" id="1_0bxom"] - -[resource] -atlas = ExtResource("1_0bxom") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/g_sniper.tres b/Assets/TextureAtlases/g_sniper.tres deleted file mode 100644 index 94355f0..0000000 --- a/Assets/TextureAtlases/g_sniper.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://fmqq24n7rwvm"] - -[ext_resource type="Texture2D" uid="uid://cv2eycs1j0ho7" path="res://Assets/Textures/g_sniper.png" id="1_weegr"] - -[resource] -atlas = ExtResource("1_weegr") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/gun.tres b/Assets/TextureAtlases/gun.tres deleted file mode 100644 index 4713b17..0000000 --- a/Assets/TextureAtlases/gun.tres +++ /dev/null @@ -1,8 +0,0 @@ -[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d060ag2vw7dp1"] - -[ext_resource type="Texture2D" uid="uid://ctjktwiq2fcjm" path="res://Assets/Textures/gun.png" id="1_m5tps"] - -[resource] -resource_local_to_scene = true -atlas = ExtResource("1_m5tps") -region = Rect2(0, 0, 64, 64) diff --git a/Assets/TextureAtlases/target_list.tres b/Assets/TextureAtlases/target_list.tres index 62d1538..2ea1850 100644 --- a/Assets/TextureAtlases/target_list.tres +++ b/Assets/TextureAtlases/target_list.tres @@ -1,6 +1,6 @@ [gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bgeu8dnqaxq7v"] -[ext_resource type="Texture2D" uid="uid://cc2umukpibmx1" path="res://Assets/Textures/target_list.png" id="1_s0pjb"] +[ext_resource type="Texture2D" uid="uid://cc2umukpibmx1" path="res://PCs/Universal/ClassCards/RocketLauncher/target_list.png" id="1_s0pjb"] [resource] atlas = ExtResource("1_s0pjb") diff --git a/Assets/Textures/8directionplayer.png b/Assets/Textures/8directionplayer.png deleted file mode 100644 index 8766948cf5988cc743c57e995a0cb039a53548ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1552 zcmeAS@N?(olHy`uVBq!ia0y~yU}RumU{K&-V_;zTyK>nR1_s8wOlRkS%;aPS291fO z6D_@&14UZ*t9ZpI35p1A^bkC%#26^(-Rn9_K}fXcmda$`6GmrLI&N^8i8ZxmJP!N8 zzeO}hl*Lid<;|PBQk;)#Jrx`$neW*t|9o%p&SJJV3wx%SMlVyGtu65|;lO5@$d4BH zGnezL-}P}Z4W2)9KL5p%zcxw1Uk|RYGTnc@p!AsVGPZ4I4?TU&xegieF6?buR}sD= z+}r)}A@xIc&TJz4LaWvs%I^vm{TGy@)0Td4T~$?3sm$tR-Q1K`_m;gkeF9gXTfFbc z)Dyb89 z)tUE_3-S*?_4VzRJ#dxpi~Z|B<)~>go8F#Osflq2XQ_I(FnQ~w(64hot4G|K6ko#L z?rxy-{cd)>q;rPowO7N=I?5;$z~h>+D@wa*XQ=(OGx}v z2g?r|`1X9z`v2+MVfhswKOPS+*X5qR`9biz)q8I|Jjmzs9=I4Aq zUoJlqe3o_WqUH7%;-(BL7EH$_WOP#uwwt?Mf1Nm|Hg7un?gHK4g{tesYB$TQ{g=qx zkaVkQ$^!N2*Dl7TKd!31_-f-3_sRz=g`ZAtZ$4`6?KkC`T-ma^ZHy5Prt<}=oOW7j zPS>gFyMC&2CA+qz=f<$&_+Is|2c^|*?@Rs7Va_<|b?~+g?@Y7n#q(RW*J}5E&Y1JG z%Ch2f`X80o=?@remf9>S6nZNaleyPy-E9UNr8T{aRNKBs>0SJBBKi4>uLx1#dx&S|gSn>A=$DqpQ^Dq5QT*l_)^V#@`0-E;r=ZC%8+;H}-QigOJUCo1<` zlxjDfEnhhEY1OszhgBByRm+!`PrR}CvrW|G0s&Ko_ibJs83t~POiQ(o=U*Kb`sQ&0W)XWv{X{Y0!|&eH^j(r*7Spb?z%RSFM*j7`*z} zo8mdw7}hkYR(^TEQ1zpA@~gyKFZap+=KB4-QcmwCgUan+f3Kf^Xy4DqGXF zJFnUJHK*AL-L9IaD%1A<FVdQ&MBb@076mjtpET3 diff --git a/PCs/Blue/blue.tres b/PCs/Blue/blue.tres index b140022..2070eef 100644 --- a/PCs/Blue/blue.tres +++ b/PCs/Blue/blue.tres @@ -1,9 +1,9 @@ [gd_resource type="Resource" script_class="HeroClass" load_steps=5 format=3 uid="uid://dxonpv8qbyrjy"] [ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_aeu85"] -[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="1_uvyoy"] -[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="2_3yr5a"] -[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="3_wyb0n"] +[ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="1_uvyoy"] +[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="2_3yr5a"] +[ext_resource type="Resource" uid="uid://ckm88acryitl4" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="3_wyb0n"] [resource] script = ExtResource("1_aeu85") diff --git a/PCs/Green/green.tres b/PCs/Green/green.tres index a84271e..44a8146 100644 --- a/PCs/Green/green.tres +++ b/PCs/Green/green.tres @@ -1,13 +1,13 @@ [gd_resource type="Resource" script_class="HeroClass" load_steps=6 format=3 uid="uid://ogbkbf1v7j7l"] [ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_cpfpk"] -[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="1_hv6hq"] +[ext_resource type="Resource" uid="uid://ckm88acryitl4" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="1_hv6hq"] [ext_resource type="Texture2D" uid="uid://bgt3j4cuq814m" path="res://Assets/TextureAtlases/green.tres" id="2_4p73e"] -[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="2_jdi4m"] -[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="3_f04lj"] +[ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="2_jdi4m"] +[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="3_f04lj"] [resource] script = ExtResource("1_cpfpk") hero_name = "Green" texture = ExtResource("2_4p73e") -deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("1_hv6hq"), ExtResource("2_jdi4m"), ExtResource("3_f04lj")]) +deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("3_f04lj"), ExtResource("1_hv6hq"), ExtResource("2_jdi4m")]) diff --git a/PCs/Red/red.tres b/PCs/Red/red.tres index 88e2518..8ce5e3c 100644 --- a/PCs/Red/red.tres +++ b/PCs/Red/red.tres @@ -1,13 +1,13 @@ [gd_resource type="Resource" script_class="HeroClass" load_steps=6 format=3 uid="uid://b5pc3frhx467q"] [ext_resource type="Script" path="res://Scripts/Resources/hero_class.gd" id="1_1wkap"] -[ext_resource type="Resource" uid="uid://bmoreipvttks8" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="1_iiksa"] -[ext_resource type="Resource" uid="uid://cvf5bxtu6er17" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="2_hkiwr"] +[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://PCs/Universal/ClassCards/Assault/card_assault.tres" id="1_iiksa"] +[ext_resource type="Resource" uid="uid://ckm88acryitl4" path="res://PCs/Universal/ClassCards/Sniper/card_sniper.tres" id="2_hkiwr"] [ext_resource type="Texture2D" uid="uid://hxev3a2ktya" path="res://Assets/TextureAtlases/red.tres" id="2_kjc7g"] -[ext_resource type="Resource" uid="uid://dh5fjnbp8auw1" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="3_ruhqi"] +[ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres" id="3_ruhqi"] [resource] script = ExtResource("1_1wkap") hero_name = "Red" texture = ExtResource("2_kjc7g") -deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("1_iiksa"), ExtResource("2_hkiwr"), ExtResource("3_ruhqi")]) +deck = Array[Resource("res://Scripts/Resources/card.gd")]([ExtResource("2_hkiwr"), ExtResource("3_ruhqi"), ExtResource("1_iiksa")]) diff --git a/PCs/Universal/ClassCards/Assault/card_assault.tres b/PCs/Universal/ClassCards/Assault/card_assault.tres index 4cf7e84..c02b196 100644 --- a/PCs/Universal/ClassCards/Assault/card_assault.tres +++ b/PCs/Universal/ClassCards/Assault/card_assault.tres @@ -1,19 +1,23 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bmoreipvttks8"] +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://deer0awg4d18o"] [ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_yqa4b"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="2_8j5h0"] -[ext_resource type="PackedScene" uid="uid://fernyl7fsifv" path="res://PCs/Universal/ClassCards/Assault/tower_assault.tscn" id="3_0r6s7"] -[ext_resource type="Resource" uid="uid://w15ojqyxd72q" path="res://Resources/WeaponStats/assault.tres" id="3_k2yr3"] -[ext_resource type="Resource" uid="uid://cktq4o3yuxgsa" path="res://Resources/TurretStats/assault.tres" id="3_p4byc"] -[ext_resource type="PackedScene" uid="uid://d1xe6hsq05110" path="res://PCs/Universal/ClassCards/Assault/weapon_assault.tscn" id="3_wj5gm"] +[ext_resource type="Texture2D" uid="uid://celay30i4soud" path="res://PCs/Universal/ClassCards/Assault/g_assault.png" id="2_a8may"] +[ext_resource type="PackedScene" uid="uid://2eehfcrsednw" path="res://PCs/Universal/ClassCards/Assault/weapon_assault.tscn" id="3_28y3b"] +[ext_resource type="Resource" uid="uid://bdmsiw45xxhiv" path="res://PCs/Universal/ClassCards/Assault/tower_stats.tres" id="3_ks0jw"] +[ext_resource type="PackedScene" uid="uid://bbfm4i4xlkwdr" path="res://PCs/Universal/ClassCards/Assault/tower_assault.tscn" id="4_5nu32"] +[ext_resource type="Resource" uid="uid://smctw4ogm4rx" path="res://PCs/Universal/ClassCards/Assault/weapon_stats.tres" id="4_est7t"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_q0mw6"] +atlas = ExtResource("2_a8may") +region = Rect2(0, 0, 64, 64) [resource] script = ExtResource("1_yqa4b") title = "Assault" rarity = 0 faction = 0 -sprite = ExtResource("2_8j5h0") -turret = ExtResource("3_0r6s7") -weapon = ExtResource("3_wj5gm") -weapon_stats = ExtResource("3_k2yr3") -tower_stats = ExtResource("3_p4byc") +sprite = SubResource("AtlasTexture_q0mw6") +turret_scene = ExtResource("4_5nu32") +weapon_scene = ExtResource("3_28y3b") +weapon_stats = ExtResource("4_est7t") +tower_stats = ExtResource("3_ks0jw") diff --git a/Assets/Textures/g_assault.png b/PCs/Universal/ClassCards/Assault/g_assault.png similarity index 100% rename from Assets/Textures/g_assault.png rename to PCs/Universal/ClassCards/Assault/g_assault.png diff --git a/Assets/Textures/g_assault.png.import b/PCs/Universal/ClassCards/Assault/g_assault.png.import similarity index 70% rename from Assets/Textures/g_assault.png.import rename to PCs/Universal/ClassCards/Assault/g_assault.png.import index 43fa149..fc15c5f 100644 --- a/Assets/Textures/g_assault.png.import +++ b/PCs/Universal/ClassCards/Assault/g_assault.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://celay30i4soud" -path="res://.godot/imported/g_assault.png-18634d790d834a408188c873cb3b1336.ctex" +path="res://.godot/imported/g_assault.png-5ee2b44f3ff930af8f664652779a0f99.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/g_assault.png" -dest_files=["res://.godot/imported/g_assault.png-18634d790d834a408188c873cb3b1336.ctex"] +source_file="res://PCs/Universal/ClassCards/Assault/g_assault.png" +dest_files=["res://.godot/imported/g_assault.png-5ee2b44f3ff930af8f664652779a0f99.ctex"] [params] diff --git a/PCs/Universal/ClassCards/Assault/tower_assault.gd b/PCs/Universal/ClassCards/Assault/tower_assault.gd new file mode 100644 index 0000000..9647c7a --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/tower_assault.gd @@ -0,0 +1,2 @@ +extends HitscanTower +class_name AssaultTower diff --git a/PCs/Universal/ClassCards/Assault/tower_assault.tscn b/PCs/Universal/ClassCards/Assault/tower_assault.tscn index b4b6281..50850aa 100644 --- a/PCs/Universal/ClassCards/Assault/tower_assault.tscn +++ b/PCs/Universal/ClassCards/Assault/tower_assault.tscn @@ -1,41 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://fernyl7fsifv"] +[gd_scene load_steps=4 format=3 uid="uid://bbfm4i4xlkwdr"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/tower.gd" id="1_c2874"] -[ext_resource type="Resource" uid="uid://cktq4o3yuxgsa" path="res://Resources/TurretStats/assault.tres" id="2_t516u"] +[ext_resource type="PackedScene" uid="uid://dumiyjlnea4gq" path="res://Scenes/Towers/hitscan_tower.tscn" id="1_uadu5"] +[ext_resource type="Resource" uid="uid://bdmsiw45xxhiv" path="res://PCs/Universal/ClassCards/Assault/tower_stats.tres" id="2_gg1gn"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/tower_assault.gd" id="2_olbck"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_llb88"] -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("model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_c2874") -stats = ExtResource("2_t516u") -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"] - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.714825, 0, -0.423869) -size = Vector3(0.481654, 0.427749, 1.38438) - -[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.715, 0, -0.424) -size = Vector3(0.481654, 0.427749, 1.38438) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_llb88") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_llb88") +[node name="AssaultTower" instance=ExtResource("1_uadu5")] +script = ExtResource("2_olbck") +stats = ExtResource("2_gg1gn") diff --git a/PCs/Universal/ClassCards/Assault/tower_stats.tres b/PCs/Universal/ClassCards/Assault/tower_stats.tres new file mode 100644 index 0000000..d6465a5 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://bdmsiw45xxhiv"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_50mwk"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_cwxf1"] + +[sub_resource type="Resource" id="Resource_bukji"] +script = ExtResource("1_cwxf1") +key = "Fire Delay" +value = 1.0 + +[sub_resource type="Resource" id="Resource_2e75s"] +script = ExtResource("1_cwxf1") +key = "Damage" +value = 1.0 + +[sub_resource type="Resource" id="Resource_1vpnf"] +script = ExtResource("1_cwxf1") +key = "Range" +value = 10.0 + +[resource] +script = ExtResource("1_50mwk") +target_type = 1 +attributes = Array[ExtResource("1_cwxf1")]([SubResource("Resource_bukji"), SubResource("Resource_2e75s"), SubResource("Resource_1vpnf")]) +text = "Fires a shot every /Fire Delay\\ seconds dealing /Damage\\ damage at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/Assault/weapon.gd b/PCs/Universal/ClassCards/Assault/weapon.gd deleted file mode 100644 index 476f8d7..0000000 --- a/PCs/Universal/ClassCards/Assault/weapon.gd +++ /dev/null @@ -1,73 +0,0 @@ -extends Sprite3D -class_name Weapon - -@export var stats : WeaponStats -@export var hero : Hero - -var cooldown := 0.0 -var other_cooldown := 0.0 -var trigger_held := false -var second_trigger_held := false - - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) - - -func set_raycast_origin(node): - $RayCast3D.global_position = node.global_position - - -func set_hero(value): - hero = value - - -func _process(delta: float) -> void: - if stats != null: - other_cooldown -= delta - - -func _physics_process(_delta: float) -> void: - if trigger_held: - shoot() - - -func hold_trigger(): - trigger_held = true - - -func release_trigger(): - trigger_held = false - - -func hold_second_trigger(): - second_trigger_held = true - - -func release_second_trigger(): - second_trigger_held = false - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - $AnimationPlayer.play("shoot") - if $RayCast3D.is_colliding(): - var target = $RayCast3D.get_collider() - if target != null: - var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) - if target_hitbox is Hitbox: - target_hitbox.damage(stats.damage) - networked_hit.rpc(get_tree().root.get_path_to(target_hitbox)) - - -@rpc -func networked_shoot(): - $AnimationPlayer.play("shoot") - - -@rpc("reliable") -func networked_hit(target_node_path : String): - var target_node = get_tree().root.get_node(target_node_path) - target_node.damage(stats.damage) diff --git a/PCs/Universal/ClassCards/Assault/weapon_assault.gd b/PCs/Universal/ClassCards/Assault/weapon_assault.gd new file mode 100644 index 0000000..3ac4ae0 --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/weapon_assault.gd @@ -0,0 +1,2 @@ +extends HitscanWeapon +class_name AssaultWeapon diff --git a/PCs/Universal/ClassCards/Assault/weapon_assault.tscn b/PCs/Universal/ClassCards/Assault/weapon_assault.tscn index 239e093..7a1d188 100644 --- a/PCs/Universal/ClassCards/Assault/weapon_assault.tscn +++ b/PCs/Universal/ClassCards/Assault/weapon_assault.tscn @@ -1,58 +1,15 @@ -[gd_scene load_steps=7 format=3 uid="uid://d1xe6hsq05110"] +[gd_scene load_steps=5 format=3 uid="uid://2eehfcrsednw"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="1_117ne"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/weapon.gd" id="2_4ie8w"] -[ext_resource type="Resource" uid="uid://w15ojqyxd72q" path="res://Resources/WeaponStats/assault.tres" id="3_s4ckt"] +[ext_resource type="PackedScene" uid="uid://difwo7wlyqr3h" path="res://Scenes/Weapons/hitscan_weapon.tscn" id="1_wkxf7"] +[ext_resource type="Resource" uid="uid://smctw4ogm4rx" path="res://PCs/Universal/ClassCards/Assault/weapon_stats.tres" id="2_fnp5x"] +[ext_resource type="Texture2D" uid="uid://celay30i4soud" path="res://PCs/Universal/ClassCards/Assault/g_assault.png" id="3_kuj4t"] -[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_604rb"] +atlas = ExtResource("3_kuj4t") +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="HitscanWeapon" instance=ExtResource("1_wkxf7")] +stats = ExtResource("2_fnp5x") -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_117ne") -script = ExtResource("2_4ie8w") -stats = ExtResource("3_s4ckt") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_604rb") diff --git a/PCs/Universal/ClassCards/Assault/weapon_stats.tres b/PCs/Universal/ClassCards/Assault/weapon_stats.tres new file mode 100644 index 0000000..14a8fdd --- /dev/null +++ b/PCs/Universal/ClassCards/Assault/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://smctw4ogm4rx"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_gk542"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_qt3yl"] + +[sub_resource type="Resource" id="Resource_bcrtt"] +script = ExtResource("1_qt3yl") +key = "Damage" +value = 3.0 + +[sub_resource type="Resource" id="Resource_llper"] +script = ExtResource("1_qt3yl") +key = "Range" +value = 15.0 + +[sub_resource type="Resource" id="Resource_7i2dt"] +script = ExtResource("1_qt3yl") +key = "Fire Delay" +value = 0.2 + +[resource] +script = ExtResource("1_gk542") +target_type = 0 +attributes = Array[ExtResource("1_qt3yl")]([SubResource("Resource_bcrtt"), SubResource("Resource_llper"), SubResource("Resource_7i2dt")]) +text = "Fires a shot every /Fire Delay\\ seconds dealing /Damage\\ damage at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/Blowdart/blowdart.png b/PCs/Universal/ClassCards/Blowdart/blowdart.png new file mode 100644 index 0000000000000000000000000000000000000000..ea13f58f16dce7125fc3a6fa52c459c3884a47e4 GIT binary patch literal 1777 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU~u4IV_;yobgjOgfq}6g)7d#7GdY=oL1SX+ z#NFP914NGPw_B35TDC->@I-*TGxs8ezNmIRSFg1RS5yY)K3Ohx*-Qo2D)_aDGbuS61sHN z#C4YzFV-shKY#h!vp&^#l|2_czglX4yy1df!1|r<-miRp?R>)l?tZ`J(KDPs^5SvLCprXYeQIWK5n1Mgc{9o2qN1EP${D<>I?q&U5 z%zXU~g}dbM{$RehI{jB!&yUFr3=EtF9+AZi3@R@`n6W9DRfd6qRo&CYF{Fa=?Tpwy z8FQYN>uwD{zuk_u^HkteX;hiO zGRZ;6g9(Kb-*jNR{=%ZoC;rbn?)CF+rOt29+oh~?TMQ@Nwl2|srh9h75=I+|?H%9v zmR^7NGWY22#^YPqI-GVm*1T?*@pZ*Jqi30X!BPvv4`qIQn&@(W>$~{+|3B{hdvCwr z{`r|FD(&xm8cpSS7d}g0+xuqgqqkemuBlC1GnePyk`I#SuPstn-CXkj&ujmmU;qD0 zU%NeLvKM#j%YR$~h6{aopHIG?u-K${=d%A7KkZx2eld^la6F^hT)t%94EG&NqocMy zdT^0rVp7yb<&6^ev!xum?&{8Cyz<)k7R&C464L|g9#uWOzv+B7)3>x62Y0S!3}d>d zSe5!WHRmo%(T6t=mCt3#)hk@=3hZX(Q0wog`&RbfA+>1Er_KV0-b2pMv}fq-XH>AL znkT@^vEHufa7Ul0&ouJ}jo>FCwtPuBk2z_Ujp zLHV_ySciGH=XKr#YWl4wt#hOpTq+-LPXDv`F{^z>`x*}JDc0Sd;miv-%5+$rEOy8L zN#pE$a_1qpnCfELovOz_u{Ah&2ZVg__5E<=-q)`yEfrWKPFm;OIzRjT14ET2U4}&p zB25X?zZdb^UHkDyde!Z&o7u^d5g%RMR!U#;+PzhNo1mPtIm2v;Bn7_K?z_>={ib%+ z>wfwkFxpVkaW?7E&#G^Na?ZRT6dQh-Tsy~;t;*xS;fA}*^+(^YyC}|#D<4!qYbNFqc^(c?)6ou^gcVwb!XV>;EEH$pEa+q@Xz0QvMOEJc|v%4 z_T5u|-^^TgxJ!QHMwt?yDfxyg*S?f^Iw#fWEn9+clv3%(i1vcL&(2masNU%IR)>8q z`>d_J#cNzEPQ*<+xrJ@Q62XtAj<$;;4+cGdrGCiq`Xj@a4;2d~)x6jFX?;AtmbXxf z8WS}q6IxgT@?ecFa=?;ZQk zb004F?6`j0OUrB7XSUcsGgb4Jau70pq{z`4rTjSf-D*y~+VK6{?3GHDS??YMe%@GA z=`+o=LF6D;`Vj-Ws2%DNzu(N+tTTf-ttKMZTiT&3gA*jN=E3ATU9lCt7f=6Ch|A@P z_1)^QcI)y7&*}pn1i#z4?b>OnhzC#i$-dX&?`O>tQPY+GaVo+nvW{7ya;8L?ty4$G zrg_(@c0T`@Zx*{V{krvG=d6zrFRUcx->!dtTgqXQ(W1h%c^Yf71=m~Ue{2ZrZ+($g zlU1|LtU=_GkglC+U_)czpZK4d9|godsaM&aHI36XyDja&mDMRGugi7F@RjMu+OO)T z4qv)``iTc~1e4C}4z1RQvWvIA7tJ-Et+43+zpbL31`mGAB)xE#%43+jNwkS^_2aqo zjC~F)yu!CTL*x39w2cwg^27#6te z#d?eM87CZ1&$s#Y;i+ud%8B654v!xuk`Z=yS zt=*}9 StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Blowdart/weapon_blowdart.tscn b/PCs/Universal/ClassCards/Blowdart/weapon_blowdart.tscn index 979d5bb..96b23d9 100644 --- a/PCs/Universal/ClassCards/Blowdart/weapon_blowdart.tscn +++ b/PCs/Universal/ClassCards/Blowdart/weapon_blowdart.tscn @@ -1,60 +1,27 @@ -[gd_scene load_steps=8 format=3 uid="uid://cqo6wwf5vbilg"] +[gd_scene load_steps=7 format=3 uid="uid://cy05ssd52exf0"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_3t02x"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Blowdart/blowdartweapon.gd" id="2_ytopx"] -[ext_resource type="Resource" uid="uid://cbskijhnnj3kw" path="res://Resources/StatusEffects/poisoned.tres" id="3_qabj4"] -[ext_resource type="Resource" uid="uid://dhegsd45xi7na" path="res://Resources/WeaponStats/blowdart.tres" id="4_j03wq"] +[ext_resource type="PackedScene" uid="uid://nrdexcyatika" path="res://Scenes/Weapons/status_applying_weapon.tscn" id="1_t3gfv"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Blowdart/weapon_blowdart.gd" id="2_g1m1f"] +[ext_resource type="Resource" uid="uid://cbskijhnnj3kw" path="res://Resources/StatusEffects/poisoned.tres" id="3_wculg"] +[ext_resource type="Resource" uid="uid://c6e50linnk2i7" path="res://PCs/Universal/ClassCards/Blowdart/weapon_stats.tres" id="4_dwqec"] +[ext_resource type="Texture2D" uid="uid://dnlplq8duves3" path="res://PCs/Universal/ClassCards/Blowdart/blowdart.png" id="5_rvf06"] -[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_85web"] +atlas = ExtResource("5_rvf06") +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="BlowdartWeapon" instance=ExtResource("1_t3gfv")] +script = ExtResource("2_g1m1f") +status_stats = ExtResource("3_wculg") +raycast = Object(RayCast3D,"_import_path":NodePath(""),"unique_name_in_owner":false,"process_mode":0,"process_priority":0,"process_physics_priority":0,"process_thread_group":0,"editor_description":"","transform":Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0),"rotation_edit_mode":0,"rotation_order":2,"top_level":false,"visible":true,"visibility_parent":NodePath(""),"enabled":true,"exclude_parent":true,"target_position":Vector3(0, 0, -1),"collision_mask":4,"hit_from_inside":false,"collide_with_areas":false,"collide_with_bodies":true,"debug_shape_custom_color":Color(0, 0, 0, 1),"debug_shape_thickness":2,"script":null) -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} +range_debug_indicator = Object(CSGSphere3D,"_import_path":NodePath(""),"unique_name_in_owner":false,"process_mode":0,"process_priority":0,"process_physics_priority":0,"process_thread_group":0,"editor_description":"","transform":Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0),"rotation_edit_mode":0,"rotation_order":2,"top_level":false,"visible":false,"visibility_parent":NodePath(""),"layers":1,"sorting_offset":0.0,"sorting_use_aabb_center":true,"material_override":null,"material_overlay":null,"transparency":0.0,"cast_shadow":1,"extra_cull_margin":0.0,"custom_aabb":AABB(0, 0, 0, 0, 0, 0),"lod_bias":1.0,"ignore_occlusion_culling":false,"gi_mode":1,"gi_lightmap_scale":0,"visibility_range_begin":0.0,"visibility_range_begin_margin":0.0,"visibility_range_end":0.0,"visibility_range_end_margin":0.0,"visibility_range_fade_mode":0,"operation":0,"snap":0.001,"calculate_tangents":true,"use_collision":false,"collision_layer":1,"collision_mask":1,"collision_priority":1.0,"flip_faces":false,"radius":4.104,"radial_segments":16,"rings":16,"smooth_faces":true,"material":null,"script":null) -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_3t02x") -script = ExtResource("2_ytopx") -status_stats = ExtResource("3_qabj4") -stats = ExtResource("4_j03wq") +stats = ExtResource("4_dwqec") +animator = Object(AnimationPlayer,"_import_path":NodePath(""),"unique_name_in_owner":false,"process_mode":0,"process_priority":0,"process_physics_priority":0,"process_thread_group":0,"editor_description":"","root_node":NodePath(".."),"autoplay":"","reset_on_save":true,"playback_process_mode":1,"playback_default_blend_time":0.0,"speed_scale":1.0,"method_call_mode":0,"audio_max_polyphony":32,"movie_quit_on_finish":false,"libraries":{ +"": null +},"blend_times":[],"script":null) -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_85web") diff --git a/PCs/Universal/ClassCards/Blowdart/weapon_stats.tres b/PCs/Universal/ClassCards/Blowdart/weapon_stats.tres new file mode 100644 index 0000000..4441be2 --- /dev/null +++ b/PCs/Universal/ClassCards/Blowdart/weapon_stats.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://c6e50linnk2i7"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_5ldx7"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_pw5it"] + +[sub_resource type="Resource" id="Resource_1txa7"] +script = ExtResource("1_pw5it") +key = "Damage" +value = 0.0 + +[sub_resource type="Resource" id="Resource_46kv2"] +script = ExtResource("1_pw5it") +key = "Range" +value = 15.0 + +[sub_resource type="Resource" id="Resource_gb76x"] +script = ExtResource("1_pw5it") +key = "Fire Delay" +value = 0.8 + +[resource] +script = ExtResource("1_5ldx7") +attributes = Array[ExtResource("1_pw5it")]([SubResource("Resource_1txa7"), SubResource("Resource_46kv2"), SubResource("Resource_gb76x")]) +text = "Fires every /Fire Delay\\s, applying one stack of Poison at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb.gd b/PCs/Universal/ClassCards/BombLauncher/bomb.gd deleted file mode 100644 index a16e826..0000000 --- a/PCs/Universal/ClassCards/BombLauncher/bomb.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends RigidBody3D -class_name Bomb - -@export var max_bounces := 1 -@export var damage := 10.0 -@export var explosion_range := 3.0 -var bounces := 0 - -func _on_body_entered(_body: Node) -> void: - bounces += 1 - var collided_body = get_colliding_bodies()[0].get_collision_layer_value(3) - if bounces > max_bounces or collided_body: - explode() - - -func explode(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= explosion_range: - enemy.damage(damage) - queue_free() diff --git a/Assets/Textures/bomb.png b/PCs/Universal/ClassCards/BombLauncher/bomb.png similarity index 100% rename from Assets/Textures/bomb.png rename to PCs/Universal/ClassCards/BombLauncher/bomb.png diff --git a/Assets/Textures/bomb.png.import b/PCs/Universal/ClassCards/BombLauncher/bomb.png.import similarity index 71% rename from Assets/Textures/bomb.png.import rename to PCs/Universal/ClassCards/BombLauncher/bomb.png.import index 88ef533..ed78b3e 100644 --- a/Assets/Textures/bomb.png.import +++ b/PCs/Universal/ClassCards/BombLauncher/bomb.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://b54d5dc4jmlau" -path="res://.godot/imported/bomb.png-c85d126612097bd650bbb12e0b92da53.ctex" +path="res://.godot/imported/bomb.png-487c0a83cb041cff7ffc29ecb2986a5b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/bomb.png" -dest_files=["res://.godot/imported/bomb.png-c85d126612097bd650bbb12e0b92da53.ctex"] +source_file="res://PCs/Universal/ClassCards/BombLauncher/bomb.png" +dest_files=["res://.godot/imported/bomb.png-487c0a83cb041cff7ffc29ecb2986a5b.ctex"] [params] diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb.tscn b/PCs/Universal/ClassCards/BombLauncher/bomb.tscn deleted file mode 100644 index 300e91a..0000000 --- a/PCs/Universal/ClassCards/BombLauncher/bomb.tscn +++ /dev/null @@ -1,29 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://d147iwg2wcqc5"] - -[ext_resource type="Texture2D" uid="uid://b54d5dc4jmlau" path="res://Assets/Textures/bomb.png" id="1_u615o"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.gd" id="1_vekqm"] - -[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_whkhx"] -bounce = 0.6 - -[sub_resource type="SphereShape3D" id="SphereShape3D_mi0in"] -radius = 0.2 - -[node name="RigidBody3D" type="RigidBody3D"] -collision_layer = 0 -collision_mask = 5 -physics_material_override = SubResource("PhysicsMaterial_whkhx") -max_contacts_reported = 1 -contact_monitor = true -script = ExtResource("1_vekqm") - -[node name="Node3D" type="Sprite3D" parent="."] -transform = Transform3D(1.4, 0, 0, 0, 1.4, 0, 0, 0, 1.4, 0, 0, 0) -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_u615o") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("SphereShape3D_mi0in") - -[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd new file mode 100644 index 0000000..5fd6b89 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd @@ -0,0 +1,16 @@ +extends ExplosiveProjectile +class_name BombProjectile + +var max_bounces := 1 +var bounces := 0 + + +func _ready() -> void: + apply_central_impulse(direction * force) + + +func _on_body_entered(_body: Node) -> void: + bounces += 1 + var collided_body = get_colliding_bodies()[0].get_collision_layer_value(3) + if bounces > max_bounces or collided_body: + explode() diff --git a/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn new file mode 100644 index 0000000..b2cd76d --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=5 format=3 uid="uid://c8oq5unisjqne"] + +[ext_resource type="PackedScene" uid="uid://7f4dfphgiswr" path="res://Scenes/Projectiles/explosive_projectile.tscn" id="1_kf2wi"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bomb_projectile.gd" id="2_qvo4u"] +[ext_resource type="Texture2D" uid="uid://b54d5dc4jmlau" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.png" id="3_ilhep"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_bbpul"] +bounce = 0.3 + +[node name="Bomb" instance=ExtResource("1_kf2wi")] +physics_material_override = SubResource("PhysicsMaterial_bbpul") +gravity_scale = 1.0 +script = ExtResource("2_qvo4u") + +[node name="Sprite3D" parent="." index="1"] +pixel_size = 0.015 +texture = ExtResource("3_ilhep") diff --git a/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd b/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd deleted file mode 100644 index 16a4c14..0000000 --- a/PCs/Universal/ClassCards/BombLauncher/bombweapon.gd +++ /dev/null @@ -1,21 +0,0 @@ -extends Weapon -class_name BombWeapon - -@export var bomb_scene: PackedScene -var firing_velocity - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - firing_velocity = sqrt((stats.fire_range * ProjectSettings.get_setting("physics/3d/default_gravity")) / sin(2 * 45)) - $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - $AnimationPlayer.play("shoot") - var bomb = bomb_scene.instantiate() as Bomb - bomb.position = $RayCast3D.global_position - bomb.damage = stats.damage - get_tree().root.add_child(bomb) - bomb.apply_impulse(-global_transform.basis.z * firing_velocity) diff --git a/PCs/Universal/ClassCards/BombLauncher/card_bomb_launcher.tres b/PCs/Universal/ClassCards/BombLauncher/card_bomb_launcher.tres new file mode 100644 index 0000000..8a7d166 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/card_bomb_launcher.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://blgngx360vff1"] + +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_qtxcq"] +[ext_resource type="Texture2D" uid="uid://3qcdx7n440sc" path="res://PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png" id="2_qpxaq"] +[ext_resource type="Resource" uid="uid://8eaecilvan23" path="res://PCs/Universal/ClassCards/BombLauncher/tower_stats.tres" id="3_gknxe"] +[ext_resource type="PackedScene" uid="uid://c3fqlkytyc62u" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn" id="3_s56j6"] +[ext_resource type="Resource" uid="uid://co6eorobj1xuu" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres" id="4_s74ea"] +[ext_resource type="PackedScene" uid="uid://d2cch7qrwocg8" path="res://PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn" id="4_vc8pe"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_rat6o"] +atlas = ExtResource("2_qpxaq") +region = Rect2(0, 0, 64, 64) + +[resource] +script = ExtResource("1_qtxcq") +title = "Bomb Launcher" +rarity = 0 +faction = 0 +sprite = SubResource("AtlasTexture_rat6o") +turret_scene = ExtResource("4_vc8pe") +weapon_scene = ExtResource("3_s56j6") +weapon_stats = ExtResource("4_s74ea") +tower_stats = ExtResource("3_gknxe") diff --git a/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres b/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres deleted file mode 100644 index e174f69..0000000 --- a/PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres +++ /dev/null @@ -1,19 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bvpkvmda845o5"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_bscy2"] -[ext_resource type="Texture2D" uid="uid://bwufgga1pjyt" path="res://Assets/TextureAtlases/g_grenade_launcher.tres" id="2_xtrq2"] -[ext_resource type="Resource" uid="uid://crmsk6lvp5i4e" path="res://Resources/TurretStats/bomblauncher.tres" id="3_c1c3t"] -[ext_resource type="PackedScene" uid="uid://6ckryuql3bh8" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn" id="4_iaadg"] -[ext_resource type="PackedScene" uid="uid://cwc8y1nv53btu" path="res://PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn" id="4_ux0v3"] -[ext_resource type="Resource" uid="uid://kbaiy5u6imtu" path="res://Resources/WeaponStats/bomblauncher.tres" id="5_mhhrq"] - -[resource] -script = ExtResource("1_bscy2") -title = "Bomb Launcher" -rarity = 0 -faction = 0 -sprite = ExtResource("2_xtrq2") -turret = ExtResource("4_ux0v3") -weapon = ExtResource("4_iaadg") -weapon_stats = ExtResource("5_mhhrq") -tower_stats = ExtResource("3_c1c3t") diff --git a/Assets/Textures/grenade_launcher.png b/PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png similarity index 100% rename from Assets/Textures/grenade_launcher.png rename to PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png diff --git a/Assets/Textures/grenade_launcher.png.import b/PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png.import similarity index 67% rename from Assets/Textures/grenade_launcher.png.import rename to PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png.import index 43b9eae..b839f1f 100644 --- a/Assets/Textures/grenade_launcher.png.import +++ b/PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://3qcdx7n440sc" -path="res://.godot/imported/grenade_launcher.png-3275b92d0df686a016f2abc93d27971f.ctex" +path="res://.godot/imported/grenade_launcher.png-1e7f404a8d0cf786acfd3eff044b4f0c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/grenade_launcher.png" -dest_files=["res://.godot/imported/grenade_launcher.png-3275b92d0df686a016f2abc93d27971f.ctex"] +source_file="res://PCs/Universal/ClassCards/BombLauncher/grenade_launcher.png" +dest_files=["res://.godot/imported/grenade_launcher.png-1e7f404a8d0cf786acfd3eff044b4f0c.ctex"] [params] diff --git a/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.gd b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.gd new file mode 100644 index 0000000..a3d1301 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.gd @@ -0,0 +1,20 @@ +extends ProjectileTower +class_name BombLauncherTower + +func _ready() -> void: + super._ready() + force = sqrt((target_range * ProjectSettings.get_setting("physics/3d/default_gravity")) / sin(2 * 45)) + + +func aim(): + super.aim() + var pos = Vector2(global_position.x, global_position.z) + var t_pos = Vector2(targeted_enemy.global_position.x, targeted_enemy.global_position.z) + var x = pos.distance_to(t_pos) + var y = targeted_enemy.global_position.y - (global_position.y + 1) + var v = force + var g = ProjectSettings.get_setting("physics/3d/default_gravity") + var v2 = pow(v, 2) + var angle = atan((v2 + sqrt(pow(v, 4) - g * ((g * pow(x, 2)) + (2 * y * v2)))) / (g * x)) + yaw_model.look_at(Vector3(t_pos.x, yaw_model.global_position.y, t_pos.y)) + yaw_model.rotate(yaw_model.global_transform.basis.x.normalized(), angle) diff --git a/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn index f8ce091..37f24fd 100644 --- a/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn +++ b/PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.tscn @@ -1,39 +1,11 @@ -[gd_scene load_steps=5 format=3 uid="uid://cwc8y1nv53btu"] +[gd_scene load_steps=5 format=3 uid="uid://d2cch7qrwocg8"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bombtower.gd" id="1_u2hyk"] -[ext_resource type="PackedScene" uid="uid://d147iwg2wcqc5" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.tscn" id="2_n307r"] -[ext_resource type="Resource" uid="uid://crmsk6lvp5i4e" path="res://Resources/TurretStats/bomblauncher.tres" id="3_xv5rx"] +[ext_resource type="PackedScene" uid="uid://t0b32qb8eub2" path="res://Scenes/Towers/projectile_tower.tscn" id="1_r8hbo"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/tower_bomb_launcher.gd" id="2_vlaa6"] +[ext_resource type="PackedScene" uid="uid://c8oq5unisjqne" path="res://PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn" id="3_562if"] +[ext_resource type="Resource" uid="uid://8eaecilvan23" path="res://PCs/Universal/ClassCards/BombLauncher/tower_stats.tres" id="4_xgwj1"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nr2od"] -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("model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_u2hyk") -bomb_scene = ExtResource("2_n307r") -stats = ExtResource("3_xv5rx") -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, 1.13842, 0) - -[node name="CSGBox3D" type="CSGBox3D" parent="Model"] - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.65) -size = Vector3(0.596453, 0.632841, 0.539216) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_nr2od") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_nr2od") +[node name="BombLauncherTower" instance=ExtResource("1_r8hbo")] +script = ExtResource("2_vlaa6") +projectile_scene = ExtResource("3_562if") +stats = ExtResource("4_xgwj1") diff --git a/PCs/Universal/ClassCards/BombLauncher/tower_stats.tres b/PCs/Universal/ClassCards/BombLauncher/tower_stats.tres new file mode 100644 index 0000000..eff28b8 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://8eaecilvan23"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_gjldi"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_jt2vs"] + +[sub_resource type="Resource" id="Resource_yb48y"] +script = ExtResource("1_gjldi") +key = "Fire Delay" +value = 4.0 + +[sub_resource type="Resource" id="Resource_ewwvw"] +script = ExtResource("1_gjldi") +key = "Damage" +value = 10.0 + +[sub_resource type="Resource" id="Resource_qu5dv"] +script = ExtResource("1_gjldi") +key = "Range" +value = 8.0 + +[resource] +script = ExtResource("2_jt2vs") +target_type = 1 +attributes = Array[ExtResource("1_gjldi")]([SubResource("Resource_yb48y"), SubResource("Resource_ewwvw"), SubResource("Resource_qu5dv")]) +text = "Launch a bomb that deals /Damage\\ damage every /Fire Delay\\ seconds" diff --git a/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.gd b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.gd new file mode 100644 index 0000000..f740f47 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.gd @@ -0,0 +1,8 @@ +extends ProjectileWeapon +class_name BombLauncherWeapon + + +func _ready() -> void: + super._ready() + var launch_range = stats.get_attribute("Range") + force = sqrt((launch_range * ProjectSettings.get_setting("physics/3d/default_gravity")) / sin(2 * 45)) diff --git a/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn index c709062..b56acf5 100644 --- a/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn +++ b/PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.tscn @@ -1,59 +1,11 @@ -[gd_scene load_steps=8 format=3 uid="uid://6ckryuql3bh8"] +[gd_scene load_steps=5 format=3 uid="uid://c3fqlkytyc62u"] -[ext_resource type="Texture2D" uid="uid://bwufgga1pjyt" path="res://Assets/TextureAtlases/g_grenade_launcher.tres" id="1_n7mif"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/bombweapon.gd" id="2_4iyo6"] -[ext_resource type="PackedScene" uid="uid://d147iwg2wcqc5" path="res://PCs/Universal/ClassCards/BombLauncher/bomb.tscn" id="3_506dv"] -[ext_resource type="Resource" uid="uid://kbaiy5u6imtu" path="res://Resources/WeaponStats/bomblauncher.tres" id="4_45cu2"] +[ext_resource type="PackedScene" uid="uid://bqdllitxbbpyp" path="res://Scenes/Weapons/projectile_weapon.tscn" id="1_gbycb"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_bomb_launcher.gd" id="2_g5ihb"] +[ext_resource type="Resource" uid="uid://co6eorobj1xuu" path="res://PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres" id="3_73ol1"] +[ext_resource type="PackedScene" uid="uid://c8oq5unisjqne" path="res://PCs/Universal/ClassCards/BombLauncher/bomb_projectile.tscn" id="3_jxt6m"] -[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") -} - -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_n7mif") -script = ExtResource("2_4iyo6") -bomb_scene = ExtResource("3_506dv") -stats = ExtResource("4_45cu2") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] +[node name="BombLauncherWeapon" instance=ExtResource("1_gbycb")] +script = ExtResource("2_g5ihb") +projectile_scene = ExtResource("3_jxt6m") +stats = ExtResource("3_73ol1") diff --git a/PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres b/PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres new file mode 100644 index 0000000..80d8031 --- /dev/null +++ b/PCs/Universal/ClassCards/BombLauncher/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://co6eorobj1xuu"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_8i32s"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_kj8v0"] + +[sub_resource type="Resource" id="Resource_yb48y"] +script = ExtResource("1_kj8v0") +key = "Fire Delay" +value = 2.0 + +[sub_resource type="Resource" id="Resource_ewwvw"] +script = ExtResource("1_kj8v0") +key = "Damage" +value = 10.0 + +[sub_resource type="Resource" id="Resource_qu5dv"] +script = ExtResource("1_kj8v0") +key = "Range" +value = 10.0 + +[resource] +script = ExtResource("1_8i32s") +target_type = 0 +attributes = Array[ExtResource("1_kj8v0")]([SubResource("Resource_yb48y"), SubResource("Resource_ewwvw"), SubResource("Resource_qu5dv")]) +text = "Launch a bomb that deals /Damage\\ damage every /Fire Delay\\ seconds" diff --git a/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres b/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres index e39160c..114da6a 100644 --- a/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres +++ b/PCs/Universal/ClassCards/DamageEnhancer/card_damage_enhancer.tres @@ -1,7 +1,7 @@ [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://Assets/TextureAtlases/g_assault.tres" id="2_irvam"] +[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_irvam"] [resource] script = ExtResource("1_hj6hq") diff --git a/PCs/Universal/ClassCards/Fireball/card_fireball.tres b/PCs/Universal/ClassCards/Fireball/card_fireball.tres index ebd2644..1433ca3 100644 --- a/PCs/Universal/ClassCards/Fireball/card_fireball.tres +++ b/PCs/Universal/ClassCards/Fireball/card_fireball.tres @@ -1,19 +1,19 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://b1gd7d12pr52k"] +[gd_resource type="Resource" script_class="Card" load_steps=6 format=3 uid="uid://bibx2my7igspq"] -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_opk1n"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="2_51tvo"] -[ext_resource type="Resource" uid="uid://b8a635kajtq6" path="res://Resources/TurretStats/fireball.tres" id="3_8w2yo"] -[ext_resource type="PackedScene" uid="uid://dr2bmfj8fquxr" path="res://PCs/Universal/ClassCards/Fireball/tower_fireball.tscn" id="4_cxojl"] -[ext_resource type="PackedScene" uid="uid://cxlr31wydvroj" path="res://PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn" id="5_47hbf"] -[ext_resource type="Resource" uid="uid://c473xvhm2g6m0" path="res://Resources/WeaponStats/fireball.tres" id="6_05wvy"] +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_qktm8"] +[ext_resource type="Texture2D" uid="uid://mwgpnnm3g3re" path="res://PCs/Universal/ClassCards/Fireball/fireball.png" id="2_lfltq"] +[ext_resource type="PackedScene" uid="uid://dnwjfb4fexr0o" path="res://PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn" id="3_4c0mu"] +[ext_resource type="Resource" uid="uid://dhwhwicgpw7yh" path="res://PCs/Universal/ClassCards/Fireball/weapon_stats.tres" id="4_folo6"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_wvh1s"] +atlas = ExtResource("2_lfltq") +region = Rect2(0, 0, 64, 64) [resource] -script = ExtResource("1_opk1n") +script = ExtResource("1_qktm8") title = "Fireball" rarity = 3 faction = 0 -sprite = ExtResource("2_51tvo") -turret = ExtResource("4_cxojl") -weapon = ExtResource("5_47hbf") -weapon_stats = ExtResource("6_05wvy") -tower_stats = ExtResource("3_8w2yo") +sprite = SubResource("AtlasTexture_wvh1s") +weapon_scene = ExtResource("3_4c0mu") +weapon_stats = ExtResource("4_folo6") diff --git a/PCs/Universal/ClassCards/Fireball/fireball.gd b/PCs/Universal/ClassCards/Fireball/fireball.gd deleted file mode 100644 index 60f5c2e..0000000 --- a/PCs/Universal/ClassCards/Fireball/fireball.gd +++ /dev/null @@ -1,32 +0,0 @@ -extends RigidBody3D -class_name Fireball - -@export var explosion_range := 6.0 -var acceleration := 15.0 -var direction -var status_stats : StatusStats -var lifetime := 15.0 -var time_alive := 0.0 - - -func _process(delta: float) -> void: - time_alive += delta - if time_alive >= lifetime: - explode() - - -func _physics_process(_delta: float) -> void: - apply_central_force(direction * acceleration) - - -func _on_body_entered(_body: Node) -> void: - explode() - - -func explode(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= explosion_range: - var status = StatusOnFire.new() - status.stats = status_stats - enemy.status_manager.add_effect(status) - queue_free() diff --git a/PCs/Universal/ClassCards/Fireball/fireball.png b/PCs/Universal/ClassCards/Fireball/fireball.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a2fcb719cabd96ab3ac4fc35dee08cf7b66e34 GIT binary patch literal 2736 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU~u4IV_;yobgjOgfq^kM)7d#7GdY=oL1SX+ zL~CzmN0C;0Vdo>^T)HknO9D1_C~zgM+~^^!a)iSzchl_Y6LO~AW#Qb`)a!b{Y0JmZ zAN*THb3|Dj1zp~}sWlb4X00Y5Xngw3Ukl^sMc;LHC{^xF*nZyOpho1z0*wt*BKRue zUn~;muk(1d%~HD8En}zM`;6ePWj_qsYj23*DdTFbbz4p0lKVvtF_MdI^{>qb5zwul5*EyjAa-wotPfk}Q%Y9Y7 zo0(kb_-a9py_w;m7LEmhX}vb8$CgMt=84PR>T(Vn|Gv*=JojW*gvvgDeWEby_=CC@?!_jL8svxjdst<2nAu#c6QKkbs&Kaaed>wMVa{1>V-)|y|~8FYSC;klExN6epy#~!|C z*K?xw{wwp1CFxIZ{(OFdfq{Xuz$3DlfkEX32s1V%v&t|qaJ=+%aSW+od^_`Yk+h|N z^W?RA-u|zDwJ-PTJBN=G6?dFev{a7lGY#ds8P1gOdeWzU`Ss7EwLg50-W;#+|Ngfx zr|Roy2d%br*`DhRH+t{A{$%+`vi*T6L;m*1)BnG}zkSo6U(0{5 ztbb_`{Mo0u;PjNhziHW}KVz)KyXRgKm_C2bsp+NXjacecH%$LqH}TSW%a-7ft9SYSO|8kkYp$wg8@>N7@#mj;a{q?u`0z-u_*>t*|E}o$WjW9N zg~?aZ2M^ph!zy1bUfyN9y1#tW{?j{ce*R%)FFJYneAj%NKWq9gWc(0*AeZpsXNRZz zm8ny^gVw%Jef{Z@`hK}T^CnN9`|bUy@AXSB+J2RkV$gdfdu^xnulti<@Fc~?lp4mY z_@4DttG%XZgYC1uQNOGC4!&b3u+%L`|MlLpL`404m|pIZbNbt+`{%cHZw+^T6L+hm zo_UL&J?H6f;tRsBU7M-BH!OR{j3<#_mBS6+es(?UpZ4{ypYpf^+&Y!+=az|xC#Ol&PO#KR~PbZu?i~+4?Dg!Xn)Y= zF6+_@H}9Q(yl?)&iZ;2Y>JDaQ512F#yp(3$=XLG(e8Zn#yx0BMy3OLyLecMXJKe40 zjnl8$Ejr%L7$K;_7|!(Y^qtV(9GUi?IpXyu))mOe@_brpziVBFktqX%jH<`JF!9$q zkF;B4Cx2Vb{6Hq`tA~#JTT$D*I_57&818UIUagw@{^jmXeGg(^R&P1hzWCMEF8Qmj zRWDYa%lVndwqUBt{sX;CB~AOn=Wlsx{ppO*JloZ+;l_tFJMGH&L|?t{M|$ki=URSxCLzVZVCnF!x@pCJF@aTYs!QU&@`a_Rac(E3URaTe|H0+j|8+ zB(qtq-U(tm5e%{ zeKq%=wBB_!YiWyaaT(3V)o*$xPR?Gf_P0)M<3;07XC$plcM0+uUb(=SR6L=9N$UQI zS1i%rpH5#p@5w{|+vk0Y*GWZ{P~%Vdq$Q=Ai>i>1JJ1Bh@v{VpXi-EhXNQ zN4BJ|&vJ;rzUYzHp010FqqOI(44-=WMJRv6q<*ddS&LWMf*$*C-+Fzs;J(b}pY}XI ze4UP4I5*#O{hp*7aY3^pZs+91ax#g*dH+~h{lRD%l)$TpH=R>|0-|4xKZNqX?#^>mv%ke+?F7AjN|Jw zhK`GYkEUuhH1&ji3#}9Nj=vQ;fAPMzJ+srd$vYcFPyhL1`oDR58S~qAGcVBEm=~tc zrtom>$57qX5x*|2`!(lf^u?p?4tG9ZJ^VcC>nEda%TK>!Sn-hS=Js7jinq$nc)y-A zf3{ZG&rR=U=IRC8RB-D5JJPrRk*`j++uMbV0h`}0Sn1DnVAYz?S5Mp-)8kf`Kf8PQ z-nn^~juTiuoO-fy3EI)Cv)#(<3+uRpr&-FuGVj!WeFr}DDiYnMd& zZ`Yc(Z%gojm5d82va2dLe7~l$ZMwbi^6x%pXYR~6ShdBxW?S9$upjIAZij6AvNZRp z{WP`%(mn4O6_fn(w)|WDq?gahpLvT=`u*i>p=&;+&b`eq%^<5)!0?9i0fYPZ^zYKP z+ovvf%s3j;95yTa>Z{Gq^S^%E<;;9R`DOc)I+unuFK>Q%{j|o-=huss=e}|0EeT0o z{+o}t;ldVI~_n9o;yWZd1x$3NyN!1MohE491Wa1V3^gAD8I~rPA%hDRdfC2Wj2M@`^xivW?HZ8sa36ZX@3zfeoxKRFn>!1fgkH$pJ3P% z`=ZyS@}b-sz5kaEPmcTjJTRez!%bkjUi{Ye{tbex_J+@2D16cTZ^|&gV&iJ}e!e63 kj;^2gf7S29B0uEC=GrYtUt-V9z`(%Z>FVdQ&MBb@08h4aqW}N^ literal 0 HcmV?d00001 diff --git a/PCs/Universal/ClassCards/Fireball/fireball.png.import b/PCs/Universal/ClassCards/Fireball/fireball.png.import new file mode 100644 index 0000000..864ce71 --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/fireball.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mwgpnnm3g3re" +path="res://.godot/imported/fireball.png-a75470cb6074cbc91efe353b08c6eb50.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://PCs/Universal/ClassCards/Fireball/fireball.png" +dest_files=["res://.godot/imported/fireball.png-a75470cb6074cbc91efe353b08c6eb50.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/PCs/Universal/ClassCards/Fireball/fireball.tscn b/PCs/Universal/ClassCards/Fireball/fireball.tscn deleted file mode 100644 index 547ce5b..0000000 --- a/PCs/Universal/ClassCards/Fireball/fireball.tscn +++ /dev/null @@ -1,30 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://dyglfv8lh2rbg"] - -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Fireball/fireball.gd" id="1_a3evl"] -[ext_resource type="Texture2D" uid="uid://b54d5dc4jmlau" path="res://Assets/Textures/bomb.png" id="2_h8lqn"] - -[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_whkhx"] -bounce = 0.6 - -[sub_resource type="SphereShape3D" id="SphereShape3D_mi0in"] -radius = 0.2 - -[node name="RigidBody3D" type="RigidBody3D"] -collision_layer = 0 -collision_mask = 5 -physics_material_override = SubResource("PhysicsMaterial_whkhx") -gravity_scale = 0.0 -max_contacts_reported = 1 -contact_monitor = true -script = ExtResource("1_a3evl") - -[node name="Node3D" type="Sprite3D" parent="."] -transform = Transform3D(1.4, 0, 0, 0, 1.4, 0, 0, 0, 1.4, 0, 0, 0) -billboard = 1 -texture_filter = 0 -texture = ExtResource("2_h8lqn") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("SphereShape3D_mi0in") - -[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/PCs/Universal/ClassCards/Fireball/fireball_projectile.gd b/PCs/Universal/ClassCards/Fireball/fireball_projectile.gd new file mode 100644 index 0000000..987f3a7 --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/fireball_projectile.gd @@ -0,0 +1,8 @@ +extends StatusApplyingProjectile +class_name FireballProjectile + + +func build_status_object() -> StatusEffect: + var status = StatusDoT.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Fireball/fireball_projectile.png b/PCs/Universal/ClassCards/Fireball/fireball_projectile.png new file mode 100644 index 0000000000000000000000000000000000000000..a3540a80cdebc2881a7ba99c9249c7577a16ed54 GIT binary patch literal 1181 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfxtY$+0h!6k3=A3*OD9@; zGdqg3+6y}$3Fp#v30e}cu|t6?Y2`)_VU;5sZn>LgPoI!8?Jf)Fwx(X!15R5$hW_B+ zBAO%0;wb3y=1r}s&^2o{0YT%_Z~j^sKQH>OvqPzJZ^HKT4hJ1yh?cQeue=YO*npOM${?(~ox2?96a`?Yo7AiC?vt!M4pQE=A{jJiQ zDP$+Y7iF~I!_-S#t?aeWUHcikQMCVTqxV;yl=_X|y1&i|6_68^(|U5cDp~HU>fOxb zLdRDNa_r3v54CVC2u$m>Q9ZUqYSPXB`##Fww{iXW;*;6Rgid8|zdeqDr!Sf6nkrXC z&9f1m`uo1k+cQsG_Ewj3*!cH-HsiS`yCPKf`RfyfS;rsLwQw(fsqf`?S${}NY zf0#XdvuS1K?t*=+%=~GWy#9IQ-CXCx7U#cEow3&Z!p@-cs|wGZv^`?}L_GHJJ-eP0 zwfA3{Z!AfFdh_S=6ATOtoCO|{#S9F3${@^GvDChdfr06or;B4q1n1UJYd>a39$A5o zE;hwhW|ekE%~Gir4GTA~KF3A@-&Y<55=9J3ic(rFEI%s0Nv@xHGsj6n(^|g%-sa=; z-Yhv)AtzTKShA_&=EJJn#aB0~GhE1>^kHAMaKe*%#Yc@V^ZUF1&+$HRB-)zUAVqAK zjPQc&HhJX_;pwpsrji_QuC@HHJ*Sfw!`ys)v)1vaFP)`g_RXlNtj>A8Bci*Zd{$cd z$|n*>ReY$*ENN=m7U&9;Q$ z+=NCCqv#vgcO6)Me@V=O1%wP@Y%diQtqVH_5?mBE5%l(vthq<(-?%V zHDt9~vw!&WE7QO7tBaeII5ClmDs4aGipy(<09!b%1v_H zU71#tt*!8!YnABYW4P8jO)O*ev?e>F^(=q5kA^81>#Eq;O=7*q_(wt5PP%Swk!H}g z4Y8gI4Qsb9oX&V>#_7vh{r-zn5_ZgbmdIqeMS3ja>zhK^`{h^(Oy*U2u zS}B2o6UFz_)3UB#;hy*UlJJ|tgs-pnGYA^|4Y<%WDf0I`SI)+sMRAvxt-7#9zSE`P zg#_a^rQjR8*fKUT#I{)I^)dL&)naT44h;5mkUMpzcg(ff> zyz@4*=vH~drO-3;z|B<`#b?x22`;##*1{1o`{nFU*Q^CvLvEEU+rQ2sDm;L>i|@gW p`GPCb`iozEzxejk=F*$y3xk7Y*>*@6GcYhPc)I$ztaD0e0sxV$5h?%x literal 0 HcmV?d00001 diff --git a/PCs/Universal/ClassCards/Fireball/fireball_projectile.png.import b/PCs/Universal/ClassCards/Fireball/fireball_projectile.png.import new file mode 100644 index 0000000..b4602e8 --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/fireball_projectile.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://baarbcx0nxi7w" +path="res://.godot/imported/fireball_projectile.png-bb6edb8e296f3f750c1296e8d3dde180.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://PCs/Universal/ClassCards/Fireball/fireball_projectile.png" +dest_files=["res://.godot/imported/fireball_projectile.png-bb6edb8e296f3f750c1296e8d3dde180.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/PCs/Universal/ClassCards/Fireball/fireball_projectile.tscn b/PCs/Universal/ClassCards/Fireball/fireball_projectile.tscn new file mode 100644 index 0000000..b31680d --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/fireball_projectile.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=5 format=3 uid="uid://ddpixntjsbpqp"] + +[ext_resource type="PackedScene" uid="uid://beq6rn0babncg" path="res://Scenes/Projectiles/status_applying_projectile.tscn" id="1_a8cjq"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Fireball/fireball_projectile.gd" id="2_rin44"] +[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="3_vb4ff"] +[ext_resource type="Texture2D" uid="uid://baarbcx0nxi7w" path="res://PCs/Universal/ClassCards/Fireball/fireball_projectile.png" id="4_uua74"] + +[node name="Fireball" instance=ExtResource("1_a8cjq")] +script = ExtResource("2_rin44") +status_stats = ExtResource("3_vb4ff") + +[node name="Sprite3D" parent="." index="1"] +texture = ExtResource("4_uua74") diff --git a/PCs/Universal/ClassCards/Fireball/fireballweapon.gd b/PCs/Universal/ClassCards/Fireball/fireballweapon.gd deleted file mode 100644 index d0a6817..0000000 --- a/PCs/Universal/ClassCards/Fireball/fireballweapon.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends Weapon -class_name FireballWeapon - -@export var fireball_scene : PackedScene -@export var status_stats : StatusStats - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - $AnimationPlayer.play("shoot") - var fireball = fireball_scene.instantiate() as Fireball - fireball.position = $RayCast3D.global_position - fireball.status_stats = status_stats - get_tree().root.add_child(fireball) - fireball.direction = -global_transform.basis.z diff --git a/PCs/Universal/ClassCards/Fireball/weapon_fireball.gd b/PCs/Universal/ClassCards/Fireball/weapon_fireball.gd new file mode 100644 index 0000000..994d670 --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/weapon_fireball.gd @@ -0,0 +1,2 @@ +extends ProjectileWeapon +class_name FireballWeapon diff --git a/PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn b/PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn index 8e72368..a02f6e0 100644 --- a/PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn +++ b/PCs/Universal/ClassCards/Fireball/weapon_fireball.tscn @@ -1,79 +1,19 @@ -[gd_scene load_steps=10 format=3 uid="uid://cxlr31wydvroj"] +[gd_scene load_steps=7 format=3 uid="uid://dnwjfb4fexr0o"] -[ext_resource type="Texture2D" uid="uid://clr6kfyci5jqb" path="res://Assets/TextureAtlases/g_rocket_launcher.tres" id="1_jmfbt"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Fireball/fireballweapon.gd" id="2_rmmdm"] -[ext_resource type="PackedScene" uid="uid://dyglfv8lh2rbg" path="res://PCs/Universal/ClassCards/Fireball/fireball.tscn" id="3_xtqoc"] -[ext_resource type="Resource" uid="uid://dbanx8taicddm" path="res://Resources/StatusEffects/on_fire.tres" id="4_a0kl2"] -[ext_resource type="Resource" uid="uid://c473xvhm2g6m0" path="res://Resources/WeaponStats/fireball.tres" id="5_n36an"] -[ext_resource type="Texture2D" uid="uid://bgeu8dnqaxq7v" path="res://Assets/TextureAtlases/target_list.tres" id="6_bpghv"] +[ext_resource type="PackedScene" uid="uid://bqdllitxbbpyp" path="res://Scenes/Weapons/projectile_weapon.tscn" id="1_7k6fb"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Fireball/weapon_fireball.gd" id="2_nprco"] +[ext_resource type="PackedScene" uid="uid://ddpixntjsbpqp" path="res://PCs/Universal/ClassCards/Fireball/fireball_projectile.tscn" id="3_2j1mm"] +[ext_resource type="Resource" uid="uid://dhwhwicgpw7yh" path="res://PCs/Universal/ClassCards/Fireball/weapon_stats.tres" id="4_rqdnu"] +[ext_resource type="Texture2D" uid="uid://mwgpnnm3g3re" path="res://PCs/Universal/ClassCards/Fireball/fireball.png" id="5_r42ic"] -[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_hfmm6"] +atlas = ExtResource("5_r42ic") +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="FireballWeapon" instance=ExtResource("1_7k6fb")] +script = ExtResource("2_nprco") +projectile_scene = ExtResource("3_2j1mm") +stats = ExtResource("4_rqdnu") -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_jmfbt") -script = ExtResource("2_rmmdm") -fireball_scene = ExtResource("3_xtqoc") -status_stats = ExtResource("4_a0kl2") -stats = ExtResource("5_n36an") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 - -[node name="TextureRect" type="TextureRect" parent="."] -visible = false -texture_filter = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -20.0 -offset_top = -20.0 -offset_right = 20.0 -offset_bottom = 20.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = ExtResource("6_bpghv") +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_hfmm6") diff --git a/PCs/Universal/ClassCards/Fireball/weapon_stats.tres b/PCs/Universal/ClassCards/Fireball/weapon_stats.tres new file mode 100644 index 0000000..f30753a --- /dev/null +++ b/PCs/Universal/ClassCards/Fireball/weapon_stats.tres @@ -0,0 +1,8 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=2 format=3 uid="uid://dhwhwicgpw7yh"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_hmbwy"] + +[resource] +script = ExtResource("1_hmbwy") +attributes = Array[Resource("res://Scripts/Resources/stat_attribute.gd")]([]) +text = "" diff --git a/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres b/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres index 2ef59d7..d9b3277 100644 --- a/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres +++ b/PCs/Universal/ClassCards/GammaLaser/card_gamma_laser.tres @@ -1,7 +1,7 @@ [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://Assets/TextureAtlases/g_assault.tres" id="2_a7b2p"] +[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://PCs/Universal/ClassCards/Assault/g_assault.tres" id="2_a7b2p"] [resource] script = ExtResource("1_goeex") diff --git a/PCs/Universal/ClassCards/Gatling/card_gatling.tres b/PCs/Universal/ClassCards/Gatling/card_gatling.tres index 4ac57e0..387fbb7 100644 --- a/PCs/Universal/ClassCards/Gatling/card_gatling.tres +++ b/PCs/Universal/ClassCards/Gatling/card_gatling.tres @@ -1,19 +1,23 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://q23ludhji5p4"] +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://cvto66tp7rrst"] [ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_5html"] -[ext_resource type="Texture2D" uid="uid://d1am28tgvwaa0" path="res://Assets/TextureAtlases/g_accelerator.tres" id="2_a3hso"] -[ext_resource type="Resource" uid="uid://cc20tomywj0jm" path="res://Resources/TurretStats/accelerator.tres" id="3_yj53i"] -[ext_resource type="PackedScene" uid="uid://rcqf3vangjlp" path="res://PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn" id="4_4xp1m"] -[ext_resource type="PackedScene" uid="uid://bwcdgglljbmot" path="res://PCs/Universal/ClassCards/Gatling/tower_gatling.tscn" id="4_maix8"] -[ext_resource type="Resource" uid="uid://ouwge5etb4me" path="res://Resources/WeaponStats/accelerator.tres" id="5_hguan"] +[ext_resource type="Texture2D" uid="uid://cx5cwn11fuugq" path="res://PCs/Universal/ClassCards/Gatling/gatling.png" id="2_rof1s"] +[ext_resource type="Resource" uid="uid://nxl5wabgl36t" path="res://PCs/Universal/ClassCards/Gatling/tower_stats.tres" id="3_4hykq"] +[ext_resource type="PackedScene" uid="uid://dkxi1ssoa44jn" path="res://PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn" id="3_wkjyf"] +[ext_resource type="Resource" uid="uid://cj2x1jvo8l4ot" path="res://PCs/Universal/ClassCards/Gatling/weapon_stats.tres" id="4_76fd1"] +[ext_resource type="PackedScene" uid="uid://bjuc3x7u3f271" path="res://PCs/Universal/ClassCards/Gatling/tower_gatling.tscn" id="4_thk7u"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_rwa4l"] +atlas = ExtResource("2_rof1s") +region = Rect2(0, 0, 64, 64) [resource] script = ExtResource("1_5html") title = "Gatling" rarity = 0 faction = 0 -sprite = ExtResource("2_a3hso") -turret = ExtResource("4_maix8") -weapon = ExtResource("4_4xp1m") -weapon_stats = ExtResource("5_hguan") -tower_stats = ExtResource("3_yj53i") +sprite = SubResource("AtlasTexture_rwa4l") +turret_scene = ExtResource("4_thk7u") +weapon_scene = ExtResource("3_wkjyf") +weapon_stats = ExtResource("4_76fd1") +tower_stats = ExtResource("3_4hykq") diff --git a/Assets/Textures/accelerator.png b/PCs/Universal/ClassCards/Gatling/gatling.png similarity index 100% rename from Assets/Textures/accelerator.png rename to PCs/Universal/ClassCards/Gatling/gatling.png diff --git a/Assets/Textures/accelerator.png.import b/PCs/Universal/ClassCards/Gatling/gatling.png.import similarity index 70% rename from Assets/Textures/accelerator.png.import rename to PCs/Universal/ClassCards/Gatling/gatling.png.import index a4f1065..2256096 100644 --- a/Assets/Textures/accelerator.png.import +++ b/PCs/Universal/ClassCards/Gatling/gatling.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cx5cwn11fuugq" -path="res://.godot/imported/accelerator.png-1a0f15190d75444ec6328a57ff1e8fbe.ctex" +path="res://.godot/imported/gatling.png-884c4cce4654c4213d5c047580076c33.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/accelerator.png" -dest_files=["res://.godot/imported/accelerator.png-1a0f15190d75444ec6328a57ff1e8fbe.ctex"] +source_file="res://PCs/Universal/ClassCards/Gatling/gatling.png" +dest_files=["res://.godot/imported/gatling.png-884c4cce4654c4213d5c047580076c33.ctex"] [params] diff --git a/PCs/Universal/ClassCards/Gatling/speedytower.gd b/PCs/Universal/ClassCards/Gatling/speedytower.gd deleted file mode 100644 index cf9befc..0000000 --- a/PCs/Universal/ClassCards/Gatling/speedytower.gd +++ /dev/null @@ -1,32 +0,0 @@ -extends Tower -class_name SpeedyTower - -var third_cooldown := 0.0 - -var time_since_firing_started := 0.0 -var time_to_reach_max_speed := 3.0 -var max_speed_multiplier := 2.0 -var destination_multiplier := 0.0 - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - destination_multiplier = 1.0 / max_speed_multiplier - - -func _process(delta: float) -> void: - other_cooldown -= delta - if !targeted_enemy: - acquire_target() - else: - if model.global_position.distance_to(targeted_enemy.global_position) > stats.fire_range: - targeted_enemy = null - time_since_firing_started = 0.0 - third_cooldown = cooldown - if targeted_enemy: - time_since_firing_started += delta - var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) - third_cooldown = cooldown * (1.0 - (destination_multiplier * progress)) - aim() - if other_cooldown <= 0: - shoot() - other_cooldown = third_cooldown diff --git a/PCs/Universal/ClassCards/Gatling/speedyweapon.gd b/PCs/Universal/ClassCards/Gatling/speedyweapon.gd deleted file mode 100644 index e12b15e..0000000 --- a/PCs/Universal/ClassCards/Gatling/speedyweapon.gd +++ /dev/null @@ -1,60 +0,0 @@ -extends Weapon -class_name SpeedyWeapon - -var third_cooldown := 0.0 - -var time_since_firing_started := 0.0 -var time_to_reach_max_speed := 3.0 -var max_speed_multiplier := 2.0 -var destination_multiplier := 0.0 - - -func _ready() -> void: - cooldown = 1.0 / stats.fire_rate - destination_multiplier = 1.0 / max_speed_multiplier - $RayCast3D.target_position = Vector3(0, 0, -stats.fire_range) - - -func set_raycast_origin(node): - $RayCast3D.global_position = node.global_position - - -func _process(delta: float) -> void: - if stats != null: - other_cooldown -= delta - if trigger_held: - time_since_firing_started += delta - var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) - third_cooldown = cooldown * (1.0 - (destination_multiplier * progress)) - - -func _physics_process(_delta: float) -> void: - if trigger_held: - shoot() - - -func hold_trigger(): - trigger_held = true - - -func release_trigger(): - trigger_held = false - time_since_firing_started = 0.0 - third_cooldown = cooldown - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = third_cooldown - $AnimationPlayer.play("shoot") - if $RayCast3D.is_colliding(): - var target = $RayCast3D.get_collider() - if target != null: - var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) - if target_hitbox is Hitbox: - target_hitbox.damage(stats.damage) - -@rpc -func networked_shoot(): - $AnimationPlayer.play("shoot") - diff --git a/PCs/Universal/ClassCards/Gatling/tower_gatling.gd b/PCs/Universal/ClassCards/Gatling/tower_gatling.gd new file mode 100644 index 0000000..93eadfc --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/tower_gatling.gd @@ -0,0 +1,38 @@ +extends HitscanTower +class_name GatlingTower + +var time_since_firing_started := 0.0 +var time_to_reach_max_speed := 0.0 +var max_speed_multiplier := 0.0 +var current_time_between_shots := 0.0 +var final_time_between_shots := 0.0 + + +func _ready() -> void: + super._ready() + time_to_reach_max_speed = stats.get_attribute("Speed Time") + max_speed_multiplier = stats.get_attribute("Speed Multiplier") + final_time_between_shots = time_between_shots / max_speed_multiplier + + +func _process(delta: float) -> void: + if time_since_firing < current_time_between_shots: + time_since_firing += delta + + +func _physics_process(delta: float) -> void: + if !targeted_enemy: + acquire_target() + else: + if !targeted_enemy.alive or global_position.distance_to(targeted_enemy.global_position) > target_range: + targeted_enemy = null + time_since_firing_started = 0.0 + current_time_between_shots = time_between_shots + if targeted_enemy: + aim() + time_since_firing_started += delta + var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) + current_time_between_shots = lerpf(time_between_shots, final_time_between_shots, progress) + if time_since_firing >= current_time_between_shots: + time_since_firing -= current_time_between_shots + shoot() diff --git a/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn b/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn index 1d5ef13..12634d6 100644 --- a/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn +++ b/PCs/Universal/ClassCards/Gatling/tower_gatling.tscn @@ -1,57 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://bwcdgglljbmot"] +[gd_scene load_steps=4 format=3 uid="uid://bjuc3x7u3f271"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Gatling/speedytower.gd" id="1_26he3"] -[ext_resource type="Resource" uid="uid://cc20tomywj0jm" path="res://Resources/TurretStats/accelerator.tres" id="2_puwlv"] +[ext_resource type="PackedScene" uid="uid://dumiyjlnea4gq" path="res://Scenes/Towers/hitscan_tower.tscn" id="1_su74p"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Gatling/tower_gatling.gd" id="2_ipjp1"] +[ext_resource type="Resource" uid="uid://nxl5wabgl36t" path="res://PCs/Universal/ClassCards/Gatling/tower_stats.tres" id="3_oicqw"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_73y0x"] -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("model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_26he3") -stats = ExtResource("2_puwlv") -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"] - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00131059, 0.27342, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.226066, 0.0918715, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGBox3D4" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.227674, -0.174673, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGBox3D5" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00246562, -0.314903, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGBox3D6" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.259054, -0.125834, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGBox3D7" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.26701, 0.102116, -0.880753) -size = Vector3(0.177, 0.148, 0.929) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_73y0x") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_73y0x") +[node name="GatlingTower" instance=ExtResource("1_su74p")] +script = ExtResource("2_ipjp1") +stats = ExtResource("3_oicqw") diff --git a/PCs/Universal/ClassCards/Gatling/tower_stats.tres b/PCs/Universal/ClassCards/Gatling/tower_stats.tres new file mode 100644 index 0000000..abf2616 --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/tower_stats.tres @@ -0,0 +1,37 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=8 format=3 uid="uid://nxl5wabgl36t"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_80xci"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_nu6vr"] + +[sub_resource type="Resource" id="Resource_oayfg"] +script = ExtResource("1_nu6vr") +key = "Fire Delay" +value = 1.0 + +[sub_resource type="Resource" id="Resource_fekle"] +script = ExtResource("1_nu6vr") +key = "Damage" +value = 1.0 + +[sub_resource type="Resource" id="Resource_ud8xi"] +script = ExtResource("1_nu6vr") +key = "Range" +value = 10.0 + +[sub_resource type="Resource" id="Resource_cvkxf"] +script = ExtResource("1_nu6vr") +key = "Speed Multiplier" +value = 2.0 + +[sub_resource type="Resource" id="Resource_pivwn"] +script = ExtResource("1_nu6vr") +key = "Speed Time" +value = 3.0 + +[resource] +script = ExtResource("1_80xci") +target_type = 1 +attributes = Array[ExtResource("1_nu6vr")]([SubResource("Resource_oayfg"), SubResource("Resource_fekle"), SubResource("Resource_ud8xi"), SubResource("Resource_cvkxf"), SubResource("Resource_pivwn")]) +text = "Fires a shot every [Fire Delay] seconds dealing [Damage] damage at a range of [Range]m + +While attacking the same target, gradually accelerates to [Speed Multiplier] times the fire rate over [Speed Time]" diff --git a/PCs/Universal/ClassCards/Gatling/weapon_gatling.gd b/PCs/Universal/ClassCards/Gatling/weapon_gatling.gd new file mode 100644 index 0000000..66f4d53 --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/weapon_gatling.gd @@ -0,0 +1,36 @@ +extends HitscanWeapon +class_name GatlingWeapon + +var time_since_firing_started := 0.0 +var time_to_reach_max_speed := 0.0 +var max_speed_multiplier := 0.0 +var current_time_between_shots := 0.0 +var final_time_between_shots := 0.0 + + +func _ready() -> void: + super._ready() + time_to_reach_max_speed = stats.get_attribute("Speed Time") + max_speed_multiplier = stats.get_attribute("Speed Multiplier") + final_time_between_shots = time_between_shots / max_speed_multiplier + + +func _process(delta: float) -> void: + super._process(delta) + if trigger_held: + time_since_firing_started += delta + var progress = clamp(time_since_firing_started / time_to_reach_max_speed, 0, 1.0) + current_time_between_shots = lerpf(time_between_shots, final_time_between_shots, progress) + + +func _physics_process(_delta: float) -> void: + if trigger_held and time_since_firing >= current_time_between_shots: + time_since_firing -= current_time_between_shots + shoot() + networked_shoot.rpc() + + +func release_trigger(): + super.release_trigger() + time_since_firing_started = 0.0 + current_time_between_shots = time_between_shots diff --git a/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn b/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn index e24488a..057d1d5 100644 --- a/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn +++ b/PCs/Universal/ClassCards/Gatling/weapon_gatling.tscn @@ -1,58 +1,15 @@ -[gd_scene load_steps=7 format=3 uid="uid://rcqf3vangjlp"] +[gd_scene load_steps=5 format=3 uid="uid://dkxi1ssoa44jn"] -[ext_resource type="Texture2D" uid="uid://d1am28tgvwaa0" path="res://Assets/TextureAtlases/g_accelerator.tres" id="1_n3tw0"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Gatling/speedyweapon.gd" id="2_fkecd"] -[ext_resource type="Resource" uid="uid://ouwge5etb4me" path="res://Resources/WeaponStats/accelerator.tres" id="3_nq6wu"] +[ext_resource type="PackedScene" uid="uid://difwo7wlyqr3h" path="res://Scenes/Weapons/hitscan_weapon.tscn" id="1_fwlu5"] +[ext_resource type="Resource" uid="uid://cj2x1jvo8l4ot" path="res://PCs/Universal/ClassCards/Gatling/weapon_stats.tres" id="2_fnyjd"] +[ext_resource type="Texture2D" uid="uid://cx5cwn11fuugq" path="res://PCs/Universal/ClassCards/Gatling/gatling.png" id="2_rv8ps"] -[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_0im1y"] +atlas = ExtResource("2_rv8ps") +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="HitscanWeapon" instance=ExtResource("1_fwlu5")] +stats = ExtResource("2_fnyjd") -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_n3tw0") -script = ExtResource("2_fkecd") -stats = ExtResource("3_nq6wu") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_0im1y") diff --git a/PCs/Universal/ClassCards/Gatling/weapon_stats.tres b/PCs/Universal/ClassCards/Gatling/weapon_stats.tres new file mode 100644 index 0000000..80badf7 --- /dev/null +++ b/PCs/Universal/ClassCards/Gatling/weapon_stats.tres @@ -0,0 +1,37 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=8 format=3 uid="uid://cj2x1jvo8l4ot"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_630yu"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_vpmor"] + +[sub_resource type="Resource" id="Resource_fi7tc"] +script = ExtResource("1_vpmor") +key = "Fire Delay" +value = 0.4 + +[sub_resource type="Resource" id="Resource_r6h5d"] +script = ExtResource("1_vpmor") +key = "Damage" +value = 2.0 + +[sub_resource type="Resource" id="Resource_gwg1i"] +script = ExtResource("1_vpmor") +key = "Range" +value = 20.0 + +[sub_resource type="Resource" id="Resource_ogk1x"] +script = ExtResource("1_vpmor") +key = "Speed Multiplier" +value = 2.0 + +[sub_resource type="Resource" id="Resource_wdp3h"] +script = ExtResource("1_vpmor") +key = "Speed Time" +value = 3.0 + +[resource] +script = ExtResource("1_630yu") +target_type = 0 +attributes = Array[ExtResource("1_vpmor")]([SubResource("Resource_fi7tc"), SubResource("Resource_r6h5d"), SubResource("Resource_gwg1i"), SubResource("Resource_ogk1x"), SubResource("Resource_wdp3h")]) +text = "Fires a shot every [Fire Delay] seconds dealing [Damage] damage at a range of [Range]m + +While held, gradually accelerates to [Speed Multiplier] times the fire rate over [Speed Time]" diff --git a/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres b/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres index 3954ac6..ec60c45 100644 --- a/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres +++ b/PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres @@ -1,19 +1,9 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bhmbk26whdsys"] +[gd_resource type="Resource" script_class="Card" load_steps=2 format=3 uid="uid://fwsg5av1egp2"] -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_4m1rh"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="2_xsq3l"] -[ext_resource type="Resource" uid="uid://dhcukj44khkd7" path="res://Resources/TurretStats/glue.tres" id="3_tb5qj"] -[ext_resource type="PackedScene" uid="uid://d24q8j53oiyd4" path="res://PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn" id="4_0jn1x"] -[ext_resource type="PackedScene" uid="uid://dja1b2ke8clo5" path="res://PCs/Universal/ClassCards/GlueLauncher/tower_glue_launcher.tscn" id="4_1nhoo"] -[ext_resource type="Resource" uid="uid://dnucn65m12dmq" path="res://Resources/WeaponStats/glue.tres" id="5_qk2lw"] +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_tdu8a"] [resource] -script = ExtResource("1_4m1rh") -title = "Glue Gun" -rarity = 1 +script = ExtResource("1_tdu8a") +title = "" +rarity = 0 faction = 0 -sprite = ExtResource("2_xsq3l") -turret = ExtResource("4_1nhoo") -weapon = ExtResource("4_0jn1x") -weapon_stats = ExtResource("5_qk2lw") -tower_stats = ExtResource("3_tb5qj") diff --git a/Assets/Textures/glue_gun.png b/PCs/Universal/ClassCards/GlueLauncher/glue_gun.png similarity index 100% rename from Assets/Textures/glue_gun.png rename to PCs/Universal/ClassCards/GlueLauncher/glue_gun.png diff --git a/Assets/Textures/glue_gun.png.import b/PCs/Universal/ClassCards/GlueLauncher/glue_gun.png.import similarity index 69% rename from Assets/Textures/glue_gun.png.import rename to PCs/Universal/ClassCards/GlueLauncher/glue_gun.png.import index d39fb6c..59e3306 100644 --- a/Assets/Textures/glue_gun.png.import +++ b/PCs/Universal/ClassCards/GlueLauncher/glue_gun.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://oblavj8vj30n" -path="res://.godot/imported/glue_gun.png-e9e16bf72630f36d6fabf28ef7667749.ctex" +path="res://.godot/imported/glue_gun.png-da3fc52d7c51b5aff27c153501f54c6c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/glue_gun.png" -dest_files=["res://.godot/imported/glue_gun.png-e9e16bf72630f36d6fabf28ef7667749.ctex"] +source_file="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" +dest_files=["res://.godot/imported/glue_gun.png-da3fc52d7c51b5aff27c153501f54c6c.ctex"] [params] diff --git a/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd b/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd deleted file mode 100644 index b2c013a..0000000 --- a/PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends Weapon -class_name StickyWeapon - -@export var status_stats : StatusStats - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - $AnimationPlayer.play("shoot") - if $RayCast3D.is_colliding(): - var target = $RayCast3D.get_collider() - if target != null: - var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape()) - if target_hitbox is Hitbox: - var status = StatusSticky.new() - status.stats = status_stats - target.status_manager.add_effect(status) diff --git a/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.gd b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.gd new file mode 100644 index 0000000..e66346b --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.gd @@ -0,0 +1,7 @@ +extends StatusApplyingWeapon + + +func build_status_object() -> StatusEffect: + var status = StatusSlow.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn index 549ae83..fa4809a 100644 --- a/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn +++ b/PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.tscn @@ -1,60 +1,19 @@ -[gd_scene load_steps=8 format=3 uid="uid://d24q8j53oiyd4"] +[gd_scene load_steps=7 format=3 uid="uid://takm6diuy71m"] -[ext_resource type="Texture2D" uid="uid://jmxhiwsiw1f5" path="res://Assets/TextureAtlases/g_glue_gun.tres" id="1_pl6t8"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/GlueLauncher/stickyweapon.gd" id="2_dnhqb"] -[ext_resource type="Resource" uid="uid://d0643gfp52x3s" path="res://Resources/StatusEffects/sticky.tres" id="3_4t7ku"] -[ext_resource type="Resource" uid="uid://dnucn65m12dmq" path="res://Resources/WeaponStats/glue.tres" id="3_li2dn"] +[ext_resource type="PackedScene" uid="uid://nrdexcyatika" path="res://Scenes/Weapons/status_applying_weapon.tscn" id="1_7v0k2"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/GlueLauncher/weapon_glue_launcher.gd" id="2_12ex2"] +[ext_resource type="Resource" uid="uid://d0643gfp52x3s" path="res://Resources/StatusEffects/sticky.tres" id="3_xtk6n"] +[ext_resource type="Resource" uid="uid://boj1ho5x0sxtq" path="res://PCs/Universal/ClassCards/GlueLauncher/weapon_stats.tres" id="4_c3ve8"] +[ext_resource type="Texture2D" uid="uid://oblavj8vj30n" path="res://PCs/Universal/ClassCards/GlueLauncher/glue_gun.png" id="5_obawu"] -[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_ehcsl"] +atlas = ExtResource("5_obawu") +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="GlueLauncherWeapon" instance=ExtResource("1_7v0k2")] +script = ExtResource("2_12ex2") +status_stats = ExtResource("3_xtk6n") +stats = ExtResource("4_c3ve8") -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} - -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_pl6t8") -script = ExtResource("2_dnhqb") -status_stats = ExtResource("3_4t7ku") -stats = ExtResource("3_li2dn") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_ehcsl") diff --git a/PCs/Universal/ClassCards/GlueLauncher/weapon_stats.tres b/PCs/Universal/ClassCards/GlueLauncher/weapon_stats.tres new file mode 100644 index 0000000..d68e88a --- /dev/null +++ b/PCs/Universal/ClassCards/GlueLauncher/weapon_stats.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://boj1ho5x0sxtq"] + +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_8sdo4"] +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_gheu8"] + +[sub_resource type="Resource" id="Resource_gbocu"] +script = ExtResource("1_gheu8") +key = "Damage" +value = 0.0 + +[sub_resource type="Resource" id="Resource_6a2im"] +script = ExtResource("1_gheu8") +key = "Range" +value = 13.0 + +[sub_resource type="Resource" id="Resource_7npe0"] +script = ExtResource("1_gheu8") +key = "Fire Delay" +value = 0.5 + +[resource] +script = ExtResource("1_8sdo4") +attributes = Array[ExtResource("1_gheu8")]([SubResource("Resource_gbocu"), SubResource("Resource_6a2im"), SubResource("Resource_7npe0")]) +text = "Fires every [Fire Delay]s, making the target Sticky at a range of [Range]m" diff --git a/PCs/Universal/ClassCards/Icicle/card_icicle.tres b/PCs/Universal/ClassCards/Icicle/card_icicle.tres index bb1c636..48d132f 100644 --- a/PCs/Universal/ClassCards/Icicle/card_icicle.tres +++ b/PCs/Universal/ClassCards/Icicle/card_icicle.tres @@ -1,19 +1,19 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://bceyh6nn6h15y"] +[gd_resource type="Resource" script_class="Card" load_steps=6 format=3 uid="uid://cb1uqjl1387kk"] -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_g0mbh"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="2_gnblw"] -[ext_resource type="Resource" uid="uid://cdmkajdgfpk6h" path="res://Resources/TurretStats/icicle.tres" id="3_fgq80"] -[ext_resource type="PackedScene" uid="uid://clabvrajn6k3r" path="res://PCs/Universal/ClassCards/Icicle/tower_icicle.tscn" id="4_jwh3d"] -[ext_resource type="PackedScene" uid="uid://dvfpqrrmjfco4" path="res://PCs/Universal/ClassCards/Icicle/weapon_icicle.tscn" id="5_appk0"] -[ext_resource type="Resource" uid="uid://dsmlqik586soo" path="res://Resources/WeaponStats/icicle.tres" id="6_mfnfc"] +[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_cmmto"] +[ext_resource type="Texture2D" uid="uid://mqo5qcghfit8" path="res://PCs/Universal/ClassCards/Icicle/icicle.png" id="2_w5fi7"] +[ext_resource type="PackedScene" uid="uid://v3iuf4lt2iff" path="res://PCs/Universal/ClassCards/Icicle/weapon_icicle.tscn" id="3_ve3rv"] +[ext_resource type="Resource" uid="uid://ckjmym1ofww4" path="res://PCs/Universal/ClassCards/Icicle/weapon_stats.tres" id="4_yv37w"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_7due4"] +atlas = ExtResource("2_w5fi7") +region = Rect2(0, 0, 64, 64) [resource] -script = ExtResource("1_g0mbh") +script = ExtResource("1_cmmto") title = "Icicle" rarity = 3 faction = 0 -sprite = ExtResource("2_gnblw") -turret = ExtResource("4_jwh3d") -weapon = ExtResource("5_appk0") -weapon_stats = ExtResource("6_mfnfc") -tower_stats = ExtResource("3_fgq80") +sprite = SubResource("AtlasTexture_7due4") +weapon_scene = ExtResource("3_ve3rv") +weapon_stats = ExtResource("4_yv37w") diff --git a/PCs/Universal/ClassCards/Icicle/icicle.gd b/PCs/Universal/ClassCards/Icicle/icicle.gd deleted file mode 100644 index 887400e..0000000 --- a/PCs/Universal/ClassCards/Icicle/icicle.gd +++ /dev/null @@ -1,32 +0,0 @@ -extends RigidBody3D -class_name Icicle - -@export var explosion_range := 6.0 -var acceleration := 15.0 -var direction -var status_stats : StatusStats -var lifetime := 15.0 -var time_alive := 0.0 - - -func _process(delta: float) -> void: - time_alive += delta - if time_alive >= lifetime: - explode() - - -func _physics_process(_delta: float) -> void: - apply_central_force(direction * acceleration) - - -func _on_body_entered(_body: Node) -> void: - explode() - - -func explode(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= explosion_range: - var status = StatusCold.new() - status.stats = status_stats - enemy.status_manager.add_effect(status) - queue_free() diff --git a/PCs/Universal/ClassCards/Icicle/icicle.png b/PCs/Universal/ClassCards/Icicle/icicle.png new file mode 100644 index 0000000000000000000000000000000000000000..f19037b90d4c3f5ef2c6e6d9d3692a37de465abe GIT binary patch literal 2588 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU~u4IV_;yobgjOgfq^kM)7d#7GdY=oL1SX+ zL~CzmN0C;0Vdo>^T)HknO9D1_C~zgM+~^^!a)iSzchl_Y6LO~AW#Qb`)a!b{Y0JmZ zAN*THb3|Dj1zp~}sWlb4X00Y5Xngw3Ukl^sMc;LHC{^xF*nZyOpho1z0*wt*BKRue zUn~;muk(1d%~HD8En}zM`;6ePWj_qsYj23*DdTFbbz4p0lKVvtF_MdI^{>qb5zwul5*EyjAa-wotPfk}Q%Y9Y7 zo0(kb_-a9py_w;m7LEmhX}vb8$CgMt=84PR>T(Vn|Gv*=JojW*gvvgDeWEby_=CC@?!_jL8svxjdst<2nAu#c6QKkbs&Kaaed>wMVa{1>V-)|y|~8FYSC;klExN6epy#~!|C z*K?xw{wwp1CFxIZ{(OFdfq{Xuz$3DlfkEX32s1V%v&t|qaD;lgIEGX(zKw{SrtB*4 z`e7k^orQw?qlP~PTppECZcF=4>^)`nw(9)knH!fb;n2S6dHy9`3O8 z;j34fb^edHs(q7Sv3s}sk$g zEkk;Pqpyu^(jKRt{inA++$I08Xq#OubAcJhmE*=rXQpo4e73m9PT}48bLm-^Wg3k2 z%MXR$ds_b5GV96@Sc@{ayeTqeq{YyqxR+k zo4;<_m2laHi%Gj5)nEGa^ZmM6#-(X(3R&x}UHr?V_T-IBQwc*^oRRmG6iWf^(yHRU zje&=4mW5fL>d)CKH8DTD{t)AhP#dOwN!23jRwP~&aM>ohZ|xn~s+M}rJApe`>yGaK z%&)RI#(mbAgPlb$qAxb?)UK+LYzTDZc=W2YbxYFRhtj4Y+27uj^D(@ieKF;S|G_iDxc zCwVOj_~UG6$Z)sqHf4EO&%8I_wNJs`MHw-SKOU~XR{O61-ch;DpV$1zE)|@9bl2VU zYgXS%GwkWTHqFeNS%9%ChlNf4Z;n+B>yy8&#s{9}pJ zvpxiK-`bEB_vHGGi?vHGUQ&19Z|InCYm?NyiaD95i^^^(_e@;-+|MlNbLQuo8!s(=R;KL`JL6>R-}sr@HI zxA0dCvp-+6xSKua*5cZg_180BYBwAy;5_kF;EKgr_g*Q^gFP48?QCsC6&}xBf9!`` z)DF44%f?@3UVLH4$q>NxZ2u{lg>$FMaJ;_hw7S_zh>x}GmPGTeEg$@b@r_V&R%3tpF)El$?yyr9MxP7v4XWGI0an@n0h^Z59m994w zY5MnQwb|stT|qos3+F#vQeS#@3xj_B%h)9^|NLEJdGX)r-KlN|Rv5Hie&)VSLtMpU zLf!U{K8GCti07>djh<_7pxv%x-u3$FZQ<~Tl^42prC4O@7yh;^bE0y)v1jGgGZl-jtw^h?|DiWi)SvtOJ4ZF8*JZZB z4Cl4KO^D~;w%H_M^39T?L7x@-N|@%ApOt8?=x^@j-+J?tbc1Uxt3-We&pgpRx1xXd zyzmm%40!!6&|dm{T6W#p_8mRTuU(iSXM33OhU2{H%mVQYUb~yZb_*r=OmqGp`I=8w zDQBzO^_sx7XWV3?Z-v?`c~5*8e}$!`dvOUtC=3(WV|GIwQ%uO1NP2T6t z-R33?K6u&?tyB6(0O zNc@40VA{v6ANqe}OIYkl|B(Jx>e^FAhmTSRZ$16+Q(?=a_^bTAA6$Oi)Yvh3f<|t4 z?r8=FPq%gAOS>-2{@hh~fwMo^{&TNDO!@x0+YAdH^+vwk_IvBcwC@58{xz2$uaz{r zn!sLj?X*O`EJNI+iHrAd6Z*jMbK;F#cf)@#5SH67F13Qsv17T<{QWU@v6`MbE^Ys6 z&KRl0dZ+Ug*{u8F_uOrb^|e`kOCHHozjv*h!riMUywc4;*{Oo%{N`hqmv7Uqe7Se^ z?^$k7oUN6MZ)smoJX zF4 StatusEffect: + var status = StatusSlow.new() + status.stats = status_stats + return status diff --git a/PCs/Universal/ClassCards/Icicle/icicle_projectile.png b/PCs/Universal/ClassCards/Icicle/icicle_projectile.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8216dc39cd4fcb4c1a4a95181d906104fcbe9c GIT binary patch literal 969 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfxtY$+0h!6k3=A3*OD9@; zGdqg3+6y}$3Fp#v30e}cu|t6?Y2`)_VU;5sZn>LgPoI!8?Jf)Fwx(X!15R5$hW_B+ zBAO%0;wb3y=1r}s&^2o{0YT%_Z~j^sKQH>OvqPzJZ^HKT4hJ1yh?cQeue=YO*npOM${?(~ox2?96a`?Yo7AiC?vt!M4pQE=A{jJiQ zDP$+Y7iF~I!_-S#t?aeWUHcikQMCVTqxV;yl=_X|y1&i|6_68^(|U5cDp~HU>fOxb zLdRDNa_r3v54CVC2u$m>Q9ZUqYSPXB`##Fww{iXW;*;6Rgid8|zdeqDr!Sf6nkrXC z&9f1m`uo1k+cQsG_Ewj3*!cH-HsiS`yCPKf`RfyfS;rsLwQw(fsqf`?S${}NY zf0#XdvuS1K?t*=+%=~GWy#9IQ-CXCx7U#cEow3&Z!p@-cs|wGZv^`?}L_GHJJ-eP0 zwfA3{Z!AfFdh_S=6ATOtoCO|{#S9F3${@^GvDChdfq{w1)5S3)f^%!Qp&zrO0C%9A z<6-5D7l(~CGAf02SE!Fr=kf$BIm^nAC09S2rtzjsye2O`e&5Gn zPnn=euJZi-;r{XSrJJ6=o^9HSB#e*o6^2M-M%>Zu0ZRK zRUAno>2j;PvTN42XYmUwE3c4GJmGw&aj}D8j8Ws}vO{_k-k+zy+Y$$kv1E* zOIsGLyb@u|DDKB<$0P%)(FO59;ic@^YH> z{cqL*;prB|Z%*Ca%e?oxp|R+EC!uAX>lm3f9P&}+aXi1e^VES)mJE$?$2IwiL>oNq zm5&{_T+v?oi!X#pWR-z{_hb#;9mQOKOP6w*UfRp-Ij2?AJ@`P+rz1&seH284Be+-p zJ;9P?9`7~Tpkec)zS)M1|IV@q9C_Tb|KjJmaJ3)4Ii?@vn@+~1GW~d{x~Au4cCgH2 zDeq@t%zFf6xP??M9+Grge|6Rp;r)V*F5FjHzP+sH> void: - time_alive += delta - if time_alive >= lifetime: - explode() - - -func _physics_process(_delta: float) -> void: - if is_instance_valid(target): - direction = global_position.direction_to(target.global_position) - apply_central_force(direction * acceleration) - - -func _on_body_entered(_body: Node) -> void: - explode() - - -func explode(): - for enemy in get_tree().get_nodes_in_group("Enemies"): - if global_position.distance_to(enemy.global_position) <= explosion_range: - enemy.damage(damage) - queue_free() diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket.png b/PCs/Universal/ClassCards/RocketLauncher/rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d80b02c2b5ed0a3eb9c2de17c0297e3c6be998 GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfxtY$+0h!6k3=A3*ODFF3 zJ{%x&tln+uqv8t-JDk}?+r?ZQWw!Fgc6o$;*lLn_i_2GPl8ENIrtank3cG$t{oyYW zjS*#W6m+?Br&c%U(ax|H9rp@~>uSE&wNKVxpvv9$)U>BD^>?0@VE>u3`YulXTQ2mu z89&_e(DHF`u;;(n_vTktR>=nM{kQ-7^Q@CI<}sG~9#U?5{Ogbr?@7`7fqNA1q&~SU z`LOok3T*+J}aM^`RP)_dl=D&oq5| zGjrwLP1PSfCMx)`%oRE<@}bjntLoEF2N)Zg-Xab*=NZtXSY>*aU+aEX1P?us0?gU1~OLiiT`lRNij)_x7k-hG|>A}?2c zUy#h}cP@L@KHlZ81@;wR%KPQLYWmvL%^zxbaz9_FWIfw`bmb+SKhW>P&zF{-> z-=h7=FNL@7Pk$kv?#{!&z`$AH5n0T@pr;JNj1^1m%NQ6KYdl>XLn1iOPIB}+V!-1X zy@NH0wS0#32De8GJl5=FEN{5l5xu}@f5PkArFWLhHE>xq%i`OAeZRJc^ZQ;NXP?s3KEKdW{=TE2kQZ0m!`BCg9%=JhI1=S`cqi*@#FD+Yz8 zO(l(~;yXxEx>WEqkHGSW+xCtEa5|@$1J67_OJ+&sd$mk~!+YNtrcsH~&0+xUgd1e#50+ zNsB%%+9{lKZW2Rf)&DtrqZwQlbG4jJ?D+Vj%KC&%wnGl1LoV0BXC7(6YbtYC8{9Y^ zo;}*5xa9AR)s-!a9{z7IXHO`W=vw(_FT*uA1+R>bv$7x8+pNC-nayigjqc}%ehxC1 uug43$kYev)f0ZTC884&Iv@7F{w7E{K?V@8RT^Se{7(8A5T-G@yGywn+X@eaA literal 0 HcmV?d00001 diff --git a/PCs/Universal/ClassCards/RocketLauncher/rocket.png.import b/PCs/Universal/ClassCards/RocketLauncher/rocket.png.import new file mode 100644 index 0000000..3b6c3be --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/rocket.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bode8mfmr3r1h" +path="res://.godot/imported/rocket.png-351afd78a91fe9f7469af30003adbe29.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://PCs/Universal/ClassCards/RocketLauncher/rocket.png" +dest_files=["res://.godot/imported/rocket.png-351afd78a91fe9f7469af30003adbe29.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/PCs/Universal/ClassCards/RocketLauncher/rocket.png.kra b/PCs/Universal/ClassCards/RocketLauncher/rocket.png.kra new file mode 100644 index 0000000000000000000000000000000000000000..2ac94f739e46ea8cfbce9fe126eb6fd34242c136 GIT binary patch literal 7619 zcmWIWW@h1H0D+mAdEpB`FfSKoU|;}Y4h9B>+|1n6lFEYA#DapH%;dz9%=|q43f=6Y z%#uWqMiB-E1`Y<0M)#i&uWV#uV8~)+VBiL6Ow7zn$xqg+$jxaDiOs)dAX58&{f9q? zPJi;eG^w*>QEO=EZrxXT*Xtj9zbrmq-2S;Si}Eb{yEgakFKQHL;lCUy z;3FQq<>DP7k>7~|XZG=2NXX6otH@Edd#-<{K+V$5^AB4S>vEQPp_j$_1UlZp)dd+RJ@4wB?*$bN_S5@ZTRdN$u zAJOL-%kAg+Ieo)-GpT^AwO)D&XKQxvc08>se(kZ4vgfQO^_xAcZtVWX33BN(=cg{d zsNu6&XQz+Bt@+UlyfkvNoFchdKM41f?b+~JhCjLITF?4x*UmPYNpTl37@qxN;qG*i zSG!0??jlR1(MO?uOv|&CRE3u+XkYHgYuWmmkN?{p=iiP#eS3E>uFOi^k-F;K#*ke~ zi!R%$$3%U35#hkd@?idhNjs}l4?1jqxaqNyM{b|X_GrGz_f@)sgC<;(PIG;t>UnUF zV5d^PrB>1|9Y+tTzm|r1E%PG0Lk+4|B(C0-_;AJHc?#2_6Xcd_x}CrCVQI!q2{nnW zXTOEzOY;5V+o$F@9qg6aXbCD<>st(Y*(AM@LE^8(t_6~cnhp1y<^Bw3Xk=>93@vh|Qo{kN|enm|W zUrKwN(=~qdpr+z{d;P+!)pz61%~@Zf6|igbxeE>Y^RBhL2V0vNX+^srGe|?%=?g|!fgw8EFlTShj)a(-Y}-%8 zGroDpaQW2UZH(WiPI0(sRAFDTUorPUoWyIZ)8Yj$rheJ{wVBs%{+HvmyUwOLFQ}GU zd_TZGL;KeAi>K4p>G6li9^MjWYI(b&;t$`+C-$hZc<<}!gY%gf7?!d?%BO;&)UwRf za=n7Q^w&Heil0B7^e8DI;lbB01)NC<2`omE`-(R(p7fu*tE*8Yz0qA|!ZT~8Lp{M; ze=d=fh&W^$E90#7Y|q};vsEW)JQS0VeH}I7(_6;*Jlp4;Y?j_+eIwPn+<$|?j0c-t zUq4;-we-EtWZUifGxYvtB?c~ixpTkIw|;Y3i}MQGpWoBZYrEaVBXdY1W82qRCzdE5 z&B~cqJZpy}-^K)myvF#2w7U=Pd`{aKz4pLMr8{~Lr+HpA z)O=uIxi3%N|F0h#t2|Fhn||ZgUuw^1%ak=QXZ(1-BuRqh%7%p|eUn-qJUe=JPw#o1 zcgNCGl1s0pJ!7}ak9amWCDkM4P}?n;bshz`?NYJ~5?tJ+%jT7zOpSf`aT@D(?uc{K z&)>3O%--U&de-!n=PsPz9=U@dJ%i(kO1HXpQt$M8QX748+s^N?|GxjoGm8nolfL^@ zUf2g zD)sF8_)7J8zt5P69h_&9!awEdhI6|Me{JcVefH1qLlMp_9V#>L#l_!z7NYypTRkxT ze=*B9oC!r zGcz!VGB7ZN=H(^krl#oUBvz&t6+LDrf5KdYf<68H6pXk+JbhflJzYXP6wFM( z91mAdcaIPdFTgXx)hF09%2mOH%f&IoQNfVQK*vDGC(2F7!pxY9k%8gCPlgA37#RL5 zFg!3mp<@51&|`S0U;BW8;emMr!~*Q(BnJKJcP4ur>>rqb9rw^kQNi|sNkf9e1EYEe zh6m;d=iR$^59T~&Wi;n0)6RL;L^|*9-@h>Dty_oYymhp2-UNnsmSzqN5A^OiSS?_9 zpyRl}I)UMVwnKsiDA+X}A23)oFg(z3XfS)g#PC4P@d1S6%G#+8YWdg z;9yV?f1tqdfWt;_es)s8WJYZ*dpjhj`@PN(MLFj=R z!vhw_2Wr+03=b?E6&#xQ8~h&_Fg#SReZYY;fhaHx43r18sPSPY1_rdOEpy*Rk&}Ue zfrWvAK?zsZ)=NoEODxSPDafoy&0%C=`28Pb32GVP>|R@v#K^$l!^FTKiPNCW4SKXQY(>Ytg5tWG?{)2y^%tmew>>rOX-xf{rzO~b=B&PplmC_r zeQw4Nw>-3b931TVFZR9pm6cVp!F&Jh|NcDd z-`>nzd3RIw2akygek^l^PK$i#^xUetd4Fwl{65dFM}|+{1{@Q0@7q(cc+s>at2Irv zcWL@JZaVe1d|q5x#fn>dP5FBH9Y0)RU#Pnxhwb2TM}ZK&h5zKvy_vON!?Jf@=f23x zRo@pR^ZK33p0$s6`D=lF#h3Dad9RwjHg)rd8lK$G7b;oLc3)ky@4V%%)|sI{U8ir@ z%>B1$fAULV)QFk%$8XOnW(J0(cnWW0#-+?rR4BYn!G*Uq1A}&g3j@CbLjuPGbp|GF zZLjO0g1~Uiy24e>P1?&%07!>Rq86OzdD_A`+Vqi2g zdthYqfRlmY{{v2;2dWGYN*oyf|5vC}V0xg>&|v?-&_Tgo!A61UfgZS|wRBK$RA7Ff zx90 z9rW!Vm^3!nD>y&UW1z@kmlAF;guonj>C%0K!!BLAgzT{UV26cZI_&;^S~#rxb=zh3(6@iUUyZFfb_aJy2(O zzyK=W)omZJ**(xWssJvLRT>|#fkc%Z5)42kw7ET~AZM#w!0^0-=8aThKv|G>76m0xSeH@16@;g57v z=J14Ex?tjYc@=Y$$L;^0CTX^PSbpB3@Zj>_#uHdHr>rYye#E@AK;{}xN?>FY>o$pn zMh1PE_Y72+V$4?YFbFgi-3*XqXusn0<<-`OW)4j|_RY#&!Kkp2y=52c&PfY(Sv9T} z>|zjEzkwq$t5Io!o?!Z+D$#I*Gtm*kdwE?FuDSI2TnSsPnEoi5EkZaZzbeWjt;twn zpIx7sO0=nCp7i?P?}T^Vi3w$!_4nt2htK~i&)KHEnek)jqg#!KKT0uJ-kZ0%)|dOt zcIli2QxE62pSE(Ss9{*d#_&!2c~e-QbEfH51|1hq>vcAD-(y@D=8HINJ$|ZM^29l| zxt}i8KAg$;F2+WB^IT4inbR%)uGKTTY{}r<=)=Ax;!kmdn5&8HV_tKeSlfSDPeG}k z!PC{xWt~$(6Kac8!}rupc_s!1DJBL6X_O)@GZ$Q<>1XDpq*j2&IT@vxp8mD5ugJ|& zC`&CW&dkrVRWj5wP*Oh~-z?7|$k%^K%NL5i{UOG%gNhU}`UV5sMLRwLNuC0=Rl0r$o zt&*XE0Yq_fX;D#XUP(x1E=&v9G`OKqWvLYf`9&qV#i=DFnR)5Oc3cVyHpQuhrKx$z zscxA$sR4;48CV?!wgsWqDX}=!FA;}bXlgz4GD|WObKF3l_AAXzN-e@_gRUW1pN&3- z8*TJ41Kf@)z?+dtjv1WP7(f$3=rc*6ZYl_?G=fOjyb?qg?r9{DT1Ey229-ujP|1#% zR6^H?K1z?!D9nsGW{<8LeRLS48-!IFZ?Z5jAdMBHYeXN818D+bmBxkaI0om?jX>}A zgS3ONN@EQ-4kJ)nk?7_jw^Bg8e~?)qtkQTCr+Jyl$>_$Q_f void: - super._ready() - for x in target_max: - var icon = target_icon_scene.instantiate() - add_child(icon) - icon.set_visible(false) - target_icons.append(icon) - - -func _process(delta: float) -> void: - super._process(delta) - if !trigger_held or other_cooldown > 0: - return - var target_list = targets.duplicate() - for target in target_list: - if !is_instance_valid(target): - targets.erase(target) - continue - for x in target_icons.size(): - if x < targets.size(): - target_icons[x].global_position = targets[x].global_position - target_icons[x].set_visible(true) - else: - target_icons[x].set_visible(false) - $TextureRect.set_visible(true) - $TextureRect.texture.region = Rect2(128 * targets.size(), 0, 128, 128) - if targets.size() < target_max and $RayCast3D.is_colliding() and !targets.has($RayCast3D.get_collider()): - targets.append($RayCast3D.get_collider()) - - -func _physics_process(_delta: float) -> void: - pass - - -func release_trigger(): - if trigger_held: - super.release_trigger() - shoot() - - -func shoot(): - if other_cooldown <= 0 and stats != null: - other_cooldown = cooldown - $AnimationPlayer.play("shoot") - for target in targets: - var rocket = rocket_scene.instantiate() as Rocket - rocket.position = $RayCast3D.global_position - rocket.damage = stats.damage - rocket.target = target - get_tree().root.add_child(rocket) - rocket.apply_central_impulse(Vector3.UP * 3.0) - targets.clear() - $TextureRect.set_visible(false) - for icon in target_icons: - icon.set_visible(false) diff --git a/Assets/Textures/target_icon.png b/PCs/Universal/ClassCards/RocketLauncher/target_icon.png similarity index 100% rename from Assets/Textures/target_icon.png rename to PCs/Universal/ClassCards/RocketLauncher/target_icon.png diff --git a/Assets/Textures/target_icon.png.import b/PCs/Universal/ClassCards/RocketLauncher/target_icon.png.import similarity index 68% rename from Assets/Textures/target_icon.png.import rename to PCs/Universal/ClassCards/RocketLauncher/target_icon.png.import index 04885c0..3596f2a 100644 --- a/Assets/Textures/target_icon.png.import +++ b/PCs/Universal/ClassCards/RocketLauncher/target_icon.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://hnfa76d6tdi" -path="res://.godot/imported/target_icon.png-52b48b3583774442e6ace899a7e119fd.ctex" +path="res://.godot/imported/target_icon.png-62861a4f843a005c647a8233c54d7a2c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/target_icon.png" -dest_files=["res://.godot/imported/target_icon.png-52b48b3583774442e6ace899a7e119fd.ctex"] +source_file="res://PCs/Universal/ClassCards/RocketLauncher/target_icon.png" +dest_files=["res://.godot/imported/target_icon.png-62861a4f843a005c647a8233c54d7a2c.ctex"] [params] diff --git a/Scenes/target_icon.tscn b/PCs/Universal/ClassCards/RocketLauncher/target_icon.tscn similarity index 75% rename from Scenes/target_icon.tscn rename to PCs/Universal/ClassCards/RocketLauncher/target_icon.tscn index fd6d151..40ce3e4 100644 --- a/Scenes/target_icon.tscn +++ b/PCs/Universal/ClassCards/RocketLauncher/target_icon.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=2 format=3 uid="uid://csufsbi64asau"] -[ext_resource type="Texture2D" uid="uid://hnfa76d6tdi" path="res://Assets/Textures/target_icon.png" id="1_r4a3f"] +[ext_resource type="Texture2D" uid="uid://hnfa76d6tdi" path="res://PCs/Universal/ClassCards/RocketLauncher/target_icon.png" id="1_r4a3f"] [node name="Node3D" type="Sprite3D"] sorting_offset = 20.0 -pixel_size = 0.003 +pixel_size = 0.002 billboard = 1 no_depth_test = true fixed_size = true diff --git a/Assets/Textures/target_list.png b/PCs/Universal/ClassCards/RocketLauncher/target_list.png similarity index 100% rename from Assets/Textures/target_list.png rename to PCs/Universal/ClassCards/RocketLauncher/target_list.png diff --git a/Assets/Textures/target_list.png.import b/PCs/Universal/ClassCards/RocketLauncher/target_list.png.import similarity index 69% rename from Assets/Textures/target_list.png.import rename to PCs/Universal/ClassCards/RocketLauncher/target_list.png.import index 31b5e01..59b35da 100644 --- a/Assets/Textures/target_list.png.import +++ b/PCs/Universal/ClassCards/RocketLauncher/target_list.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cc2umukpibmx1" -path="res://.godot/imported/target_list.png-22999316bc250bbe67cd788be5f870a7.ctex" +path="res://.godot/imported/target_list.png-65d3525b52a0ccfc6d97382117363a29.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/target_list.png" -dest_files=["res://.godot/imported/target_list.png-22999316bc250bbe67cd788be5f870a7.ctex"] +source_file="res://PCs/Universal/ClassCards/RocketLauncher/target_list.png" +dest_files=["res://.godot/imported/target_list.png-65d3525b52a0ccfc6d97382117363a29.ctex"] [params] diff --git a/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.gd b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.gd new file mode 100644 index 0000000..136b9b9 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.gd @@ -0,0 +1,75 @@ +extends ProjectileTower +class_name RocketLauncherTower + +var target_max := 3 +var targets = [] + + +func _ready() -> void: + super._ready() + target_max = floori(stats.get_attribute("Target Limit")) + + +func _physics_process(_delta: float) -> void: + if !is_multiplayer_authority(): + #only doing the graphical sort of stuff but not shoot logic + if targeted_enemy and is_instance_valid(targeted_enemy): + if !targeted_enemy.alive or global_position.distance_to(targeted_enemy.global_position) > target_range: + targeted_enemy = null + else: + aim() + return + if targets.size() < target_max: + acquire_target() + if targets.size() > 0: + var target_list = targets.duplicate() + for target in target_list: + if !is_instance_valid(target) or !target.alive: + targets.erase(target) + continue + if global_position.distance_to(target.global_position) > target_range: + targets.erase(target) + if targets.size() > 0: + targeted_enemy = targets[0] + networked_acquire_target.rpc(get_tree().root.get_path_to(targeted_enemy)) + aim() + if time_since_firing >= time_between_shots: + time_since_firing -= time_between_shots + shoot() + + +func acquire_target(): + var possible_enemies = [] + for enemy in get_tree().get_nodes_in_group("Enemies"): + if global_position.distance_to(enemy.global_position) > target_range: + continue + if !(enemy.stats.target_type & stats.target_type): + continue + if targets.has(enemy): + continue + possible_enemies.append(enemy) + + for x in target_max - targets.size(): + if possible_enemies.size() == 0: + return + var chosen = possible_enemies.pick_random() + possible_enemies.erase(chosen) + targets.append(chosen) + + +func shoot(): + for target in targets: + networked_spawn_rocket.rpc(get_tree().root.get_path_to(target), multiplayer.get_unique_id()) + + +@rpc("reliable", "call_local") +func networked_spawn_rocket(target_node_path, peer_id): + var target = get_tree().root.get_node(target_node_path) + var projectile = projectile_scene.instantiate() as RocketProjectile + projectile.position = global_position + Vector3.UP + projectile.damage = damage + projectile.target = target + projectile.name = base_name + str(peer_id) + str(projectile_id) + get_tree().root.add_child(projectile) + projectile.apply_central_impulse(Vector3.UP * 3.0) + projectile_id += 1 diff --git a/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn index 36c9d49..e9ff1d4 100644 --- a/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn +++ b/PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.tscn @@ -1,43 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://br3bd1jmi235x"] +[gd_scene load_steps=4 format=3 uid="uid://b3q0f6w30nwsh"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/rockettower.gd" id="1_8hb2v"] -[ext_resource type="PackedScene" uid="uid://hr0dw2533tsl" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket.tscn" id="2_by0gu"] -[ext_resource type="Resource" uid="uid://duofn25nuu84q" path="res://Resources/TurretStats/rocketlauncher.tres" id="3_ynh7l"] +[ext_resource type="PackedScene" uid="uid://t0b32qb8eub2" path="res://Scenes/Towers/projectile_tower.tscn" id="1_su4lx"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/tower_rocket_launcher.gd" id="2_33124"] +[ext_resource type="PackedScene" uid="uid://p2vwo8ivben6" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn" id="3_8kvhb"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fouf8"] -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("model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_8hb2v") -rocket_scene = ExtResource("2_by0gu") -stats = ExtResource("3_ynh7l") -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, 1.97939, 0) - -[node name="CSGBox3D" type="CSGBox3D" parent="Model"] - -[node name="CSGBox3D2" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.65) -size = Vector3(0.805859, 0.771887, 1.04243) - -[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.20204) -size = Vector3(0.597715, 0.561942, 0.242169) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_fouf8") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_fouf8") +[node name="RocketLauncherTower" instance=ExtResource("1_su4lx")] +script = ExtResource("2_33124") +projectile_scene = ExtResource("3_8kvhb") diff --git a/PCs/Universal/ClassCards/RocketLauncher/tower_stats.tres b/PCs/Universal/ClassCards/RocketLauncher/tower_stats.tres new file mode 100644 index 0000000..52f7410 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/tower_stats.tres @@ -0,0 +1,30 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=7 format=3 uid="uid://c65rq455ma8f6"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_3kswp"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_k606l"] + +[sub_resource type="Resource" id="Resource_4fjm2"] +script = ExtResource("1_3kswp") +key = "Fire Delay" +value = 5.0 + +[sub_resource type="Resource" id="Resource_uwj4j"] +script = ExtResource("1_3kswp") +key = "Target Limit" +value = 3.0 + +[sub_resource type="Resource" id="Resource_6qv5v"] +script = ExtResource("1_3kswp") +key = "Damage" +value = 8.0 + +[sub_resource type="Resource" id="Resource_y1rtq"] +script = ExtResource("1_3kswp") +key = "Range" +value = 20.0 + +[resource] +script = ExtResource("1_k606l") +target_type = 2 +attributes = Array[ExtResource("1_3kswp")]([SubResource("Resource_4fjm2"), SubResource("Resource_uwj4j"), SubResource("Resource_6qv5v"), SubResource("Resource_y1rtq")]) +text = "Every /Fire Delay\\s, fires a homing rocket at up to /Target Limit\\ flying enemies up to /Range\\m away that deal /Damage\\ damage" diff --git a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd new file mode 100644 index 0000000..b399597 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd @@ -0,0 +1,76 @@ +extends ProjectileWeapon +class_name RocketLauncherWeapon + +@export var target_icon_scene : PackedScene +@export var targeting_raycast : RayCast3D +@export var targeting_ui_rect : TextureRect +var target_max := 3 +var targets = [] +var target_icons = [] + + +func _ready() -> void: + super._ready() + targeting_raycast.global_position = hero.camera.global_position + + target_max = floori(stats.get_attribute("Target Limit")) + for x in target_max: + var icon = target_icon_scene.instantiate() + add_child(icon) + icon.set_visible(false) + target_icons.append(icon) + + +func _process(delta: float) -> void: + super._process(delta) + if !trigger_held or time_since_firing < time_between_shots: + return + var target_list = targets.duplicate() + for target in target_list: + if !is_instance_valid(target): + targets.erase(target) + continue + for x in target_icons.size(): + if x < targets.size(): + target_icons[x].global_position = targets[x].sprite.global_position + target_icons[x].set_visible(true) + else: + target_icons[x].set_visible(false) + targeting_ui_rect.set_visible(true) + targeting_ui_rect.texture.region = Rect2(128 * targets.size(), 0, 128, 128) + if targets.size() < target_max and targeting_raycast.is_colliding() and !targets.has(targeting_raycast.get_collider()): + targets.append(targeting_raycast.get_collider()) + + +func release_trigger(): + super.release_trigger() + if targets.size() > 0 and time_since_firing >= time_between_shots: + time_since_firing -= time_between_shots + shoot() + + +func shoot(): + animator.play("shoot") + for target in targets: + networked_spawn_rocket.rpc(get_tree().root.get_path_to(target), multiplayer.get_unique_id()) + targets.clear() + targeting_ui_rect.set_visible(false) + for icon in target_icons: + icon.set_visible(false) + + +@rpc("reliable", "call_local") +func networked_spawn_rocket(target_node_path, peer_id): + var target = get_tree().root.get_node(target_node_path) + var projectile = projectile_scene.instantiate() as RocketProjectile + projectile.position = global_position + projectile.damage = damage + projectile.target = target + projectile.name = str(peer_id) + str(projectile_id) + get_tree().root.add_child(projectile) + projectile.apply_central_impulse(Vector3.UP * 3.0) + projectile_id += 1 + + +func _physics_process(_delta: float) -> void: + pass diff --git a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn index 98affaa..06718b6 100644 --- a/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn +++ b/PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.tscn @@ -1,70 +1,37 @@ -[gd_scene load_steps=10 format=3 uid="uid://cbmoi73hquaer"] +[gd_scene load_steps=10 format=3 uid="uid://bdp7icdejayvr"] -[ext_resource type="Texture2D" uid="uid://clr6kfyci5jqb" path="res://Assets/TextureAtlases/g_rocket_launcher.tres" id="1_67vj1"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket_weapon.gd" id="2_rfuq6"] -[ext_resource type="Resource" uid="uid://dtfgyt85mp1ar" path="res://Resources/WeaponStats/rocketlauncher.tres" id="3_7mndo"] -[ext_resource type="PackedScene" uid="uid://hr0dw2533tsl" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket.tscn" id="3_xn783"] -[ext_resource type="PackedScene" uid="uid://csufsbi64asau" path="res://Scenes/target_icon.tscn" id="4_ptwpb"] -[ext_resource type="Texture2D" uid="uid://bgeu8dnqaxq7v" path="res://Assets/TextureAtlases/target_list.tres" id="5_nbrvn"] +[ext_resource type="PackedScene" uid="uid://bqdllitxbbpyp" path="res://Scenes/Weapons/projectile_weapon.tscn" id="1_gxaua"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/RocketLauncher/weapon_rocket_launcher.gd" id="2_8x1tf"] +[ext_resource type="PackedScene" uid="uid://p2vwo8ivben6" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket_projectile.tscn" id="2_lfuvh"] +[ext_resource type="PackedScene" uid="uid://csufsbi64asau" path="res://PCs/Universal/ClassCards/RocketLauncher/target_icon.tscn" id="3_2x5va"] +[ext_resource type="Resource" uid="uid://d2yo07m2mp2mp" path="res://PCs/Universal/ClassCards/RocketLauncher/weapon_stats.tres" id="3_i1hxj"] +[ext_resource type="Texture2D" uid="uid://by1y15lm0bppe" path="res://PCs/Universal/ClassCards/RocketLauncher/rocket_launcher.png" id="4_iygkf"] +[ext_resource type="Texture2D" uid="uid://cc2umukpibmx1" path="res://PCs/Universal/ClassCards/RocketLauncher/target_list.png" id="6_jlv88"] -[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_f4p4w"] +atlas = ExtResource("4_iygkf") +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="AtlasTexture" id="AtlasTexture_ewxon"] +atlas = ExtResource("6_jlv88") +region = Rect2(0, 0, 128, 128) -[sub_resource type="AnimationLibrary" id="AnimationLibrary_ntl6p"] -_data = { -"RESET": SubResource("Animation_n8b32"), -"shoot": SubResource("Animation_g0h8q") -} +[node name="RocketLauncher" node_paths=PackedStringArray("targeting_raycast", "targeting_ui_rect") instance=ExtResource("1_gxaua")] +script = ExtResource("2_8x1tf") +target_icon_scene = ExtResource("3_2x5va") +targeting_raycast = NodePath("RayCast3D") +targeting_ui_rect = NodePath("TextureRect") +projectile_scene = ExtResource("2_lfuvh") +stats = ExtResource("3_i1hxj") -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_67vj1") -script = ExtResource("2_rfuq6") -rocket_scene = ExtResource("3_xn783") -target_icon_scene = ExtResource("4_ptwpb") -stats = ExtResource("3_7mndo") +[node name="Sprite3D" parent="." index="0"] +texture = SubResource("AtlasTexture_f4p4w") -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] +[node name="RayCast3D" type="RayCast3D" parent="." index="2"] +target_position = Vector3(0, 0, -100) collision_mask = 4 -[node name="TextureRect" type="TextureRect" parent="."] -visible = false -texture_filter = 1 +[node name="TextureRect" type="TextureRect" parent="." index="3"] anchors_preset = 8 anchor_left = 0.5 anchor_top = 0.5 @@ -76,4 +43,4 @@ offset_right = 20.0 offset_bottom = 20.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("5_nbrvn") +texture = SubResource("AtlasTexture_ewxon") diff --git a/PCs/Universal/ClassCards/RocketLauncher/weapon_stats.tres b/PCs/Universal/ClassCards/RocketLauncher/weapon_stats.tres new file mode 100644 index 0000000..bfe4ea8 --- /dev/null +++ b/PCs/Universal/ClassCards/RocketLauncher/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://d2yo07m2mp2mp"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_1le4i"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="2_0trth"] + +[sub_resource type="Resource" id="Resource_4fjm2"] +script = ExtResource("1_1le4i") +key = "Fire Delay" +value = 2.0 + +[sub_resource type="Resource" id="Resource_uwj4j"] +script = ExtResource("1_1le4i") +key = "Target Limit" +value = 3.0 + +[sub_resource type="Resource" id="Resource_6qv5v"] +script = ExtResource("1_1le4i") +key = "Damage" +value = 8.0 + +[resource] +script = ExtResource("2_0trth") +target_type = 0 +attributes = Array[ExtResource("1_1le4i")]([SubResource("Resource_4fjm2"), SubResource("Resource_uwj4j"), SubResource("Resource_6qv5v")]) +text = "Every /Fire Delay\\s, hold to target up to /Target Limit\\ enemies and release to fire homing rockets that deal /Damage\\ damage" diff --git a/PCs/Universal/ClassCards/Sniper/card_sniper.tres b/PCs/Universal/ClassCards/Sniper/card_sniper.tres index 345c409..49678c6 100644 --- a/PCs/Universal/ClassCards/Sniper/card_sniper.tres +++ b/PCs/Universal/ClassCards/Sniper/card_sniper.tres @@ -1,19 +1,23 @@ -[gd_resource type="Resource" script_class="Card" load_steps=7 format=3 uid="uid://cvf5bxtu6er17"] +[gd_resource type="Resource" script_class="Card" load_steps=8 format=3 uid="uid://ckm88acryitl4"] [ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_5vmtk"] -[ext_resource type="Texture2D" uid="uid://fmqq24n7rwvm" path="res://Assets/TextureAtlases/g_sniper.tres" id="2_skiu7"] -[ext_resource type="Resource" uid="uid://85iany3x0uv2" path="res://Resources/WeaponStats/sniper.tres" id="3_acfmb"] -[ext_resource type="PackedScene" uid="uid://v21rc7vtqp8l" path="res://Scenes/Weapons/scopedweapon.tscn" id="3_i0e3w"] -[ext_resource type="Resource" uid="uid://ddw7pj1ckwmp8" path="res://Resources/TurretStats/sniper.tres" id="3_tfyul"] -[ext_resource type="PackedScene" uid="uid://ryhc48vl36fc" path="res://Scenes/Towers/snipertower.tscn" id="4_kbb6b"] +[ext_resource type="Texture2D" uid="uid://cv2eycs1j0ho7" path="res://PCs/Universal/ClassCards/Sniper/g_sniper.png" id="2_go86x"] +[ext_resource type="Resource" uid="uid://eb0by6ba1d43" path="res://PCs/Universal/ClassCards/Sniper/tower_stats.tres" id="3_6i55t"] +[ext_resource type="PackedScene" uid="uid://bd65e03fscyxr" path="res://PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn" id="3_qfpvu"] +[ext_resource type="Resource" uid="uid://3y7n1vdvf822" path="res://PCs/Universal/ClassCards/Sniper/weapon_stats.tres" id="4_7kvq1"] +[ext_resource type="PackedScene" uid="uid://bt4qbc5lp4nhr" path="res://PCs/Universal/ClassCards/Sniper/tower_sniper.tscn" id="4_k5nhs"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_fckie"] +atlas = ExtResource("2_go86x") +region = Rect2(0, 0, 64, 64) [resource] script = ExtResource("1_5vmtk") title = "Sniper" rarity = 4 faction = 0 -sprite = ExtResource("2_skiu7") -turret = ExtResource("4_kbb6b") -weapon = ExtResource("3_i0e3w") -weapon_stats = ExtResource("3_acfmb") -tower_stats = ExtResource("3_tfyul") +sprite = SubResource("AtlasTexture_fckie") +turret_scene = ExtResource("4_k5nhs") +weapon_scene = ExtResource("3_qfpvu") +weapon_stats = ExtResource("4_7kvq1") +tower_stats = ExtResource("3_6i55t") diff --git a/Assets/Textures/g_sniper.png b/PCs/Universal/ClassCards/Sniper/g_sniper.png similarity index 100% rename from Assets/Textures/g_sniper.png rename to PCs/Universal/ClassCards/Sniper/g_sniper.png diff --git a/Assets/Textures/g_sniper.png.import b/PCs/Universal/ClassCards/Sniper/g_sniper.png.import similarity index 70% rename from Assets/Textures/g_sniper.png.import rename to PCs/Universal/ClassCards/Sniper/g_sniper.png.import index 5200106..cb614d7 100644 --- a/Assets/Textures/g_sniper.png.import +++ b/PCs/Universal/ClassCards/Sniper/g_sniper.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cv2eycs1j0ho7" -path="res://.godot/imported/g_sniper.png-540afb6cf2bb7c1448f9a3771f0c56fe.ctex" +path="res://.godot/imported/g_sniper.png-60dd6bed4ee309636ac895a2e167e09c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/g_sniper.png" -dest_files=["res://.godot/imported/g_sniper.png-540afb6cf2bb7c1448f9a3771f0c56fe.ctex"] +source_file="res://PCs/Universal/ClassCards/Sniper/g_sniper.png" +dest_files=["res://.godot/imported/g_sniper.png-60dd6bed4ee309636ac895a2e167e09c.ctex"] [params] diff --git a/Assets/Textures/scopetest.png b/PCs/Universal/ClassCards/Sniper/scopetest.png similarity index 100% rename from Assets/Textures/scopetest.png rename to PCs/Universal/ClassCards/Sniper/scopetest.png diff --git a/Assets/Textures/scopetest.png.import b/PCs/Universal/ClassCards/Sniper/scopetest.png.import similarity index 70% rename from Assets/Textures/scopetest.png.import rename to PCs/Universal/ClassCards/Sniper/scopetest.png.import index ad19e53..4cbbd7d 100644 --- a/Assets/Textures/scopetest.png.import +++ b/PCs/Universal/ClassCards/Sniper/scopetest.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bepgxu7wtcl1i" -path="res://.godot/imported/scopetest.png-67622c4a1fb91662a6422da2eebebaa6.ctex" +path="res://.godot/imported/scopetest.png-6eaf83096c5e4493d2c0b323ec8f5877.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Assets/Textures/scopetest.png" -dest_files=["res://.godot/imported/scopetest.png-67622c4a1fb91662a6422da2eebebaa6.ctex"] +source_file="res://PCs/Universal/ClassCards/Sniper/scopetest.png" +dest_files=["res://.godot/imported/scopetest.png-6eaf83096c5e4493d2c0b323ec8f5877.ctex"] [params] diff --git a/PCs/Universal/ClassCards/Sniper/tower_sniper.gd b/PCs/Universal/ClassCards/Sniper/tower_sniper.gd new file mode 100644 index 0000000..83ea726 --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/tower_sniper.gd @@ -0,0 +1,2 @@ +extends HitscanTower +class_name SniperTower diff --git a/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn b/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn index d16f549..5087da1 100644 --- a/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn +++ b/PCs/Universal/ClassCards/Sniper/tower_sniper.tscn @@ -1,37 +1,10 @@ -[gd_scene load_steps=4 format=3 uid="uid://ryhc48vl36fc"] +[gd_scene load_steps=4 format=3 uid="uid://bt4qbc5lp4nhr"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Assault/tower.gd" id="1_tmpm5"] -[ext_resource type="Resource" uid="uid://ddw7pj1ckwmp8" path="res://Resources/TurretStats/sniper.tres" id="2_opda8"] +[ext_resource type="PackedScene" uid="uid://dumiyjlnea4gq" path="res://Scenes/Towers/hitscan_tower.tscn" id="1_x1nem"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Sniper/tower_sniper.gd" id="2_v5fr7"] +[ext_resource type="Resource" uid="uid://eb0by6ba1d43" path="res://PCs/Universal/ClassCards/Sniper/tower_stats.tres" id="3_a0vis"] -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mt54a"] -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("model", "range_sphere", "minimap_range_sphere")] -script = ExtResource("1_tmpm5") -stats = ExtResource("2_opda8") -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"] - -[node name="CSGBox3D3" type="CSGBox3D" parent="Model"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.776406) -size = Vector3(0.481654, 0.427749, 1.38438) - -[node name="CSGSphere3D" type="CSGSphere3D" parent="Model"] -visible = false -radius = 7.5 -material = SubResource("StandardMaterial3D_mt54a") - -[node name="CSGSphere3D2" type="CSGSphere3D" parent="Model"] -visible = false -layers = 4 -radius = 7.5 -material = SubResource("StandardMaterial3D_mt54a") +[node name="HitscanTower" instance=ExtResource("1_x1nem")] +script = ExtResource("2_v5fr7") +target_type = 3 +stats = ExtResource("3_a0vis") diff --git a/PCs/Universal/ClassCards/Sniper/tower_stats.tres b/PCs/Universal/ClassCards/Sniper/tower_stats.tres new file mode 100644 index 0000000..1c68601 --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/tower_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://eb0by6ba1d43"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_ihl3s"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_otwn2"] + +[sub_resource type="Resource" id="Resource_1ct8q"] +script = ExtResource("1_ihl3s") +key = "Fire Delay" +value = 2.0 + +[sub_resource type="Resource" id="Resource_erx05"] +script = ExtResource("1_ihl3s") +key = "Damage" +value = 20.0 + +[sub_resource type="Resource" id="Resource_vfpmb"] +script = ExtResource("1_ihl3s") +key = "Range" +value = 50.0 + +[resource] +script = ExtResource("1_otwn2") +target_type = 3 +attributes = Array[ExtResource("1_ihl3s")]([SubResource("Resource_1ct8q"), SubResource("Resource_erx05"), SubResource("Resource_vfpmb")]) +text = "Fires a shot every /Fire Delay\\ seconds dealing /Damage\\ damage at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/Sniper/scopedweapon.gd b/PCs/Universal/ClassCards/Sniper/weapon_sniper.gd similarity index 51% rename from PCs/Universal/ClassCards/Sniper/scopedweapon.gd rename to PCs/Universal/ClassCards/Sniper/weapon_sniper.gd index 1145fc7..261c604 100644 --- a/PCs/Universal/ClassCards/Sniper/scopedweapon.gd +++ b/PCs/Universal/ClassCards/Sniper/weapon_sniper.gd @@ -1,15 +1,15 @@ -extends Weapon -class_name ScopedWeapon +extends HitscanWeapon +class_name SniperWeapon -var scope_mask : Texture +@export var scope_mask : CanvasLayer func hold_second_trigger(): super.hold_second_trigger() - $CanvasLayer.set_visible(true) + scope_mask.set_visible(true) hero.set_zoom_factor(3.0) func release_second_trigger(): super.release_second_trigger() - $CanvasLayer.set_visible(false) + scope_mask.set_visible(false) diff --git a/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn b/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn index 4518bbf..e54d42c 100644 --- a/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn +++ b/PCs/Universal/ClassCards/Sniper/weapon_sniper.tscn @@ -1,85 +1,30 @@ -[gd_scene load_steps=8 format=3 uid="uid://v21rc7vtqp8l"] +[gd_scene load_steps=7 format=3 uid="uid://bd65e03fscyxr"] -[ext_resource type="Texture2D" uid="uid://fmqq24n7rwvm" path="res://Assets/TextureAtlases/g_sniper.tres" id="1_6a01i"] -[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Sniper/scopedweapon.gd" id="2_qemq6"] -[ext_resource type="Resource" uid="uid://85iany3x0uv2" path="res://Resources/WeaponStats/sniper.tres" id="3_3c36k"] -[ext_resource type="Texture2D" uid="uid://bepgxu7wtcl1i" path="res://Assets/Textures/scopetest.png" id="3_pyugo"] +[ext_resource type="PackedScene" uid="uid://difwo7wlyqr3h" path="res://Scenes/Weapons/hitscan_weapon.tscn" id="1_6ph0d"] +[ext_resource type="Script" path="res://PCs/Universal/ClassCards/Sniper/weapon_sniper.gd" id="2_r0w4v"] +[ext_resource type="Texture2D" uid="uid://bepgxu7wtcl1i" path="res://PCs/Universal/ClassCards/Sniper/scopetest.png" id="3_fhx8q"] +[ext_resource type="Resource" uid="uid://3y7n1vdvf822" path="res://PCs/Universal/ClassCards/Sniper/weapon_stats.tres" id="3_mmfq3"] +[ext_resource type="Texture2D" uid="uid://cv2eycs1j0ho7" path="res://PCs/Universal/ClassCards/Sniper/g_sniper.png" id="4_ub37g"] -[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_cussn"] +atlas = ExtResource("4_ub37g") +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="HitscanWeapon" node_paths=PackedStringArray("scope_mask") instance=ExtResource("1_6ph0d")] +script = ExtResource("2_r0w4v") +scope_mask = NodePath("CanvasLayer") +stats = ExtResource("3_mmfq3") -[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_cussn") -[node name="Weapon" type="Sprite3D"] -layers = 2 -billboard = 1 -texture_filter = 0 -texture = ExtResource("1_6a01i") -script = ExtResource("2_qemq6") -stats = ExtResource("3_3c36k") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_ntl6p") -} - -[node name="RayCast3D" type="RayCast3D" parent="."] -collision_mask = 4 - -[node name="CanvasLayer" type="CanvasLayer" parent="."] -layer = 2 +[node name="CanvasLayer" type="CanvasLayer" parent="." index="4"] visible = false -[node name="TextureRect" type="TextureRect" parent="CanvasLayer"] -clip_children = 1 -visibility_layer = 2 -texture_filter = 1 +[node name="TextureRect" type="TextureRect" parent="CanvasLayer" index="0"] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("3_pyugo") - -[node name="ColorRect" type="ColorRect" parent="CanvasLayer/TextureRect"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -color = Color(0, 0, 0, 1) +texture = ExtResource("3_fhx8q") diff --git a/PCs/Universal/ClassCards/Sniper/weapon_stats.tres b/PCs/Universal/ClassCards/Sniper/weapon_stats.tres new file mode 100644 index 0000000..3e9b884 --- /dev/null +++ b/PCs/Universal/ClassCards/Sniper/weapon_stats.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="CardText" load_steps=6 format=3 uid="uid://3y7n1vdvf822"] + +[ext_resource type="Script" path="res://Scripts/Resources/stat_attribute.gd" id="1_7xbx2"] +[ext_resource type="Script" path="res://Scripts/Resources/card_text.gd" id="1_t3oy2"] + +[sub_resource type="Resource" id="Resource_58kde"] +script = ExtResource("1_7xbx2") +key = "Fire Delay" +value = 1.2 + +[sub_resource type="Resource" id="Resource_jl4jv"] +script = ExtResource("1_7xbx2") +key = "Damage" +value = 30.0 + +[sub_resource type="Resource" id="Resource_28kyj"] +script = ExtResource("1_7xbx2") +key = "Range" +value = 50.0 + +[resource] +script = ExtResource("1_t3oy2") +target_type = 0 +attributes = Array[ExtResource("1_7xbx2")]([SubResource("Resource_58kde"), SubResource("Resource_jl4jv"), SubResource("Resource_28kyj")]) +text = "Fires a shot every /Fire Delay\\ seconds dealing /Damage\\ damage at a range of /Range\\m" diff --git a/PCs/Universal/ClassCards/SpeedEnhancer/card_speed_enhancer.tres b/PCs/Universal/ClassCards/SpeedEnhancer/card_speed_enhancer.tres deleted file mode 100644 index 396a94c..0000000 --- a/PCs/Universal/ClassCards/SpeedEnhancer/card_speed_enhancer.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="Card" load_steps=3 format=3 uid="uid://bkhbxi82sd3y4"] - -[ext_resource type="Script" path="res://Scripts/Resources/card.gd" id="1_lii00"] -[ext_resource type="Texture2D" uid="uid://ca4lwwd3e0y73" path="res://Assets/TextureAtlases/g_assault.tres" id="2_npyaf"] - -[resource] -script = ExtResource("1_lii00") -title = "Speed Enhancer" -rarity = 2 -faction = 0 -sprite = ExtResource("2_npyaf") diff --git a/PCs/hero.gd b/PCs/hero.gd index 92fd4ab..8b6423d 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -16,15 +16,14 @@ signal died @export var sprite : EightDirectionSprite3D @export var interaction_raycast : RayCast3D @export var inventory : Inventory -@export var weapon : Weapon @export var card : CardInHand @export var pause_menu_scene : PackedScene -@export var weapon_scene : PackedScene @export var hud : HUD @export var movement : PlayerMovement @export var sprint_zoom_speed := 0.2 var equipped_card : Card +var weapon : Weapon var paused := false var editing_mode := true var profile: PlayerProfile @@ -206,15 +205,14 @@ func equip_weapon(): unequip_weapon() return if inventory.contents.size() > 0: - networked_equip_weapon.rpc() equipped_card = inventory.remove() - weapon = equipped_card.weapon.instantiate() + networked_equip_weapon.rpc(Data.cards.find(equipped_card)) + weapon = equipped_card.weapon_scene.instantiate() weapon.name = "weapon" weapon.set_multiplayer_authority(multiplayer.get_unique_id()) - right_hand.add_child(weapon) gauntlet_sprite.set_visible(false) - weapon.set_raycast_origin(camera) weapon.set_hero(self) + right_hand.add_child(weapon) check_left_hand_valid() @@ -234,14 +232,13 @@ func networked_set_ready_state(state: bool): @rpc("reliable") -func networked_equip_weapon(): - equipped_card = inventory.remove() - weapon = equipped_card.weapon.instantiate() +func networked_equip_weapon(card_index): + equipped_card = Data.cards[card_index] + weapon = equipped_card.weapon_scene.instantiate() weapon.set_multiplayer_authority(multiplayer.get_remote_sender_id()) weapon.name = "weapon" - right_hand.add_child(weapon) - weapon.set_raycast_origin(camera) weapon.set_hero(self) + right_hand.add_child(weapon) @rpc("reliable") diff --git a/PCs/hero.tscn b/PCs/hero.tscn index 34cc91a..a5dbe10 100644 --- a/PCs/hero.tscn +++ b/PCs/hero.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=29 format=3 uid="uid://dxgxbtf68lcv5"] +[gd_scene load_steps=28 format=3 uid="uid://dxgxbtf68lcv5"] [ext_resource type="Script" path="res://PCs/hero.gd" id="1_pihpe"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://PCs/Red/red.tres" id="2_dbyo0"] [ext_resource type="PackedScene" uid="uid://ri8r03wqy80t" path="res://Scenes/8_direction_sprite.tscn" id="2_ib0t5"] [ext_resource type="Texture2D" uid="uid://dkbkam81k355s" path="res://Assets/TextureAtlases/gauntlet.tres" id="3_5myy0"] [ext_resource type="PackedScene" uid="uid://buvgdem68wtev" path="res://Scenes/Menus/pause_menu.tscn" id="3_avnsx"] -[ext_resource type="PackedScene" uid="uid://d1xe6hsq05110" path="res://PCs/Universal/ClassCards/Assault/weapon_assault.tscn" id="4_b0lpv"] [ext_resource type="PackedScene" uid="uid://dixtx38u4jhd7" path="res://Scenes/UI/card_hand.tscn" id="4_mwtvp"] [ext_resource type="PackedScene" uid="uid://dqt1ggtkpkuhs" path="res://Scenes/gauntlet.tscn" id="5_jlxb3"] [ext_resource type="Script" path="res://Scripts/inventory.gd" id="6_cf5ap"] @@ -72,7 +71,6 @@ interaction_raycast = NodePath("Head/RayCast3D") inventory = NodePath("Inventory") card = NodePath("SubViewport/Head2/LeftHand/SubViewport/Node2D") pause_menu_scene = ExtResource("3_avnsx") -weapon_scene = ExtResource("4_b0lpv") hud = NodePath("HUD") movement = NodePath("PlayerMovement") diff --git a/Resources/TurretStats/accelerator.tres b/Resources/TurretStats/accelerator.tres deleted file mode 100644 index 77969f0..0000000 --- a/Resources/TurretStats/accelerator.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://cc20tomywj0jm"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_jhska"] - -[resource] -script = ExtResource("1_jhska") -can_target = 1 -damage = 1.0 -fire_range = 8.0 -fire_rate = 4.0 diff --git a/Resources/TurretStats/assault.tres b/Resources/TurretStats/assault.tres deleted file mode 100644 index 4df20d6..0000000 --- a/Resources/TurretStats/assault.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://cktq4o3yuxgsa"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_ujduk"] - -[resource] -script = ExtResource("1_ujduk") -can_target = 1 -damage = 1.0 -fire_range = 8.0 -fire_rate = 5.0 diff --git a/Resources/TurretStats/blowdart.tres b/Resources/TurretStats/blowdart.tres deleted file mode 100644 index d5fb20c..0000000 --- a/Resources/TurretStats/blowdart.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://by1gyra5a4aks"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_cofk4"] - -[resource] -script = ExtResource("1_cofk4") -can_target = 3 -damage = 10.0 -fire_range = 20.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/bomblauncher.tres b/Resources/TurretStats/bomblauncher.tres deleted file mode 100644 index 213f30f..0000000 --- a/Resources/TurretStats/bomblauncher.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://crmsk6lvp5i4e"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_2a4i2"] - -[resource] -script = ExtResource("1_2a4i2") -can_target = 1 -damage = 30.0 -fire_range = 10.0 -fire_rate = 0.2 diff --git a/Resources/TurretStats/fireball.tres b/Resources/TurretStats/fireball.tres deleted file mode 100644 index 5b79927..0000000 --- a/Resources/TurretStats/fireball.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://b8a635kajtq6"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_3jfph"] - -[resource] -script = ExtResource("1_3jfph") -can_target = 3 -damage = 10.0 -fire_range = 20.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/flametower.tres b/Resources/TurretStats/flametower.tres deleted file mode 100644 index 142a0c8..0000000 --- a/Resources/TurretStats/flametower.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://5ywipj3632u8"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_h37p4"] - -[resource] -script = ExtResource("1_h37p4") -can_target = 1 -damage = 0.0 -fire_range = 5.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/glue.tres b/Resources/TurretStats/glue.tres deleted file mode 100644 index ba435d6..0000000 --- a/Resources/TurretStats/glue.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://dhcukj44khkd7"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_ntl50"] - -[resource] -script = ExtResource("1_ntl50") -can_target = 1 -damage = 0.0 -fire_range = 20.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/icicle.tres b/Resources/TurretStats/icicle.tres deleted file mode 100644 index 3ac28b4..0000000 --- a/Resources/TurretStats/icicle.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://cdmkajdgfpk6h"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_sxyf1"] - -[resource] -script = ExtResource("1_sxyf1") -can_target = 3 -damage = 10.0 -fire_range = 20.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/reactor.tres b/Resources/TurretStats/reactor.tres deleted file mode 100644 index c87c437..0000000 --- a/Resources/TurretStats/reactor.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://baa8sauri4218"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_uugt6"] - -[resource] -script = ExtResource("1_uugt6") -can_target = 1 -damage = 10.0 -fire_range = 20.0 -fire_rate = 1.0 diff --git a/Resources/TurretStats/refridgerator.tres b/Resources/TurretStats/refridgerator.tres deleted file mode 100644 index 65f67a1..0000000 --- a/Resources/TurretStats/refridgerator.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://ugpxwdjfvssu"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_71ewu"] - -[resource] -script = ExtResource("1_71ewu") -can_target = 1 -damage = 10.0 -fire_range = 4.0 -fire_rate = 2.0 diff --git a/Resources/TurretStats/rocketlauncher.tres b/Resources/TurretStats/rocketlauncher.tres deleted file mode 100644 index e1d1c24..0000000 --- a/Resources/TurretStats/rocketlauncher.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://duofn25nuu84q"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_g11ny"] - -[resource] -script = ExtResource("1_g11ny") -can_target = 2 -damage = 6.0 -fire_range = 20.0 -fire_rate = 0.15 diff --git a/Resources/TurretStats/sniper.tres b/Resources/TurretStats/sniper.tres deleted file mode 100644 index 2cc921c..0000000 --- a/Resources/TurretStats/sniper.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="TowerStats" load_steps=2 format=3 uid="uid://ddw7pj1ckwmp8"] - -[ext_resource type="Script" path="res://Scripts/Resources/TowerStats.gd" id="1_xsq5r"] - -[resource] -script = ExtResource("1_xsq5r") -can_target = 3 -damage = 20.0 -fire_range = 20.0 -fire_rate = 0.6 diff --git a/Resources/WeaponStats/accelerator.tres b/Resources/WeaponStats/accelerator.tres deleted file mode 100644 index 4cb4e70..0000000 --- a/Resources/WeaponStats/accelerator.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://ouwge5etb4me"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_lgw1t"] - -[resource] -script = ExtResource("1_lgw1t") -damage = 1 -fire_rate = 12.0 -fire_range = 25.0 diff --git a/Resources/WeaponStats/assault.tres b/Resources/WeaponStats/assault.tres deleted file mode 100644 index fbb9b22..0000000 --- a/Resources/WeaponStats/assault.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://w15ojqyxd72q"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_ttw2m"] - -[resource] -script = ExtResource("1_ttw2m") -damage = 3 -fire_rate = 10.0 -fire_range = 25.0 diff --git a/Resources/WeaponStats/blowdart.tres b/Resources/WeaponStats/blowdart.tres deleted file mode 100644 index b8af080..0000000 --- a/Resources/WeaponStats/blowdart.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dhegsd45xi7na"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_xkaiy"] - -[resource] -script = ExtResource("1_xkaiy") -damage = 0 -fire_rate = 1.0 -fire_range = 30.0 diff --git a/Resources/WeaponStats/bomblauncher.tres b/Resources/WeaponStats/bomblauncher.tres deleted file mode 100644 index c86aec3..0000000 --- a/Resources/WeaponStats/bomblauncher.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://kbaiy5u6imtu"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_xiddx"] - -[resource] -script = ExtResource("1_xiddx") -damage = 10 -fire_rate = 1.0 -fire_range = 6.0 diff --git a/Resources/WeaponStats/fireball.tres b/Resources/WeaponStats/fireball.tres deleted file mode 100644 index 3b9b63a..0000000 --- a/Resources/WeaponStats/fireball.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://c473xvhm2g6m0"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_4kg7u"] - -[resource] -script = ExtResource("1_4kg7u") -damage = 0 -fire_rate = 1.0 -fire_range = 0.0 diff --git a/Resources/WeaponStats/flamethrower.tres b/Resources/WeaponStats/flamethrower.tres deleted file mode 100644 index bff4ee3..0000000 --- a/Resources/WeaponStats/flamethrower.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://c4ihsd13o1esd"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_kt5ga"] - -[resource] -script = ExtResource("1_kt5ga") -damage = 0 -fire_rate = 2.0 -fire_range = 3.0 diff --git a/Resources/WeaponStats/glue.tres b/Resources/WeaponStats/glue.tres deleted file mode 100644 index 22d1e79..0000000 --- a/Resources/WeaponStats/glue.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dnucn65m12dmq"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_s171y"] - -[resource] -script = ExtResource("1_s171y") -damage = 0 -fire_rate = 2.0 -fire_range = 20.0 diff --git a/Resources/WeaponStats/icicle.tres b/Resources/WeaponStats/icicle.tres deleted file mode 100644 index 60c8d9f..0000000 --- a/Resources/WeaponStats/icicle.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dsmlqik586soo"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_irad3"] - -[resource] -script = ExtResource("1_irad3") -damage = 0 -fire_rate = 0.5 -fire_range = 20.0 diff --git a/Resources/WeaponStats/reactor.tres b/Resources/WeaponStats/reactor.tres deleted file mode 100644 index 8c0a8dc..0000000 --- a/Resources/WeaponStats/reactor.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://b5eakeawu3gle"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_np134"] - -[resource] -script = ExtResource("1_np134") -damage = 0 -fire_rate = 2.0 -fire_range = 10.0 diff --git a/Resources/WeaponStats/refridgerator.tres b/Resources/WeaponStats/refridgerator.tres deleted file mode 100644 index e69cdcd..0000000 --- a/Resources/WeaponStats/refridgerator.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://cpyrdja71sboe"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_uybdl"] - -[resource] -script = ExtResource("1_uybdl") -damage = 0 -fire_rate = 0.5 -fire_range = 5.0 diff --git a/Resources/WeaponStats/rocketlauncher.tres b/Resources/WeaponStats/rocketlauncher.tres deleted file mode 100644 index 3603a23..0000000 --- a/Resources/WeaponStats/rocketlauncher.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://dtfgyt85mp1ar"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_sg2a6"] - -[resource] -script = ExtResource("1_sg2a6") -damage = 8 -fire_rate = 0.5 -fire_range = 80.0 diff --git a/Resources/WeaponStats/sniper.tres b/Resources/WeaponStats/sniper.tres deleted file mode 100644 index 9a29f13..0000000 --- a/Resources/WeaponStats/sniper.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="WeaponStats" load_steps=2 format=3 uid="uid://85iany3x0uv2"] - -[ext_resource type="Script" path="res://Scripts/Resources/WeaponStats.gd" id="1_idnx0"] - -[resource] -script = ExtResource("1_idnx0") -damage = 30 -fire_rate = 1.2 -fire_range = 80.0 diff --git a/Scenes/Projectiles/explosive_projectile.tscn b/Scenes/Projectiles/explosive_projectile.tscn new file mode 100644 index 0000000..8000dd6 --- /dev/null +++ b/Scenes/Projectiles/explosive_projectile.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://7f4dfphgiswr"] + +[ext_resource type="PackedScene" uid="uid://c8qjlgam6wuo0" path="res://Scenes/Projectiles/projectile.tscn" id="1_136w8"] +[ext_resource type="Script" path="res://Scripts/Projectiles/explosive_projectile.gd" id="2_3adg2"] + +[node name="ExplosiveProjectile" instance=ExtResource("1_136w8")] +script = ExtResource("2_3adg2") +explosion_range = 3.0 diff --git a/Scenes/Projectiles/homing_projectile.tscn b/Scenes/Projectiles/homing_projectile.tscn new file mode 100644 index 0000000..60af3b2 --- /dev/null +++ b/Scenes/Projectiles/homing_projectile.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://di2wwvkv4wov1"] + +[ext_resource type="PackedScene" uid="uid://7f4dfphgiswr" path="res://Scenes/Projectiles/explosive_projectile.tscn" id="1_it3tw"] +[ext_resource type="Script" path="res://Scripts/Projectiles/homing_projectile.gd" id="2_etdxg"] + +[node name="HomingProjectile" instance=ExtResource("1_it3tw")] +script = ExtResource("2_etdxg") +acceleration = 30.0 +max_speed = 15.0 +explosion_range = 6.0 diff --git a/Scenes/Projectiles/projectile.tscn b/Scenes/Projectiles/projectile.tscn new file mode 100644 index 0000000..1404b21 --- /dev/null +++ b/Scenes/Projectiles/projectile.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=3 uid="uid://c8qjlgam6wuo0"] + +[ext_resource type="Script" path="res://Scripts/Projectiles/projectile.gd" id="1_k4v4y"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_fgj4t"] +radius = 0.2 + +[node name="Projectile" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")] +collision_layer = 0 +collision_mask = 5 +gravity_scale = 0.0 +max_contacts_reported = 1 +contact_monitor = true +script = ExtResource("1_k4v4y") +collision_shape = NodePath("CollisionShape3D") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_fgj4t") + +[node name="Sprite3D" type="Sprite3D" parent="."] +billboard = 1 +texture_filter = 0 + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/Scenes/Projectiles/status_applying_projectile.tscn b/Scenes/Projectiles/status_applying_projectile.tscn new file mode 100644 index 0000000..2bb9760 --- /dev/null +++ b/Scenes/Projectiles/status_applying_projectile.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://beq6rn0babncg"] + +[ext_resource type="PackedScene" uid="uid://7f4dfphgiswr" path="res://Scenes/Projectiles/explosive_projectile.tscn" id="1_atrjq"] +[ext_resource type="Script" path="res://Scripts/Projectiles/status_applying_projectile.gd" id="2_4p44n"] + +[node name="StatusApplyingProjectile" instance=ExtResource("1_atrjq")] +max_contacts_reported = 0 +script = ExtResource("2_4p44n") +status_stats = null diff --git a/Scenes/Towers/hitscan_tower.tscn b/Scenes/Towers/hitscan_tower.tscn new file mode 100644 index 0000000..0ab3f86 --- /dev/null +++ b/Scenes/Towers/hitscan_tower.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=3 format=3 uid="uid://dumiyjlnea4gq"] + +[ext_resource type="PackedScene" uid="uid://bvqu1heobgboe" path="res://Scenes/Towers/tower.tscn" id="1_60g1i"] +[ext_resource type="Script" path="res://Scripts/Towers/hitscan_tower.gd" id="2_t6bcd"] + +[node name="HitscanTower" instance=ExtResource("1_60g1i")] +script = ExtResource("2_t6bcd") diff --git a/Scenes/Towers/projectile_tower.tscn b/Scenes/Towers/projectile_tower.tscn new file mode 100644 index 0000000..7dc253f --- /dev/null +++ b/Scenes/Towers/projectile_tower.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://t0b32qb8eub2"] + +[ext_resource type="PackedScene" uid="uid://bvqu1heobgboe" path="res://Scenes/Towers/tower.tscn" id="1_yagdr"] +[ext_resource type="Script" path="res://Scripts/Towers/projectile_tower.gd" id="2_fqi5p"] + +[node name="ProjectileTower" instance=ExtResource("1_yagdr")] +script = ExtResource("2_fqi5p") +projectile_scene = null diff --git a/Scenes/Towers/tower.tscn b/Scenes/Towers/tower.tscn new file mode 100644 index 0000000..ce379bb --- /dev/null +++ b/Scenes/Towers/tower.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=6 format=3 uid="uid://bvqu1heobgboe"] + +[ext_resource type="Script" path="res://Scripts/Towers/tower.gd" id="1_u8bfo"] + +[sub_resource type="Animation" id="Animation_vk4a8"] +resource_name = "shoot" + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_cebsq"] +_data = { +"shoot": SubResource("Animation_vk4a8") +} + +[sub_resource type="BoxMesh" id="BoxMesh_42byu"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1ucq4"] +transparency = 1 +cull_mode = 1 +shading_mode = 0 +albedo_color = Color(1, 0, 0.415686, 0.223529) + +[node name="Tower" type="Node3D" node_paths=PackedStringArray("animator", "pitch_model", "yaw_model", "range_indicator")] +script = ExtResource("1_u8bfo") +animator = NodePath("AnimationPlayer") +pitch_model = NodePath("Pitch") +yaw_model = NodePath("Yaw") +range_indicator = NodePath("CSGSphere3D") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_cebsq") +} + +[node name="Pitch" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_42byu") + +[node name="Yaw" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_42byu") + +[node name="MinimapIcon" type="Sprite3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0) +layers = 4 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="."] +visible = false +radius = 10.0 +radial_segments = 16 +rings = 16 +material = SubResource("StandardMaterial3D_1ucq4") diff --git a/Scenes/UI/card_hand.tscn b/Scenes/UI/card_hand.tscn index 0eb253b..1113419 100644 --- a/Scenes/UI/card_hand.tscn +++ b/Scenes/UI/card_hand.tscn @@ -4,16 +4,11 @@ [ext_resource type="Texture2D" uid="uid://dlqnhs8or4ik2" path="res://Assets/Textures/cardhand.png" id="1_d5oo3"] [ext_resource type="Texture2D" uid="uid://buf8t5gc7iw3a" path="res://Assets/TextureAtlases/rarityborders.tres" id="3_pclfx"] -[node name="Node2D" type="Node2D" node_paths=PackedStringArray("rarity_sprite", "title_text", "damage_text_text", "damage_text", "fire_rate_text_text", "fire_rate_text", "range_text_text", "range_text")] +[node name="Node2D" type="Node2D" node_paths=PackedStringArray("rarity_sprite", "title_text", "description")] script = ExtResource("1_2cfmh") rarity_sprite = NodePath("Sprite2D2") title_text = NodePath("Title") -damage_text_text = NodePath("DamageText") -damage_text = NodePath("Damage") -fire_rate_text_text = NodePath("FireRateText") -fire_rate_text = NodePath("FireRate") -range_text_text = NodePath("RangeText") -range_text = NodePath("Range") +description = NodePath("Description") [node name="Sprite2D" type="Sprite2D" parent="."] texture_filter = 1 @@ -38,56 +33,13 @@ theme_override_colors/font_color = Color(0, 0, 0, 1) text = "spider queen" horizontal_alignment = 1 -[node name="DamageText" type="Label" parent="."] -offset_left = 30.0 -offset_top = 65.0 -offset_right = 132.0 -offset_bottom = 91.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Damage: " -horizontal_alignment = 1 - -[node name="Damage" type="Label" parent="."] -offset_left = 78.0 -offset_top = 65.0 -offset_right = 180.0 -offset_bottom = 91.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "45" -horizontal_alignment = 1 - -[node name="FireRateText" type="Label" parent="."] -offset_left = 31.0 -offset_top = 89.0 -offset_right = 133.0 -offset_bottom = 115.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Fire Rate: " -horizontal_alignment = 1 - -[node name="FireRate" type="Label" parent="."] -offset_left = 77.0 -offset_top = 90.0 -offset_right = 179.0 -offset_bottom = 116.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "3" -horizontal_alignment = 1 - -[node name="RangeText" type="Label" parent="."] -offset_left = 44.0 -offset_top = 111.0 -offset_right = 146.0 -offset_bottom = 137.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Range: " -horizontal_alignment = 1 - -[node name="Range" type="Label" parent="."] -offset_left = 87.0 -offset_top = 111.0 -offset_right = 189.0 -offset_bottom = 137.0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "55" -horizontal_alignment = 1 +[node name="Description" type="RichTextLabel" parent="."] +offset_left = 66.0 +offset_top = 42.0 +offset_right = 167.0 +offset_bottom = 178.0 +theme_override_colors/default_color = Color(0, 0, 0, 1) +theme_override_font_sizes/normal_font_size = 11 +bbcode_enabled = true +text = "In here goes some card text that really be quite long sometimes if you're not really really careful to describe the card's effects concisely" +fit_content = true diff --git a/Scenes/Weapons/hitscan_weapon.tscn b/Scenes/Weapons/hitscan_weapon.tscn new file mode 100644 index 0000000..efb28be --- /dev/null +++ b/Scenes/Weapons/hitscan_weapon.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=3 uid="uid://difwo7wlyqr3h"] + +[ext_resource type="PackedScene" uid="uid://b7nargdyg28fj" path="res://Scenes/Weapons/weapon.tscn" id="1_s865l"] +[ext_resource type="Script" path="res://Scripts/Weapons/hitscan_weapon.gd" id="2_nyich"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1ucq4"] +transparency = 1 +cull_mode = 1 +shading_mode = 0 +albedo_color = Color(1, 0, 0.415686, 0.223529) + +[node name="HitscanWeapon" node_paths=PackedStringArray("raycast", "range_debug_indicator") instance=ExtResource("1_s865l")] +script = ExtResource("2_nyich") +raycast = NodePath("RayCast3D") +range_debug_indicator = NodePath("CSGSphere3D") + +[node name="RayCast3D" type="RayCast3D" parent="." index="2"] +target_position = Vector3(0, 0, -1) +collision_mask = 4 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="." index="3"] +visible = false +radius = 4.104 +radial_segments = 16 +rings = 16 +material = SubResource("StandardMaterial3D_1ucq4") diff --git a/Scenes/Weapons/projectile_weapon.tscn b/Scenes/Weapons/projectile_weapon.tscn new file mode 100644 index 0000000..e0f92a2 --- /dev/null +++ b/Scenes/Weapons/projectile_weapon.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://bqdllitxbbpyp"] + +[ext_resource type="PackedScene" uid="uid://b7nargdyg28fj" path="res://Scenes/Weapons/weapon.tscn" id="1_nbhwa"] +[ext_resource type="Script" path="res://Scripts/Weapons/projectile_weapon.gd" id="2_5ekyi"] + +[node name="ProjectileWeapon" instance=ExtResource("1_nbhwa")] +script = ExtResource("2_5ekyi") +projectile_scene = null diff --git a/Scenes/Weapons/status_applying_weapon.tscn b/Scenes/Weapons/status_applying_weapon.tscn new file mode 100644 index 0000000..c29da4d --- /dev/null +++ b/Scenes/Weapons/status_applying_weapon.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://nrdexcyatika"] + +[ext_resource type="PackedScene" uid="uid://difwo7wlyqr3h" path="res://Scenes/Weapons/hitscan_weapon.tscn" id="1_uolyx"] +[ext_resource type="Script" path="res://Scripts/Weapons/status_applying_weapon.gd" id="2_iq7bw"] + +[node name="StatusApplyingWeapon" instance=ExtResource("1_uolyx")] +script = ExtResource("2_iq7bw") +status_stats = null diff --git a/Scenes/Weapons/weapon.tscn b/Scenes/Weapons/weapon.tscn new file mode 100644 index 0000000..a35b1ab --- /dev/null +++ b/Scenes/Weapons/weapon.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=5 format=3 uid="uid://b7nargdyg28fj"] + +[ext_resource type="Script" path="res://Scripts/Weapons/weapon.gd" id="1_yo2gh"] + +[sub_resource type="Animation" id="Animation_5krlx"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite3D: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_0rgpe"] +resource_name = "shoot" +length = 0.15 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite3D: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_fs82p"] +_data = { +"RESET": SubResource("Animation_5krlx"), +"shoot": SubResource("Animation_0rgpe") +} + +[node name="Weapon" type="Node3D" node_paths=PackedStringArray("animator")] +script = ExtResource("1_yo2gh") +animator = NodePath("AnimationPlayer") + +[node name="Sprite3D" type="Sprite3D" parent="."] +layers = 2 +billboard = 1 +texture_filter = 0 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_fs82p") +} diff --git a/Scripts/AStarGraph3D.gd b/Scripts/AStarGraph3D.gd index 23847aa..cc564a8 100644 --- a/Scripts/AStarGraph3D.gd +++ b/Scripts/AStarGraph3D.gd @@ -1,7 +1,7 @@ extends Node3D class_name AStarGraph3D -@export var grid_size := Vector2(21, 13) +@export var grid_size := Vector2i(21, 13) @export var point_gap := 1.2 var non_build_locations = [] var astar := AStar3D.new() diff --git a/Scripts/beelining_controller.gd b/Scripts/EnemyAI/beelining_controller.gd similarity index 100% rename from Scripts/beelining_controller.gd rename to Scripts/EnemyAI/beelining_controller.gd diff --git a/Scripts/enemy_movement.gd b/Scripts/EnemyAI/enemy_movement.gd similarity index 100% rename from Scripts/enemy_movement.gd rename to Scripts/EnemyAI/enemy_movement.gd diff --git a/Scripts/pathing_controller.gd b/Scripts/EnemyAI/pathing_controller.gd similarity index 100% rename from Scripts/pathing_controller.gd rename to Scripts/EnemyAI/pathing_controller.gd diff --git a/Scripts/Projectiles/explosive_projectile.gd b/Scripts/Projectiles/explosive_projectile.gd new file mode 100644 index 0000000..01d3970 --- /dev/null +++ b/Scripts/Projectiles/explosive_projectile.gd @@ -0,0 +1,34 @@ +extends Projectile +class_name ExplosiveProjectile + +@export var explosion_range := 3.0 + + +func _process(delta: float) -> void: + super._process(delta) + if time_alive >= lifetime: + explode() + + +func _on_body_entered(_body: Node) -> void: + explode() + + +func explode(): + if is_multiplayer_authority(): + for enemy in get_tree().get_nodes_in_group("Enemies"): + if global_position.distance_to(enemy.global_position) <= explosion_range: + hit(enemy) + networked_hit.rpc(get_tree().root.get_path_to(enemy)) + networked_kill.rpc() + queue_free() + + +func hit(target): + target.damage(damage) + + +@rpc("reliable") +func networked_hit(target_node_path): + var target = get_tree().root.get_node(target_node_path) + hit(target) diff --git a/Scripts/Projectiles/homing_projectile.gd b/Scripts/Projectiles/homing_projectile.gd new file mode 100644 index 0000000..6a5d099 --- /dev/null +++ b/Scripts/Projectiles/homing_projectile.gd @@ -0,0 +1,17 @@ +extends ExplosiveProjectile +class_name HomingProjectile + +var target : Node3D +@export var acceleration := 40.0 +@export var max_speed := 14.0 + + +func _physics_process(_delta: float) -> void: + if is_instance_valid(target): + direction = global_position.direction_to(target.global_position) + #apply_central_force(direction * acceleration) + + +func _integrate_forces(state: PhysicsDirectBodyState3D) -> void: + 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 new file mode 100644 index 0000000..f99c693 --- /dev/null +++ b/Scripts/Projectiles/projectile.gd @@ -0,0 +1,23 @@ +extends RigidBody3D +class_name Projectile + +@export var collision_shape : CollisionShape3D + +var direction := Vector3.FORWARD +var force := 2.0 +var damage := 0.0 +var lifetime := 10.0 +var time_alive := 0.0 + + +func _process(delta: float) -> void: + time_alive += delta + + +func _on_body_entered(_body: Node) -> void: + pass # Replace with function body. + + +@rpc("reliable") +func networked_kill(): + queue_free() diff --git a/Scripts/Projectiles/status_applying_projectile.gd b/Scripts/Projectiles/status_applying_projectile.gd new file mode 100644 index 0000000..d979366 --- /dev/null +++ b/Scripts/Projectiles/status_applying_projectile.gd @@ -0,0 +1,15 @@ +extends ExplosiveProjectile +class_name StatusApplyingProjectile + +@export var status_stats : StatusStats + + +func hit(target): + super.hit(target) + target.status_manager.add_effect(build_status_object()) + + +func build_status_object() -> StatusEffect: + var status = StatusEffect.new() + status.stats = status_stats + return status diff --git a/Scripts/Resources/TowerStats.gd b/Scripts/Resources/TowerStats.gd deleted file mode 100644 index 93d0a47..0000000 --- a/Scripts/Resources/TowerStats.gd +++ /dev/null @@ -1,7 +0,0 @@ -extends Resource -class_name TowerStats - -@export var can_target : Data.TargetType -@export var damage := 10.0 -@export var fire_range := 20.0 -@export var fire_rate := 1.0 diff --git a/Scripts/Resources/WeaponStats.gd b/Scripts/Resources/WeaponStats.gd deleted file mode 100644 index 53835b0..0000000 --- a/Scripts/Resources/WeaponStats.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends Resource -class_name WeaponStats - -@export var damage : int -@export var fire_rate : float -@export var fire_range : float diff --git a/Scripts/Resources/card.gd b/Scripts/Resources/card.gd index 26d9ffc..3f70e01 100644 --- a/Scripts/Resources/card.gd +++ b/Scripts/Resources/card.gd @@ -1,13 +1,13 @@ extends Resource class_name Card -enum Faction {GENERIC} +enum Faction {GENERIC = 0} @export var title : String @export var rarity : Data.Rarity -@export var faction : Faction +@export var faction : Faction @export var sprite : AtlasTexture -@export var turret : PackedScene -@export var weapon : PackedScene -@export var weapon_stats : WeaponStats -@export var tower_stats : TowerStats +@export var turret_scene : PackedScene +@export var weapon_scene : PackedScene +@export var weapon_stats : CardText +@export var tower_stats : CardText diff --git a/Scripts/Resources/card_text.gd b/Scripts/Resources/card_text.gd new file mode 100644 index 0000000..fb61c82 --- /dev/null +++ b/Scripts/Resources/card_text.gd @@ -0,0 +1,13 @@ +extends Resource +class_name CardText + +@export var target_type : Data.TargetType +@export var attributes : Array[StatAttribute] +@export_multiline var text : String + + +func get_attribute(attribute : String) -> float: + for stat in attributes: + if stat.key == attribute: + return stat.value + return 0.0 diff --git a/Scripts/Resources/stat_attribute.gd b/Scripts/Resources/stat_attribute.gd new file mode 100644 index 0000000..d60b12a --- /dev/null +++ b/Scripts/Resources/stat_attribute.gd @@ -0,0 +1,5 @@ +extends Resource +class_name StatAttribute + +@export var key : String +@export var value : float diff --git a/Scripts/StatusEffects/StatusOnFire.gd b/Scripts/StatusEffects/StatusOnFire.gd deleted file mode 100644 index 19123ba..0000000 --- a/Scripts/StatusEffects/StatusOnFire.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends StatusEffect -class_name StatusOnFire - - -func proc(affected, stacks, _existing_effects): - affected.damage(stats.potency * stacks) diff --git a/Scripts/StatusEffects/status_poison.gd b/Scripts/StatusEffects/status_dot.gd similarity index 82% rename from Scripts/StatusEffects/status_poison.gd rename to Scripts/StatusEffects/status_dot.gd index d44dc9e..0d01f44 100644 --- a/Scripts/StatusEffects/status_poison.gd +++ b/Scripts/StatusEffects/status_dot.gd @@ -1,5 +1,5 @@ extends StatusEffect -class_name StatusPoison +class_name StatusDoT func proc(affected, stacks, _existing_effects): diff --git a/Scripts/StatusEffects/status_radioactive.gd b/Scripts/StatusEffects/status_radioactive.gd deleted file mode 100644 index 70a3b85..0000000 --- a/Scripts/StatusEffects/status_radioactive.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends StatusEffect -class_name StatusRadioactive - -func proc(affected, stacks, _existing_effects): - affected.damage(stats.potency * stacks) diff --git a/Scripts/StatusEffects/status_cold.gd b/Scripts/StatusEffects/status_slow.gd similarity index 90% rename from Scripts/StatusEffects/status_cold.gd rename to Scripts/StatusEffects/status_slow.gd index 20bdee8..0fd68d2 100644 --- a/Scripts/StatusEffects/status_cold.gd +++ b/Scripts/StatusEffects/status_slow.gd @@ -1,5 +1,6 @@ extends StatusEffect -class_name StatusCold +class_name StatusSlow + func on_attached(affected, _existing_effects): affected.movement_speed_penalty -= stats.potency diff --git a/Scripts/StatusEffects/status_sticky.gd b/Scripts/StatusEffects/status_sticky.gd deleted file mode 100644 index fe37159..0000000 --- a/Scripts/StatusEffects/status_sticky.gd +++ /dev/null @@ -1,10 +0,0 @@ -extends StatusEffect -class_name StatusSticky - - -func on_attached(affected, _existing_effects): - affected.movement_speed_penalty -= stats.potency - - -func on_removed(affected, _existing_effects): - affected.movement_speed_penalty += stats.potency diff --git a/Scripts/Towers/hitscan_tower.gd b/Scripts/Towers/hitscan_tower.gd new file mode 100644 index 0000000..45b5d51 --- /dev/null +++ b/Scripts/Towers/hitscan_tower.gd @@ -0,0 +1,13 @@ +extends Tower +class_name HitscanTower + + +func shoot(): + super.shoot() + if targeted_enemy and is_instance_valid(targeted_enemy) and targeted_enemy.alive: + targeted_enemy.damage(damage) + + +@rpc("reliable") +func networked_shoot(): + super.networked_shoot() diff --git a/Scripts/Towers/projectile_tower.gd b/Scripts/Towers/projectile_tower.gd new file mode 100644 index 0000000..5c05677 --- /dev/null +++ b/Scripts/Towers/projectile_tower.gd @@ -0,0 +1,30 @@ +extends Tower +class_name ProjectileTower + +@export var projectile_scene : PackedScene + +var force := 2.0 +var projectile_id := 0 + + +func shoot(): + if is_multiplayer_authority(): + networked_spawn_projectile.rpc(multiplayer.get_unique_id()) + + +@rpc("reliable") +func networked_shoot(): + super.networked_shoot() + shoot() + + +@rpc("reliable", "call_local") +func networked_spawn_projectile(peer_id): + var projectile = projectile_scene.instantiate() as Projectile + projectile.position = global_position + Vector3.UP + projectile.damage = damage + projectile.direction = -yaw_model.global_transform.basis.z + projectile.force = force + projectile.name = base_name + str(peer_id) + str(projectile_id) + get_tree().root.add_child(projectile) + projectile_id += 1 diff --git a/Scripts/Towers/tower.gd b/Scripts/Towers/tower.gd new file mode 100644 index 0000000..3a2167f --- /dev/null +++ b/Scripts/Towers/tower.gd @@ -0,0 +1,92 @@ +extends Node3D +class_name Tower + +@export var stats : CardText +@export var animator : AnimationPlayer +@export var pitch_model : MeshInstance3D +@export var yaw_model : MeshInstance3D +@export var range_indicator : CSGSphere3D + +var base_name +var targeted_enemy +var time_since_firing := 0.0 +var time_between_shots := 0.0 +var damage := 0.0 +var target_range := 0.0 + + +func _ready() -> void: + time_between_shots = stats.get_attribute("Fire Delay") + damage = stats.get_attribute("Damage") + target_range = stats.get_attribute("Range") + range_indicator.radius = target_range + + +func preview_range(value): + range_indicator.set_visible(value) + + +func _process(delta: float) -> void: + if !is_multiplayer_authority(): + return + if time_since_firing < time_between_shots: + time_since_firing += delta + + +func _physics_process(_delta: float) -> void: + if !is_multiplayer_authority(): + #only doing the graphical sort of stuff but not shoot logic + if targeted_enemy: + if !is_instance_valid(targeted_enemy) or !targeted_enemy.alive or global_position.distance_to(targeted_enemy.global_position) > target_range: + targeted_enemy = null + else: + aim() + return + if !targeted_enemy: + acquire_target() + else: + if !is_instance_valid(targeted_enemy) or !targeted_enemy.alive or global_position.distance_to(targeted_enemy.global_position) > target_range: + targeted_enemy = null + if targeted_enemy: + aim() + if time_since_firing >= time_between_shots: + time_since_firing -= time_between_shots + shoot() + + +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 acquire_target(): + var most_progressed_enemy = null + for enemy in get_tree().get_nodes_in_group("Enemies"): + if global_position.distance_to(enemy.global_position) > target_range: + continue + var em_1 = enemy.movement_controller as EnemyMovement + var em_2 : EnemyMovement + if most_progressed_enemy != null: + em_2 = most_progressed_enemy.movement_controller as EnemyMovement + if (most_progressed_enemy == null or em_1.distance_remaining < em_2.distance_remaining) and enemy.stats.target_type & stats.target_type: + most_progressed_enemy = enemy + if most_progressed_enemy != null: + targeted_enemy = most_progressed_enemy + networked_acquire_target.rpc(get_tree().root.get_path_to(most_progressed_enemy)) + + +func shoot(): + animator.play("shoot") + if is_multiplayer_authority(): + networked_shoot.rpc() + + +@rpc("reliable") +func networked_shoot(): + shoot() + + +@rpc("reliable") +func networked_acquire_target(target_node_path): + targeted_enemy = get_tree().root.get_node(target_node_path) diff --git a/Scripts/Weapons/hitscan_weapon.gd b/Scripts/Weapons/hitscan_weapon.gd new file mode 100644 index 0000000..624e75a --- /dev/null +++ b/Scripts/Weapons/hitscan_weapon.gd @@ -0,0 +1,37 @@ +extends Weapon +class_name HitscanWeapon + +@export var raycast : RayCast3D +@export var range_debug_indicator : CSGSphere3D + +var attack_range := 0.0 + + +func _ready() -> void: + super._ready() + attack_range = stats.get_attribute("Range") + raycast.target_position = Vector3(0, 0, -attack_range) + range_debug_indicator.radius = attack_range + raycast.global_position = hero.camera.global_position + + +func shoot(): + super.shoot() + if raycast.is_colliding(): + var target = raycast.get_collider() + if target != null: + var target_hitbox = target.shape_owner_get_owner(raycast.get_collider_shape()) + if target_hitbox is Hitbox: + hit(target, target_hitbox) + networked_hit.rpc(get_tree().root.get_path_to(target), get_tree().root.get_path_to(target_hitbox)) + + +func hit(_target, target_hitbox : Hitbox): + target_hitbox.damage(damage) + + +@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) diff --git a/Scripts/Weapons/projectile_weapon.gd b/Scripts/Weapons/projectile_weapon.gd new file mode 100644 index 0000000..577a81c --- /dev/null +++ b/Scripts/Weapons/projectile_weapon.gd @@ -0,0 +1,25 @@ +extends Weapon +class_name ProjectileWeapon + +@export var projectile_scene : PackedScene + +var force := 2.0 +var projectile_id := 0 + + +func shoot(): + super.shoot() + var projectile = projectile_scene.instantiate() as Projectile + projectile.position = global_position + projectile.damage = damage + projectile.direction = -global_transform.basis.z + projectile.force = force + projectile.name = str(multiplayer.get_unique_id()) + str(projectile_id) + get_tree().root.add_child(projectile) + projectile_id += 1 + + +@rpc("reliable") +func networked_shoot(): + super.networked_shoot() + shoot() diff --git a/Scripts/Weapons/status_applying_weapon.gd b/Scripts/Weapons/status_applying_weapon.gd new file mode 100644 index 0000000..b2adf8a --- /dev/null +++ b/Scripts/Weapons/status_applying_weapon.gd @@ -0,0 +1,15 @@ +extends HitscanWeapon +class_name StatusApplyingWeapon + +@export var status_stats : StatusStats + + +func hit(target, target_hitbox : Hitbox): + super.hit(target, target_hitbox) + target.status_manager.add_effect(build_status_object()) + + +func build_status_object() -> StatusEffect: + var status = StatusEffect.new() + status.stats = status_stats + return status diff --git a/Scripts/Weapons/weapon.gd b/Scripts/Weapons/weapon.gd new file mode 100644 index 0000000..5e10fbd --- /dev/null +++ b/Scripts/Weapons/weapon.gd @@ -0,0 +1,58 @@ +extends Node3D +class_name Weapon + +@export var stats : CardText +@export var animator : AnimationPlayer + +var hero : Hero +var trigger_held := false +var second_trigger_held := false +var time_since_firing := 0.0 +var time_between_shots := 0.0 +var damage := 0.0 + + +func _ready() -> void: + time_between_shots = stats.get_attribute("Fire Delay") + damage = stats.get_attribute("Damage") + + +func set_hero(value): + hero = value + + +func _process(delta: float) -> void: + if time_since_firing < time_between_shots: + time_since_firing += delta + + +func _physics_process(_delta: float) -> void: + if trigger_held and time_since_firing >= time_between_shots: + time_since_firing -= time_between_shots + shoot() + networked_shoot.rpc() + + +func hold_trigger(): + trigger_held = true + + +func release_trigger(): + trigger_held = false + + +func hold_second_trigger(): + second_trigger_held = true + + +func release_second_trigger(): + second_trigger_held = false + + +func shoot(): + animator.play("shoot") + + +@rpc +func networked_shoot(): + animator.play("shoot") diff --git a/Scripts/card_hand.gd b/Scripts/card_hand.gd index 1147189..5e5edb5 100644 --- a/Scripts/card_hand.gd +++ b/Scripts/card_hand.gd @@ -3,28 +3,27 @@ class_name CardInHand var stats : Card @export var rarity_sprite : Sprite2D -@export var title_text: Label -@export var damage_text_text: Label -@export var damage_text: Label -@export var fire_rate_text_text: Label -@export var fire_rate_text: Label -@export var range_text_text: Label -@export var range_text: Label +@export var title_text : Label +@export var description : RichTextLabel func set_card(value): stats = value title_text.text = stats.title rarity_sprite.region_rect = Rect2(64 * stats.rarity, 0, 64, 64) - view_weapon() + + +func process_card_text(card_text : CardText) -> String: + var processed_string = card_text.text + for stat in card_text.attributes: + processed_string = processed_string.replace(stat.key, str(stat.value)) + processed_string = processed_string.replace("/", "[color=red]") + processed_string = processed_string.replace("\\", "[color=black]") + return processed_string func view_weapon(): - damage_text.text = str(stats.weapon_stats.damage) - fire_rate_text.text = str(stats.weapon_stats.fire_rate) - range_text.text = str(stats.weapon_stats.fire_rate) + description.text = process_card_text(stats.weapon_stats) func view_tower(): - damage_text.text = str(stats.tower_stats.damage) - fire_rate_text.text = str(stats.tower_stats.fire_rate) - range_text.text = str(stats.tower_stats.fire_rate) + description.text = process_card_text(stats.tower_stats) diff --git a/Scripts/data.gd b/Scripts/data.gd index 4a66f97..b52086c 100644 --- a/Scripts/data.gd +++ b/Scripts/data.gd @@ -10,9 +10,9 @@ var player_keymap : PlayerKeymap var wall_cost := 4 var printer_cost := 10 -enum TargetType {LAND = 1, AIR = 2, BOTH = 3} -enum EnemyType {LAND = 1, AIR = 2} -enum Rarity {COMMON, UNCOMMON, RARE, EPIC, LEGENDARY} +enum TargetType {UNDEFINED = 0, LAND = 1, AIR = 2, BOTH = 3} +enum EnemyType {UNDEFINED = 0, LAND = 1, AIR = 2} +enum Rarity {COMMON = 0, UNCOMMON = 1, RARE = 2, EPIC = 3, LEGENDARY = 4} var rarity_weights = { "COMMON" = 50, "UNCOMMON" = 30, @@ -32,18 +32,27 @@ func _ready() -> void: characters.append(preload("res://PCs/Green/green.tres")) characters.append(preload("res://PCs/Blue/blue.tres")) + #Common cards.append(preload("res://PCs/Universal/ClassCards/Assault/card_assault.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/BombLauncher/card_grenade_launcher.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Sniper/card_sniper.tres")) + cards.append(preload("res://PCs/Universal/ClassCards/BombLauncher/card_bomb_launcher.tres")) cards.append(preload("res://PCs/Universal/ClassCards/Gatling/card_gatling.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/GlueLauncher/card_glue_launcher.tres")) cards.append(preload("res://PCs/Universal/ClassCards/RocketLauncher/card_rocket_launcher.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Flamethrower/card_flamethrower.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Blowdart/card_blowdart.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Fireball/card_fireball.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Icicle/card_icicle.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Reactor/card_reactor.tres")) - cards.append(preload("res://PCs/Universal/ClassCards/Refridgerator/card_refridgerator.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/GlueLauncher/card_glue_launcher.tres")) + #Rare + #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 + #cards.append(preload("res://PCs/Universal/ClassCards/Icicle/card_icicle.tres")) + #cards.append(preload("res://PCs/Universal/ClassCards/Fireball/card_fireball.tres")) + #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/Lightning/card_lightning.tres")) enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog.tres")) enemies.append(preload("res://Worlds/GreenPlanet/Enemies/dog_fast.tres")) diff --git a/Scripts/edit_tool.gd b/Scripts/edit_tool.gd index 0c977a6..06beb90 100644 --- a/Scripts/edit_tool.gd +++ b/Scripts/edit_tool.gd @@ -93,7 +93,7 @@ func spawn_tower_preview(): last_tower_base = ray_collider var card = inventory.selected_item last_card = card - tower_preview = card.turret.instantiate() as Tower + tower_preview = card.turret_scene.instantiate() as Tower tower_preview.stats = card.tower_stats tower_preview.preview_range(true) ray_collider.add_child(tower_preview) diff --git a/Scripts/game.gd b/Scripts/game.gd index 178e593..e7b1143 100644 --- a/Scripts/game.gd +++ b/Scripts/game.gd @@ -23,7 +23,7 @@ var enemies := 0 var objective_health := 120 var wave := 0 var upcoming_wave -var pot : int +var pot : float var UILayer : CanvasLayer @@ -97,7 +97,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 + (spawn_power / 100)) + networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 100)) @rpc("reliable", "call_local") @@ -158,6 +158,9 @@ func remove_player(peer_id): func start_game(): game_active = true + enemies = 0 + objective_health = 100 + wave = 0 level.a_star_graph_3d.make_grid() level.a_star_graph_3d.find_path() set_upcoming_wave() diff --git a/Scripts/ground_enemy_controller.gd b/Scripts/ground_enemy_controller.gd deleted file mode 100644 index 5ac802d..0000000 --- a/Scripts/ground_enemy_controller.gd +++ /dev/null @@ -1,2 +0,0 @@ -extends Node3D -class_name GroundEnemyController diff --git a/PCs/Universal/ClassCards/Assault/tower.gd b/Scripts/tower.gd similarity index 97% rename from PCs/Universal/ClassCards/Assault/tower.gd rename to Scripts/tower.gd index 8bb20e9..e181d19 100644 --- a/PCs/Universal/ClassCards/Assault/tower.gd +++ b/Scripts/tower.gd @@ -1,7 +1,6 @@ extends Node3D -class_name Tower +class_name OldTower -@export var stats : TowerStats @export var model : Node3D @export var range_sphere : CSGSphere3D @export var minimap_range_sphere : CSGSphere3D diff --git a/Scripts/tower_base.gd b/Scripts/tower_base.gd index b99cf61..dcac602 100644 --- a/Scripts/tower_base.gd +++ b/Scripts/tower_base.gd @@ -36,9 +36,11 @@ func toggle_collision(): @rpc("reliable", "call_local", "any_peer") func networked_spawn_tower(): - tower = inventory.selected_item.turret.instantiate() as Tower + tower = inventory.selected_item.turret_scene.instantiate() as Tower tower.stats = inventory.selected_item.tower_stats tower.name = "tower" + tower.base_name = name + tower.position = Vector3.UP minimap_icon.modulate = Color.RED add_child(tower) diff --git a/Scripts/wave_manager.gd b/Scripts/wave_manager.gd index 8330f27..fe5168b 100644 --- a/Scripts/wave_manager.gd +++ b/Scripts/wave_manager.gd @@ -7,15 +7,15 @@ func calculate_spawn_power(wave_number : int, number_of_players : int) -> int: func generate_wave(spawn_power : int, spawn_pool : Array[Enemy]) -> Dictionary: var wave = {} - #var sp_used = 0 + var sp_used = 0 var enemy_types = randi_range(1, 5) var enemy_choices = spawn_pool.duplicate() - var sp_allotment = spawn_power / enemy_types + var sp_allotment = floori(spawn_power / enemy_types) for x in enemy_types: var choice = enemy_choices.pick_random() enemy_choices.erase(choice) if sp_allotment / choice.spawn_power > 0: wave[Data.enemies.find(choice)] = sp_allotment / choice.spawn_power - #sp_used += wave[choice] * choice.spawn_power - #print("tried to generate wave with " + str(spawn_power) + " spawn power, used " + str(sp_used)) + sp_used += wave[Data.enemies.find(choice)] * choice.spawn_power + print("tried to generate wave with " + str(spawn_power) + " spawn power, used " + str(sp_used)) return wave diff --git a/Worlds/GreenPlanet/Enemies/air_enemy.tscn b/Worlds/GreenPlanet/Enemies/air_enemy.tscn index e9b0d7b..62ae9ad 100644 --- a/Worlds/GreenPlanet/Enemies/air_enemy.tscn +++ b/Worlds/GreenPlanet/Enemies/air_enemy.tscn @@ -8,14 +8,14 @@ [ext_resource type="Texture2D" uid="uid://r202vo47jw1q" path="res://Assets/Textures/enemyhealth.png" id="8_77uyi"] [ext_resource type="Script" path="res://Scripts/StatusEffector.gd" id="9_7hati"] [ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="9_7yfyh"] -[ext_resource type="Script" path="res://Scripts/beelining_controller.gd" id="9_cx8mv"] +[ext_resource type="Script" path="res://Scripts/EnemyAI/beelining_controller.gd" id="9_cx8mv"] [sub_resource type="SphereShape3D" id="SphereShape3D_21dgw"] [sub_resource type="ViewportTexture" id="ViewportTexture_ss5ir"] viewport_path = NodePath("SubViewport") -[node name="Dog" type="CharacterBody3D" node_paths=PackedStringArray("status_manager", "movement_controller", "health") groups=["Enemies"]] +[node name="Dog" type="CharacterBody3D" node_paths=PackedStringArray("status_manager", "movement_controller", "health", "sprite") groups=["Enemies"]] collision_layer = 4 collision_mask = 3 motion_mode = 1 @@ -23,6 +23,7 @@ script = ExtResource("1_m83kr") status_manager = NodePath("StatusEffector") movement_controller = NodePath("BeeliningController") health = NodePath("Health") +sprite = NodePath("DirectionSprite") [node name="Health" type="Node" parent="."] script = ExtResource("3_wiose") diff --git a/Worlds/GreenPlanet/Enemies/enemy_controller.gd b/Worlds/GreenPlanet/Enemies/enemy_controller.gd index d04fd25..5b06599 100644 --- a/Worlds/GreenPlanet/Enemies/enemy_controller.gd +++ b/Worlds/GreenPlanet/Enemies/enemy_controller.gd @@ -8,6 +8,7 @@ signal died(enemy) @export var status_manager : StatusEffector @export var movement_controller : EnemyMovement @export var health : Health +@export var sprite : Sprite3D var movement_speed var movement_speed_penalty := 1.0 @@ -19,7 +20,7 @@ func _ready() -> void: health.current_health = stats.health $SubViewport/ProgressBar.max_value = stats.health $SubViewport/ProgressBar.value = stats.health - $DirectionSprite.texture = stats.sprite.duplicate() + sprite.texture = stats.sprite.duplicate() movement_speed = stats.movement_speed diff --git a/Worlds/GreenPlanet/Enemies/land_enemy.tscn b/Worlds/GreenPlanet/Enemies/land_enemy.tscn index 4e1c8a9..30c62a2 100644 --- a/Worlds/GreenPlanet/Enemies/land_enemy.tscn +++ b/Worlds/GreenPlanet/Enemies/land_enemy.tscn @@ -8,12 +8,12 @@ [ext_resource type="PackedScene" uid="uid://cqtew0t8sttpm" path="res://Scenes/damage_particle.tscn" id="4_tn1tu"] [ext_resource type="Texture2D" uid="uid://r202vo47jw1q" path="res://Assets/Textures/enemyhealth.png" id="8_5ba7s"] [ext_resource type="Texture2D" uid="uid://b1fn60m6xfcsq" path="res://Assets/Textures/minimap_enemy.png" id="9_f8btv"] -[ext_resource type="Script" path="res://Scripts/pathing_controller.gd" id="10_gljle"] +[ext_resource type="Script" path="res://Scripts/EnemyAI/pathing_controller.gd" id="10_gljle"] [ext_resource type="Script" path="res://Scripts/StatusEffector.gd" id="10_txouh"] [sub_resource type="SphereShape3D" id="SphereShape3D_21dgw"] -[sub_resource type="AtlasTexture" id="AtlasTexture_ln1wo"] +[sub_resource type="AtlasTexture" id="AtlasTexture_sn7du"] resource_local_to_scene = true atlas = ExtResource("3_naknq") region = Rect2(0, 0, 32, 32) @@ -21,13 +21,14 @@ region = Rect2(0, 0, 32, 32) [sub_resource type="ViewportTexture" id="ViewportTexture_4tj6k"] viewport_path = NodePath("SubViewport") -[node name="Dog" type="CharacterBody3D" node_paths=PackedStringArray("status_manager", "movement_controller", "health") groups=["Enemies"]] +[node name="Dog" type="CharacterBody3D" node_paths=PackedStringArray("status_manager", "movement_controller", "health", "sprite") groups=["Enemies"]] collision_layer = 4 collision_mask = 3 script = ExtResource("1_fwsjt") status_manager = NodePath("StatusEffector") movement_controller = NodePath("PathingController") health = NodePath("Health") +sprite = NodePath("DirectionSprite") [node name="Health" type="Node" parent="."] script = ExtResource("2_swu53") @@ -41,7 +42,7 @@ script = ExtResource("2_j8yin") [node name="DirectionSprite" parent="." instance=ExtResource("2_o7jmg")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.642479, 0) pixel_size = 0.04 -texture = SubResource("AtlasTexture_ln1wo") +texture = SubResource("AtlasTexture_sn7du") [node name="Sprite3D" type="Sprite3D" parent="."] transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 1.20821, 0) diff --git a/Worlds/GreenPlanet/tilemap.tres b/Worlds/GreenPlanet/tilemap.tres index 3c6c8ce..e426bc4 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_0ow0h"] +[sub_resource type="Image" id="Image_jqni1"] 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_0ow0h") +image = SubResource("Image_jqni1") [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_s3wf2"] +[sub_resource type="Image" id="Image_6qi5f"] 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_s3wf2") +image = SubResource("Image_6qi5f") [sub_resource type="BoxShape3D" id="BoxShape3D_d3j6k"]