From 141285188f9a089ee443ba63f93dc82a63794ea9 Mon Sep 17 00:00:00 2001 From: cornerloan Date: Thu, 20 Feb 2025 16:45:02 -0800 Subject: [PATCH 1/9] added heal note player also starts with 1 copy of this note in their queue --- Classes/Notes/assets/heal_note.png | Bin 0 -> 1055 bytes Classes/Notes/assets/heal_note.png.import | 34 ++++++++++++++++++++++ Globals/Scribe.cs | 11 +++++++ scenes/Puppets/scripts/PlayerStats.cs | 1 + 4 files changed, 46 insertions(+) create mode 100644 Classes/Notes/assets/heal_note.png create mode 100644 Classes/Notes/assets/heal_note.png.import diff --git a/Classes/Notes/assets/heal_note.png b/Classes/Notes/assets/heal_note.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe4312088087fc569594565fe2a2f8884f08a90 GIT binary patch literal 1055 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFg9j7I|q0=J1Z0v<)>xlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xwd%CBKV@QO1a)Jcw;slWiocB(x_*1XF_>+9>oR9-8dJg#p zuNd4)7-Jfy{1B@vYR@QUw_!QKws>blRKgX;#e5P4>;kb#4^MqwGNtMUL!e^A>7p!# sMKTWF2Co_xK4kC;{-q(o+APJuQ0FXiHCIS+Jt(d{UHx3vIVCg!09Ngry#N3J literal 0 HcmV?d00001 diff --git a/Classes/Notes/assets/heal_note.png.import b/Classes/Notes/assets/heal_note.png.import new file mode 100644 index 00000000..22f3a997 --- /dev/null +++ b/Classes/Notes/assets/heal_note.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdf3g3174du4r" +path="res://.godot/imported/heal_note.png-09ca289a296eee82d33c64101a4e593a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Notes/assets/heal_note.png" +dest_files=["res://.godot/imported/heal_note.png-09ca289a296eee82d33c64101a4e593a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index 45bc8588..8657e1dd 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -45,6 +45,17 @@ public partial class Scribe : Node director.Enemy.TakeDamage(2 * (int)timing); } ), + new Note( + "PlayerHeal", + "Basic player note, heals player", + GD.Load("res://Classes/Notes/assets/heal_note.png"), + null, + 1, + (director, note, timing) => + { + director.Player.Heal((int)timing); + } + ), }; public static readonly RelicTemplate[] RelicDictionary = new[] diff --git a/scenes/Puppets/scripts/PlayerStats.cs b/scenes/Puppets/scripts/PlayerStats.cs index a42bd9cf..472109b6 100644 --- a/scenes/Puppets/scripts/PlayerStats.cs +++ b/scenes/Puppets/scripts/PlayerStats.cs @@ -12,6 +12,7 @@ public partial class PlayerStats : Resource Scribe.NoteDictionary[1].Clone(), Scribe.NoteDictionary[1].Clone(), Scribe.NoteDictionary[2].Clone(), + Scribe.NoteDictionary[3].Clone(), }; //TODO: Get a better method than .Clone public RelicTemplate[] CurRelics = Array.Empty(); From 7595ae4e1c3325fee327cf6cf4ebfb631c1208f6 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Thu, 20 Feb 2025 18:15:49 -0800 Subject: [PATCH 2/9] Refactoring for map room types Created puppet scenes Added WIP map icons Created BattleConfig --- Globals/FunkEngineNameSpace.cs | 169 ++++++++++++++++-- Globals/StageProducer.cs | 113 +----------- project.godot | 4 + .../BattleDirector/scripts/BattleDirector.cs | 9 +- scenes/Maps/assets/BattleIcon.png | Bin 0 -> 285 bytes scenes/Maps/assets/BattleIcon.png.import | 34 ++++ scenes/Maps/assets/BossIcon.png | Bin 0 -> 300 bytes scenes/Maps/assets/BossIcon.png.import | 34 ++++ scenes/Maps/assets/ChestIcon.png | Bin 0 -> 234 bytes scenes/Maps/assets/ChestIcon.png.import | 34 ++++ scenes/Maps/scripts/Cartographer.cs | 19 +- scenes/NoteManager/note_manager.tscn | 12 +- scenes/Puppets/Enemies/Boss1.tscn | 22 +++ scenes/Puppets/Enemies/EnemyPuppet.tscn | 17 ++ scenes/Puppets/PlayerPuppet.tscn | 20 +++ scenes/Puppets/scripts/PlayerPuppet.cs | 4 +- scenes/Puppets/scripts/PuppetTemplate.cs | 21 ++- 17 files changed, 358 insertions(+), 154 deletions(-) create mode 100644 scenes/Maps/assets/BattleIcon.png create mode 100644 scenes/Maps/assets/BattleIcon.png.import create mode 100644 scenes/Maps/assets/BossIcon.png create mode 100644 scenes/Maps/assets/BossIcon.png.import create mode 100644 scenes/Maps/assets/ChestIcon.png create mode 100644 scenes/Maps/assets/ChestIcon.png.import create mode 100644 scenes/Puppets/Enemies/Boss1.tscn create mode 100644 scenes/Puppets/Enemies/EnemyPuppet.tscn create mode 100644 scenes/Puppets/PlayerPuppet.tscn diff --git a/Globals/FunkEngineNameSpace.cs b/Globals/FunkEngineNameSpace.cs index 7d422ea6..d1a69629 100644 --- a/Globals/FunkEngineNameSpace.cs +++ b/Globals/FunkEngineNameSpace.cs @@ -1,7 +1,24 @@ -using Godot; +using System; +using System.Linq; +using Godot; namespace FunkEngine; +public struct SongData +{ + public int Bpm; + public double SongLength; + public int NumLoops; +} + +public struct ArrowData +{ + public Color Color; + public string Key; + public NoteChecker Node; + public ArrowType Type; +} + public enum ArrowType { Up = 0, @@ -10,14 +27,6 @@ public enum ArrowType Right = 3, } -public enum BattleEffectTrigger -{ - NotePlaced, - NoteHit, - SelfNoteHit, - OnPickup, -} - public enum Timing { Miss = 0, @@ -27,6 +36,22 @@ public enum Timing Perfect = 4, } +public struct BattleConfig +{ + public MapRooms RoomType { get; private set; } + public MapGrid.Room CurRoom { get; private set; } + public SongData CurSong { get; set; } + public int TodoEnemyAndChart; +} + +public enum BattleEffectTrigger +{ + NotePlaced, + NoteHit, + SelfNoteHit, + OnPickup, +} + public enum Stages { Title, @@ -35,19 +60,127 @@ public enum Stages Map, } -public struct SongData +public enum MapRooms { - public int Bpm; - public double SongLength; - public int NumLoops; + Battle, + Chest, + Boss, } -public struct ArrowData +public class MapGrid { - public Color Color; - public string Key; - public NoteChecker Node; - public ArrowType Type; + private int[,] _map; + private Room[] _rooms; + private int _curIdx = 0; + private int _curRoom = 0; + + public Room[] GetRooms() + { + return _rooms; + } + + public class Room + { + public Room(int idx, int x, int y) + { + Idx = idx; + X = x; + Y = y; + } + + public void SetType(MapRooms type) + { + Type = type; + } + + public void AddChild(int newIdx) + { + if (Children.Contains(newIdx)) + return; + Children = Children.Append(newIdx).ToArray(); + } + + public int Idx { get; private set; } + public int[] Children { get; private set; } = Array.Empty(); + public int X { get; private set; } + public int Y { get; private set; } + public MapRooms Type { get; private set; } + } + + public void InitMapGrid(int width, int height, int paths) + { + _curIdx = 0; + _rooms = Array.Empty(); + _map = new int[width, height]; //x,y + + int startX = (width / 2); + _rooms = _rooms.Append(new Room(_curIdx, startX, 0)).ToArray(); + _map[startX, 0] = _curIdx++; + + for (int i = 0; i < paths; i++) + { + GeneratePath_r(startX, 0, width, height); + } + CreateCommonChildren(width, height); + AddBossRoom(width, height); + } + + //Start at x, y, assume prev room exists. Picks new x pos within +/- 1, attaches recursively + private void GeneratePath_r(int x, int y, int width, int height) + { + int nextX = StageProducer.GlobalRng.RandiRange( + Math.Max(x - 1, 0), + Math.Min(x + 1, width - 1) + ); + if (_map[nextX, y + 1] == 0) + { + _rooms = _rooms.Append(new Room(_curIdx, nextX, y + 1)).ToArray(); + _map[nextX, y + 1] = _curIdx; + _rooms[_map[x, y]].AddChild(_curIdx++); + _rooms[^1].SetType(MapRooms.Battle); + if (y > 0 && y % 3 == 0) + { + _rooms[^1].SetType(MapRooms.Chest); + } + } + else + { + _rooms[_map[x, y]].AddChild(_map[nextX, y + 1]); + } + if (y < height - 2) + { + GeneratePath_r(nextX, y + 1, width, height); + } + } + + //Asserts that if there is a room at the same x, but y+1 they are connected + private void CreateCommonChildren(int width, int height) + { + foreach (Room room in _rooms) + { + Vector2I curPos = new Vector2I(room.X, room.Y); + if (room.Y + 1 >= height) + continue; + if (_map[curPos.X, curPos.Y + 1] == 0) + continue; + GD.Print("Added child on same X."); + room.AddChild(_map[curPos.X, curPos.Y + 1]); + } + } + + //Adds a boss room at the end of rooms, all max height rooms connect to it. + private void AddBossRoom(int width, int height) + { + _rooms = _rooms.Append(new Room(_curIdx, width / 2, height)).ToArray(); + _rooms[_curIdx].SetType(MapRooms.Boss); + for (int i = 0; i < width; i++) //Attach all last rooms to a boss room + { + if (_map[i, height - 1] != 0) + { + _rooms[_map[i, height - 1]].AddChild(_curIdx); + } + } + } } public interface IBattleEvent diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index d304eaaa..2167a8d9 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -12,125 +12,19 @@ public partial class StageProducer : Node private ulong _lastRngState; private bool _isInitialized = false; - private Stages _curStage = Stages.Title; + private Stages _curStage = Stages.Title; //TODO: State Machine kinda deal? private Node _curScene; public static MapGrid.Room CurRoom { get; private set; } public static Vector2I MapSize { get; private set; } = new Vector2I(7, 6); //For now, make width an odd number public static MapGrid Map { get; } = new MapGrid(); + public static BattleConfig Config; + //Hold here to persist between changes //TODO: Allow for permanent changes and battle temporary stat changes. public static PlayerStats PlayerStats; - public class MapGrid - { - private int[,] _map; - private Room[] _rooms; - private int _curIdx = 0; - private int _curRoom = 0; - - public Room[] GetRooms() - { - return _rooms; - } - - public class Room - { - public Room(int idx, int x, int y) - { - Idx = idx; - X = x; - Y = y; - } - - public void SetType(string type) - { - Type = type; - } - - public void AddChild(int newIdx) - { - if (Children.Contains(newIdx)) - return; - Children = Children.Append(newIdx).ToArray(); - } - - public int Idx { get; private set; } - public int[] Children { get; private set; } = Array.Empty(); - public int X { get; private set; } - public int Y { get; private set; } - private string Type; - } - - public void InitMapGrid(int width, int height, int paths) - { - _curIdx = 0; - _rooms = Array.Empty(); - _map = new int[width, height]; //x,y - - int startX = (width / 2); - _rooms = _rooms.Append(new Room(_curIdx, startX, 0)).ToArray(); - _map[startX, 0] = _curIdx++; - - for (int i = 0; i < paths; i++) - { - GeneratePath_r(startX, 0, width, height); - } - CreateCommonChildren(width, height); - AddBossRoom(width, height); - } - - //Start at x, y, assume prev room exists. Picks new x pos within +/- 1, attaches recursively - private void GeneratePath_r(int x, int y, int width, int height) - { - int nextX = GlobalRng.RandiRange(Math.Max(x - 1, 0), Math.Min(x + 1, width - 1)); - if (_map[nextX, y + 1] == 0) - { - _rooms = _rooms.Append(new Room(_curIdx, nextX, y + 1)).ToArray(); - _map[nextX, y + 1] = _curIdx; - _rooms[_map[x, y]].AddChild(_curIdx++); - } - else - { - _rooms[_map[x, y]].AddChild(_map[nextX, y + 1]); - } - if (y < height - 2) - { - GeneratePath_r(nextX, y + 1, width, height); - } - } - - //Asserts that if there is a room at the same x, but y+1 they are connected - private void CreateCommonChildren(int width, int height) - { - foreach (Room room in _rooms) - { - Vector2I curPos = new Vector2I(room.X, room.Y); - if (room.Y + 1 >= height) - continue; - if (_map[curPos.X, curPos.Y + 1] == 0) - continue; - GD.Print("Added child on same X."); - room.AddChild(_map[curPos.X, curPos.Y + 1]); - } - } - - //Adds a boss room at the end of rooms, all max height rooms connect to it. - private void AddBossRoom(int width, int height) - { - _rooms = _rooms.Append(new Room(_curIdx, width / 2, height)).ToArray(); - _rooms[_curIdx].SetType("Boss"); - for (int i = 0; i < width; i++) //Attach all last rooms to a boss room - { - if (_map[i, height - 1] != 0) - { - _rooms[_map[i, height - 1]].AddChild(_curIdx); - } - } - } - } - public void StartGame() { Map.InitMapGrid(MapSize.X, MapSize.Y, 3); @@ -158,6 +52,7 @@ public void TransitionStage(Stages nextStage) GetTree().ChangeSceneToFile("res://scenes/SceneTransitions/TitleScreen.tscn"); break; case Stages.Battle: + Config = new BattleConfig() { }; GetTree().ChangeSceneToFile("res://scenes/BattleDirector/test_battle_scene.tscn"); break; case Stages.Map: diff --git a/project.godot b/project.godot index 5ff99624..a677fd5d 100644 --- a/project.godot +++ b/project.godot @@ -38,24 +38,28 @@ arrowUp={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null) ] } arrowDown={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) ] } arrowLeft={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null) ] } arrowRight={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":86,"key_label":0,"unicode":118,"location":0,"echo":false,"script":null) ] } Pause={ diff --git a/scenes/BattleDirector/scripts/BattleDirector.cs b/scenes/BattleDirector/scripts/BattleDirector.cs index 9a0822c1..b1dc9afa 100644 --- a/scenes/BattleDirector/scripts/BattleDirector.cs +++ b/scenes/BattleDirector/scripts/BattleDirector.cs @@ -71,18 +71,18 @@ public override void _Ready() }; TimeKeeper.Bpm = _curSong.Bpm; - Player = new PlayerPuppet(); + Player = GD.Load("res://scenes/Puppets/PlayerPuppet.tscn") + .Instantiate(); AddChild(Player); Player.Defeated += CheckBattleStatus; EventizeRelics(); NotePlacementBar.Setup(StageProducer.PlayerStats); //TODO: Refine - Enemy = new PuppetTemplate(); - Enemy.SetPosition(new Vector2(400, 0)); + Enemy = GD.Load("res://scenes/Puppets/Enemies/Boss1.tscn") + .Instantiate(); AddChild(Enemy); Enemy.Defeated += CheckBattleStatus; - Enemy.Init(GD.Load("res://scenes/BattleDirector/assets/Enemy1.png"), "Enemy"); //TODO: This is a temporary measure Button startButton = new Button(); @@ -105,7 +105,6 @@ private void Begin() CD.TimedInput += OnTimedInput; //TODO: Make enemies, can put this in an enemy subclass - Enemy.Sprite.Scale *= 2; var enemTween = CreateTween(); enemTween.TweenProperty(Enemy.Sprite, "position", Vector2.Down * 5, 1f).AsRelative(); enemTween.TweenProperty(Enemy.Sprite, "position", Vector2.Up * 5, 1f).AsRelative(); diff --git a/scenes/Maps/assets/BattleIcon.png b/scenes/Maps/assets/BattleIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a93306c1e2bb3ff32990e348ea1c989d8f237527 GIT binary patch literal 285 zcmV+&0pk9NP)Px#*GWV{R9J=WmO%;wF$hI%={3Cn!Tv$oRX{|88ar;{Zi4YYjmo?Ld}+|$lj0YE zi0Bh>VrKIkz%u}z5HlY`96bR5w>pmij8>pSoG91>mg(|WVZs1b#`1f?WI@{Y0Dw|c zjxVAM&w7>4&x)@*C4k5Rl3?CwhAJR0@3NJd$r4Kly|_XZ z&_Q>8(QPPWwKicyTqaZou-?>K#U70GO#@hOse^l>)>(QAtgb%!HzPx#=1D|BR9J=WmrD-AAPhuJm23F^2b+U5D0K8?Ry>^Np zfCF#lq z6<&nwm)m#YNobw4($G4b_~262=Mk{N)`17nOON#dKnmZCJg2>)i_Qy9LpK6XCSSB0 yczt&geq!>m6%lbSr{5445xG`Ox*6O4M|1-k7@F+Jcrir)0000Iv8_iVU=cUY59buB@7iWAK926mR`X4kM+Qra>hl4 zj7qnJ7}C@jR;DtZWneBS{kt@-`8zvzOayC+FkcdJ$=EiWg0fm@r)um}%tycT(mdKI;Vst0Hg$1mH+?% literal 0 HcmV?d00001 diff --git a/scenes/Maps/assets/ChestIcon.png.import b/scenes/Maps/assets/ChestIcon.png.import new file mode 100644 index 00000000..7b4992d1 --- /dev/null +++ b/scenes/Maps/assets/ChestIcon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://othbopej2fym" +path="res://.godot/imported/ChestIcon.png-83b4a439102e920a2f15bc896417dcfc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/Maps/assets/ChestIcon.png" +dest_files=["res://.godot/imported/ChestIcon.png-83b4a439102e920a2f15bc896417dcfc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/Maps/scripts/Cartographer.cs b/scenes/Maps/scripts/Cartographer.cs index e7804e02..5a9e20d9 100644 --- a/scenes/Maps/scripts/Cartographer.cs +++ b/scenes/Maps/scripts/Cartographer.cs @@ -20,7 +20,7 @@ private Vector2 GetPosition(int x, int y) private void DrawMap() { var rooms = StageProducer.Map.GetRooms(); - foreach (StageProducer.MapGrid.Room room in rooms) + foreach (MapGrid.Room room in rooms) { DrawMapSprite(room); foreach (int roomIdx in room.Children) @@ -36,7 +36,7 @@ private void DrawMap() AddFocusNeighbors(); } - private void DrawMapSprite(StageProducer.MapGrid.Room room) + private void DrawMapSprite(MapGrid.Room room) { var newButton = new Button(); AddChild(newButton); @@ -55,8 +55,19 @@ private void DrawMapSprite(StageProducer.MapGrid.Room room) }; validButtons = validButtons.Append(newButton).ToArray(); } - newButton.Icon = (Texture2D)GD.Load("res://icon.svg"); //TODO: Room types icons - newButton.Scale *= .25f; + + switch (room.Type) + { + case MapRooms.Battle: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/BattleIcon.png"); + break; + case MapRooms.Boss: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/BossIcon.png"); + break; + case MapRooms.Chest: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/ChestIcon.png"); + break; + } newButton.ZIndex = 1; newButton.Position = GetPosition(room.X, room.Y) - newButton.Size * 2; } diff --git a/scenes/NoteManager/note_manager.tscn b/scenes/NoteManager/note_manager.tscn index 64469369..e0e38332 100644 --- a/scenes/NoteManager/note_manager.tscn +++ b/scenes/NoteManager/note_manager.tscn @@ -21,23 +21,23 @@ script = ExtResource("3_0cioe") modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") -[node name="arrowDown" type="Sprite2D" parent="noteCheckers"] +[node name="arrowUp" type="Sprite2D" parent="noteCheckers"] position = Vector2(0, 70) -rotation = 1.5708 +rotation = -1.5708 texture = ExtResource("2_pb1qk") script = ExtResource("3_0cioe") -[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowDown"] +[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowUp"] modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") -[node name="arrowUp" type="Sprite2D" parent="noteCheckers"] +[node name="arrowDown" type="Sprite2D" parent="noteCheckers"] position = Vector2(0, 111) -rotation = -1.5708 +rotation = 1.5708 texture = ExtResource("2_pb1qk") script = ExtResource("3_0cioe") -[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowUp"] +[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowDown"] modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") diff --git a/scenes/Puppets/Enemies/Boss1.tscn b/scenes/Puppets/Enemies/Boss1.tscn new file mode 100644 index 00000000..2434b794 --- /dev/null +++ b/scenes/Puppets/Enemies/Boss1.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://bi5iqbwpsd381"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PuppetTemplate.cs" id="1_310x1"] +[ext_resource type="Texture2D" uid="uid://veedngaorx3l" path="res://scenes/BattleDirector/assets/Enemy1.png" id="2_bxcx7"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="3_otelj"] + +[node name="EnemPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_310x1") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") +StartPos = Vector2(500, 125) +InitScale = Vector2(2, 2) + +[node name="Sprite" type="Sprite2D" parent="."] +position = Vector2(0, -32) +texture = ExtResource("2_bxcx7") + +[node name="ProgressBar" parent="." instance=ExtResource("3_otelj")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/Enemies/EnemyPuppet.tscn b/scenes/Puppets/Enemies/EnemyPuppet.tscn new file mode 100644 index 00000000..e7020df5 --- /dev/null +++ b/scenes/Puppets/Enemies/EnemyPuppet.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://cwm0n2wu851nx"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PuppetTemplate.cs" id="1_kgmh0"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="1_sxlrs"] + +[node name="EnemPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_kgmh0") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") + +[node name="Sprite" type="Sprite2D" parent="."] + +[node name="ProgressBar" parent="." instance=ExtResource("1_sxlrs")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/PlayerPuppet.tscn b/scenes/Puppets/PlayerPuppet.tscn new file mode 100644 index 00000000..83e5d034 --- /dev/null +++ b/scenes/Puppets/PlayerPuppet.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://eus17omen6yk"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PlayerPuppet.cs" id="1_f4rea"] +[ext_resource type="Texture2D" uid="uid://b6fkei0i83vte" path="res://scenes/BattleDirector/assets/Character1.png" id="2_affso"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="3_rechw"] + +[node name="PlayerPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_f4rea") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") +StartPos = Vector2(158, 125) + +[node name="Sprite" type="Sprite2D" parent="."] +texture = ExtResource("2_affso") + +[node name="ProgressBar" parent="." instance=ExtResource("3_rechw")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/scripts/PlayerPuppet.cs b/scenes/Puppets/scripts/PlayerPuppet.cs index c831fb6c..350291b7 100644 --- a/scenes/Puppets/scripts/PlayerPuppet.cs +++ b/scenes/Puppets/scripts/PlayerPuppet.cs @@ -12,9 +12,7 @@ public override void _Ready() _currentHealth = Stats.CurrentHealth; _maxHealth = Stats.MaxHealth; - Init(GD.Load("res://scenes/BattleDirector/assets/Character1.png"), "Player"); - SetPosition(new Vector2(80, 0)); - Sprite.Position += Vector2.Down * 30; //TEMP + UniqName = "Player"; base._Ready(); } diff --git a/scenes/Puppets/scripts/PuppetTemplate.cs b/scenes/Puppets/scripts/PuppetTemplate.cs index 9079b982..2bc1edf0 100644 --- a/scenes/Puppets/scripts/PuppetTemplate.cs +++ b/scenes/Puppets/scripts/PuppetTemplate.cs @@ -9,8 +9,17 @@ public partial class PuppetTemplate : Node2D public delegate void DefeatedHandler(PuppetTemplate self); public event DefeatedHandler Defeated; + [Export] protected HealthBar _healthBar; - public Sprite2D Sprite = new Sprite2D(); + + [Export] + public Sprite2D Sprite; + + [Export] + public Vector2 StartPos; //158, 126 + + [Export] + public Vector2 InitScale = Vector2.One; protected int _maxHealth = 100; protected int _currentHealth = 100; @@ -21,15 +30,9 @@ public partial class PuppetTemplate : Node2D public override void _Ready() { - _healthBar = GD.Load("res://scenes/Puppets/HealthBar.tscn") - .Instantiate(); - AddChild(_healthBar); - _healthBar.Position += Vector2.Down * 155; - - Sprite.Position = new Vector2(75, 86); - AddChild(Sprite); //TODO: DECIDE Whether to replace with packedscenes/robust subclasses - _healthBar.SetHealth(_maxHealth, _currentHealth); + Position = StartPos; + Sprite.Scale = InitScale; } public void Init(Texture2D texture, string name) From 52763834c5d9d48c415e2bde0dca96564d97006b Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Thu, 20 Feb 2025 18:15:49 -0800 Subject: [PATCH 3/9] Refactoring for map room types Created puppet scenes Added WIP map icons Created BattleConfig --- Globals/FunkEngineNameSpace.cs | 169 ++++++++++++++++-- Globals/StageProducer.cs | 113 +----------- project.godot | 4 + .../BattleDirector/scripts/BattleDirector.cs | 9 +- scenes/Maps/assets/BattleIcon.png | Bin 0 -> 285 bytes scenes/Maps/assets/BattleIcon.png.import | 34 ++++ scenes/Maps/assets/BossIcon.png | Bin 0 -> 300 bytes scenes/Maps/assets/BossIcon.png.import | 34 ++++ scenes/Maps/assets/ChestIcon.png | Bin 0 -> 234 bytes scenes/Maps/assets/ChestIcon.png.import | 34 ++++ scenes/Maps/scripts/Cartographer.cs | 19 +- scenes/NoteManager/note_manager.tscn | 12 +- scenes/Puppets/Enemies/Boss1.tscn | 22 +++ scenes/Puppets/Enemies/EnemyPuppet.tscn | 17 ++ scenes/Puppets/PlayerPuppet.tscn | 20 +++ scenes/Puppets/scripts/PlayerPuppet.cs | 4 +- scenes/Puppets/scripts/PuppetTemplate.cs | 21 ++- 17 files changed, 358 insertions(+), 154 deletions(-) create mode 100644 scenes/Maps/assets/BattleIcon.png create mode 100644 scenes/Maps/assets/BattleIcon.png.import create mode 100644 scenes/Maps/assets/BossIcon.png create mode 100644 scenes/Maps/assets/BossIcon.png.import create mode 100644 scenes/Maps/assets/ChestIcon.png create mode 100644 scenes/Maps/assets/ChestIcon.png.import create mode 100644 scenes/Puppets/Enemies/Boss1.tscn create mode 100644 scenes/Puppets/Enemies/EnemyPuppet.tscn create mode 100644 scenes/Puppets/PlayerPuppet.tscn diff --git a/Globals/FunkEngineNameSpace.cs b/Globals/FunkEngineNameSpace.cs index 7d422ea6..d1a69629 100644 --- a/Globals/FunkEngineNameSpace.cs +++ b/Globals/FunkEngineNameSpace.cs @@ -1,7 +1,24 @@ -using Godot; +using System; +using System.Linq; +using Godot; namespace FunkEngine; +public struct SongData +{ + public int Bpm; + public double SongLength; + public int NumLoops; +} + +public struct ArrowData +{ + public Color Color; + public string Key; + public NoteChecker Node; + public ArrowType Type; +} + public enum ArrowType { Up = 0, @@ -10,14 +27,6 @@ public enum ArrowType Right = 3, } -public enum BattleEffectTrigger -{ - NotePlaced, - NoteHit, - SelfNoteHit, - OnPickup, -} - public enum Timing { Miss = 0, @@ -27,6 +36,22 @@ public enum Timing Perfect = 4, } +public struct BattleConfig +{ + public MapRooms RoomType { get; private set; } + public MapGrid.Room CurRoom { get; private set; } + public SongData CurSong { get; set; } + public int TodoEnemyAndChart; +} + +public enum BattleEffectTrigger +{ + NotePlaced, + NoteHit, + SelfNoteHit, + OnPickup, +} + public enum Stages { Title, @@ -35,19 +60,127 @@ public enum Stages Map, } -public struct SongData +public enum MapRooms { - public int Bpm; - public double SongLength; - public int NumLoops; + Battle, + Chest, + Boss, } -public struct ArrowData +public class MapGrid { - public Color Color; - public string Key; - public NoteChecker Node; - public ArrowType Type; + private int[,] _map; + private Room[] _rooms; + private int _curIdx = 0; + private int _curRoom = 0; + + public Room[] GetRooms() + { + return _rooms; + } + + public class Room + { + public Room(int idx, int x, int y) + { + Idx = idx; + X = x; + Y = y; + } + + public void SetType(MapRooms type) + { + Type = type; + } + + public void AddChild(int newIdx) + { + if (Children.Contains(newIdx)) + return; + Children = Children.Append(newIdx).ToArray(); + } + + public int Idx { get; private set; } + public int[] Children { get; private set; } = Array.Empty(); + public int X { get; private set; } + public int Y { get; private set; } + public MapRooms Type { get; private set; } + } + + public void InitMapGrid(int width, int height, int paths) + { + _curIdx = 0; + _rooms = Array.Empty(); + _map = new int[width, height]; //x,y + + int startX = (width / 2); + _rooms = _rooms.Append(new Room(_curIdx, startX, 0)).ToArray(); + _map[startX, 0] = _curIdx++; + + for (int i = 0; i < paths; i++) + { + GeneratePath_r(startX, 0, width, height); + } + CreateCommonChildren(width, height); + AddBossRoom(width, height); + } + + //Start at x, y, assume prev room exists. Picks new x pos within +/- 1, attaches recursively + private void GeneratePath_r(int x, int y, int width, int height) + { + int nextX = StageProducer.GlobalRng.RandiRange( + Math.Max(x - 1, 0), + Math.Min(x + 1, width - 1) + ); + if (_map[nextX, y + 1] == 0) + { + _rooms = _rooms.Append(new Room(_curIdx, nextX, y + 1)).ToArray(); + _map[nextX, y + 1] = _curIdx; + _rooms[_map[x, y]].AddChild(_curIdx++); + _rooms[^1].SetType(MapRooms.Battle); + if (y > 0 && y % 3 == 0) + { + _rooms[^1].SetType(MapRooms.Chest); + } + } + else + { + _rooms[_map[x, y]].AddChild(_map[nextX, y + 1]); + } + if (y < height - 2) + { + GeneratePath_r(nextX, y + 1, width, height); + } + } + + //Asserts that if there is a room at the same x, but y+1 they are connected + private void CreateCommonChildren(int width, int height) + { + foreach (Room room in _rooms) + { + Vector2I curPos = new Vector2I(room.X, room.Y); + if (room.Y + 1 >= height) + continue; + if (_map[curPos.X, curPos.Y + 1] == 0) + continue; + GD.Print("Added child on same X."); + room.AddChild(_map[curPos.X, curPos.Y + 1]); + } + } + + //Adds a boss room at the end of rooms, all max height rooms connect to it. + private void AddBossRoom(int width, int height) + { + _rooms = _rooms.Append(new Room(_curIdx, width / 2, height)).ToArray(); + _rooms[_curIdx].SetType(MapRooms.Boss); + for (int i = 0; i < width; i++) //Attach all last rooms to a boss room + { + if (_map[i, height - 1] != 0) + { + _rooms[_map[i, height - 1]].AddChild(_curIdx); + } + } + } } public interface IBattleEvent diff --git a/Globals/StageProducer.cs b/Globals/StageProducer.cs index d304eaaa..2167a8d9 100644 --- a/Globals/StageProducer.cs +++ b/Globals/StageProducer.cs @@ -12,125 +12,19 @@ public partial class StageProducer : Node private ulong _lastRngState; private bool _isInitialized = false; - private Stages _curStage = Stages.Title; + private Stages _curStage = Stages.Title; //TODO: State Machine kinda deal? private Node _curScene; public static MapGrid.Room CurRoom { get; private set; } public static Vector2I MapSize { get; private set; } = new Vector2I(7, 6); //For now, make width an odd number public static MapGrid Map { get; } = new MapGrid(); + public static BattleConfig Config; + //Hold here to persist between changes //TODO: Allow for permanent changes and battle temporary stat changes. public static PlayerStats PlayerStats; - public class MapGrid - { - private int[,] _map; - private Room[] _rooms; - private int _curIdx = 0; - private int _curRoom = 0; - - public Room[] GetRooms() - { - return _rooms; - } - - public class Room - { - public Room(int idx, int x, int y) - { - Idx = idx; - X = x; - Y = y; - } - - public void SetType(string type) - { - Type = type; - } - - public void AddChild(int newIdx) - { - if (Children.Contains(newIdx)) - return; - Children = Children.Append(newIdx).ToArray(); - } - - public int Idx { get; private set; } - public int[] Children { get; private set; } = Array.Empty(); - public int X { get; private set; } - public int Y { get; private set; } - private string Type; - } - - public void InitMapGrid(int width, int height, int paths) - { - _curIdx = 0; - _rooms = Array.Empty(); - _map = new int[width, height]; //x,y - - int startX = (width / 2); - _rooms = _rooms.Append(new Room(_curIdx, startX, 0)).ToArray(); - _map[startX, 0] = _curIdx++; - - for (int i = 0; i < paths; i++) - { - GeneratePath_r(startX, 0, width, height); - } - CreateCommonChildren(width, height); - AddBossRoom(width, height); - } - - //Start at x, y, assume prev room exists. Picks new x pos within +/- 1, attaches recursively - private void GeneratePath_r(int x, int y, int width, int height) - { - int nextX = GlobalRng.RandiRange(Math.Max(x - 1, 0), Math.Min(x + 1, width - 1)); - if (_map[nextX, y + 1] == 0) - { - _rooms = _rooms.Append(new Room(_curIdx, nextX, y + 1)).ToArray(); - _map[nextX, y + 1] = _curIdx; - _rooms[_map[x, y]].AddChild(_curIdx++); - } - else - { - _rooms[_map[x, y]].AddChild(_map[nextX, y + 1]); - } - if (y < height - 2) - { - GeneratePath_r(nextX, y + 1, width, height); - } - } - - //Asserts that if there is a room at the same x, but y+1 they are connected - private void CreateCommonChildren(int width, int height) - { - foreach (Room room in _rooms) - { - Vector2I curPos = new Vector2I(room.X, room.Y); - if (room.Y + 1 >= height) - continue; - if (_map[curPos.X, curPos.Y + 1] == 0) - continue; - GD.Print("Added child on same X."); - room.AddChild(_map[curPos.X, curPos.Y + 1]); - } - } - - //Adds a boss room at the end of rooms, all max height rooms connect to it. - private void AddBossRoom(int width, int height) - { - _rooms = _rooms.Append(new Room(_curIdx, width / 2, height)).ToArray(); - _rooms[_curIdx].SetType("Boss"); - for (int i = 0; i < width; i++) //Attach all last rooms to a boss room - { - if (_map[i, height - 1] != 0) - { - _rooms[_map[i, height - 1]].AddChild(_curIdx); - } - } - } - } - public void StartGame() { Map.InitMapGrid(MapSize.X, MapSize.Y, 3); @@ -158,6 +52,7 @@ public void TransitionStage(Stages nextStage) GetTree().ChangeSceneToFile("res://scenes/SceneTransitions/TitleScreen.tscn"); break; case Stages.Battle: + Config = new BattleConfig() { }; GetTree().ChangeSceneToFile("res://scenes/BattleDirector/test_battle_scene.tscn"); break; case Stages.Map: diff --git a/project.godot b/project.godot index 5ff99624..a677fd5d 100644 --- a/project.godot +++ b/project.godot @@ -38,24 +38,28 @@ arrowUp={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null) ] } arrowDown={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) ] } arrowLeft={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null) ] } arrowRight={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":86,"key_label":0,"unicode":118,"location":0,"echo":false,"script":null) ] } Pause={ diff --git a/scenes/BattleDirector/scripts/BattleDirector.cs b/scenes/BattleDirector/scripts/BattleDirector.cs index 9a0822c1..b1dc9afa 100644 --- a/scenes/BattleDirector/scripts/BattleDirector.cs +++ b/scenes/BattleDirector/scripts/BattleDirector.cs @@ -71,18 +71,18 @@ public override void _Ready() }; TimeKeeper.Bpm = _curSong.Bpm; - Player = new PlayerPuppet(); + Player = GD.Load("res://scenes/Puppets/PlayerPuppet.tscn") + .Instantiate(); AddChild(Player); Player.Defeated += CheckBattleStatus; EventizeRelics(); NotePlacementBar.Setup(StageProducer.PlayerStats); //TODO: Refine - Enemy = new PuppetTemplate(); - Enemy.SetPosition(new Vector2(400, 0)); + Enemy = GD.Load("res://scenes/Puppets/Enemies/Boss1.tscn") + .Instantiate(); AddChild(Enemy); Enemy.Defeated += CheckBattleStatus; - Enemy.Init(GD.Load("res://scenes/BattleDirector/assets/Enemy1.png"), "Enemy"); //TODO: This is a temporary measure Button startButton = new Button(); @@ -105,7 +105,6 @@ private void Begin() CD.TimedInput += OnTimedInput; //TODO: Make enemies, can put this in an enemy subclass - Enemy.Sprite.Scale *= 2; var enemTween = CreateTween(); enemTween.TweenProperty(Enemy.Sprite, "position", Vector2.Down * 5, 1f).AsRelative(); enemTween.TweenProperty(Enemy.Sprite, "position", Vector2.Up * 5, 1f).AsRelative(); diff --git a/scenes/Maps/assets/BattleIcon.png b/scenes/Maps/assets/BattleIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a93306c1e2bb3ff32990e348ea1c989d8f237527 GIT binary patch literal 285 zcmV+&0pk9NP)Px#*GWV{R9J=WmO%;wF$hI%={3Cn!Tv$oRX{|88ar;{Zi4YYjmo?Ld}+|$lj0YE zi0Bh>VrKIkz%u}z5HlY`96bR5w>pmij8>pSoG91>mg(|WVZs1b#`1f?WI@{Y0Dw|c zjxVAM&w7>4&x)@*C4k5Rl3?CwhAJR0@3NJd$r4Kly|_XZ z&_Q>8(QPPWwKicyTqaZou-?>K#U70GO#@hOse^l>)>(QAtgb%!HzPx#=1D|BR9J=WmrD-AAPhuJm23F^2b+U5D0K8?Ry>^Np zfCF#lq z6<&nwm)m#YNobw4($G4b_~262=Mk{N)`17nOON#dKnmZCJg2>)i_Qy9LpK6XCSSB0 yczt&geq!>m6%lbSr{5445xG`Ox*6O4M|1-k7@F+Jcrir)0000Iv8_iVU=cUY59buB@7iWAK926mR`X4kM+Qra>hl4 zj7qnJ7}C@jR;DtZWneBS{kt@-`8zvzOayC+FkcdJ$=EiWg0fm@r)um}%tycT(mdKI;Vst0Hg$1mH+?% literal 0 HcmV?d00001 diff --git a/scenes/Maps/assets/ChestIcon.png.import b/scenes/Maps/assets/ChestIcon.png.import new file mode 100644 index 00000000..7b4992d1 --- /dev/null +++ b/scenes/Maps/assets/ChestIcon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://othbopej2fym" +path="res://.godot/imported/ChestIcon.png-83b4a439102e920a2f15bc896417dcfc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/Maps/assets/ChestIcon.png" +dest_files=["res://.godot/imported/ChestIcon.png-83b4a439102e920a2f15bc896417dcfc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/Maps/scripts/Cartographer.cs b/scenes/Maps/scripts/Cartographer.cs index e7804e02..5a9e20d9 100644 --- a/scenes/Maps/scripts/Cartographer.cs +++ b/scenes/Maps/scripts/Cartographer.cs @@ -20,7 +20,7 @@ private Vector2 GetPosition(int x, int y) private void DrawMap() { var rooms = StageProducer.Map.GetRooms(); - foreach (StageProducer.MapGrid.Room room in rooms) + foreach (MapGrid.Room room in rooms) { DrawMapSprite(room); foreach (int roomIdx in room.Children) @@ -36,7 +36,7 @@ private void DrawMap() AddFocusNeighbors(); } - private void DrawMapSprite(StageProducer.MapGrid.Room room) + private void DrawMapSprite(MapGrid.Room room) { var newButton = new Button(); AddChild(newButton); @@ -55,8 +55,19 @@ private void DrawMapSprite(StageProducer.MapGrid.Room room) }; validButtons = validButtons.Append(newButton).ToArray(); } - newButton.Icon = (Texture2D)GD.Load("res://icon.svg"); //TODO: Room types icons - newButton.Scale *= .25f; + + switch (room.Type) + { + case MapRooms.Battle: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/BattleIcon.png"); + break; + case MapRooms.Boss: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/BossIcon.png"); + break; + case MapRooms.Chest: + newButton.Icon = (Texture2D)GD.Load("res://scenes/Maps/assets/ChestIcon.png"); + break; + } newButton.ZIndex = 1; newButton.Position = GetPosition(room.X, room.Y) - newButton.Size * 2; } diff --git a/scenes/NoteManager/note_manager.tscn b/scenes/NoteManager/note_manager.tscn index 64469369..e0e38332 100644 --- a/scenes/NoteManager/note_manager.tscn +++ b/scenes/NoteManager/note_manager.tscn @@ -21,23 +21,23 @@ script = ExtResource("3_0cioe") modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") -[node name="arrowDown" type="Sprite2D" parent="noteCheckers"] +[node name="arrowUp" type="Sprite2D" parent="noteCheckers"] position = Vector2(0, 70) -rotation = 1.5708 +rotation = -1.5708 texture = ExtResource("2_pb1qk") script = ExtResource("3_0cioe") -[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowDown"] +[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowUp"] modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") -[node name="arrowUp" type="Sprite2D" parent="noteCheckers"] +[node name="arrowDown" type="Sprite2D" parent="noteCheckers"] position = Vector2(0, 111) -rotation = -1.5708 +rotation = 1.5708 texture = ExtResource("2_pb1qk") script = ExtResource("3_0cioe") -[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowUp"] +[node name="Outline" type="Sprite2D" parent="noteCheckers/arrowDown"] modulate = Color(0, 0, 0, 1) texture = ExtResource("4_3mttx") diff --git a/scenes/Puppets/Enemies/Boss1.tscn b/scenes/Puppets/Enemies/Boss1.tscn new file mode 100644 index 00000000..2434b794 --- /dev/null +++ b/scenes/Puppets/Enemies/Boss1.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://bi5iqbwpsd381"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PuppetTemplate.cs" id="1_310x1"] +[ext_resource type="Texture2D" uid="uid://veedngaorx3l" path="res://scenes/BattleDirector/assets/Enemy1.png" id="2_bxcx7"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="3_otelj"] + +[node name="EnemPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_310x1") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") +StartPos = Vector2(500, 125) +InitScale = Vector2(2, 2) + +[node name="Sprite" type="Sprite2D" parent="."] +position = Vector2(0, -32) +texture = ExtResource("2_bxcx7") + +[node name="ProgressBar" parent="." instance=ExtResource("3_otelj")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/Enemies/EnemyPuppet.tscn b/scenes/Puppets/Enemies/EnemyPuppet.tscn new file mode 100644 index 00000000..e7020df5 --- /dev/null +++ b/scenes/Puppets/Enemies/EnemyPuppet.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://cwm0n2wu851nx"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PuppetTemplate.cs" id="1_kgmh0"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="1_sxlrs"] + +[node name="EnemPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_kgmh0") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") + +[node name="Sprite" type="Sprite2D" parent="."] + +[node name="ProgressBar" parent="." instance=ExtResource("1_sxlrs")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/PlayerPuppet.tscn b/scenes/Puppets/PlayerPuppet.tscn new file mode 100644 index 00000000..83e5d034 --- /dev/null +++ b/scenes/Puppets/PlayerPuppet.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://eus17omen6yk"] + +[ext_resource type="Script" path="res://scenes/Puppets/scripts/PlayerPuppet.cs" id="1_f4rea"] +[ext_resource type="Texture2D" uid="uid://b6fkei0i83vte" path="res://scenes/BattleDirector/assets/Character1.png" id="2_affso"] +[ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="3_rechw"] + +[node name="PlayerPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] +script = ExtResource("1_f4rea") +_healthBar = NodePath("ProgressBar") +Sprite = NodePath("Sprite") +StartPos = Vector2(158, 125) + +[node name="Sprite" type="Sprite2D" parent="."] +texture = ExtResource("2_affso") + +[node name="ProgressBar" parent="." instance=ExtResource("3_rechw")] +offset_left = -75.0 +offset_top = 32.0 +offset_right = 75.0 +offset_bottom = 52.0 diff --git a/scenes/Puppets/scripts/PlayerPuppet.cs b/scenes/Puppets/scripts/PlayerPuppet.cs index c831fb6c..350291b7 100644 --- a/scenes/Puppets/scripts/PlayerPuppet.cs +++ b/scenes/Puppets/scripts/PlayerPuppet.cs @@ -12,9 +12,7 @@ public override void _Ready() _currentHealth = Stats.CurrentHealth; _maxHealth = Stats.MaxHealth; - Init(GD.Load("res://scenes/BattleDirector/assets/Character1.png"), "Player"); - SetPosition(new Vector2(80, 0)); - Sprite.Position += Vector2.Down * 30; //TEMP + UniqName = "Player"; base._Ready(); } diff --git a/scenes/Puppets/scripts/PuppetTemplate.cs b/scenes/Puppets/scripts/PuppetTemplate.cs index 9079b982..2bc1edf0 100644 --- a/scenes/Puppets/scripts/PuppetTemplate.cs +++ b/scenes/Puppets/scripts/PuppetTemplate.cs @@ -9,8 +9,17 @@ public partial class PuppetTemplate : Node2D public delegate void DefeatedHandler(PuppetTemplate self); public event DefeatedHandler Defeated; + [Export] protected HealthBar _healthBar; - public Sprite2D Sprite = new Sprite2D(); + + [Export] + public Sprite2D Sprite; + + [Export] + public Vector2 StartPos; //158, 126 + + [Export] + public Vector2 InitScale = Vector2.One; protected int _maxHealth = 100; protected int _currentHealth = 100; @@ -21,15 +30,9 @@ public partial class PuppetTemplate : Node2D public override void _Ready() { - _healthBar = GD.Load("res://scenes/Puppets/HealthBar.tscn") - .Instantiate(); - AddChild(_healthBar); - _healthBar.Position += Vector2.Down * 155; - - Sprite.Position = new Vector2(75, 86); - AddChild(Sprite); //TODO: DECIDE Whether to replace with packedscenes/robust subclasses - _healthBar.SetHealth(_maxHealth, _currentHealth); + Position = StartPos; + Sprite.Scale = InitScale; } public void Init(Texture2D texture, string name) From fdcac573eba2d4a395cb542cf2e76c992973da13 Mon Sep 17 00:00:00 2001 From: Thomas Wessel Date: Thu, 20 Feb 2025 19:16:15 -0800 Subject: [PATCH 4/9] Add star shader to battle scene --- scenes/ChartViewport/ChartViewport.tscn | 15 ++++++++++++++- scenes/ChartViewport/StarryNight.gdshader | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 scenes/ChartViewport/StarryNight.gdshader diff --git a/scenes/ChartViewport/ChartViewport.tscn b/scenes/ChartViewport/ChartViewport.tscn index 8708038b..52f35d99 100644 --- a/scenes/ChartViewport/ChartViewport.tscn +++ b/scenes/ChartViewport/ChartViewport.tscn @@ -1,9 +1,14 @@ -[gd_scene load_steps=5 format=3 uid="uid://dfevfib11kou1"] +[gd_scene load_steps=7 format=3 uid="uid://dfevfib11kou1"] [ext_resource type="Texture2D" uid="uid://b0tvsewgnf2x7" path="res://icon.svg" id="1_0wnka"] [ext_resource type="Script" path="res://scenes/ChartViewport/ChartManager.cs" id="1_ruh2l"] [ext_resource type="Script" path="res://scenes/ChartViewport/Loopable.cs" id="3_5u57h"] [ext_resource type="PackedScene" uid="uid://bn8txx53xlguw" path="res://scenes/NoteManager/note_manager.tscn" id="4_fd5fw"] +[ext_resource type="Shader" path="res://scenes/ChartViewport/StarryNight.gdshader" id="5_kqrxg"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_5uw0y"] +shader = ExtResource("5_kqrxg") +shader_parameter/bg_color = Vector4(0.18, 0.08, 0.12, 0) [node name="VPContainer" type="SubViewportContainer" node_paths=PackedStringArray("IH", "ChartLoopables")] offset_right = 480.0 @@ -45,4 +50,12 @@ offset_bottom = 300.0 texture = ExtResource("1_0wnka") script = ExtResource("3_5u57h") +[node name="StarShader" type="ColorRect" parent="SubViewport"] +material = SubResource("ShaderMaterial_5uw0y") +offset_left = -60.0 +offset_right = 415.0 +offset_bottom = 177.0 +scale = Vector2(2.18, 2.18) +color = Color(0, 0, 0, 1) + [node name="noteManager" parent="SubViewport" instance=ExtResource("4_fd5fw")] diff --git a/scenes/ChartViewport/StarryNight.gdshader b/scenes/ChartViewport/StarryNight.gdshader new file mode 100644 index 00000000..62c07421 --- /dev/null +++ b/scenes/ChartViewport/StarryNight.gdshader @@ -0,0 +1,21 @@ +//based on this star shader. Thanks gerardogc2378 +//https://godotshaders.com/shader/stars-shader/ + +shader_type canvas_item; + +uniform vec4 bg_color; + +float rand(vec2 st) { + return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123); +} + +void fragment() { + float color = 0.0; + + if (rand(SCREEN_UV.xy / 20.0) > 0.996) + { + float r = rand(SCREEN_UV.xy); + color = r * (0.85 * sin(TIME * (r * 5.0) + 720.0 * r) + 0.95); + } + COLOR = vec4(vec3(color),1.0) + bg_color; +} \ No newline at end of file From fbdbaf7910c62467947cd791390bf5b8a4cb4bbc Mon Sep 17 00:00:00 2001 From: Thomas Wessel Date: Thu, 20 Feb 2025 20:32:32 -0800 Subject: [PATCH 5/9] Add blood droplets to enemy 1 --- scenes/Puppets/Enemies/Boss1.tscn | 29 ++++++++++++++- .../Enemies/assets/Boss1EmissionShape.tres | 13 +++++++ .../Puppets/Enemies/assets/Enemy1.png.import | 34 ++++++++++++++++++ .../Enemies/assets/Enemy1EmissionShape.png | Bin 0 -> 1038 bytes .../assets/Enemy1EmissionShape.png.import | 34 ++++++++++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 scenes/Puppets/Enemies/assets/Boss1EmissionShape.tres create mode 100644 scenes/Puppets/Enemies/assets/Enemy1.png.import create mode 100644 scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png create mode 100644 scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png.import diff --git a/scenes/Puppets/Enemies/Boss1.tscn b/scenes/Puppets/Enemies/Boss1.tscn index 2434b794..9ee3ee20 100644 --- a/scenes/Puppets/Enemies/Boss1.tscn +++ b/scenes/Puppets/Enemies/Boss1.tscn @@ -1,9 +1,27 @@ -[gd_scene load_steps=4 format=3 uid="uid://bi5iqbwpsd381"] +[gd_scene load_steps=8 format=3 uid="uid://bi5iqbwpsd381"] [ext_resource type="Script" path="res://scenes/Puppets/scripts/PuppetTemplate.cs" id="1_310x1"] [ext_resource type="Texture2D" uid="uid://veedngaorx3l" path="res://scenes/BattleDirector/assets/Enemy1.png" id="2_bxcx7"] +[ext_resource type="Texture2D" uid="uid://b2iptr3o8rg4t" path="res://scenes/Puppets/Enemies/assets/Boss1EmissionShape.tres" id="3_ct4k8"] [ext_resource type="PackedScene" uid="uid://bgomxovxs7sr8" path="res://scenes/Puppets/HealthBar.tscn" id="3_otelj"] +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_3jiu6"] +emission_shape = 4 +emission_point_texture = ExtResource("3_ct4k8") +emission_point_count = 1078 +gravity = Vector3(0, 98, 0) +scale_min = 4.0 +scale_max = 4.0 +turbulence_noise_strength = 14.2 + +[sub_resource type="Gradient" id="Gradient_s7p55"] +offsets = PackedFloat32Array(0) +colors = PackedColorArray(0.641048, 0.0406094, 0.0473231, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_16sp0"] +gradient = SubResource("Gradient_s7p55") +width = 1 + [node name="EnemPuppet" type="Node2D" node_paths=PackedStringArray("_healthBar", "Sprite")] script = ExtResource("1_310x1") _healthBar = NodePath("ProgressBar") @@ -15,6 +33,15 @@ InitScale = Vector2(2, 2) position = Vector2(0, -32) texture = ExtResource("2_bxcx7") +[node name="Blood Particles" type="GPUParticles2D" parent="Sprite"] +z_index = -1 +position = Vector2(-32, -32) +amount = 4 +process_material = SubResource("ParticleProcessMaterial_3jiu6") +texture = SubResource("GradientTexture1D_16sp0") +lifetime = 2.0 +trail_lifetime = 10.0 + [node name="ProgressBar" parent="." instance=ExtResource("3_otelj")] offset_left = -75.0 offset_top = 32.0 diff --git a/scenes/Puppets/Enemies/assets/Boss1EmissionShape.tres b/scenes/Puppets/Enemies/assets/Boss1EmissionShape.tres new file mode 100644 index 00000000..46b09170 --- /dev/null +++ b/scenes/Puppets/Enemies/assets/Boss1EmissionShape.tres @@ -0,0 +1,13 @@ +[gd_resource type="ImageTexture" load_steps=2 format=3 uid="uid://b2iptr3o8rg4t"] + +[sub_resource type="Image" id="Image_jc6cb"] +data = { +"data": PackedByteArray(0, 0, 64, 64, 0, 0, 232, 65, 0, 0, 64, 64, 0, 0, 240, 65, 0, 0, 64, 64, 0, 0, 248, 65, 0, 0, 64, 64, 0, 0, 0, 66, 0, 0, 64, 64, 0, 0, 4, 66, 0, 0, 128, 64, 0, 0, 200, 65, 0, 0, 128, 64, 0, 0, 208, 65, 0, 0, 128, 64, 0, 0, 216, 65, 0, 0, 128, 64, 0, 0, 224, 65, 0, 0, 128, 64, 0, 0, 232, 65, 0, 0, 128, 64, 0, 0, 240, 65, 0, 0, 128, 64, 0, 0, 248, 65, 0, 0, 128, 64, 0, 0, 0, 66, 0, 0, 160, 64, 0, 0, 200, 65, 0, 0, 160, 64, 0, 0, 208, 65, 0, 0, 160, 64, 0, 0, 216, 65, 0, 0, 160, 64, 0, 0, 224, 65, 0, 0, 160, 64, 0, 0, 232, 65, 0, 0, 160, 64, 0, 0, 240, 65, 0, 0, 160, 64, 0, 0, 248, 65, 0, 0, 192, 64, 0, 0, 192, 65, 0, 0, 192, 64, 0, 0, 200, 65, 0, 0, 192, 64, 0, 0, 208, 65, 0, 0, 192, 64, 0, 0, 216, 65, 0, 0, 192, 64, 0, 0, 224, 65, 0, 0, 192, 64, 0, 0, 232, 65, 0, 0, 192, 64, 0, 0, 240, 65, 0, 0, 224, 64, 0, 0, 192, 65, 0, 0, 224, 64, 0, 0, 200, 65, 0, 0, 224, 64, 0, 0, 208, 65, 0, 0, 224, 64, 0, 0, 216, 65, 0, 0, 224, 64, 0, 0, 224, 65, 0, 0, 224, 64, 0, 0, 232, 65, 0, 0, 224, 64, 0, 0, 240, 65, 0, 0, 0, 65, 0, 0, 192, 65, 0, 0, 0, 65, 0, 0, 200, 65, 0, 0, 0, 65, 0, 0, 208, 65, 0, 0, 0, 65, 0, 0, 216, 65, 0, 0, 0, 65, 0, 0, 224, 65, 0, 0, 0, 65, 0, 0, 232, 65, 0, 0, 0, 65, 0, 0, 48, 66, 0, 0, 16, 65, 0, 0, 192, 65, 0, 0, 16, 65, 0, 0, 200, 65, 0, 0, 16, 65, 0, 0, 208, 65, 0, 0, 16, 65, 0, 0, 216, 65, 0, 0, 16, 65, 0, 0, 224, 65, 0, 0, 16, 65, 0, 0, 44, 66, 0, 0, 16, 65, 0, 0, 48, 66, 0, 0, 32, 65, 0, 0, 184, 65, 0, 0, 32, 65, 0, 0, 192, 65, 0, 0, 32, 65, 0, 0, 200, 65, 0, 0, 32, 65, 0, 0, 208, 65, 0, 0, 32, 65, 0, 0, 216, 65, 0, 0, 32, 65, 0, 0, 224, 65, 0, 0, 32, 65, 0, 0, 36, 66, 0, 0, 32, 65, 0, 0, 40, 66, 0, 0, 32, 65, 0, 0, 44, 66, 0, 0, 32, 65, 0, 0, 48, 66, 0, 0, 48, 65, 0, 0, 168, 65, 0, 0, 48, 65, 0, 0, 176, 65, 0, 0, 48, 65, 0, 0, 184, 65, 0, 0, 48, 65, 0, 0, 192, 65, 0, 0, 48, 65, 0, 0, 200, 65, 0, 0, 48, 65, 0, 0, 208, 65, 0, 0, 48, 65, 0, 0, 216, 65, 0, 0, 48, 65, 0, 0, 28, 66, 0, 0, 48, 65, 0, 0, 32, 66, 0, 0, 48, 65, 0, 0, 36, 66, 0, 0, 48, 65, 0, 0, 40, 66, 0, 0, 48, 65, 0, 0, 44, 66, 0, 0, 48, 65, 0, 0, 48, 66, 0, 0, 64, 65, 0, 0, 160, 65, 0, 0, 64, 65, 0, 0, 168, 65, 0, 0, 64, 65, 0, 0, 192, 65, 0, 0, 64, 65, 0, 0, 200, 65, 0, 0, 64, 65, 0, 0, 208, 65, 0, 0, 64, 65, 0, 0, 16, 66, 0, 0, 64, 65, 0, 0, 20, 66, 0, 0, 64, 65, 0, 0, 24, 66, 0, 0, 64, 65, 0, 0, 28, 66, 0, 0, 64, 65, 0, 0, 32, 66, 0, 0, 64, 65, 0, 0, 36, 66, 0, 0, 64, 65, 0, 0, 40, 66, 0, 0, 64, 65, 0, 0, 44, 66, 0, 0, 64, 65, 0, 0, 48, 66, 0, 0, 64, 65, 0, 0, 52, 66, 0, 0, 80, 65, 0, 0, 152, 65, 0, 0, 80, 65, 0, 0, 160, 65, 0, 0, 80, 65, 0, 0, 168, 65, 0, 0, 80, 65, 0, 0, 192, 65, 0, 0, 80, 65, 0, 0, 200, 65, 0, 0, 80, 65, 0, 0, 208, 65, 0, 0, 80, 65, 0, 0, 8, 66, 0, 0, 80, 65, 0, 0, 12, 66, 0, 0, 80, 65, 0, 0, 16, 66, 0, 0, 80, 65, 0, 0, 20, 66, 0, 0, 80, 65, 0, 0, 24, 66, 0, 0, 80, 65, 0, 0, 28, 66, 0, 0, 80, 65, 0, 0, 32, 66, 0, 0, 80, 65, 0, 0, 36, 66, 0, 0, 80, 65, 0, 0, 40, 66, 0, 0, 80, 65, 0, 0, 44, 66, 0, 0, 96, 65, 0, 0, 144, 65, 0, 0, 96, 65, 0, 0, 152, 65, 0, 0, 96, 65, 0, 0, 160, 65, 0, 0, 96, 65, 0, 0, 184, 65, 0, 0, 96, 65, 0, 0, 192, 65, 0, 0, 96, 65, 0, 0, 200, 65, 0, 0, 96, 65, 0, 0, 248, 65, 0, 0, 96, 65, 0, 0, 0, 66, 0, 0, 96, 65, 0, 0, 4, 66, 0, 0, 96, 65, 0, 0, 8, 66, 0, 0, 96, 65, 0, 0, 12, 66, 0, 0, 96, 65, 0, 0, 16, 66, 0, 0, 96, 65, 0, 0, 20, 66, 0, 0, 96, 65, 0, 0, 24, 66, 0, 0, 96, 65, 0, 0, 28, 66, 0, 0, 96, 65, 0, 0, 32, 66, 0, 0, 96, 65, 0, 0, 36, 66, 0, 0, 112, 65, 0, 0, 136, 65, 0, 0, 112, 65, 0, 0, 144, 65, 0, 0, 112, 65, 0, 0, 152, 65, 0, 0, 112, 65, 0, 0, 160, 65, 0, 0, 112, 65, 0, 0, 184, 65, 0, 0, 112, 65, 0, 0, 192, 65, 0, 0, 112, 65, 0, 0, 200, 65, 0, 0, 112, 65, 0, 0, 240, 65, 0, 0, 112, 65, 0, 0, 248, 65, 0, 0, 112, 65, 0, 0, 0, 66, 0, 0, 112, 65, 0, 0, 4, 66, 0, 0, 112, 65, 0, 0, 8, 66, 0, 0, 112, 65, 0, 0, 12, 66, 0, 0, 112, 65, 0, 0, 16, 66, 0, 0, 112, 65, 0, 0, 20, 66, 0, 0, 112, 65, 0, 0, 24, 66, 0, 0, 128, 65, 0, 0, 136, 65, 0, 0, 128, 65, 0, 0, 144, 65, 0, 0, 128, 65, 0, 0, 152, 65, 0, 0, 128, 65, 0, 0, 160, 65, 0, 0, 128, 65, 0, 0, 184, 65, 0, 0, 128, 65, 0, 0, 192, 65, 0, 0, 128, 65, 0, 0, 224, 65, 0, 0, 128, 65, 0, 0, 232, 65, 0, 0, 128, 65, 0, 0, 240, 65, 0, 0, 128, 65, 0, 0, 248, 65, 0, 0, 128, 65, 0, 0, 0, 66, 0, 0, 128, 65, 0, 0, 4, 66, 0, 0, 128, 65, 0, 0, 8, 66, 0, 0, 128, 65, 0, 0, 12, 66, 0, 0, 128, 65, 0, 0, 16, 66, 0, 0, 136, 65, 0, 0, 136, 65, 0, 0, 136, 65, 0, 0, 144, 65, 0, 0, 136, 65, 0, 0, 152, 65, 0, 0, 136, 65, 0, 0, 160, 65, 0, 0, 136, 65, 0, 0, 184, 65, 0, 0, 136, 65, 0, 0, 192, 65, 0, 0, 136, 65, 0, 0, 224, 65, 0, 0, 136, 65, 0, 0, 232, 65, 0, 0, 136, 65, 0, 0, 240, 65, 0, 0, 136, 65, 0, 0, 248, 65, 0, 0, 136, 65, 0, 0, 0, 66, 0, 0, 136, 65, 0, 0, 4, 66, 0, 0, 136, 65, 0, 0, 8, 66, 0, 0, 136, 65, 0, 0, 12, 66, 0, 0, 144, 65, 0, 0, 144, 65, 0, 0, 144, 65, 0, 0, 152, 65, 0, 0, 144, 65, 0, 0, 160, 65, 0, 0, 144, 65, 0, 0, 168, 65, 0, 0, 144, 65, 0, 0, 184, 65, 0, 0, 144, 65, 0, 0, 192, 65, 0, 0, 144, 65, 0, 0, 216, 65, 0, 0, 144, 65, 0, 0, 224, 65, 0, 0, 144, 65, 0, 0, 232, 65, 0, 0, 144, 65, 0, 0, 240, 65, 0, 0, 144, 65, 0, 0, 248, 65, 0, 0, 144, 65, 0, 0, 0, 66, 0, 0, 144, 65, 0, 0, 4, 66, 0, 0, 144, 65, 0, 0, 8, 66, 0, 0, 144, 65, 0, 0, 12, 66, 0, 0, 144, 65, 0, 0, 16, 66, 0, 0, 144, 65, 0, 0, 20, 66, 0, 0, 144, 65, 0, 0, 24, 66, 0, 0, 144, 65, 0, 0, 28, 66, 0, 0, 152, 65, 0, 0, 152, 65, 0, 0, 152, 65, 0, 0, 160, 65, 0, 0, 152, 65, 0, 0, 168, 65, 0, 0, 152, 65, 0, 0, 176, 65, 0, 0, 152, 65, 0, 0, 184, 65, 0, 0, 152, 65, 0, 0, 192, 65, 0, 0, 152, 65, 0, 0, 208, 65, 0, 0, 152, 65, 0, 0, 216, 65, 0, 0, 152, 65, 0, 0, 224, 65, 0, 0, 152, 65, 0, 0, 232, 65, 0, 0, 152, 65, 0, 0, 240, 65, 0, 0, 152, 65, 0, 0, 248, 65, 0, 0, 152, 65, 0, 0, 0, 66, 0, 0, 152, 65, 0, 0, 4, 66, 0, 0, 152, 65, 0, 0, 8, 66, 0, 0, 152, 65, 0, 0, 12, 66, 0, 0, 152, 65, 0, 0, 16, 66, 0, 0, 160, 65, 0, 0, 160, 65, 0, 0, 160, 65, 0, 0, 168, 65, 0, 0, 160, 65, 0, 0, 176, 65, 0, 0, 160, 65, 0, 0, 184, 65, 0, 0, 160, 65, 0, 0, 192, 65, 0, 0, 160, 65, 0, 0, 200, 65, 0, 0, 160, 65, 0, 0, 208, 65, 0, 0, 160, 65, 0, 0, 216, 65, 0, 0, 160, 65, 0, 0, 224, 65, 0, 0, 160, 65, 0, 0, 232, 65, 0, 0, 160, 65, 0, 0, 240, 65, 0, 0, 160, 65, 0, 0, 248, 65, 0, 0, 160, 65, 0, 0, 0, 66, 0, 0, 160, 65, 0, 0, 4, 66, 0, 0, 168, 65, 0, 0, 176, 65, 0, 0, 168, 65, 0, 0, 184, 65, 0, 0, 168, 65, 0, 0, 192, 65, 0, 0, 168, 65, 0, 0, 200, 65, 0, 0, 168, 65, 0, 0, 208, 65, 0, 0, 168, 65, 0, 0, 216, 65, 0, 0, 168, 65, 0, 0, 224, 65, 0, 0, 168, 65, 0, 0, 232, 65, 0, 0, 168, 65, 0, 0, 240, 65, 0, 0, 168, 65, 0, 0, 248, 65, 0, 0, 168, 65, 0, 0, 0, 66, 0, 0, 168, 65, 0, 0, 4, 66, 0, 0, 168, 65, 0, 0, 8, 66, 0, 0, 168, 65, 0, 0, 12, 66, 0, 0, 168, 65, 0, 0, 16, 66, 0, 0, 168, 65, 0, 0, 20, 66, 0, 0, 168, 65, 0, 0, 24, 66, 0, 0, 168, 65, 0, 0, 28, 66, 0, 0, 168, 65, 0, 0, 32, 66, 0, 0, 168, 65, 0, 0, 36, 66, 0, 0, 168, 65, 0, 0, 40, 66, 0, 0, 168, 65, 0, 0, 44, 66, 0, 0, 168, 65, 0, 0, 48, 66, 0, 0, 168, 65, 0, 0, 52, 66, 0, 0, 168, 65, 0, 0, 56, 66, 0, 0, 168, 65, 0, 0, 60, 66, 0, 0, 176, 65, 0, 0, 184, 65, 0, 0, 176, 65, 0, 0, 192, 65, 0, 0, 176, 65, 0, 0, 200, 65, 0, 0, 176, 65, 0, 0, 208, 65, 0, 0, 176, 65, 0, 0, 216, 65, 0, 0, 176, 65, 0, 0, 224, 65, 0, 0, 176, 65, 0, 0, 232, 65, 0, 0, 176, 65, 0, 0, 240, 65, 0, 0, 176, 65, 0, 0, 248, 65, 0, 0, 176, 65, 0, 0, 0, 66, 0, 0, 176, 65, 0, 0, 4, 66, 0, 0, 176, 65, 0, 0, 8, 66, 0, 0, 176, 65, 0, 0, 12, 66, 0, 0, 176, 65, 0, 0, 16, 66, 0, 0, 176, 65, 0, 0, 20, 66, 0, 0, 176, 65, 0, 0, 24, 66, 0, 0, 176, 65, 0, 0, 28, 66, 0, 0, 176, 65, 0, 0, 32, 66, 0, 0, 176, 65, 0, 0, 36, 66, 0, 0, 176, 65, 0, 0, 40, 66, 0, 0, 176, 65, 0, 0, 44, 66, 0, 0, 176, 65, 0, 0, 48, 66, 0, 0, 176, 65, 0, 0, 52, 66, 0, 0, 176, 65, 0, 0, 56, 66, 0, 0, 176, 65, 0, 0, 60, 66, 0, 0, 176, 65, 0, 0, 64, 66, 0, 0, 176, 65, 0, 0, 68, 66, 0, 0, 176, 65, 0, 0, 72, 66, 0, 0, 176, 65, 0, 0, 76, 66, 0, 0, 184, 65, 0, 0, 184, 65, 0, 0, 184, 65, 0, 0, 192, 65, 0, 0, 184, 65, 0, 0, 200, 65, 0, 0, 184, 65, 0, 0, 208, 65, 0, 0, 184, 65, 0, 0, 216, 65, 0, 0, 184, 65, 0, 0, 224, 65, 0, 0, 184, 65, 0, 0, 232, 65, 0, 0, 184, 65, 0, 0, 240, 65, 0, 0, 184, 65, 0, 0, 248, 65, 0, 0, 184, 65, 0, 0, 0, 66, 0, 0, 184, 65, 0, 0, 4, 66, 0, 0, 184, 65, 0, 0, 8, 66, 0, 0, 184, 65, 0, 0, 12, 66, 0, 0, 184, 65, 0, 0, 16, 66, 0, 0, 184, 65, 0, 0, 20, 66, 0, 0, 184, 65, 0, 0, 24, 66, 0, 0, 184, 65, 0, 0, 28, 66, 0, 0, 184, 65, 0, 0, 32, 66, 0, 0, 184, 65, 0, 0, 36, 66, 0, 0, 184, 65, 0, 0, 40, 66, 0, 0, 184, 65, 0, 0, 44, 66, 0, 0, 184, 65, 0, 0, 48, 66, 0, 0, 192, 65, 0, 0, 192, 65, 0, 0, 192, 65, 0, 0, 200, 65, 0, 0, 192, 65, 0, 0, 208, 65, 0, 0, 192, 65, 0, 0, 216, 65, 0, 0, 192, 65, 0, 0, 224, 65, 0, 0, 192, 65, 0, 0, 232, 65, 0, 0, 192, 65, 0, 0, 240, 65, 0, 0, 192, 65, 0, 0, 248, 65, 0, 0, 192, 65, 0, 0, 0, 66, 0, 0, 192, 65, 0, 0, 4, 66, 0, 0, 192, 65, 0, 0, 8, 66, 0, 0, 192, 65, 0, 0, 12, 66, 0, 0, 192, 65, 0, 0, 16, 66, 0, 0, 192, 65, 0, 0, 20, 66, 0, 0, 192, 65, 0, 0, 24, 66, 0, 0, 192, 65, 0, 0, 28, 66, 0, 0, 192, 65, 0, 0, 32, 66, 0, 0, 192, 65, 0, 0, 36, 66, 0, 0, 192, 65, 0, 0, 40, 66, 0, 0, 192, 65, 0, 0, 44, 66, 0, 0, 192, 65, 0, 0, 48, 66, 0, 0, 200, 65, 0, 0, 192, 65, 0, 0, 200, 65, 0, 0, 200, 65, 0, 0, 200, 65, 0, 0, 208, 65, 0, 0, 200, 65, 0, 0, 216, 65, 0, 0, 200, 65, 0, 0, 224, 65, 0, 0, 200, 65, 0, 0, 232, 65, 0, 0, 200, 65, 0, 0, 240, 65, 0, 0, 200, 65, 0, 0, 248, 65, 0, 0, 200, 65, 0, 0, 0, 66, 0, 0, 200, 65, 0, 0, 4, 66, 0, 0, 200, 65, 0, 0, 8, 66, 0, 0, 200, 65, 0, 0, 12, 66, 0, 0, 200, 65, 0, 0, 16, 66, 0, 0, 200, 65, 0, 0, 20, 66, 0, 0, 200, 65, 0, 0, 24, 66, 0, 0, 200, 65, 0, 0, 28, 66, 0, 0, 200, 65, 0, 0, 32, 66, 0, 0, 200, 65, 0, 0, 36, 66, 0, 0, 200, 65, 0, 0, 40, 66, 0, 0, 200, 65, 0, 0, 44, 66, 0, 0, 200, 65, 0, 0, 48, 66, 0, 0, 200, 65, 0, 0, 52, 66, 0, 0, 200, 65, 0, 0, 56, 66, 0, 0, 200, 65, 0, 0, 60, 66, 0, 0, 208, 65, 0, 0, 192, 65, 0, 0, 208, 65, 0, 0, 200, 65, 0, 0, 208, 65, 0, 0, 208, 65, 0, 0, 208, 65, 0, 0, 216, 65, 0, 0, 208, 65, 0, 0, 224, 65, 0, 0, 208, 65, 0, 0, 232, 65, 0, 0, 208, 65, 0, 0, 240, 65, 0, 0, 208, 65, 0, 0, 248, 65, 0, 0, 208, 65, 0, 0, 0, 66, 0, 0, 208, 65, 0, 0, 4, 66, 0, 0, 208, 65, 0, 0, 8, 66, 0, 0, 208, 65, 0, 0, 12, 66, 0, 0, 208, 65, 0, 0, 16, 66, 0, 0, 208, 65, 0, 0, 20, 66, 0, 0, 208, 65, 0, 0, 24, 66, 0, 0, 208, 65, 0, 0, 28, 66, 0, 0, 208, 65, 0, 0, 32, 66, 0, 0, 208, 65, 0, 0, 36, 66, 0, 0, 208, 65, 0, 0, 40, 66, 0, 0, 208, 65, 0, 0, 44, 66, 0, 0, 208, 65, 0, 0, 48, 66, 0, 0, 208, 65, 0, 0, 52, 66, 0, 0, 208, 65, 0, 0, 56, 66, 0, 0, 208, 65, 0, 0, 60, 66, 0, 0, 208, 65, 0, 0, 64, 66, 0, 0, 208, 65, 0, 0, 68, 66, 0, 0, 208, 65, 0, 0, 72, 66, 0, 0, 208, 65, 0, 0, 76, 66, 0, 0, 208, 65, 0, 0, 80, 66, 0, 0, 216, 65, 0, 0, 216, 65, 0, 0, 216, 65, 0, 0, 224, 65, 0, 0, 216, 65, 0, 0, 232, 65, 0, 0, 216, 65, 0, 0, 240, 65, 0, 0, 216, 65, 0, 0, 248, 65, 0, 0, 216, 65, 0, 0, 0, 66, 0, 0, 216, 65, 0, 0, 4, 66, 0, 0, 216, 65, 0, 0, 8, 66, 0, 0, 216, 65, 0, 0, 12, 66, 0, 0, 216, 65, 0, 0, 16, 66, 0, 0, 216, 65, 0, 0, 20, 66, 0, 0, 216, 65, 0, 0, 24, 66, 0, 0, 216, 65, 0, 0, 28, 66, 0, 0, 216, 65, 0, 0, 32, 66, 0, 0, 216, 65, 0, 0, 36, 66, 0, 0, 216, 65, 0, 0, 40, 66, 0, 0, 216, 65, 0, 0, 44, 66, 0, 0, 216, 65, 0, 0, 48, 66, 0, 0, 216, 65, 0, 0, 52, 66, 0, 0, 216, 65, 0, 0, 56, 66, 0, 0, 216, 65, 0, 0, 60, 66, 0, 0, 216, 65, 0, 0, 64, 66, 0, 0, 216, 65, 0, 0, 68, 66, 0, 0, 216, 65, 0, 0, 72, 66, 0, 0, 216, 65, 0, 0, 76, 66, 0, 0, 216, 65, 0, 0, 80, 66, 0, 0, 216, 65, 0, 0, 84, 66, 0, 0, 216, 65, 0, 0, 88, 66, 0, 0, 216, 65, 0, 0, 92, 66, 0, 0, 216, 65, 0, 0, 96, 66, 0, 0, 216, 65, 0, 0, 100, 66, 0, 0, 224, 65, 0, 0, 232, 65, 0, 0, 224, 65, 0, 0, 240, 65, 0, 0, 224, 65, 0, 0, 248, 65, 0, 0, 224, 65, 0, 0, 0, 66, 0, 0, 224, 65, 0, 0, 4, 66, 0, 0, 224, 65, 0, 0, 8, 66, 0, 0, 224, 65, 0, 0, 12, 66, 0, 0, 224, 65, 0, 0, 16, 66, 0, 0, 224, 65, 0, 0, 20, 66, 0, 0, 224, 65, 0, 0, 24, 66, 0, 0, 224, 65, 0, 0, 28, 66, 0, 0, 224, 65, 0, 0, 32, 66, 0, 0, 224, 65, 0, 0, 36, 66, 0, 0, 224, 65, 0, 0, 40, 66, 0, 0, 224, 65, 0, 0, 44, 66, 0, 0, 224, 65, 0, 0, 48, 66, 0, 0, 224, 65, 0, 0, 52, 66, 0, 0, 224, 65, 0, 0, 56, 66, 0, 0, 224, 65, 0, 0, 60, 66, 0, 0, 224, 65, 0, 0, 64, 66, 0, 0, 224, 65, 0, 0, 68, 66, 0, 0, 224, 65, 0, 0, 72, 66, 0, 0, 224, 65, 0, 0, 76, 66, 0, 0, 224, 65, 0, 0, 80, 66, 0, 0, 224, 65, 0, 0, 84, 66, 0, 0, 224, 65, 0, 0, 88, 66, 0, 0, 224, 65, 0, 0, 92, 66, 0, 0, 224, 65, 0, 0, 96, 66, 0, 0, 224, 65, 0, 0, 100, 66, 0, 0, 224, 65, 0, 0, 104, 66, 0, 0, 232, 65, 0, 0, 240, 65, 0, 0, 232, 65, 0, 0, 248, 65, 0, 0, 232, 65, 0, 0, 0, 66, 0, 0, 232, 65, 0, 0, 4, 66, 0, 0, 232, 65, 0, 0, 8, 66, 0, 0, 232, 65, 0, 0, 12, 66, 0, 0, 232, 65, 0, 0, 16, 66, 0, 0, 232, 65, 0, 0, 20, 66, 0, 0, 232, 65, 0, 0, 24, 66, 0, 0, 232, 65, 0, 0, 28, 66, 0, 0, 232, 65, 0, 0, 32, 66, 0, 0, 232, 65, 0, 0, 36, 66, 0, 0, 232, 65, 0, 0, 40, 66, 0, 0, 232, 65, 0, 0, 44, 66, 0, 0, 232, 65, 0, 0, 48, 66, 0, 0, 232, 65, 0, 0, 52, 66, 0, 0, 232, 65, 0, 0, 56, 66, 0, 0, 232, 65, 0, 0, 60, 66, 0, 0, 232, 65, 0, 0, 64, 66, 0, 0, 232, 65, 0, 0, 68, 66, 0, 0, 232, 65, 0, 0, 72, 66, 0, 0, 232, 65, 0, 0, 76, 66, 0, 0, 232, 65, 0, 0, 80, 66, 0, 0, 232, 65, 0, 0, 84, 66, 0, 0, 232, 65, 0, 0, 88, 66, 0, 0, 232, 65, 0, 0, 92, 66, 0, 0, 232, 65, 0, 0, 96, 66, 0, 0, 232, 65, 0, 0, 100, 66, 0, 0, 240, 65, 0, 0, 248, 65, 0, 0, 240, 65, 0, 0, 0, 66, 0, 0, 240, 65, 0, 0, 4, 66, 0, 0, 240, 65, 0, 0, 8, 66, 0, 0, 240, 65, 0, 0, 12, 66, 0, 0, 240, 65, 0, 0, 16, 66, 0, 0, 240, 65, 0, 0, 20, 66, 0, 0, 240, 65, 0, 0, 24, 66, 0, 0, 240, 65, 0, 0, 28, 66, 0, 0, 240, 65, 0, 0, 32, 66, 0, 0, 240, 65, 0, 0, 36, 66, 0, 0, 240, 65, 0, 0, 40, 66, 0, 0, 240, 65, 0, 0, 44, 66, 0, 0, 240, 65, 0, 0, 48, 66, 0, 0, 240, 65, 0, 0, 52, 66, 0, 0, 240, 65, 0, 0, 56, 66, 0, 0, 240, 65, 0, 0, 60, 66, 0, 0, 240, 65, 0, 0, 64, 66, 0, 0, 240, 65, 0, 0, 68, 66, 0, 0, 240, 65, 0, 0, 72, 66, 0, 0, 240, 65, 0, 0, 76, 66, 0, 0, 240, 65, 0, 0, 80, 66, 0, 0, 248, 65, 0, 0, 248, 65, 0, 0, 248, 65, 0, 0, 0, 66, 0, 0, 248, 65, 0, 0, 4, 66, 0, 0, 248, 65, 0, 0, 8, 66, 0, 0, 248, 65, 0, 0, 12, 66, 0, 0, 248, 65, 0, 0, 16, 66, 0, 0, 248, 65, 0, 0, 20, 66, 0, 0, 248, 65, 0, 0, 24, 66, 0, 0, 248, 65, 0, 0, 28, 66, 0, 0, 248, 65, 0, 0, 32, 66, 0, 0, 248, 65, 0, 0, 36, 66, 0, 0, 248, 65, 0, 0, 40, 66, 0, 0, 248, 65, 0, 0, 44, 66, 0, 0, 248, 65, 0, 0, 48, 66, 0, 0, 248, 65, 0, 0, 52, 66, 0, 0, 248, 65, 0, 0, 56, 66, 0, 0, 248, 65, 0, 0, 60, 66, 0, 0, 248, 65, 0, 0, 64, 66, 0, 0, 248, 65, 0, 0, 68, 66, 0, 0, 248, 65, 0, 0, 72, 66, 0, 0, 0, 66, 0, 0, 248, 65, 0, 0, 0, 66, 0, 0, 0, 66, 0, 0, 0, 66, 0, 0, 4, 66, 0, 0, 0, 66, 0, 0, 8, 66, 0, 0, 0, 66, 0, 0, 12, 66, 0, 0, 0, 66, 0, 0, 16, 66, 0, 0, 0, 66, 0, 0, 20, 66, 0, 0, 0, 66, 0, 0, 24, 66, 0, 0, 0, 66, 0, 0, 28, 66, 0, 0, 0, 66, 0, 0, 32, 66, 0, 0, 0, 66, 0, 0, 36, 66, 0, 0, 0, 66, 0, 0, 40, 66, 0, 0, 0, 66, 0, 0, 44, 66, 0, 0, 0, 66, 0, 0, 48, 66, 0, 0, 0, 66, 0, 0, 52, 66, 0, 0, 0, 66, 0, 0, 56, 66, 0, 0, 0, 66, 0, 0, 60, 66, 0, 0, 0, 66, 0, 0, 64, 66, 0, 0, 0, 66, 0, 0, 68, 66, 0, 0, 4, 66, 0, 0, 240, 65, 0, 0, 4, 66, 0, 0, 248, 65, 0, 0, 4, 66, 0, 0, 0, 66, 0, 0, 4, 66, 0, 0, 4, 66, 0, 0, 4, 66, 0, 0, 8, 66, 0, 0, 4, 66, 0, 0, 12, 66, 0, 0, 4, 66, 0, 0, 16, 66, 0, 0, 4, 66, 0, 0, 20, 66, 0, 0, 4, 66, 0, 0, 24, 66, 0, 0, 4, 66, 0, 0, 28, 66, 0, 0, 4, 66, 0, 0, 32, 66, 0, 0, 4, 66, 0, 0, 36, 66, 0, 0, 4, 66, 0, 0, 40, 66, 0, 0, 4, 66, 0, 0, 44, 66, 0, 0, 4, 66, 0, 0, 48, 66, 0, 0, 4, 66, 0, 0, 52, 66, 0, 0, 4, 66, 0, 0, 56, 66, 0, 0, 4, 66, 0, 0, 60, 66, 0, 0, 4, 66, 0, 0, 64, 66, 0, 0, 4, 66, 0, 0, 68, 66, 0, 0, 4, 66, 0, 0, 72, 66, 0, 0, 8, 66, 0, 0, 232, 65, 0, 0, 8, 66, 0, 0, 240, 65, 0, 0, 8, 66, 0, 0, 248, 65, 0, 0, 8, 66, 0, 0, 0, 66, 0, 0, 8, 66, 0, 0, 4, 66, 0, 0, 8, 66, 0, 0, 8, 66, 0, 0, 8, 66, 0, 0, 12, 66, 0, 0, 8, 66, 0, 0, 16, 66, 0, 0, 8, 66, 0, 0, 20, 66, 0, 0, 8, 66, 0, 0, 24, 66, 0, 0, 8, 66, 0, 0, 28, 66, 0, 0, 8, 66, 0, 0, 32, 66, 0, 0, 8, 66, 0, 0, 36, 66, 0, 0, 8, 66, 0, 0, 40, 66, 0, 0, 8, 66, 0, 0, 44, 66, 0, 0, 8, 66, 0, 0, 48, 66, 0, 0, 8, 66, 0, 0, 52, 66, 0, 0, 8, 66, 0, 0, 56, 66, 0, 0, 8, 66, 0, 0, 60, 66, 0, 0, 8, 66, 0, 0, 64, 66, 0, 0, 8, 66, 0, 0, 68, 66, 0, 0, 8, 66, 0, 0, 72, 66, 0, 0, 8, 66, 0, 0, 76, 66, 0, 0, 8, 66, 0, 0, 80, 66, 0, 0, 8, 66, 0, 0, 84, 66, 0, 0, 8, 66, 0, 0, 88, 66, 0, 0, 12, 66, 0, 0, 216, 65, 0, 0, 12, 66, 0, 0, 224, 65, 0, 0, 12, 66, 0, 0, 232, 65, 0, 0, 12, 66, 0, 0, 240, 65, 0, 0, 12, 66, 0, 0, 248, 65, 0, 0, 12, 66, 0, 0, 0, 66, 0, 0, 12, 66, 0, 0, 4, 66, 0, 0, 12, 66, 0, 0, 8, 66, 0, 0, 12, 66, 0, 0, 12, 66, 0, 0, 12, 66, 0, 0, 16, 66, 0, 0, 12, 66, 0, 0, 20, 66, 0, 0, 12, 66, 0, 0, 24, 66, 0, 0, 12, 66, 0, 0, 28, 66, 0, 0, 12, 66, 0, 0, 32, 66, 0, 0, 12, 66, 0, 0, 36, 66, 0, 0, 12, 66, 0, 0, 40, 66, 0, 0, 12, 66, 0, 0, 44, 66, 0, 0, 12, 66, 0, 0, 48, 66, 0, 0, 12, 66, 0, 0, 52, 66, 0, 0, 12, 66, 0, 0, 56, 66, 0, 0, 12, 66, 0, 0, 60, 66, 0, 0, 12, 66, 0, 0, 64, 66, 0, 0, 12, 66, 0, 0, 68, 66, 0, 0, 12, 66, 0, 0, 72, 66, 0, 0, 12, 66, 0, 0, 76, 66, 0, 0, 12, 66, 0, 0, 80, 66, 0, 0, 12, 66, 0, 0, 84, 66, 0, 0, 12, 66, 0, 0, 88, 66, 0, 0, 12, 66, 0, 0, 92, 66, 0, 0, 12, 66, 0, 0, 96, 66, 0, 0, 12, 66, 0, 0, 100, 66, 0, 0, 12, 66, 0, 0, 104, 66, 0, 0, 16, 66, 0, 0, 192, 65, 0, 0, 16, 66, 0, 0, 200, 65, 0, 0, 16, 66, 0, 0, 208, 65, 0, 0, 16, 66, 0, 0, 216, 65, 0, 0, 16, 66, 0, 0, 224, 65, 0, 0, 16, 66, 0, 0, 232, 65, 0, 0, 16, 66, 0, 0, 240, 65, 0, 0, 16, 66, 0, 0, 248, 65, 0, 0, 16, 66, 0, 0, 0, 66, 0, 0, 16, 66, 0, 0, 4, 66, 0, 0, 16, 66, 0, 0, 8, 66, 0, 0, 16, 66, 0, 0, 12, 66, 0, 0, 16, 66, 0, 0, 16, 66, 0, 0, 16, 66, 0, 0, 20, 66, 0, 0, 16, 66, 0, 0, 24, 66, 0, 0, 16, 66, 0, 0, 28, 66, 0, 0, 16, 66, 0, 0, 32, 66, 0, 0, 16, 66, 0, 0, 36, 66, 0, 0, 16, 66, 0, 0, 40, 66, 0, 0, 16, 66, 0, 0, 44, 66, 0, 0, 16, 66, 0, 0, 48, 66, 0, 0, 16, 66, 0, 0, 52, 66, 0, 0, 16, 66, 0, 0, 56, 66, 0, 0, 16, 66, 0, 0, 60, 66, 0, 0, 16, 66, 0, 0, 64, 66, 0, 0, 16, 66, 0, 0, 68, 66, 0, 0, 16, 66, 0, 0, 72, 66, 0, 0, 16, 66, 0, 0, 76, 66, 0, 0, 16, 66, 0, 0, 80, 66, 0, 0, 16, 66, 0, 0, 84, 66, 0, 0, 16, 66, 0, 0, 88, 66, 0, 0, 16, 66, 0, 0, 92, 66, 0, 0, 16, 66, 0, 0, 96, 66, 0, 0, 16, 66, 0, 0, 100, 66, 0, 0, 16, 66, 0, 0, 104, 66, 0, 0, 16, 66, 0, 0, 108, 66, 0, 0, 20, 66, 0, 0, 192, 65, 0, 0, 20, 66, 0, 0, 200, 65, 0, 0, 20, 66, 0, 0, 208, 65, 0, 0, 20, 66, 0, 0, 216, 65, 0, 0, 20, 66, 0, 0, 224, 65, 0, 0, 20, 66, 0, 0, 232, 65, 0, 0, 20, 66, 0, 0, 240, 65, 0, 0, 20, 66, 0, 0, 248, 65, 0, 0, 20, 66, 0, 0, 0, 66, 0, 0, 20, 66, 0, 0, 4, 66, 0, 0, 20, 66, 0, 0, 8, 66, 0, 0, 20, 66, 0, 0, 12, 66, 0, 0, 20, 66, 0, 0, 16, 66, 0, 0, 20, 66, 0, 0, 20, 66, 0, 0, 20, 66, 0, 0, 24, 66, 0, 0, 20, 66, 0, 0, 28, 66, 0, 0, 20, 66, 0, 0, 32, 66, 0, 0, 20, 66, 0, 0, 36, 66, 0, 0, 20, 66, 0, 0, 40, 66, 0, 0, 20, 66, 0, 0, 44, 66, 0, 0, 20, 66, 0, 0, 48, 66, 0, 0, 20, 66, 0, 0, 52, 66, 0, 0, 20, 66, 0, 0, 56, 66, 0, 0, 20, 66, 0, 0, 60, 66, 0, 0, 20, 66, 0, 0, 64, 66, 0, 0, 20, 66, 0, 0, 68, 66, 0, 0, 20, 66, 0, 0, 72, 66, 0, 0, 20, 66, 0, 0, 76, 66, 0, 0, 20, 66, 0, 0, 80, 66, 0, 0, 20, 66, 0, 0, 84, 66, 0, 0, 20, 66, 0, 0, 88, 66, 0, 0, 20, 66, 0, 0, 92, 66, 0, 0, 20, 66, 0, 0, 96, 66, 0, 0, 20, 66, 0, 0, 100, 66, 0, 0, 20, 66, 0, 0, 104, 66, 0, 0, 20, 66, 0, 0, 108, 66, 0, 0, 20, 66, 0, 0, 112, 66, 0, 0, 20, 66, 0, 0, 116, 66, 0, 0, 24, 66, 0, 0, 184, 65, 0, 0, 24, 66, 0, 0, 192, 65, 0, 0, 24, 66, 0, 0, 200, 65, 0, 0, 24, 66, 0, 0, 208, 65, 0, 0, 24, 66, 0, 0, 216, 65, 0, 0, 24, 66, 0, 0, 224, 65, 0, 0, 24, 66, 0, 0, 232, 65, 0, 0, 24, 66, 0, 0, 240, 65, 0, 0, 24, 66, 0, 0, 248, 65, 0, 0, 24, 66, 0, 0, 0, 66, 0, 0, 24, 66, 0, 0, 4, 66, 0, 0, 24, 66, 0, 0, 8, 66, 0, 0, 24, 66, 0, 0, 12, 66, 0, 0, 24, 66, 0, 0, 16, 66, 0, 0, 24, 66, 0, 0, 20, 66, 0, 0, 24, 66, 0, 0, 24, 66, 0, 0, 24, 66, 0, 0, 28, 66, 0, 0, 24, 66, 0, 0, 32, 66, 0, 0, 24, 66, 0, 0, 36, 66, 0, 0, 24, 66, 0, 0, 40, 66, 0, 0, 24, 66, 0, 0, 44, 66, 0, 0, 24, 66, 0, 0, 48, 66, 0, 0, 24, 66, 0, 0, 52, 66, 0, 0, 24, 66, 0, 0, 56, 66, 0, 0, 24, 66, 0, 0, 60, 66, 0, 0, 24, 66, 0, 0, 64, 66, 0, 0, 28, 66, 0, 0, 184, 65, 0, 0, 28, 66, 0, 0, 192, 65, 0, 0, 28, 66, 0, 0, 200, 65, 0, 0, 28, 66, 0, 0, 208, 65, 0, 0, 28, 66, 0, 0, 216, 65, 0, 0, 28, 66, 0, 0, 224, 65, 0, 0, 28, 66, 0, 0, 232, 65, 0, 0, 28, 66, 0, 0, 240, 65, 0, 0, 28, 66, 0, 0, 248, 65, 0, 0, 28, 66, 0, 0, 0, 66, 0, 0, 28, 66, 0, 0, 4, 66, 0, 0, 28, 66, 0, 0, 8, 66, 0, 0, 28, 66, 0, 0, 12, 66, 0, 0, 28, 66, 0, 0, 16, 66, 0, 0, 28, 66, 0, 0, 20, 66, 0, 0, 28, 66, 0, 0, 24, 66, 0, 0, 28, 66, 0, 0, 28, 66, 0, 0, 28, 66, 0, 0, 32, 66, 0, 0, 28, 66, 0, 0, 36, 66, 0, 0, 28, 66, 0, 0, 40, 66, 0, 0, 28, 66, 0, 0, 44, 66, 0, 0, 28, 66, 0, 0, 48, 66, 0, 0, 28, 66, 0, 0, 52, 66, 0, 0, 32, 66, 0, 0, 184, 65, 0, 0, 32, 66, 0, 0, 192, 65, 0, 0, 32, 66, 0, 0, 200, 65, 0, 0, 32, 66, 0, 0, 208, 65, 0, 0, 32, 66, 0, 0, 216, 65, 0, 0, 32, 66, 0, 0, 224, 65, 0, 0, 32, 66, 0, 0, 232, 65, 0, 0, 32, 66, 0, 0, 240, 65, 0, 0, 32, 66, 0, 0, 248, 65, 0, 0, 32, 66, 0, 0, 0, 66, 0, 0, 32, 66, 0, 0, 4, 66, 0, 0, 32, 66, 0, 0, 8, 66, 0, 0, 32, 66, 0, 0, 12, 66, 0, 0, 32, 66, 0, 0, 16, 66, 0, 0, 32, 66, 0, 0, 20, 66, 0, 0, 32, 66, 0, 0, 24, 66, 0, 0, 32, 66, 0, 0, 28, 66, 0, 0, 32, 66, 0, 0, 32, 66, 0, 0, 32, 66, 0, 0, 36, 66, 0, 0, 32, 66, 0, 0, 40, 66, 0, 0, 32, 66, 0, 0, 44, 66, 0, 0, 32, 66, 0, 0, 48, 66, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0, 32, 66, 0, 0, 56, 66, 0, 0, 32, 66, 0, 0, 60, 66, 0, 0, 32, 66, 0, 0, 64, 66, 0, 0, 32, 66, 0, 0, 68, 66, 0, 0, 32, 66, 0, 0, 72, 66, 0, 0, 32, 66, 0, 0, 76, 66, 0, 0, 36, 66, 0, 0, 184, 65, 0, 0, 36, 66, 0, 0, 192, 65, 0, 0, 36, 66, 0, 0, 200, 65, 0, 0, 36, 66, 0, 0, 208, 65, 0, 0, 36, 66, 0, 0, 216, 65, 0, 0, 36, 66, 0, 0, 224, 65, 0, 0, 36, 66, 0, 0, 232, 65, 0, 0, 36, 66, 0, 0, 240, 65, 0, 0, 36, 66, 0, 0, 248, 65, 0, 0, 36, 66, 0, 0, 0, 66, 0, 0, 36, 66, 0, 0, 4, 66, 0, 0, 36, 66, 0, 0, 8, 66, 0, 0, 36, 66, 0, 0, 12, 66, 0, 0, 36, 66, 0, 0, 16, 66, 0, 0, 36, 66, 0, 0, 20, 66, 0, 0, 36, 66, 0, 0, 24, 66, 0, 0, 36, 66, 0, 0, 28, 66, 0, 0, 36, 66, 0, 0, 32, 66, 0, 0, 36, 66, 0, 0, 36, 66, 0, 0, 36, 66, 0, 0, 40, 66, 0, 0, 36, 66, 0, 0, 44, 66, 0, 0, 36, 66, 0, 0, 48, 66, 0, 0, 36, 66, 0, 0, 52, 66, 0, 0, 36, 66, 0, 0, 56, 66, 0, 0, 36, 66, 0, 0, 60, 66, 0, 0, 36, 66, 0, 0, 64, 66, 0, 0, 36, 66, 0, 0, 68, 66, 0, 0, 36, 66, 0, 0, 72, 66, 0, 0, 36, 66, 0, 0, 76, 66, 0, 0, 36, 66, 0, 0, 80, 66, 0, 0, 40, 66, 0, 0, 176, 65, 0, 0, 40, 66, 0, 0, 184, 65, 0, 0, 40, 66, 0, 0, 192, 65, 0, 0, 40, 66, 0, 0, 200, 65, 0, 0, 40, 66, 0, 0, 208, 65, 0, 0, 40, 66, 0, 0, 216, 65, 0, 0, 40, 66, 0, 0, 224, 65, 0, 0, 40, 66, 0, 0, 232, 65, 0, 0, 40, 66, 0, 0, 240, 65, 0, 0, 40, 66, 0, 0, 248, 65, 0, 0, 40, 66, 0, 0, 0, 66, 0, 0, 40, 66, 0, 0, 4, 66, 0, 0, 40, 66, 0, 0, 8, 66, 0, 0, 40, 66, 0, 0, 12, 66, 0, 0, 40, 66, 0, 0, 16, 66, 0, 0, 40, 66, 0, 0, 20, 66, 0, 0, 40, 66, 0, 0, 24, 66, 0, 0, 40, 66, 0, 0, 28, 66, 0, 0, 44, 66, 0, 0, 168, 65, 0, 0, 44, 66, 0, 0, 176, 65, 0, 0, 44, 66, 0, 0, 184, 65, 0, 0, 44, 66, 0, 0, 192, 65, 0, 0, 44, 66, 0, 0, 200, 65, 0, 0, 44, 66, 0, 0, 208, 65, 0, 0, 44, 66, 0, 0, 216, 65, 0, 0, 44, 66, 0, 0, 224, 65, 0, 0, 44, 66, 0, 0, 232, 65, 0, 0, 44, 66, 0, 0, 240, 65, 0, 0, 44, 66, 0, 0, 248, 65, 0, 0, 44, 66, 0, 0, 0, 66, 0, 0, 44, 66, 0, 0, 4, 66, 0, 0, 44, 66, 0, 0, 8, 66, 0, 0, 48, 66, 0, 0, 160, 65, 0, 0, 48, 66, 0, 0, 168, 65, 0, 0, 48, 66, 0, 0, 176, 65, 0, 0, 48, 66, 0, 0, 184, 65, 0, 0, 48, 66, 0, 0, 192, 65, 0, 0, 48, 66, 0, 0, 200, 65, 0, 0, 48, 66, 0, 0, 208, 65, 0, 0, 48, 66, 0, 0, 216, 65, 0, 0, 48, 66, 0, 0, 224, 65, 0, 0, 48, 66, 0, 0, 232, 65, 0, 0, 48, 66, 0, 0, 240, 65, 0, 0, 48, 66, 0, 0, 248, 65, 0, 0, 48, 66, 0, 0, 0, 66, 0, 0, 48, 66, 0, 0, 4, 66, 0, 0, 48, 66, 0, 0, 8, 66, 0, 0, 48, 66, 0, 0, 12, 66, 0, 0, 48, 66, 0, 0, 16, 66, 0, 0, 52, 66, 0, 0, 152, 65, 0, 0, 52, 66, 0, 0, 160, 65, 0, 0, 52, 66, 0, 0, 168, 65, 0, 0, 52, 66, 0, 0, 176, 65, 0, 0, 52, 66, 0, 0, 184, 65, 0, 0, 52, 66, 0, 0, 192, 65, 0, 0, 52, 66, 0, 0, 200, 65, 0, 0, 52, 66, 0, 0, 208, 65, 0, 0, 52, 66, 0, 0, 216, 65, 0, 0, 52, 66, 0, 0, 224, 65, 0, 0, 52, 66, 0, 0, 232, 65, 0, 0, 52, 66, 0, 0, 240, 65, 0, 0, 52, 66, 0, 0, 248, 65, 0, 0, 52, 66, 0, 0, 0, 66, 0, 0, 52, 66, 0, 0, 4, 66, 0, 0, 52, 66, 0, 0, 8, 66, 0, 0, 52, 66, 0, 0, 12, 66, 0, 0, 52, 66, 0, 0, 16, 66, 0, 0, 52, 66, 0, 0, 20, 66, 0, 0, 52, 66, 0, 0, 24, 66, 0, 0, 52, 66, 0, 0, 28, 66, 0, 0, 52, 66, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0, 36, 66, 0, 0, 52, 66, 0, 0, 40, 66, 0, 0, 52, 66, 0, 0, 44, 66, 0, 0, 52, 66, 0, 0, 48, 66, 0, 0, 52, 66, 0, 0, 52, 66, 0, 0, 52, 66, 0, 0, 56, 66, 0, 0, 52, 66, 0, 0, 60, 66, 0, 0, 52, 66, 0, 0, 64, 66, 0, 0, 52, 66, 0, 0, 68, 66, 0, 0, 52, 66, 0, 0, 72, 66, 0, 0, 56, 66, 0, 0, 144, 65, 0, 0, 56, 66, 0, 0, 152, 65, 0, 0, 56, 66, 0, 0, 160, 65, 0, 0, 56, 66, 0, 0, 168, 65, 0, 0, 56, 66, 0, 0, 192, 65, 0, 0, 56, 66, 0, 0, 200, 65, 0, 0, 56, 66, 0, 0, 208, 65, 0, 0, 56, 66, 0, 0, 216, 65, 0, 0, 56, 66, 0, 0, 224, 65, 0, 0, 56, 66, 0, 0, 232, 65, 0, 0, 56, 66, 0, 0, 240, 65, 0, 0, 56, 66, 0, 0, 248, 65, 0, 0, 56, 66, 0, 0, 0, 66, 0, 0, 56, 66, 0, 0, 4, 66, 0, 0, 56, 66, 0, 0, 8, 66, 0, 0, 56, 66, 0, 0, 12, 66, 0, 0, 56, 66, 0, 0, 16, 66, 0, 0, 56, 66, 0, 0, 20, 66, 0, 0, 56, 66, 0, 0, 24, 66, 0, 0, 56, 66, 0, 0, 28, 66, 0, 0, 56, 66, 0, 0, 32, 66, 0, 0, 56, 66, 0, 0, 36, 66, 0, 0, 56, 66, 0, 0, 40, 66, 0, 0, 56, 66, 0, 0, 44, 66, 0, 0, 56, 66, 0, 0, 48, 66, 0, 0, 60, 66, 0, 0, 136, 65, 0, 0, 60, 66, 0, 0, 144, 65, 0, 0, 60, 66, 0, 0, 152, 65, 0, 0, 60, 66, 0, 0, 160, 65, 0, 0, 60, 66, 0, 0, 192, 65, 0, 0, 60, 66, 0, 0, 200, 65, 0, 0, 60, 66, 0, 0, 208, 65, 0, 0, 60, 66, 0, 0, 216, 65, 0, 0, 60, 66, 0, 0, 224, 65, 0, 0, 60, 66, 0, 0, 0, 66, 0, 0, 60, 66, 0, 0, 4, 66, 0, 0, 60, 66, 0, 0, 8, 66, 0, 0, 60, 66, 0, 0, 12, 66, 0, 0, 60, 66, 0, 0, 16, 66, 0, 0, 60, 66, 0, 0, 20, 66, 0, 0, 60, 66, 0, 0, 24, 66, 0, 0, 60, 66, 0, 0, 28, 66, 0, 0, 60, 66, 0, 0, 32, 66, 0, 0, 60, 66, 0, 0, 36, 66, 0, 0, 64, 66, 0, 0, 128, 65, 0, 0, 64, 66, 0, 0, 136, 65, 0, 0, 64, 66, 0, 0, 144, 65, 0, 0, 64, 66, 0, 0, 152, 65, 0, 0, 64, 66, 0, 0, 184, 65, 0, 0, 64, 66, 0, 0, 192, 65, 0, 0, 64, 66, 0, 0, 200, 65, 0, 0, 64, 66, 0, 0, 208, 65, 0, 0, 64, 66, 0, 0, 216, 65, 0, 0, 64, 66, 0, 0, 8, 66, 0, 0, 64, 66, 0, 0, 12, 66, 0, 0, 64, 66, 0, 0, 16, 66, 0, 0, 64, 66, 0, 0, 20, 66, 0, 0, 64, 66, 0, 0, 24, 66, 0, 0, 64, 66, 0, 0, 28, 66, 0, 0, 68, 66, 0, 0, 112, 65, 0, 0, 68, 66, 0, 0, 128, 65, 0, 0, 68, 66, 0, 0, 136, 65, 0, 0, 68, 66, 0, 0, 144, 65, 0, 0, 68, 66, 0, 0, 184, 65, 0, 0, 68, 66, 0, 0, 192, 65, 0, 0, 68, 66, 0, 0, 200, 65, 0, 0, 68, 66, 0, 0, 208, 65, 0, 0, 68, 66, 0, 0, 216, 65, 0, 0, 68, 66, 0, 0, 16, 66, 0, 0, 68, 66, 0, 0, 20, 66, 0, 0, 68, 66, 0, 0, 24, 66, 0, 0, 68, 66, 0, 0, 28, 66, 0, 0, 68, 66, 0, 0, 32, 66, 0, 0, 72, 66, 0, 0, 112, 65, 0, 0, 72, 66, 0, 0, 128, 65, 0, 0, 72, 66, 0, 0, 136, 65, 0, 0, 72, 66, 0, 0, 184, 65, 0, 0, 72, 66, 0, 0, 192, 65, 0, 0, 72, 66, 0, 0, 200, 65, 0, 0, 72, 66, 0, 0, 208, 65, 0, 0, 72, 66, 0, 0, 20, 66, 0, 0, 72, 66, 0, 0, 24, 66, 0, 0, 72, 66, 0, 0, 28, 66, 0, 0, 72, 66, 0, 0, 32, 66, 0, 0, 72, 66, 0, 0, 36, 66, 0, 0, 72, 66, 0, 0, 40, 66, 0, 0, 76, 66, 0, 0, 96, 65, 0, 0, 76, 66, 0, 0, 112, 65, 0, 0, 76, 66, 0, 0, 128, 65, 0, 0, 76, 66, 0, 0, 184, 65, 0, 0, 76, 66, 0, 0, 192, 65, 0, 0, 76, 66, 0, 0, 200, 65, 0, 0, 76, 66, 0, 0, 208, 65, 0, 0, 76, 66, 0, 0, 216, 65, 0, 0, 76, 66, 0, 0, 20, 66, 0, 0, 76, 66, 0, 0, 24, 66, 0, 0, 76, 66, 0, 0, 28, 66, 0, 0, 76, 66, 0, 0, 32, 66, 0, 0, 76, 66, 0, 0, 36, 66, 0, 0, 76, 66, 0, 0, 40, 66, 0, 0, 76, 66, 0, 0, 44, 66, 0, 0, 80, 66, 0, 0, 96, 65, 0, 0, 80, 66, 0, 0, 112, 65, 0, 0, 80, 66, 0, 0, 128, 65, 0, 0, 80, 66, 0, 0, 184, 65, 0, 0, 80, 66, 0, 0, 192, 65, 0, 0, 80, 66, 0, 0, 200, 65, 0, 0, 80, 66, 0, 0, 208, 65, 0, 0, 80, 66, 0, 0, 216, 65, 0, 0, 80, 66, 0, 0, 224, 65, 0, 0, 80, 66, 0, 0, 232, 65, 0, 0, 80, 66, 0, 0, 240, 65, 0, 0, 80, 66, 0, 0, 24, 66, 0, 0, 80, 66, 0, 0, 28, 66, 0, 0, 80, 66, 0, 0, 32, 66, 0, 0, 80, 66, 0, 0, 36, 66, 0, 0, 80, 66, 0, 0, 40, 66, 0, 0, 80, 66, 0, 0, 44, 66, 0, 0, 84, 66, 0, 0, 96, 65, 0, 0, 84, 66, 0, 0, 112, 65, 0, 0, 84, 66, 0, 0, 128, 65, 0, 0, 84, 66, 0, 0, 184, 65, 0, 0, 84, 66, 0, 0, 192, 65, 0, 0, 84, 66, 0, 0, 200, 65, 0, 0, 84, 66, 0, 0, 208, 65, 0, 0, 84, 66, 0, 0, 216, 65, 0, 0, 84, 66, 0, 0, 224, 65, 0, 0, 84, 66, 0, 0, 232, 65, 0, 0, 84, 66, 0, 0, 240, 65, 0, 0, 84, 66, 0, 0, 248, 65, 0, 0, 84, 66, 0, 0, 0, 66, 0, 0, 84, 66, 0, 0, 32, 66, 0, 0, 84, 66, 0, 0, 36, 66, 0, 0, 84, 66, 0, 0, 40, 66, 0, 0, 84, 66, 0, 0, 44, 66, 0, 0, 88, 66, 0, 0, 96, 65, 0, 0, 88, 66, 0, 0, 112, 65, 0, 0, 88, 66, 0, 0, 128, 65, 0, 0, 88, 66, 0, 0, 136, 65, 0, 0, 88, 66, 0, 0, 192, 65, 0, 0, 88, 66, 0, 0, 200, 65, 0, 0, 88, 66, 0, 0, 208, 65, 0, 0, 88, 66, 0, 0, 216, 65, 0, 0, 88, 66, 0, 0, 0, 66, 0, 0, 88, 66, 0, 0, 4, 66, 0, 0, 88, 66, 0, 0, 8, 66, 0, 0, 88, 66, 0, 0, 12, 66, 0, 0, 88, 66, 0, 0, 40, 66, 0, 0, 88, 66, 0, 0, 44, 66, 0, 0, 92, 66, 0, 0, 96, 65, 0, 0, 92, 66, 0, 0, 112, 65, 0, 0, 92, 66, 0, 0, 128, 65, 0, 0, 92, 66, 0, 0, 136, 65, 0, 0, 92, 66, 0, 0, 144, 65, 0, 0, 92, 66, 0, 0, 208, 65, 0, 0, 92, 66, 0, 0, 216, 65, 0, 0, 92, 66, 0, 0, 8, 66, 0, 0, 92, 66, 0, 0, 12, 66, 0, 0, 92, 66, 0, 0, 16, 66, 0, 0, 92, 66, 0, 0, 20, 66, 0, 0, 92, 66, 0, 0, 24, 66, 0, 0, 96, 66, 0, 0, 112, 65, 0, 0, 96, 66, 0, 0, 128, 65, 0, 0, 96, 66, 0, 0, 136, 65, 0, 0, 96, 66, 0, 0, 144, 65, 0, 0, 96, 66, 0, 0, 152, 65, 0, 0, 96, 66, 0, 0, 216, 65, 0, 0, 96, 66, 0, 0, 224, 65, 0, 0, 96, 66, 0, 0, 16, 66, 0, 0, 96, 66, 0, 0, 20, 66, 0, 0, 96, 66, 0, 0, 24, 66, 0, 0, 96, 66, 0, 0, 28, 66, 0, 0, 96, 66, 0, 0, 32, 66, 0, 0, 96, 66, 0, 0, 36, 66, 0, 0, 96, 66, 0, 0, 40, 66, 0, 0, 96, 66, 0, 0, 44, 66, 0, 0, 100, 66, 0, 0, 128, 65, 0, 0, 100, 66, 0, 0, 136, 65, 0, 0, 100, 66, 0, 0, 144, 65, 0, 0, 100, 66, 0, 0, 152, 65, 0, 0, 100, 66, 0, 0, 160, 65, 0, 0, 100, 66, 0, 0, 168, 65, 0, 0, 100, 66, 0, 0, 184, 65, 0, 0, 100, 66, 0, 0, 224, 65, 0, 0, 100, 66, 0, 0, 232, 65, 0, 0, 100, 66, 0, 0, 36, 66, 0, 0, 100, 66, 0, 0, 40, 66, 0, 0, 100, 66, 0, 0, 44, 66, 0, 0, 100, 66, 0, 0, 48, 66, 0, 0, 100, 66, 0, 0, 52, 66, 0, 0, 100, 66, 0, 0, 56, 66, 0, 0, 100, 66, 0, 0, 68, 66, 0, 0, 100, 66, 0, 0, 72, 66, 0, 0, 100, 66, 0, 0, 76, 66, 0, 0, 104, 66, 0, 0, 136, 65, 0, 0, 104, 66, 0, 0, 144, 65, 0, 0, 104, 66, 0, 0, 152, 65, 0, 0, 104, 66, 0, 0, 160, 65, 0, 0, 104, 66, 0, 0, 168, 65, 0, 0, 104, 66, 0, 0, 176, 65, 0, 0, 104, 66, 0, 0, 184, 65, 0, 0, 104, 66, 0, 0, 232, 65, 0, 0, 104, 66, 0, 0, 240, 65, 0, 0, 104, 66, 0, 0, 248, 65, 0, 0, 104, 66, 0, 0, 0, 66, 0, 0, 108, 66, 0, 0, 152, 65, 0, 0, 108, 66, 0, 0, 160, 65, 0, 0, 108, 66, 0, 0, 168, 65, 0, 0, 108, 66, 0, 0, 176, 65, 0, 0, 108, 66, 0, 0, 240, 65, 0, 0, 108, 66, 0, 0, 248, 65, 0, 0, 108, 66, 0, 0, 0, 66, 0, 0, 108, 66, 0, 0, 4, 66, 0, 0, 108, 66, 0, 0, 8, 66, 0, 0, 108, 66, 0, 0, 12, 66, 0, 0, 108, 66, 0, 0, 16, 66, 0, 0, 108, 66, 0, 0, 20, 66, 0, 0, 112, 66, 0, 0, 160, 65, 0, 0, 112, 66, 0, 0, 0, 66, 0, 0, 112, 66, 0, 0, 4, 66, 0, 0, 112, 66, 0, 0, 8, 66, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 93, 4, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 13, 4, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 13, 4, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 13, 4, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 72, 4, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 72, 4, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 42, 5, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 218, 4, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 218, 4, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 218, 4, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 21, 5, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 21, 5, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 176, 5, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 96, 5, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 20, 0, 0, 0, 8, 118, 105, 99, 98, 104, 118, 0, 18, 164, 8, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 155, 5, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 155, 5, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 53, 6, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 229, 5, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 20, 0, 0, 0, 4, 118, 101, 99, 98, 104, 118, 0, 17, 128, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 32, 6, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 32, 6, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 249, 6, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 169, 6, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 169, 6, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 169, 6, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 228, 6, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 228, 6, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 122, 7, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 42, 7, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 17, 128, 117, 116, 121, 112, 101, 0, 17, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 101, 7, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 101, 7, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 47, 8, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 4, 129, 206, 224, 130, 78, 1, 208, 227, 7, 0, 0, 0, 0, 0, 0, 129, 78, 127, 17, 22, 95, 87, 77, 87, 105, 110, 100, 111, 119, 79, 114, 100, 101, 114, 105, 110, 103, 73, 110, 102, 111, 0, 129, 248, 129, 253, 129, 206, 17, 3, 117, 111, 119, 105, 100, 0, 224, 119, 111, 99, 103, 119, 105, 100, 0, 17, 0, 116, 112, 112, 115, 0, 17, 0, 117, 114, 119, 105, 100, 0, 224, 116, 99, 101, 116, 0, 17, 0, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 26, 8, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 26, 8, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 220, 9, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 1, 129, 206, 208, 140, 9, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 111, 17, 36, 56, 0, 65, 0, 56, 0, 49, 0, 51, 0, 55, 0, 52, 0, 69, 0, 45, 0, 50, 0, 69, 0, 53, 0, 67, 0, 45, 0, 52, 0, 49, 0, 49, 0, 65, 0, 45, 0, 56, 0, 69, 0, 70, 0, 50, 0, 45, 0, 53, 0, 54, 0, 68, 0, 51, 0, 54, 0, 50, 0, 55, 0, 53, 0, 70, 0, 69, 0, 55, 0, 70, 0, 130, 72, 1, 24, 255, 255, 255, 255, 255, 255, 255, 255, 115, 102, 114, 0, 79, 17, 32, 0, 0, 0, 0, 0, 0, 89, 64, 0, 0, 0, 0, 0, 0, 89, 64, 0, 0, 0, 0, 0, 104, 144, 64, 0, 0, 0, 0, 0, 192, 134, 64, 115, 116, 105, 0, 96, 115, 119, 108, 0, 17, 0, 118, 99, 103, 119, 105, 100, 0, 17, 0, 130, 35, 7, 17, 0, 119, 116, 121, 112, 101, 105, 100, 0, 224, 117, 112, 114, 101, 115, 0, 17, 0, 117, 112, 119, 105, 100, 0, 224, 118, 112, 115, 110, 104, 105, 0, 17, 0, 118, 112, 115, 110, 108, 111, 0, 17, 0, 117, 102, 114, 101, 116, 0, 24, 209, 176, 56, 225, 6, 6, 2, 0, 117, 102, 100, 99, 115, 0, 18, 0, 4, 118, 115, 104, 112, 114, 112, 0, 224, 117, 100, 105, 99, 114, 0, 130, 98, 2, 117, 99, 114, 97, 100, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 130, 91, 2, 130, 98, 2, 118, 117, 109, 103, 100, 102, 0, 79, 17, 32, 0, 0, 0, 0, 0, 0, 0, 0, 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, 115, 109, 115, 107, 0, 17, 0, 130, 221, 5, 17, 0, 130, 87, 5, 17, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 199, 9, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 199, 9, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 165, 10, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 85, 10, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 18, 0, 16, 130, 250, 8, 111, 17, 36, 68, 0, 69, 0, 53, 0, 65, 0, 68, 0, 57, 0, 69, 0, 68, 0, 45, 0, 56, 0, 66, 0, 51, 0, 54, 0, 45, 0, 52, 0, 65, 0, 53, 0, 48, 0, 45, 0, 65, 0, 52, 0, 57, 0, 68, 0, 45, 0, 65, 0, 65, 0, 56, 0, 49, 0, 70, 0, 65, 0, 66, 0, 57, 0, 66, 0, 70, 0, 66, 0, 56, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 144, 10, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 144, 10, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 37, 11, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 213, 10, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 17, 64, 130, 219, 8, 18, 238, 204, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 16, 11, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 16, 11, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 216, 11, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 136, 11, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 136, 11, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 136, 11, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 195, 11, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 195, 11, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 148, 12, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 68, 12, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 68, 12, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 68, 12, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 127, 12, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 127, 12, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 19, 13, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 195, 12, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 17, 128, 130, 35, 7, 17, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 254, 12, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 254, 12, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 156, 13, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 76, 13, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 64, 0, 130, 60, 9, 35, 0, 0, 0, 0, 0, 0, 40, 64, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 135, 13, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 135, 13, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 31, 14, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 207, 13, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 8, 130, 87, 5, 18, 164, 8, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 10, 14, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 10, 14, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 161, 14, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 81, 14, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 4, 130, 221, 5, 17, 128, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 140, 14, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 140, 14, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 32, 15, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 208, 14, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 18, 0, 16, 130, 250, 8, 224, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 11, 15, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 11, 15, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 158, 15, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 26, 129, 206, 224, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 208, 106, 15, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 106, 15, 0, 0, 0, 0, 0, 0, 130, 82, 8, 130, 129, 1, 208, 137, 15, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 137, 15, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 75, 16, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 251, 15, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 0, 0, 0, 0, 0, 0, 0, 0, 172, 64, 130, 169, 8, 79, 17, 32, 0, 130, 0, 141, 3, 0, 0, 0, 162, 0, 0, 0, 0, 0, 106, 64, 0, 0, 0, 0, 0, 104, 144, 64, 0, 0, 0, 0, 0, 192, 134, 64, 130, 19, 9, 24, 181, 181, 136, 224, 6, 6, 2, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 54, 16, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 54, 16, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 254, 16, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 174, 16, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 174, 16, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 174, 16, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 233, 16, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 233, 16, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 168, 17, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 88, 17, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 88, 17, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 88, 17, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 147, 17, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 147, 17, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 43, 18, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 219, 17, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 8, 130, 87, 5, 18, 36, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 22, 18, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 22, 18, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 174, 18, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 94, 18, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 4, 130, 221, 5, 18, 0, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 153, 18, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 153, 18, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 97, 19, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 17, 19, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 17, 19, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 17, 19, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 76, 19, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 76, 19, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 29, 20, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 205, 19, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 205, 19, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 205, 19, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 18, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 8, 20, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 8, 20, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 160, 20, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 80, 20, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 8, 130, 87, 5, 18, 68, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 139, 20, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 139, 20, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 35, 21, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 211, 20, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 4, 130, 221, 5, 18, 64, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 14, 21, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 14, 21, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 157, 21, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 77, 21, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 17, 32, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 136, 21, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 136, 21, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 121, 22, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 41, 22, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 11, 2, 130, 72, 1, 17, 16, 130, 91, 2, 208, 41, 22, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 41, 22, 0, 0, 0, 0, 0, 0, 208, 41, 22, 0, 0, 0, 0, 0, 0, 129, 78, 127, 17, 40, 87, 77, 87, 105, 110, 100, 111, 119, 80, 114, 111, 112, 101, 114, 116, 121, 83, 110, 97, 112, 115, 104, 111, 116, 67, 104, 105, 108, 100, 87, 105, 110, 100, 111, 119, 73, 110, 102, 111, 0, 117, 99, 108, 100, 119, 0, 130, 82, 8, 117, 99, 108, 100, 112, 0, 17, 1, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 100, 22, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 100, 22, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 131, 23, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 51, 23, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 18, 0, 128, 130, 43, 9, 208, 51, 23, 0, 0, 0, 0, 0, 0, 129, 78, 127, 17, 26, 95, 87, 77, 87, 105, 110, 100, 111, 119, 83, 104, 97, 100, 111, 119, 80, 114, 111, 112, 101, 114, 116, 105, 101, 115, 0, 115, 97, 114, 0, 34, 0, 0, 160, 65, 115, 97, 100, 0, 34, 51, 51, 51, 63, 116, 97, 118, 111, 0, 34, 0, 0, 144, 65, 116, 97, 114, 115, 0, 176, 116, 97, 114, 100, 0, 34, 51, 51, 115, 63, 116, 97, 99, 116, 0, 192, 115, 105, 114, 0, 34, 0, 0, 64, 65, 115, 105, 100, 0, 34, 102, 102, 230, 62, 116, 105, 118, 111, 0, 34, 0, 0, 0, 65, 116, 105, 114, 115, 0, 176, 116, 105, 114, 100, 0, 34, 154, 153, 89, 63, 116, 105, 99, 116, 0, 192, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 110, 23, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 110, 23, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 72, 24, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 248, 23, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 248, 23, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 248, 23, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 18, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 51, 24, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 51, 24, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 202, 24, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 122, 24, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 2, 130, 123, 9, 17, 15, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 181, 24, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 181, 24, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 73, 25, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 249, 24, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 17, 128, 130, 35, 7, 17, 2, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 52, 25, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 52, 25, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 219, 25, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 4, 129, 206, 224, 130, 78, 1, 208, 143, 25, 0, 0, 0, 0, 0, 0, 129, 78, 130, 157, 7, 129, 248, 130, 82, 8, 129, 206, 17, 1, 130, 190, 7, 224, 130, 197, 7, 18, 239, 195, 130, 207, 7, 17, 0, 130, 214, 7, 224, 130, 221, 7, 17, 0, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 198, 25, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 198, 25, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 111, 26, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 31, 26, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 17, 1, 130, 208, 8, 107, 79, 0, 112, 0, 101, 0, 110, 0, 32, 0, 97, 0, 32, 0, 70, 0, 105, 0, 108, 0, 101, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 90, 26, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 90, 26, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 61, 27, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 237, 26, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 11, 2, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 237, 26, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 237, 26, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 248, 131, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 40, 27, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 40, 27, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 11, 28, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 187, 27, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 187, 27, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 187, 27, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 134, 0, 0, 0, 0, 0, 0, 0, 248, 18, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 246, 27, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 246, 27, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 226, 28, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 146, 28, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 146, 28, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 146, 28, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 131, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 134, 0, 0, 0, 0, 0, 0, 0, 248, 18, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 205, 28, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 205, 28, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 167, 29, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 87, 29, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 11, 2, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 87, 29, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 87, 29, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 57, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 56, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 146, 29, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 146, 29, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 63, 30, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 4, 129, 206, 224, 130, 78, 1, 208, 243, 29, 0, 0, 0, 0, 0, 0, 129, 78, 130, 157, 7, 129, 248, 130, 82, 8, 129, 206, 17, 4, 130, 190, 7, 224, 130, 197, 7, 17, 0, 130, 207, 7, 17, 0, 130, 214, 7, 224, 130, 221, 7, 24, 181, 181, 136, 224, 6, 6, 2, 0, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 42, 30, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 42, 30, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 184, 30, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 3, 129, 206, 208, 104, 30, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 129, 253, 130, 72, 1, 17, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 163, 30, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 163, 30, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 208, 152, 31, 0, 0, 0, 0, 0, 0, 129, 78, 129, 168, 129, 200, 17, 2, 129, 206, 208, 72, 31, 0, 0, 0, 0, 0, 0, 129, 78, 129, 220, 129, 248, 130, 82, 8, 130, 72, 1, 20, 0, 0, 0, 32, 130, 246, 2, 208, 72, 31, 0, 0, 0, 0, 0, 0, 129, 78, 129, 127, 129, 136, 160, 72, 31, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 248, 13, 0, 0, 0, 0, 0, 0, 0, 248, 134, 0, 0, 0, 0, 0, 0, 0, 248, 131, 0, 0, 0, 0, 0, 0, 0, 248, 18, 0, 0, 0, 0, 0, 0, 0, 248, 19, 0, 0, 0, 0, 0, 0, 0, 248, 22, 0, 0, 0, 0, 0, 0, 0, 248, 30, 0, 0, 0, 0, 0, 0, 0, 130, 78, 1, 224, 130, 82, 1, 224, 130, 90, 1, 224, 130, 98, 1, 224, 130, 105, 1, 224, 130, 114, 1, 224, 130, 122, 1, 224, 130, 129, 1, 208, 131, 31, 0, 0, 0, 0, 0, 0, 129, 78, 130, 144, 1, 129, 136, 160, 131, 31, 0, 0, 0, 0, 0, 0, 130, 162, 1, 130, 193, 1, 17, 0, 130, 201, 1, 224, 130, 208, 1, 224, 130, 216, 1, 224, 130, 224, 1, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 141, 3, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": "RGFloat", +"height": 1, +"mipmaps": false, +"width": 2048 +} + +[resource] +image = SubResource("Image_jc6cb") diff --git a/scenes/Puppets/Enemies/assets/Enemy1.png.import b/scenes/Puppets/Enemies/assets/Enemy1.png.import new file mode 100644 index 00000000..fab1cddf --- /dev/null +++ b/scenes/Puppets/Enemies/assets/Enemy1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kanii866rnyf" +path="res://.godot/imported/Enemy1.png-6cca2af04071b56c63c9ecdd5d897db6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/Puppets/Enemies/assets/Enemy1.png" +dest_files=["res://.godot/imported/Enemy1.png-6cca2af04071b56c63c9ecdd5d897db6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png b/scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png new file mode 100644 index 0000000000000000000000000000000000000000..851334ba53ae79403ec327ec1216858d8ff63f43 GIT binary patch literal 1038 zcmV+p1o8WcP)bMsfFP>%2JQ120_XUL&qNWq6}Q?or#gfKLk2#Eu@46 zQd=m54Mxotxr!ju4MD*N=`=8Krg+`0oyx@4R$sa zpZmMN-}&8hu7nChdI#P%kY*|X=V--8kcJtp93U>ol3~3Jpj5IyN)~~oIawNj)~Q|h z2lQFcSg+}&0TQqt`cEwYi*j>Hn->6R8&4EK;N}-ozv-m`0Bg&Do(DupqU)C;Ant7u z0S@&T5eNh11HHun3$Epku?_}aQeM(XobP*7GoitJxzPn`d3%Z@yB zfju2z;+Y&!ljJfv+u`;f&x7HK2}VuVs~#J`?VM<+ZU^~3W!@MP;NIAJz~np&qZf_u zFRSY2m1=88y!lLFfWXw?Fysx20v--%~wJE)kpbE_+a*=NOiXy;$Z8Oe*}OpDZsbgxw(ZG{gCXK z{)4sQ*OhU|&k+#4kiQYNd75?abP8;l02`b7SrYPxdhD($2`E6lc}wY7lo!?EMGsi~>b*4wNt}B9occ&WMz7&i=fX%T} zc$64wRtsK>QvBwtSKtxce-7PX2T`8Hp6Yh7Uf? zfl+5JOLN-tUHh4Hr+u>v$GzYxVEYOgJH%8-X-h|>XN`QJ07%omogB1iYaCgV&gfv; z5{z3<$QKg^pg5>-(0O)kb=CxpY8nS(IsHGoHdPKR9nn35RW;DpuL_GxB|r>Ypsxkv zWA#IIwXX)2U|;8O=HcSnl^3);0800VP&_s~X@9cxy~*C!fy0k)WoJz3Rs)C?IUg*K zhtH>@VR7kIAi!2fqNB-Z*mz6W{5>jQS`j&%N#yT;IR{?I*T>LxKQZ^OQb7F2aCD>s zkaw2@d;2N?_cgwAl>vOMz}neS28a=>1d4rl4VXJkZ{nNv0zxxMP*CcehX4Qo07*qo IM6N<$g5@yVQvd(} literal 0 HcmV?d00001 diff --git a/scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png.import b/scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png.import new file mode 100644 index 00000000..853abc22 --- /dev/null +++ b/scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5jpi2i502lw5" +path="res://.godot/imported/Enemy1EmissionShape.png-e1502c3313247b217f7d453af1069017.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/Puppets/Enemies/assets/Enemy1EmissionShape.png" +dest_files=["res://.godot/imported/Enemy1EmissionShape.png-e1502c3313247b217f7d453af1069017.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 From af12534d27504ea719e7de5c36e1482aaee9a56f Mon Sep 17 00:00:00 2001 From: cornerloan Date: Fri, 21 Feb 2025 00:27:14 -0800 Subject: [PATCH 6/9] added vampire note steals 1 health from enemy --- Classes/Notes/assets/vampire_note.png | Bin 0 -> 1194 bytes Classes/Notes/assets/vampire_note.png.import | 34 +++++++++++++++++++ Globals/Scribe.cs | 12 +++++++ 3 files changed, 46 insertions(+) create mode 100644 Classes/Notes/assets/vampire_note.png create mode 100644 Classes/Notes/assets/vampire_note.png.import diff --git a/Classes/Notes/assets/vampire_note.png b/Classes/Notes/assets/vampire_note.png new file mode 100644 index 0000000000000000000000000000000000000000..6c086bfdb5f27b3cd0bf520688e833bee1226ed0 GIT binary patch literal 1194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFg9j7I|q0=J1Z0v<)>xlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xw`zKEq$B+p3x0Ag2nhkhd+T$8^z2DU@(z{vIRx(-PaYa(_ z(hIKhT3G(|sH+`F_+T)ZFJ)3ix@m01%Z3F!ey0M$Z@ipzDwBE5`qrJHYD;)e>}XH_ zvm}?dQ7@=)f=o{%YwoKb+uktec#Z&&nM zUIW8pSE~*fUXZ^0U@qH&>;3FJA$L*_#Mn!*t-39BVDOrT!iU;U!YxK^OeNkZ1 z?Dd$1;rAx9R<6(AuFX1o-&1(z7X8(ItuwZ7|Ffhx!>M47O_G|`jt62KLOjA*35si^ j_0DXlE(lFG_#tm+u4y2@TSyvIDlvGv`njxgN@xNA$%o@= literal 0 HcmV?d00001 diff --git a/Classes/Notes/assets/vampire_note.png.import b/Classes/Notes/assets/vampire_note.png.import new file mode 100644 index 00000000..65be637e --- /dev/null +++ b/Classes/Notes/assets/vampire_note.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dg0lmu0pip4lr" +path="res://.godot/imported/vampire_note.png-4331f817a6feee1f1066a9e9f95934c8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Classes/Notes/assets/vampire_note.png" +dest_files=["res://.godot/imported/vampire_note.png-4331f817a6feee1f1066a9e9f95934c8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index 8657e1dd..afe9ba26 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -56,6 +56,18 @@ public partial class Scribe : Node director.Player.Heal((int)timing); } ), + new Note( + "PlayerVampire", + "Steals health from enemy.", + GD.Load("res://Classes/Notes/assets/vampire_note.png"), + null, + 1, + (director, note, timing) => + { + director.Player.Heal((int)timing); + director.Enemy.TakeDamage((int)timing); + } + ), }; public static readonly RelicTemplate[] RelicDictionary = new[] From 0f950dbfe3d50a0221b3c366b8fdbfb87d8b97fd Mon Sep 17 00:00:00 2001 From: cornerloan Date: Fri, 21 Feb 2025 01:11:43 -0800 Subject: [PATCH 7/9] added quarter note --- Classes/Notes/assets/quarter_note.png | Bin 0 -> 1020 bytes Classes/Notes/assets/quarter_note.png.import | 34 ++++++++++++++++++ Classes/Notes/assets/vampire_note.png | Bin 1194 -> 1219 bytes Globals/Scribe.cs | 13 ++++++- .../scripts/NotePlacementBar.cs | 9 ++++- 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 Classes/Notes/assets/quarter_note.png create mode 100644 Classes/Notes/assets/quarter_note.png.import diff --git a/Classes/Notes/assets/quarter_note.png b/Classes/Notes/assets/quarter_note.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cbd41b3598b9f56695c7dd855356f1dc3fe0de GIT binary patch literal 1020 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFg9j7I|q0=J1Z0v<)>xlq%tsQ zoS!<;+Jo6qqGkUaFBcK+;EsqG!L?fqm8Jhf~e)`WUi`XRJ)V4b=H6a!%YnErtWB^6KitU zo$)+6yX&pby;XOD_iiXXI&*H|t}}T_J_biktkf#6otUsVKFnRDf5#j5*FSc9{mU$z z`6%kJ&~b^^HzZW;U-8$Kzh0`u{B+4R4HMhn|El>}${*~0@H^gp-~U=3UjKrZA%9=H zO8gVp8*ued`-Oe1&%;B{-f8X5eNl5pYF*$Ysg$ghB75eZGC%8loOg@PwCdGwii`L; zUuJ!h`o_P&T=%AT>Akx#w{Oo+*ZTXHq2g-MO4a18AAoVfS>O>_%)p?h1j3A~9^IV; z6l6>Cc6VVo&fw1AZZCb{5Kx4@#M9T6{Us9@I|tX%g=)1xA;}Wgh!W@g+}zZ>5(ej@ z)Wnk16ovB4k_-iRPv3y>Mm}+1T(@V2M3hAM`dB6B=jtV<HIW;5GqpB!1xXLdixhgx^GDY3qj+e`( z!U||YZfZ%QLPc&)Ua?h$trFN^DKRGXOam#J2J;$^?dHBFIWRLmRL>ikOW)$RS7$vxA5L{R(8kLk1K~ z@X$@o0|se1Fzj@u%-{xwyNjobV@QPi+e?OA3<^BX7hnB-zot8QVNx^4wEqWGouyrk z85|gsWj((i%s$J`zUa2r=1ckly3c3rR#lR9HvtmN5>(FbqWv;s&gY+=`K%D@3^hJ0rJZWaSKD zNs8n6yKWTI!YDHVi3)Mdvgy|1K&b< zneBH#+hF0;SKlC*fV0`aRDA&&=nXQsn1M`lfGusHVG#o;enJLfjFZm-hrWrQP|-TO z=a3UnXQ>Gw@f@u9X=G59!sT|C>nhjtsk*nGo~(sTdL53k=3@VR@LM;9T1x-`002ovPDHLkV1nKmgCGC^ delta 274 zcmV+t0qy?7391ROq62>b@<~KNR9Hvtl1mPQFbqV8UV$x3?th{#*>Z+-lOW@GVpFBi zMV^EN{){Ikz+mt&lMZB(cxN?Tc&2%4q|vuZ6i)CZr9>xQA!_q-_m> zE>dxj9E^blZR+^8?f?^sFsaAIGJt4v514^pQEk^csr*M(L&ksVL!iF8TdfT+F~-$; zz%kGp)8L&3px2KF3{>1@z+68X2CCZ{z^nK2CsNDx7f>y>flF>3=x{iLO5+3o`?5BL z3iI~Xn$6!y6PdIxtB!@3x3~PHb7(?voIGMCI=J8#2oekvYG5I(8!pVSdvH}}F!&!n YHz_b5yAm4;000UA07*qoM6N<$f?kSy7ytkO diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index afe9ba26..a17cd900 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -58,7 +58,7 @@ public partial class Scribe : Node ), new Note( "PlayerVampire", - "Steals health from enemy.", + "Steals health from enemy", GD.Load("res://Classes/Notes/assets/vampire_note.png"), null, 1, @@ -68,6 +68,17 @@ public partial class Scribe : Node director.Enemy.TakeDamage((int)timing); } ), + new Note( + "PlayerQuarter", + "Basic note at a quarter of the cost", + GD.Load("res://Classes/Notes/assets/quarter_note.png"), + null, + 1, + (director, note, timing) => + { + director.Enemy.TakeDamage((int)timing); + } + ), }; public static readonly RelicTemplate[] RelicDictionary = new[] diff --git a/scenes/BattleDirector/scripts/NotePlacementBar.cs b/scenes/BattleDirector/scripts/NotePlacementBar.cs index 4beb175e..79511746 100644 --- a/scenes/BattleDirector/scripts/NotePlacementBar.cs +++ b/scenes/BattleDirector/scripts/NotePlacementBar.cs @@ -133,13 +133,20 @@ public void MissNote() // Placing a note resets the note placement bar public Note PlacedNote() { - _currentBarValue = 0; + if (_noteQueue.Peek().Name == "PlayerQuarter") + _currentBarValue -= MaxValue / 4; + else + _currentBarValue = 0; + UpdateNotePlacementBar(_currentBarValue); return GetNote(); } public bool CanPlaceNote() { + if (_noteQueue.Peek().Name == "PlayerQuarter") + return _currentBarValue >= MaxValue / 4; + return _currentBarValue >= MaxValue; } From 5471c931272ccbe817cd93dde0d8bf6d177ebe3e Mon Sep 17 00:00:00 2001 From: Thomas Wessel Date: Sun, 23 Feb 2025 00:43:25 -0800 Subject: [PATCH 8/9] Add gradient and timescale modifier to star shader --- scenes/ChartViewport/ChartViewport.tscn | 5 ++++- scenes/ChartViewport/StarryNight.gdshader | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/scenes/ChartViewport/ChartViewport.tscn b/scenes/ChartViewport/ChartViewport.tscn index 52f35d99..55f09f8c 100644 --- a/scenes/ChartViewport/ChartViewport.tscn +++ b/scenes/ChartViewport/ChartViewport.tscn @@ -8,7 +8,10 @@ [sub_resource type="ShaderMaterial" id="ShaderMaterial_5uw0y"] shader = ExtResource("5_kqrxg") -shader_parameter/bg_color = Vector4(0.18, 0.08, 0.12, 0) +shader_parameter/bg_top_color = Vector4(0.18, 0.08, 0.12, 0) +shader_parameter/bg_bottom_color = Vector4(0.028, 0.008, 0.184, 0) +shader_parameter/gradient_ratio = 1.0 +shader_parameter/time_scale = 1.0 [node name="VPContainer" type="SubViewportContainer" node_paths=PackedStringArray("IH", "ChartLoopables")] offset_right = 480.0 diff --git a/scenes/ChartViewport/StarryNight.gdshader b/scenes/ChartViewport/StarryNight.gdshader index 62c07421..126e5eab 100644 --- a/scenes/ChartViewport/StarryNight.gdshader +++ b/scenes/ChartViewport/StarryNight.gdshader @@ -3,7 +3,10 @@ shader_type canvas_item; -uniform vec4 bg_color; +uniform vec4 bg_top_color; +uniform vec4 bg_bottom_color; +uniform float gradient_ratio; +uniform float time_scale; float rand(vec2 st) { return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123); @@ -15,7 +18,10 @@ void fragment() { if (rand(SCREEN_UV.xy / 20.0) > 0.996) { float r = rand(SCREEN_UV.xy); - color = r * (0.85 * sin(TIME * (r * 5.0) + 720.0 * r) + 0.95); + color = r * (0.85 * sin((TIME * time_scale) * (r * 5.0) + 720.0 * r) + 0.95); } - COLOR = vec4(vec3(color),1.0) + bg_color; + + vec4 gradient_color = mix(bg_top_color, bg_bottom_color, SCREEN_UV.y / gradient_ratio); + + COLOR = vec4(vec3(color),1.0) + gradient_color; } \ No newline at end of file From df12691d6016123126e6db31a6af65d4f7e7f0f4 Mon Sep 17 00:00:00 2001 From: LifeHckr Date: Sun, 23 Feb 2025 17:03:11 -0800 Subject: [PATCH 9/9] Removed old looping Backgrounds --- scenes/ChartViewport/ChartManager.cs | 16 ---------------- scenes/ChartViewport/ChartViewport.tscn | 23 +---------------------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/scenes/ChartViewport/ChartManager.cs b/scenes/ChartViewport/ChartManager.cs index 7a1516d9..42b0fd85 100644 --- a/scenes/ChartViewport/ChartManager.cs +++ b/scenes/ChartViewport/ChartManager.cs @@ -48,7 +48,6 @@ public void PrepChart(SongData songData) TimeKeeper.ChartLength = (float)ChartLength; TimeKeeper.Bpm = songData.Bpm; - InitBackgrounds(); _arrowGroup = ChartLoopables.GetNode("ArrowGroup"); IH.Connect(nameof(InputHandler.NotePressed), new Callable(this, nameof(OnNotePressed))); @@ -74,21 +73,6 @@ public void PrepChart(SongData songData) tween.SetLoops().Play(); } - private void InitBackgrounds() - { - int i = 0; - foreach (Node child in ChartLoopables.GetChildren()) - { - if (child is not Loopable) - continue; - Loopable loopable = (Loopable)child; - loopable.Position = Vector2.Zero; - loopable.SetSize(new Vector2((float)ChartLength / 2 + 1, Size.Y)); - loopable.Bounds = (float)ChartLength / 2 * i; - i++; - } - } - private void TweenArrows(Vector2 scale) { foreach (var node in _arrowGroup.GetChildren()) diff --git a/scenes/ChartViewport/ChartViewport.tscn b/scenes/ChartViewport/ChartViewport.tscn index 55f09f8c..0b14f4bf 100644 --- a/scenes/ChartViewport/ChartViewport.tscn +++ b/scenes/ChartViewport/ChartViewport.tscn @@ -1,8 +1,6 @@ -[gd_scene load_steps=7 format=3 uid="uid://dfevfib11kou1"] +[gd_scene load_steps=5 format=3 uid="uid://dfevfib11kou1"] -[ext_resource type="Texture2D" uid="uid://b0tvsewgnf2x7" path="res://icon.svg" id="1_0wnka"] [ext_resource type="Script" path="res://scenes/ChartViewport/ChartManager.cs" id="1_ruh2l"] -[ext_resource type="Script" path="res://scenes/ChartViewport/Loopable.cs" id="3_5u57h"] [ext_resource type="PackedScene" uid="uid://bn8txx53xlguw" path="res://scenes/NoteManager/note_manager.tscn" id="4_fd5fw"] [ext_resource type="Shader" path="res://scenes/ChartViewport/StarryNight.gdshader" id="5_kqrxg"] @@ -25,13 +23,6 @@ handle_input_locally = false size = Vector2i(480, 180) render_target_update_mode = 4 -[node name="ColorFill" type="ColorRect" parent="SubViewport"] -z_index = -2 -offset_left = -60.0 -offset_right = 690.0 -offset_bottom = 360.0 -color = Color(0.129412, 0.145098, 0.196078, 1) - [node name="Camera2D" type="Camera2D" parent="SubViewport"] position = Vector2(-50, 0) anchor_mode = 0 @@ -41,18 +32,6 @@ unique_name_in_owner = true [node name="ArrowGroup" type="Node" parent="SubViewport/ChartLoopables"] -[node name="ChartBG2" type="TextureRect" parent="SubViewport/ChartLoopables"] -offset_right = 701.0 -offset_bottom = 300.0 -texture = ExtResource("1_0wnka") -script = ExtResource("3_5u57h") - -[node name="ChartBG1" type="TextureRect" parent="SubViewport/ChartLoopables"] -offset_right = 701.0 -offset_bottom = 300.0 -texture = ExtResource("1_0wnka") -script = ExtResource("3_5u57h") - [node name="StarShader" type="ColorRect" parent="SubViewport"] material = SubResource("ShaderMaterial_5uw0y") offset_left = -60.0