{"id":272,"date":"2022-09-26T09:42:35","date_gmt":"2022-09-26T09:42:35","guid":{"rendered":"https:\/\/blogs.scummvm.org\/quote58\/?p=272"},"modified":"2022-09-26T09:42:35","modified_gmt":"2022-09-26T09:42:35","slug":"gsoc-final-report","status":"publish","type":"post","link":"https:\/\/blogs.scummvm.org\/quote58\/2022\/09\/26\/gsoc-final-report\/","title":{"rendered":"GSoC Final Report"},"content":{"rendered":"<h2>Welcome!<\/h2>\n<p>Google Summer of Code 2022 has now ended, so this post will wrap up everything that&#8217;s been done and what is left to do.<\/p>\n<p>The branch of my repository with the latest code for The Immortal can be found here: <a href=\"https:\/\/github.com\/Quote58\/scummvm\/tree\/immortal\/engines\/immortal\">https:\/\/github.com\/Quote58\/scummvm\/tree\/immortal\/engines\/immortal<\/a><\/p>\n<hr \/>\n<h2>What has been done<\/h2>\n<h3>&#8211; Initial analysis of the source code and ScummVM engine skeleton [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/06\/13\/game-versions-file-systems-and-the-next-step\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/3638187936d825ca2857dd1279e8202c0c9696f7\">relevant commit<\/a>]<\/h3>\n<p>The original plan was to continue the implementation started in a previous GSoC for the DOS version of the game, however after taking a look through the source code for each version and discussing it with my mentor, the plan changed and I began work on implementing the Apple IIGS version instead.<\/p>\n<h3>&#8211; Support for ProDOS with Common::Archive [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/06\/20\/prodos-file-system\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/e5e59f8cc02ff8725e0df8506dd75279569c98be\">relevant commit<\/a>]<\/h3>\n<p>The first challenge that presented itself when I began work on the Apple IIGS version was the file format for the game itself. The Immortal was originally packaged as ProDOS disks, which was an issue because ScummVM did not have support for reading this file format at all. Adding support required learning about and understanding the way ProDOS files work, \u00a0and experimenting until I had code that could parse the entire disk and list the files within. Once it was possible to get and return files from the disk with a file name, I was encouraged to integrate this with the Common::Archive class in ScummVM, and proceeded to do so.<\/p>\n<h3>&#8211; Compression Routines [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/06\/27\/translating-assembly\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/314e9fc04db8cdf3ab2fc3dd422a53f887768cb4\">relevant commit<\/a>]<\/h3>\n<p>Once the file could be read by the engine, I decided to begin by tackling something that looked fairly self contained. The compression\/decompression routines did not seem to be tied in to any other functions within the engine, and so could serve as a way to get comfortable with what I would be doing in the rest of the engine, through something with a clear purpose and input\/output. In the linked post, I talk about the process of beginning to translate the assembly of the engine into C++, with the compression routines as the example.<\/p>\n<h3>&#8211; Initial engine and subsystem skeletons [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/07\/18\/weekly-update-more-structure\/\">relevant pos<\/a>t] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/d15bd054cf985250a32b43b705072a50dbe07e14\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-90\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM.png\" alt=\"\" width=\"267\" height=\"326\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM.png 1704w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-246x300.png 246w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-838x1024.png 838w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-768x938.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-1257x1536.png 1257w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-1676x2048.png 1676w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Screen-Shot-2022-07-11-at-1.02.35-AM-1568x1916.png 1568w\" sizes=\"auto, (max-width: 267px) 100vw, 267px\" \/><\/p>\n<p>After the compression functions were written, the next step was to start analyzing the files in the engine and begin to understand the main path of the game logic, the connections between different files, and ultimately create the initial engine skeletons. This meant creating the outline of immortal.cpp, kernal.cpp, and logic.cpp, and creating the necessary function stubs for everything along the way.<\/p>\n<h3>&#8211; Palette processing [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/07\/04\/one-bit-two-bit-red-bit-blue-bit\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/d15bd054cf985250a32b43b705072a50dbe07e14#diff-ce1fd2856bc24ecff0430631dde10b66f9fe36470c8867168da44ac225a19022\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-75\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/07\/Jul-03-2022-19-21-27.gif\" alt=\"\" width=\"320\" height=\"206\" \/><\/p>\n<p>While creating the skeleton for kernal.cpp, I decided to implement the main palette processing functions. There are not too many functions related to this, and it was a core component of the engine, so I felt it was good to implement along the way. It also served as an example of how the assembly code makes heavy use of bit manipulation and interesting math\/programming principles.<\/p>\n<h3>&#8211; Scope and engine outline [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/07\/28\/conceptualizing-the-game-engine\/\">relevant post<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-175\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM.png\" alt=\"\" width=\"319\" height=\"269\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM.png 2148w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-300x253.png 300w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-1024x864.png 1024w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-768x648.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-1536x1296.png 1536w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-2048x1728.png 2048w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-16-at-12.13.53-AM-1568x1323.png 1568w\" sizes=\"auto, (max-width: 319px) 100vw, 319px\" \/><\/p>\n<p>One part of translating the engine that took some time to get sorted out, was the general structure of the engine itself. It isn&#8217;t initially clear how each component of the engine relates to each other, but it is important for knowing how to structure the translation, what data types to choose, how to manage scope, etc. The linked post goes over the entire process of sorting through the files and determining the general scope and relation of each component in terms of &#8216;layers&#8217; in the engine. This was important for the translation going forward, as it could inform decisions about how each new component that was translated related to the whole engine.<\/p>\n<h3>&#8211; Story subsystem [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/08\/09\/weekly-update-story-time\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/962fb50754b9bc129b90f1896870a6f285bbcb39#diff-54f9b3ce711fff121da7a76baf3fe5477ad5515568f037a2f35e02cc3fb22c86\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-165\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM.png\" alt=\"\" width=\"183\" height=\"309\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM.png 1316w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM-178x300.png 178w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM-607x1024.png 607w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM-768x1296.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM-911x1536.png 911w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/Screen-Shot-2022-08-09-at-5.00.19-AM-1214x2048.png 1214w\" sizes=\"auto, (max-width: 183px) 100vw, 183px\" \/><\/p>\n<p>The &#8216;story&#8217; subsystem in the game is crucial, as it defines many of the important aspects of each level of the game. It defines what and where the objects, enemies, and more are in each level, as well as the dialog strings, the sprite animations, and more. The way it is implemented in the source code is unusual, and the linked post goes into detail about it.<\/p>\n<h3>&#8211; Cycles [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/08\/22\/weekly-update-seg-faulty-code\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/876dbd674920b0145f302396757061bcd512da9e\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-200\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real.png\" alt=\"\" width=\"459\" height=\"278\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real.png 1798w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real-300x182.png 300w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real-1024x621.png 1024w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real-768x466.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real-1536x931.png 1536w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/08\/What-is-a-Cycle-for-real-1568x951.png 1568w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/p>\n<p>&#8216;Cycles&#8217; are the way that this engine handles sprite animations, and the linked post goes over the oddities with them.<\/p>\n<h3>&#8211; Flameset [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/6966f0d20d6c42246c6a8a5b0ca49f69ec31c4c4\">relevant commit<\/a>]<\/h3>\n<p>&#8216;Flamesets&#8217; are the torches that you find on the walls in each level. They are not objects or enemies, but are in fact their own little subsystem consisting of a sprite cycle, and code for interacting with fireballs, and even dimming the screen when they are &#8216;off&#8217;.<\/p>\n<h3>&#8211; Sprite rendering [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/09\/13\/weekly-update-draw-me-like-one-of-your-french-wizards\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/d7ddd28085dfabde517d8593849f4d34b16d7015\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-250\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/sprites.gif\" alt=\"\" width=\"325\" height=\"214\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-217\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM.png\" alt=\"\" width=\"331\" height=\"212\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM.png 3178w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-300x192.png 300w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-1024x655.png 1024w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-768x491.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-1536x982.png 1536w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-2048x1309.png 2048w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-02-at-4.11.04-AM-1568x1003.png 1568w\" sizes=\"auto, (max-width: 331px) 100vw, 331px\" \/><\/p>\n<p>Sprite rendering involved many different subsystems and took some time. This is because the method for preparing and drawing sprites is a bit unusual, and translating it accurately was a challenge. The post goes into detail about some aspects, but there are several others throughout which detail the process of understanding them.<\/p>\n<h3>&#8211; Text parsing and printing [<a href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/09\/20\/weekly-update-text-rendering\/\">relevant post<\/a>] [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/8aea3a253e14c0102006853082f1109a098ad44a\">relevant commit<\/a>]<\/h3>\n<h3><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-257\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Sep-19-2022_06-01-51.gif\" alt=\"\" width=\"326\" height=\"204\" \/><\/h3>\n<h3>&#8211; Hit gauge [<a href=\"https:\/\/github.com\/Quote58\/scummvm\/commit\/026becabf769dd82d874ec6ff639191b9089b6e4\">relevant commit<\/a>]<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-244\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-10.32.02-PM.png\" alt=\"\" width=\"327\" height=\"108\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-10.32.02-PM.png 1040w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-10.32.02-PM-300x99.png 300w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-10.32.02-PM-1024x339.png 1024w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-10.32.02-PM-768x254.png 768w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/p>\n<p>This acts as the wizard&#8217;s health bar in the game, and is drawn with sprites from the font sprite sheet.<\/p>\n<h3>&#8211; Implemented many functions for Kernal, Logic, Level, Room, Sprites, and more, creating the skeleton of the engine in a way that supports a continued, accurate translation<\/h3>\n<hr \/>\n<h2>What is left to do<\/h2>\n<p>I had hoped to have some of the map drawing in time for this post, but unfortunately the map data is stored in multiple file types (.CNM and .UNV) which require unpacking and processing before they are usable, and the formats are specific to the Apple IIGS version of the game. I am working on it, but it will take more time to decipher.<\/p>\n<ul>\n<li>Drawing level data from maze files with drawchr (requires deciphering the .CNM and .UNV files)<\/li>\n<li>Implementing an input layer through ScummVM (the engine code currently references &#8216;actions&#8217; and has function stubs that are called for input, but functions for getting input from ScummVM need to be written)<\/li>\n<li>Object and Monster subsystems<\/li>\n<li>Music and sound implementation<\/li>\n<li>Filling out the rest of the static and dynamic story entries (the first level is written out and the structure is there, it just needs the data for the other levels to be written out) (the static data for Str and Cyc are included, but Motive, Program, and ObjType still need to be written out)<\/li>\n<li>Filling out remaining functions in kernal.cpp, logic.cpp, level.cpp, and room.cpp<\/li>\n<li>Implementing motives, pickups, and other object\/enemy structures and their related functions<\/li>\n<\/ul>\n<hr \/>\n<h2>Conclusion<\/h2>\n<p>My time with Google Summer of Code 2022 has been wonderful, and in some ways I am sad for it to be over. However I am also grateful to have been a part of it this year, as I have learned a lot and have gotten to contribute to something I think is meaningful. ScummVM is a great program, and a great community.<\/p>\n<p>I was hesitant at first about making these blog posts, but I ended up enjoying and learning from them. It allowed me to strengthen my understanding of the code and concepts at hand, and it served as a good organizational tool, allowing me to keep track of progress each week.<\/p>\n<p>I will continue to work on The Immortal, building from I have done the past few months towards a complete implementation of the game. And if possible I will continue to update this blog with progress.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Lastly, I want to say <strong>Thank you<\/strong>. To\u00a0Google and ScummVM for this opportunity, to my mentor Criezy for the advice and code reviews, to Sev and all the other ScummVM members that helped me (especially with Git!), to my brother for pushing me to apply for GSoC in the first place as well as his support and help along the way, and to anyone that has read any or all of these blog posts or simply followed the progress in any number of ways. I am truly grateful to all of you for this past summer.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-239\" src=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM.png\" alt=\"\" width=\"582\" height=\"377\" srcset=\"https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM.png 2486w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-300x194.png 300w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-1024x663.png 1024w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-768x497.png 768w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-1536x995.png 1536w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-2048x1326.png 2048w, https:\/\/blogs.scummvm.org\/quote58\/wp-content\/uploads\/sites\/54\/2022\/09\/Screen-Shot-2022-09-12-at-5.25.12-AM-1568x1015.png 1568w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome! Google Summer of Code 2022 has now ended, so this post will wrap up everything that&#8217;s been done and what is left to do. The branch of my repository with the latest code for The Immortal can be found here: https:\/\/github.com\/Quote58\/scummvm\/tree\/immortal\/engines\/immortal What has been done &#8211; Initial analysis of the source code and ScummVM&hellip; <a class=\"more-link\" href=\"https:\/\/blogs.scummvm.org\/quote58\/2022\/09\/26\/gsoc-final-report\/\">Continue reading <span class=\"screen-reader-text\">GSoC Final Report<\/span><\/a><\/p>\n","protected":false},"author":14,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-272","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry"],"_links":{"self":[{"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/posts\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":16,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":288,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/posts\/272\/revisions\/288"}],"wp:attachment":[{"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/media?parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/categories?post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/quote58\/wp-json\/wp\/v2\/tags?post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}