{"id":289,"date":"2023-05-19T02:12:59","date_gmt":"2023-05-19T01:12:59","guid":{"rendered":"http:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/?p=289"},"modified":"2023-05-19T02:12:59","modified_gmt":"2023-05-19T01:12:59","slug":"unreal-fundamentals","status":"publish","type":"post","link":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/2023\/05\/19\/unreal-fundamentals\/","title":{"rendered":"Unreal Fundamentals"},"content":{"rendered":"\n<p>My notes for the fundamentals seem to be all over the place but I found my unreal project for it. I&#8217;m going to identify which <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TASK 1<\/h2>\n\n\n\n<p>As a minimum, try and implement:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.Something that moves \u2013 either across the ground or with moving parts like a windmill<\/li>\n\n\n\n<li>2.Something that changes when the player gets near \u2013 a door maybe?<\/li>\n<\/ul>\n\n\n\n<p>As stretch goals, you can try making:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3.Something that spawns other blueprints<\/li>\n\n\n\n<li>4.Something that follows the player<\/li>\n\n\n\n<li>5.Something that changes with user input<\/li>\n<\/ul>\n\n\n\n<p>For the fundamentals, I planned to make elements that I already had in mind for my indie dev game. I&#8217;ve connected the project to github using the built in source control however this apparently isn&#8217;t ideal, and it&#8217;s better to just set up the unreal project as a repository in github after creation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"421\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-36-1024x421.png\" alt=\"\" class=\"wp-image-290\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-36-1024x421.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-36-300x123.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-36-768x316.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-36.png 1133w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>I programmed a mechanic where the player spawns in a projectile on a keybind.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"540\" height=\"131\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-38.png\" alt=\"\" class=\"wp-image-292\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-38.png 540w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-38-300x73.png 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/figure>\n\n\n\n<p>Scrollwheel changes the selected spell used when firing a projectile, using an enumerator to change the selected spell and a select to get the right class when firing.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"942\" height=\"410\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-37.png\" alt=\"\" class=\"wp-image-291\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-37.png 942w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-37-300x131.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-37-768x334.png 768w\" sizes=\"auto, (max-width: 942px) 100vw, 942px\" \/><\/figure>\n\n\n\n<p>Using AI and a navmesh, I&#8217;ve set up an punching bag enemy that follows the player around. When they&#8217;re within a certain distance from the player, a yellow warning light activates. When the enemy is hit with a projectile it stops moving and activates a red light for a few seconds before chasing the player again.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TASK 2:<\/h2>\n\n\n\n<p><br>As a minimum, try and implement:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.A new input for the player \u2013 such as dashing or crouching<\/li>\n\n\n\n<li>2.A new actor that is spawned through the player \u2013 such as a fireball<\/li>\n<\/ul>\n\n\n\n<p>As stretch goals, you can try making:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3.Something that overrides the controls from the player \u2013 such as a remote-controlled missile or a hot air balloon<\/li>\n\n\n\n<li>4.Something that reads an actor\u2019s properties to output different actions \u2013 such as a coin sorter<\/li>\n\n\n\n<li>5.Something that drops \u201cloot\u201d when it\u2019s destroyed \u2013 such as an enemy or a chest<\/li>\n<\/ul>\n\n\n\n<p>For 1. I&#8217;ve made a dash where on input, an impulse is added to give the player a burst of speed in their current movement direction. I didn&#8217;t have the best understanding of movement vector math so I just multiplied the current vector to get a new value. To apply a maximum speed, I check if the new speed is greater than the maximum speed and if is then it will use the maximum speed float instead.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-39-1024x550.png\" alt=\"\" class=\"wp-image-293\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-39-1024x550.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-39-300x161.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-39-768x413.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-39.png 1195w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"331\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-40-1024x331.png\" alt=\"\" class=\"wp-image-294\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-40-1024x331.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-40-300x97.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-40-768x248.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-40.png 1330w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Looking back, A rather silly flaw in this logic is that I&#8217;m comparing the new speed to the max speed, and applying the max speed as the impulse which results in a speed which is higher anyway? I was very silly making this.<\/p>\n\n\n\n<p>2. is already done with the projectile attack.<\/p>\n\n\n\n<p>for 3. I made a spell that the player can control, I haven&#8217;t worked out how handle the rotation and movement that well of the projectile but still, when the spell is cast the a function is called which disables and enables input to player with fed in toggle bool, it&#8217;s called when the spell is cast and again when the spell ends. (This uses delays, it would be much better with timers).<\/p>\n\n\n\n<p>The most recent branch is UniTemporaryDev, I&#8217;ve loaded that now which has the more recent changes.<\/p>\n\n\n\n<p>4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"799\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-41.png\" alt=\"\" class=\"wp-image-295\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-41.png 569w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-41-214x300.png 214w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/figure>\n\n\n\n<p>When the punching bag enemy is hit, it takes the material from that projectile and applies it to itself for the stun duration.<\/p>\n\n\n\n<p>5.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"562\" height=\"586\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-42.png\" alt=\"\" class=\"wp-image-296\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-42.png 562w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-42-288x300.png 288w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/figure>\n\n\n\n<p>When the enemy is stunned, it drops a block of gold that can be picked up and adds to a gold score.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TASK 3<\/h2>\n\n\n\n<p>As a minimum, try and implement:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.Some functions that change the blueprint\u2019s appearance when conditions are met \u2013 such as a timed colour change<\/li>\n\n\n\n<li>2.Some functions that are used as \u201csetters\u201d and \u201cgetters\u201d for other blueprints<\/li>\n<\/ul>\n\n\n\n<p>stretch goals, you can try making:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3.A function that can manage multiple actors \u2013 such as a scale manager for all characters<\/li>\n\n\n\n<li>4.A function that throws away actors that get near it \u2013 such as a bumper car<\/li>\n\n\n\n<li>5. A function that moves actors to and from preset locations \u2013 such as a portal<\/li>\n<\/ul>\n\n\n\n<p>I don&#8217;t have to worry about 1, as this was met when tackling the last task.<br>For the Remainder of the fundamentals, I&#8217;ll start to refer to some aspects of my indie dev game.<\/p>\n\n\n\n<p>For 2, I&#8217;ve got a function that sets the player&#8217;s mana on a timer to regenerate overtime.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"209\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-43-1024x209.png\" alt=\"\" class=\"wp-image-297\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-43-1024x209.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-43-300x61.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-43-768x156.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-43.png 1433w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>For 3, I have a start button where once pressed, it gets all wall actors in the level and starts a timer on each of them.<\/p>\n\n\n\n<p>For 4, I made a brick that does not want to be touched.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"574\" height=\"554\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-51.png\" alt=\"\" class=\"wp-image-305\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-51.png 574w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-51-300x290.png 300w\" sizes=\"auto, (max-width: 574px) 100vw, 574px\" \/><\/figure>\n\n\n\n<p>It has a large sphere collision and on overlap, it drastically raises the actor&#8217;s height<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"881\" height=\"377\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-52.png\" alt=\"\" class=\"wp-image-306\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-52.png 881w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-52-300x128.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-52-768x329.png 768w\" sizes=\"auto, (max-width: 881px) 100vw, 881px\" \/><\/figure>\n\n\n\n<p>for 5, I quickly made two new blueprints, Portal A and portal B<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"394\" height=\"204\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-50.png\" alt=\"\" class=\"wp-image-304\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-50.png 394w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-50-300x155.png 300w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"311\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-48.png\" alt=\"\" class=\"wp-image-302\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-48.png 975w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-48-300x96.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-48-768x245.png 768w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/figure>\n\n\n\n<p>Rather than use a pre-set location, I can easily change the teleport point by moving portal B. There&#8217;s an in-world reference between these two locations for the player. I think this would work better with a cast however in order to have backup code for what happens when that cast fails.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Task 4<\/h2>\n\n\n\n<p>As a minimum, try and implement:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.Something that tracks the player\u2019s health<\/li>\n\n\n\n<li>2.Something that counts down an ability cooldown \u2013 such as jump frequency<\/li>\n<\/ul>\n\n\n\n<p>As stretch goals, you can try making:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3.Something that can change the world \u2013 such as buttons to change the player\u2019s material<\/li>\n\n\n\n<li>4.Something that resets the worldstate \u2013 such as a restart button<\/li>\n\n\n\n<li>5.Something that tracks progress of a goal \u2013 such as a pickup tracker<\/li>\n<\/ul>\n\n\n\n<p>For 1, in my indie dev game I&#8217;ve got health + maxhealth floats set up on the player character, it can be tracked visually on the player&#8217;s HUD.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"784\" height=\"141\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-44.png\" alt=\"\" class=\"wp-image-298\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-44.png 784w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-44-300x54.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-44-768x138.png 768w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><\/figure>\n\n\n\n<p>For 2, my indie dev game also features a dash ability programmed difficulty with a do-once limit that resets after a delay.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"176\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-45-1024x176.png\" alt=\"\" class=\"wp-image-299\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-45-1024x176.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-45-300x52.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-45-768x132.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-45.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>I&#8217;m not sure but for 3, I think the walls may count for this as the walls are part of the game environment and the start button triggers a function for all of them.<\/p>\n\n\n\n<p>4, My indie dev game features a restart when the player dies.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"244\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-46-1024x244.png\" alt=\"\" class=\"wp-image-300\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-46-1024x244.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-46-300x71.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-46-768x183.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-46.png 1320w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"588\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-53-1024x588.png\" alt=\"\" class=\"wp-image-307\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-53-1024x588.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-53-300x172.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-53-768x441.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-53.png 1441w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>5. indie dev game is also tracking gold, xp and score earned from killing enemies as well as a depth gauge alternative to a timer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"583\" height=\"370\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-54.png\" alt=\"\" class=\"wp-image-308\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-54.png 583w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2023\/05\/image-54-300x190.png 300w\" sizes=\"auto, (max-width: 583px) 100vw, 583px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>My notes for the fundamentals seem to be all over the place but I found my unreal project for it. I&#8217;m going to identify which TASK 1 As a minimum, try and implement: As stretch goals, you can try making: For the fundamentals, I planned to make elements that I already had in mind for&hellip; <a class=\"more-link\" href=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/2023\/05\/19\/unreal-fundamentals\/\">Continue reading <span class=\"screen-reader-text\">Unreal Fundamentals<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-289","post","type-post","status-publish","format-standard","hentry","category-uncategorised","entry"],"_links":{"self":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=289"}],"version-history":[{"count":1,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions"}],"predecessor-version":[{"id":309,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions\/309"}],"wp:attachment":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}