{"id":471,"date":"2023-05-01T12:52:27","date_gmt":"2023-05-01T12:52:27","guid":{"rendered":"http:\/\/fridaynightartwork.com\/randomlyGames\/?page_id=471"},"modified":"2024-02-02T00:15:04","modified_gmt":"2024-02-02T00:15:04","slug":"neo-mecha-v0-4-0-cleaning-art-devlog","status":"publish","type":"page","link":"http:\/\/fridaynightartwork.com\/randomlyGames\/?page_id=471","title":{"rendered":"Neo Mecha v0.4.0 Cleaning Art devlog"},"content":{"rendered":"\n<p>The goal for v0.4.0 is cleaning up some code and redoing some art<\/p>\n\n\n\n<p><strong>Remove Command Processors<\/strong> \u2611<\/p>\n\n\n\n<p>The key to make sure development is remains fast is to make sure you have a good Architecture. While writing the various action classes for the new Smoke Action in v0.3.0 I decided that the <em>Command Processor<\/em> classes were a bit redundant. The only purpose they served was to separate the logic of applying a command from the actual command data. Which really wasn&#8217;t useful.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMecho_Architecture_change.png\"><img decoding=\"async\" loading=\"lazy\" width=\"701\" height=\"581\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMecho_Architecture_change.png\" alt=\"\" class=\"wp-image-472\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMecho_Architecture_change.png 701w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMecho_Architecture_change-300x249.png 300w\" sizes=\"(max-width: 701px) 100vw, 701px\" \/><\/a><\/figure>\n\n\n\n<p>NeoMecha is separated into two main layers, <strong>Logic<\/strong> and <strong>UI<\/strong>. In the UI each button to take an action corresponds to an <strong>Action Generator<\/strong>. When you push a button the <strong>Action Generator<\/strong> generates <strong>Action Options<\/strong> which are then selectable on the <strong>Visual Gameboard<\/strong>. When you select an <strong>Action Option<\/strong> the <strong>Visual Gameboard<\/strong> passes an <strong>Action Choice<\/strong>, created by the <strong>Action Option<\/strong>, to the <strong>Rules Engine<\/strong>. The <strong>Rules Engine<\/strong> then processes the <strong>Action Choice<\/strong> through a series of <strong>Action Processor<\/strong> that change the <strong>Action Choice<\/strong> into a series of commands to be applied to both the <strong>Visual Gameboard<\/strong> and the <strong>Logical Gameboard<\/strong>. The commands are returned in the form of an <strong>Action Result<\/strong>, which is just a list of <strong>Action Groups<\/strong>, which are a list of commands that should be executed at the same time.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMechaActionFlow.png\"><img decoding=\"async\" loading=\"lazy\" width=\"720\" height=\"900\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMechaActionFlow.png\" alt=\"\" class=\"wp-image-473\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMechaActionFlow.png 720w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMechaActionFlow-240x300.png 240w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_NeoMechaActionFlow-614x768.png 614w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/figure>\n\n\n\n<p>Later I plan to refactor the <strong>Action Choices<\/strong> so that they do not have object references and only have Ids. That will make it easy to pass them back and forth between a server and a client. I also need to find a way to organize reactions. Right now they just a bunch of messy If statements.<\/p>\n\n\n\n<p><strong>Middle mouse scroll<\/strong> \u2611<\/p>\n\n\n\n<p>I never really liked how strategy games scroll the when you move your mouse to the edge of the screen. I put that into kind of scrolling into NeoMecha but it too slow. For my own sanity I added the ability to click and scroll with the middle mouse button. I will likely try to make edge scrolling better but for now middle mouse to scroll works much better.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_MiddleMouseButton.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"480\" height=\"272\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_MiddleMouseButton.gif\" alt=\"\" class=\"wp-image-474\"\/><\/a><\/figure>\n\n\n\n<p><strong>Better High\/Mid\/Low Display<\/strong> \u2611<\/p>\n\n\n\n<p>It is extremely difficult to to read the attack style that is used. To make things worse, during a replay the text just stacks on top of each other. In keeping with the Neo in NeoMecha I&#8217;m trying a Cyberpunk style. So, Gave the the attack style a purple background with a neon pink outline and changed the text color to hot pink.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_HighLowPixel.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"480\" height=\"270\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_HighLowPixel.gif\" alt=\"\" class=\"wp-image-475\"\/><\/a><\/figure>\n\n\n\n<p><strong>Better Logo<\/strong> \u2611<\/p>\n\n\n\n<p>After that I got very distracted by making a better logo. As I&#8217;m starting to post about NeoMecha I wanted to have a something more than a placeholder logo.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_LogoOriginal_v1.png\"><img decoding=\"async\" loading=\"lazy\" width=\"512\" height=\"128\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_LogoOriginal_v1.png\" alt=\"\" class=\"wp-image-476\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_LogoOriginal_v1.png 512w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_LogoOriginal_v1-300x75.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><figcaption class=\"wp-element-caption\">The placeholder logo<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v2.png\"><img decoding=\"async\" loading=\"lazy\" width=\"512\" height=\"128\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v2.png\" alt=\"\" class=\"wp-image-477\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v2.png 512w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v2-300x75.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><figcaption class=\"wp-element-caption\">V2<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v3.png\"><img decoding=\"async\" loading=\"lazy\" width=\"512\" height=\"128\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v3.png\" alt=\"\" class=\"wp-image-478\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v3.png 512w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_Logo_v3-300x75.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><figcaption class=\"wp-element-caption\">V3<\/figcaption><\/figure>\n\n\n\n<p><strong>Confrim End Turn<\/strong><\/p>\n\n\n\n<p>One problem the game has, is people hitting &#8220;End Turn&#8221; before they use their reaction points. To try to make this better I added an confirmation dialog box. If you have unspent points when you end your turn, you will be asked if you&#8217;re sure you want to end your turn. Long term I&#8217;d like to change how reactions are set but that is too much work to do at the moment.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_ConfirmEndTurnBasic.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"480\" height=\"269\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_ConfirmEndTurnBasic.gif\" alt=\"\" class=\"wp-image-479\"\/><\/a><\/figure>\n\n\n\n<p>I also added some styling to the dialog box so it doesn&#8217;t look absolutely terrible.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_ConfirmEndTurnTheme.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"480\" height=\"269\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_ConfirmEndTurnTheme.gif\" alt=\"\" class=\"wp-image-480\"\/><\/a><\/figure>\n\n\n\n<p><strong>Fix tile highlighting bug<\/strong> \u2611<\/p>\n\n\n\n<p>Secondary tile highlighting wasn&#8217;t working so I took a look, and yeah, it just had the bad logic.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0-SecondaryTiles-BeforeAfter.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"480\" height=\"269\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0-SecondaryTiles-BeforeAfter.gif\" alt=\"\" class=\"wp-image-481\"\/><\/a><\/figure>\n\n\n\n<p><strong>Logging and Testing<\/strong> \u2611<br><br>Time for some of the less glamorous side of coding, logging and testing. Previously their was a log file but nothing was actually being logged. I started by by adding&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/logging?tabs=command-line#log-scopes\">logging scopes<\/a>&nbsp;to each of the top level Rules Engine functions, then adding a log statement when something actually happened. Like an Action Choice was processed, an Action Command was processed, or check for end of game. This made a turn look like this<\/p>\n\n\n\n<p><code>3-04-18T05:48:12.3698715-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Action Processor: SetDodgeReactionProcessor Processed Choice SetDodgeReactionChoice.&nbsp;<br>2023-04-18T05:48:12.3699577-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Result.&nbsp;<br>2023-04-18T05:48:12.3699852-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Group.&nbsp;<br>2023-04-18T05:48:12.3700175-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command SetDodgeReactionCommand.&nbsp;&nbsp;<br>2023-04-18T05:48:12.3963735-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Checking for End of Game.&nbsp;<\/code><\/p>\n\n\n\n<p>I then added log statements to the GameBoard and MechUnit objects when they changed their state and ended up with a turn looking like this<\/p>\n\n\n\n<p>Move Action<br><code>2023-04-18T05:48:23.8145502-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Action Processor: MoveProcessor Processed Choice MoveChoice.&nbsp;<br>2023-04-18T05:48:23.8146153-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Result.&nbsp;<br>2023-04-18T05:48:23.8146370-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Group.&nbsp;<br>2023-04-18T05:48:23.8146564-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command MoveCommand.&nbsp;<br>2023-04-18T05:48:23.8146890-07:00 [Information]: (Intrepid.TBSRulesEngine.GameObjects.Gameboard) [TakeAction]: Placing game Piece: 32b0ac0d-048d-4715-b932-d8f0acbd4aa9 on Tile: Position { X = 3, Y = 8 }.&nbsp;<br>2023-04-18T05:48:23.8147238-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: 32b0ac0d-048d-4715-b932-d8f0acbd4aa9 Using 1 Action Points, 1 remaining.&nbsp;<br>2023-04-18T05:48:23.8153571-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Checking for End of Game.&nbsp;<\/code><\/p>\n\n\n\n<p>Attack Action<br><code>2023-04-18T05:48:24.4860353-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Action Processor: MeleeAttackProcessor Processed Choice MeleeAttackChoice.&nbsp;<br>2023-04-18T05:48:24.4860951-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Result.&nbsp;<br>2023-04-18T05:48:24.4861181-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Group.&nbsp;<br>2023-04-18T05:48:24.4861438-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command DodgeToCommand.&nbsp;<br>2023-04-18T05:48:24.4863373-07:00 [Information]: (Intrepid.TBSRulesEngine.GameObjects.Gameboard) [TakeAction]: Placing game Piece: 4ef3c6d5-914e-4a51-8598-efb0428721f6 on Tile: Position { X = 2, Y = 7 }.&nbsp;<br>2023-04-18T05:48:24.4863760-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command MeleeAttackCommand.&nbsp;<br>2023-04-18T05:48:24.4866399-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: 32b0ac0d-048d-4715-b932-d8f0acbd4aa9 Using 1 Action Points, 0 remaining.&nbsp;<br>2023-04-18T05:48:24.4895473-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Checking for End of Game.&nbsp;<\/code><\/p>\n\n\n\n<p>Alright enough logging for now, lets move on to testing.<\/p>\n\n\n\n<p>I created several builder classes that let me build &amp; setup a Rules Engine test like this.<br>These builders turned out pretty well.  will probably import them into the main game when I start importing real map data.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer3.png\"><img decoding=\"async\" loading=\"lazy\" width=\"539\" height=\"268\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer3.png\" alt=\"\" class=\"wp-image-483\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer3.png 539w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer3-300x149.png 300w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/a><\/figure>\n\n\n\n<p>A basic test looks like.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer2.png\"><img decoding=\"async\" loading=\"lazy\" width=\"796\" height=\"371\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer2.png\" alt=\"\" class=\"wp-image-484\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer2.png 796w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer2-300x140.png 300w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer2-768x358.png 768w\" sizes=\"(max-width: 796px) 100vw, 796px\" \/><\/a><\/figure>\n\n\n\n<p>And now I have a bit of test coverage.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer.png\"><img decoding=\"async\" loading=\"lazy\" width=\"206\" height=\"421\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer.png\" alt=\"\" class=\"wp-image-485\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer.png 206w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/04\/v0.4.0_TestExplorer-147x300.png 147w\" sizes=\"(max-width: 206px) 100vw, 206px\" \/><\/a><\/figure>\n\n\n\n<p><strong>Quick improvments<\/strong> \u2611<\/p>\n\n\n\n<p>I put in a stop watch to see if the Rules Engine was having issues. It looks like it is preforming pretty good ATM.<\/p>\n\n\n\n<p><code>2023-04-20T22:26:14.3502853-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Action Processor: MeleeAttackProcessor Processed Choice MeleeAttackChoice.&nbsp;<br>2023-04-20T22:26:14.3503662-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Processed Action Choice in 0 ms .&nbsp;<br>2023-04-20T22:26:14.3503873-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Result.&nbsp;<br>2023-04-20T22:26:14.3504076-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applying Action Group.&nbsp;<br>2023-04-20T22:26:14.3504265-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command MeleeAttackCommand.&nbsp;<br>2023-04-20T22:26:14.3504531-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: 29590114-cd33-47ef-8fc5-696f0c3be3eb Using 0 Action Points, 2 remaining.&nbsp;<br>2023-04-20T22:26:14.3504762-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command TakeHitCommand.&nbsp;<br>2023-04-20T22:26:14.3505093-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: 29590114-cd33-47ef-8fc5-696f0c3be3eb Took 10 Damage, 90 HP remaining.&nbsp;<br>2023-04-20T22:26:14.3505308-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command TakeHitCommand.&nbsp;<br>2023-04-20T22:26:14.3505521-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: e830ec65-4279-4a6a-b4c7-486eb289874d Took 0 Damage, 100 HP remaining.&nbsp;<br>2023-04-20T22:26:14.3505715-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command TakeHitCommand.&nbsp;<br>2023-04-20T22:26:14.3506749-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Executing command MeleeAttackCommand.&nbsp;<br>2023-04-20T22:26:14.3507246-07:00 [Information]: (NeoMecha.Rules.GameObjects.MechUnit) [TakeAction]: MechUnit: e830ec65-4279-4a6a-b4c7-486eb289874d Using 1 Action Points, 0 remaining.&nbsp;<br>2023-04-20T22:26:14.3507743-07:00 [Information]: (Intrepid.TBSRulesEngine.RulesEngine) [TakeAction]: Applied Commands in 0 ms.&nbsp;<\/code><\/p>\n\n\n\n<p>I also refactored the GetTilesICanMoveTo function to not use recursion and instead use a while loop. I did this because I want to increase the movement range but the recursive version can have performance issues. The recursive version ran in ~ 9900 ticks just under a millisecond, while the while loop runs in ~ 300 ticks for a 4 tile range. I going to try increasing the  range to 20.<\/p>\n\n\n\n<p><strong>Before<\/strong><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void FindTilesICanMoveTo(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITile curTile,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int range,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref List&lt;ITile&gt; foundTiles)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (range &lt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get up tile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var upPos = Position.Create(curTile.X, curTile.Y - 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HasTile(upPos))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (AddToFoundTilesForMoveTo(GetTile(upPos), ref foundTiles))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindTilesICanMoveTo(GetTile(upPos), range - GetTile(upPos).MovementCost, ref foundTiles);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get Right tile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var rightPos = Position.Create(curTile.X + 1, curTile.Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HasTile(rightPos))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (AddToFoundTilesForMoveTo(GetTile(rightPos), ref foundTiles))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindTilesICanMoveTo(GetTile(rightPos), range - GetTile(rightPos).MovementCost, ref foundTiles);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get Down tile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var downPos = Position.Create(curTile.X, curTile.Y + 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HasTile(downPos))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (AddToFoundTilesForMoveTo(GetTile(downPos), ref foundTiles))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindTilesICanMoveTo(GetTile(downPos), range - GetTile(downPos).MovementCost, ref foundTiles);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Get Left tile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var leftPos = Position.Create(curTile.X - 1, curTile.Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (HasTile(leftPos))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (AddToFoundTilesForMoveTo(GetTile(leftPos), ref foundTiles))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindTilesICanMoveTo(GetTile(leftPos), range - GetTile(leftPos).MovementCost, ref foundTiles);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/code><\/p>\n\n\n\n<p><strong>After<\/strong><\/p>\n\n\n\n<p><code>public void FindTilesICanMoveTo(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITile startTile,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int range,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref List&lt;ITile&gt; foundTiles)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (range &lt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;ITile&gt; nextFrontier = new List&lt;ITile&gt;();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;ITile&gt; frontier = new List&lt;ITile&gt;() { startTile };<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (range &gt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (var tile in frontier)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumerable&lt;ITile&gt; neighbors = GetNeighbors(tile);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (var neighbor in neighbors)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/ If we dont' have it add it to the nextFrontier<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!nextFrontier.Contains(neighbor)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; !foundTiles.Contains(neighbor)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; !neighbor.IsOcupied<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; neighbor.IsTraversable)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextFrontier.Add(neighbor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--range;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frontier = nextFrontier.ToList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foundTiles.AddRange(nextFrontier);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextFrontier.Clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">UI Work<\/h2>\n\n\n\n<p><strong>Buttons Redesign<\/strong> \u2611<\/p>\n\n\n\n<p>As the fisrt step of redesigning the controls the buttons need to be replaced.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_Buttons.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"256\" height=\"256\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_Buttons.gif\" alt=\"\" class=\"wp-image-489\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_WideButtons.gif\"><img decoding=\"async\" loading=\"lazy\" width=\"512\" height=\"256\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_WideButtons.gif\" alt=\"\" class=\"wp-image-490\"\/><\/a><\/figure>\n\n\n\n<p><strong>Console Redesign<\/strong> \u2611<\/p>\n\n\n\n<p>This is what the current console looks like.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign00.png\"><img decoding=\"async\" loading=\"lazy\" width=\"637\" height=\"359\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign00.png\" alt=\"\" class=\"wp-image-491\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign00.png 637w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign00-300x169.png 300w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/a><\/figure>\n\n\n\n<p>This is what the console looks like after replacing the buttons and other graphics without changing the overall layout.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign01.png\"><img decoding=\"async\" loading=\"lazy\" width=\"637\" height=\"361\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign01.png\" alt=\"\" class=\"wp-image-492\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign01.png 637w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign01-300x170.png 300w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/a><\/figure>\n\n\n\n<p>This is what the console looks like after a redesign of the layout.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign02.png\"><img decoding=\"async\" loading=\"lazy\" width=\"638\" height=\"359\" src=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign02.png\" alt=\"\" class=\"wp-image-493\" srcset=\"http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign02.png 638w, http:\/\/fridaynightartwork.com\/randomlyGames\/wp-content\/uploads\/2023\/05\/v0.4.0_ConsoleResign02-300x169.png 300w\" sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/a><\/figure>\n\n\n\n<p>And just so sound is completely neglected I added a sfx to the button.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"v0.4.0 Btn SFX\" width=\"648\" height=\"365\" src=\"https:\/\/www.youtube.com\/embed\/HBxCSe6o1C0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>I think that will be good for v0.4.0. It&#8217;s time to start scoping out v0.5.0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The goal for v0.4.0 is cleaning up some code and redoing some art Remove Command Processors \u2611 The key to make sure development is remains fast is to make sure you have a good Architecture. While writing the various action classes for the new Smoke Action in v0.3.0 I decided that the Command Processor classes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":466,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/pages\/471"}],"collection":[{"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=471"}],"version-history":[{"count":6,"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/pages\/471\/revisions"}],"predecessor-version":[{"id":624,"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/pages\/471\/revisions\/624"}],"up":[{"embeddable":true,"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=\/wp\/v2\/pages\/466"}],"wp:attachment":[{"href":"http:\/\/fridaynightartwork.com\/randomlyGames\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}