[{"data":1,"prerenderedAt":1022},["ShallowReactive",2],{"article-the-adventure-pals-porting-to-console-via-unity-part-1":3,"related-the-adventure-pals-porting-to-console-via-unity-part-1":636},{"metadata":4,"sys":7,"fields":28},{"tags":5,"concepts":6},[],[],{"space":8,"id":13,"type":14,"createdAt":15,"updatedAt":16,"environment":17,"publishedVersion":21,"revision":22,"contentType":23,"locale":27},{"sys":9},{"type":10,"linkType":11,"id":12},"Link","Space","i9kiyzrddw2a","1mI36T5FLd6JIUaRKalN4D","Entry","2020-01-22T14:57:34.976Z","2020-01-27T02:01:23.184Z",{"sys":18},{"id":19,"type":10,"linkType":20},"master","Environment",66,4,{"sys":24},{"type":10,"linkType":25,"id":26},"ContentType","article","en-US",{"title":29,"slug":30,"banner":31,"content":56,"excerpt":634,"category":635},"The Adventure Pals - Porting To Console - Part 1","the-adventure-pals-porting-to-console-via-unity-part-1",{"metadata":32,"sys":35,"fields":45},{"tags":33,"concepts":34},[],[],{"space":36,"id":38,"type":39,"createdAt":40,"updatedAt":40,"environment":41,"publishedVersion":43,"revision":44,"locale":27},{"sys":37},{"type":10,"linkType":11,"id":12},"1P2vNN7LjWmUAV660KzwqR","Asset","2020-01-22T14:52:59.544Z",{"sys":42},{"id":19,"type":10,"linkType":20},19,1,{"title":46,"file":47},"The Adventure Pals Porting Part 1",{"url":48,"details":49,"fileName":54,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F1P2vNN7LjWmUAV660KzwqR\u002F2e9e79f82568ab8381722e9431c07920\u002Ftap-article.png",{"size":50,"image":51},235043,{"width":52,"height":53},500,391,"tap-article.png","image\u002Fpng",{"data":57,"content":58,"nodeType":633},{},[59,85,102,121,128,135,142,149,155,163,181,207,213,220,249,256,263,269,276,295,302,309,323,336,343,350,357,380,386,393,400,409,416,423,439,446,469,475,500,507,515,522,529,537,568,575,594,610,617,625],{"data":60,"content":61,"nodeType":84},{},[62],{"data":63,"content":64,"nodeType":83},{},[65,70,79],{"data":66,"marks":67,"value":68,"nodeType":69},{},[],"This article was written by Matthew Tighe and originally published on the Do Games site, which can be found ","text",{"data":71,"content":73,"nodeType":78},{"uri":72},"https:\u002F\u002Fdo-games.com\u002Fblog\u002Fthe-adventure-pals-console-tech-part1",[74],{"data":75,"marks":76,"value":77,"nodeType":69},{},[],"here","hyperlink",{"data":80,"marks":81,"value":82,"nodeType":69},{},[],".","paragraph","blockquote",{"data":86,"content":87,"nodeType":83},{},[88,92,98],{"data":89,"marks":90,"value":91,"nodeType":69},{},[],"The Adventure Pals was released in April 2018.  In this series of technical articles Matt will discuss how the existing game written in Haxe\u002FOpenFL, was ported to Playstation 4, Xbox One and Switch using the somewhat unusual approach of going ",{"data":93,"marks":94,"value":97,"nodeType":69},{},[95],{"type":96},"italic","via",{"data":99,"marks":100,"value":101,"nodeType":69},{},[]," Unity. Matt will cover the general approach and dive into some of the technical detail and interesting challenges that popped up along the way including the bizarre “giant tree mode”!\n",{"data":103,"content":104,"nodeType":83},{},[105,109,117],{"data":106,"marks":107,"value":108,"nodeType":69},{},[],"While the game took ",{"data":110,"content":112,"nodeType":78},{"uri":111},"http:\u002F\u002Fmassivemonster.co\u002F",[113],{"data":114,"marks":115,"value":116,"nodeType":69},{},[],"Massive Monster",{"data":118,"marks":119,"value":120,"nodeType":69},{},[]," several years to develop from start to finish, the Unity and console conversion work started in January 2017 where it ran alongside the final game development and was finished in April 2018 when the game launched.",{"data":122,"content":123,"nodeType":83},{},[124],{"data":125,"marks":126,"value":127,"nodeType":69},{},[],"There were over 192 commits spanning 150+ man days of effort over this period and representing a significant contribution to the project - not simply a “porting” task.  All releases of the game use our Unity conversion and optimisation with further work applied to target Microsoft Xbox One, Nintendo Switch and Sony PS4 and to pass certification. ",{"data":129,"content":130,"nodeType":83},{},[131],{"data":132,"marks":133,"value":134,"nodeType":69},{},[],"So let’s get started at the beginning…",{"data":136,"content":137,"nodeType":83},{},[138],{"data":139,"marks":140,"value":141,"nodeType":69},{},[],"",{"data":143,"content":144,"nodeType":83},{},[145],{"data":146,"marks":147,"value":148,"nodeType":69},{},[],"Sometime in mid 2016, Jay from Massive Monster got back in contact with me to revive a discussion we’d had a year or so before about using Unity to bring an existing title to console.  The concept centered around the fact that Haxe could be cross compiled into C# and I’d had some experience cross compiling games many years back during the dawn of the mobile games industry.",{"data":150,"content":151,"nodeType":83},{},[152],{"data":153,"marks":154,"value":141,"nodeType":69},{},[],{"data":156,"content":157,"nodeType":162},{},[158],{"data":159,"marks":160,"value":161,"nodeType":69},{},[],"Haxe, OpenFL and Lime","heading-2",{"data":164,"content":165,"nodeType":83},{},[166,169,177],{"data":167,"marks":168,"value":141,"nodeType":69},{},[],{"data":170,"content":172,"nodeType":78},{"uri":171},"https:\u002F\u002Fhaxe.org\u002F",[173],{"data":174,"marks":175,"value":176,"nodeType":69},{},[],"Haxe",{"data":178,"marks":179,"value":180,"nodeType":69},{},[]," refers to itself as “The Cross platform Toolkit”.  This includes - the Haxe programming language, cross compiler, standard library and tools to allow developers to write applications or games in a nice, modern language which is then cross-compiled to each platform’s language de-riguer; allowing excellent performance with no overhead from a virtual machine.",{"data":182,"content":205,"nodeType":206},{"target":183},{"metadata":184,"sys":187,"fields":195},{"tags":185,"concepts":186},[],[],{"space":188,"id":190,"type":39,"createdAt":191,"updatedAt":191,"environment":192,"publishedVersion":194,"revision":44,"locale":27},{"sys":189},{"type":10,"linkType":11,"id":12},"4yES2iEMt6PgZhNCX5lKRs","2020-01-22T14:54:06.423Z",{"sys":193},{"id":19,"type":10,"linkType":20},11,{"title":196,"file":197},"HAXE The Cross platform Toolkit",{"url":198,"details":199,"fileName":204,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F4yES2iEMt6PgZhNCX5lKRs\u002Fd32c91a34abeb5bc126885eefd4d48a5\u002Fimage.png",{"size":200,"image":201},11730,{"width":202,"height":203},300,384,"image.png",[],"embedded-asset-block",{"data":208,"content":209,"nodeType":83},{},[210],{"data":211,"marks":212,"value":141,"nodeType":69},{},[],{"data":214,"content":215,"nodeType":83},{},[216],{"data":217,"marks":218,"value":219,"nodeType":69},{},[],"But Haxe by itself doesn’t include everything needed to write a game, you also need rendering, I\u002FO etc.  This is where OpenFL and Lime come in.",{"data":221,"content":222,"nodeType":83},{},[223,226,234,238,246],{"data":224,"marks":225,"value":141,"nodeType":69},{},[],{"data":227,"content":229,"nodeType":78},{"uri":228},"https:\u002F\u002Fwww.openfl.org\u002F",[230],{"data":231,"marks":232,"value":233,"nodeType":69},{},[],"OpenFL",{"data":235,"marks":236,"value":237,"nodeType":69},{},[]," is a framework for Haxe which mirrors the Adobe Flash API.  Therefore Haxe\u002FOpenFL is a very popular combination for developers migrating away from Flash, as Massive Monster were with The Adventure Pals.  It’s also a great cross platform framework for building new games.  One of the most notable titles in the recent times being ",{"data":239,"content":241,"nodeType":78},{"uri":240},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPapers,_Please",[242],{"data":243,"marks":244,"value":245,"nodeType":69},{},[],"Papers Please by Lukas Pope",{"data":247,"marks":248,"value":82,"nodeType":69},{},[],{"data":250,"content":251,"nodeType":83},{},[252],{"data":253,"marks":254,"value":255,"nodeType":69},{},[],"OpenFL actually uses a library called Lime to abstract the platform specific functionality.  Rendering, timers, I\u002FO etc.",{"data":257,"content":258,"nodeType":83},{},[259],{"data":260,"marks":261,"value":262,"nodeType":69},{},[],"Given this stack was designed to be portable in the first place, we started off attempting to port this to Unity as a target.  After a few weeks it became clear this was a pretty big task.  Most games tend to use a very specific subset of any platform and to get even basic things working we were having to port large chunks of related but unused functionality just to get simple things running.  Eventually that approach would probably reach a critical mass - but we didn’t have that long.  So a different approach was needed.",{"data":264,"content":265,"nodeType":83},{},[266],{"data":267,"marks":268,"value":141,"nodeType":69},{},[],{"data":270,"content":271,"nodeType":162},{},[272],{"data":273,"marks":274,"value":275,"nodeType":69},{},[],"The Right Abstractions",{"data":277,"content":278,"nodeType":83},{},[279,283,291],{"data":280,"marks":281,"value":282,"nodeType":69},{},[],"Many years previous to all this. I had worked at leading UK independent mobile games studio ",{"data":284,"content":286,"nodeType":78},{"uri":285},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIOMO",[287],{"data":288,"marks":289,"value":290,"nodeType":69},{},[],"IOMO",{"data":292,"marks":293,"value":294,"nodeType":69},{},[],".  As well as writing all our racing games (a topic for another time) I ended up leading the development of the porting framework we used to allow us to write high quality titles across the then diverse range of Java J2ME handsets.",{"data":296,"content":297,"nodeType":83},{},[298],{"data":299,"marks":300,"value":301,"nodeType":69},{},[],"At the time we were actually starting to expanding beyond J2ME devices to platforms requiring C++ or C# and one of our sister companies supplied a Java->C cross compiler.  There were no mature cross-platform rendering layers suitable for the performance constraints of mobile at the time.  Typically therefore, there was significant difference in how each game rendered for ultimate performance. ",{"data":303,"content":304,"nodeType":83},{},[305],{"data":306,"marks":307,"value":308,"nodeType":69},{},[],"To accommodate this, the “platform” abstraction I designed was actually split into 2 levels:",{"data":310,"content":311,"nodeType":83},{},[312,319],{"data":313,"marks":314,"value":318,"nodeType":69},{},[315,316],{"type":96},{"type":317},"bold","Core functions",{"data":320,"marks":321,"value":322,"nodeType":69},{},[]," shared by all games which we called “The Framework” e.g. app life-cycle, resource handling, localisation.",{"data":324,"content":325,"nodeType":83},{},[326,332],{"data":327,"marks":328,"value":331,"nodeType":69},{},[329,330],{"type":96},{"type":317},"Game specific functions",{"data":333,"marks":334,"value":335,"nodeType":69},{},[],", usually dominated by rendering but covering some other areas.",{"data":337,"content":338,"nodeType":83},{},[339],{"data":340,"marks":341,"value":342,"nodeType":69},{},[],"The game logic was then cross compiled from Java to C++ using the platform specific underlying layers.",{"data":344,"content":345,"nodeType":83},{},[346],{"data":347,"marks":348,"value":349,"nodeType":69},{},[],"The Adventure Pals was no different to our Java games of the time in that the majority of the game was implemented on top of a core set of game specific functions, which if converted would allow us to port the game with a fraction of the effort.",{"data":351,"content":352,"nodeType":83},{},[353],{"data":354,"marks":355,"value":356,"nodeType":69},{},[],"Given we’d demonstrated the cross compiler of Haxe, all we had to do was resurrect this approach and port the game specific rendering functions to Unity and we’d hopefully start to see some output!",{"data":358,"content":379,"nodeType":206},{"target":359},{"metadata":360,"sys":363,"fields":371},{"tags":361,"concepts":362},[],[],{"space":364,"id":366,"type":39,"createdAt":367,"updatedAt":367,"environment":368,"publishedVersion":370,"revision":44,"locale":27},{"sys":365},{"type":10,"linkType":11,"id":12},"6LSyPMPaxb5exJhgSkGV1u","2020-01-22T14:55:04.977Z",{"sys":369},{"id":19,"type":10,"linkType":20},21,{"title":372,"file":373},"HAXE Unify Adventure Pals Stack",{"url":374,"details":375,"fileName":204,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F6LSyPMPaxb5exJhgSkGV1u\u002Ff6926dc9bf2253a82f64e89eb8737309\u002Fimage.png",{"size":376,"image":377},23939,{"width":52,"height":378},339,[],{"data":381,"content":382,"nodeType":83},{},[383],{"data":384,"marks":385,"value":141,"nodeType":69},{},[],{"data":387,"content":388,"nodeType":162},{},[389],{"data":390,"marks":391,"value":392,"nodeType":69},{},[],"Proof of Concept",{"data":394,"content":395,"nodeType":83},{},[396],{"data":397,"marks":398,"value":399,"nodeType":69},{},[],"The initial rough proof of concept was created as:",{"data":401,"content":402,"nodeType":83},{},[403],{"data":404,"marks":405,"value":408,"nodeType":69},{},[406],{"type":407},"code","class Game {\n  private var sprite:Sprite;\n  private var movie:Movie;\n  private var speed:Int;\n        \n  public function new() {\n    speed = 5;\n    sprite = new Sprite();\n    movie = new Movie();\n  }\n\n  public function Update():Void {\n    sprite.x += speed;\n    if(sprite.x > 160.0 || sprite.x \u003C -160.0) {\n      speed = 0-speed;\n    }\n    sprite.Update();\n  }\n}",{"data":410,"content":411,"nodeType":83},{},[412],{"data":413,"marks":414,"value":415,"nodeType":69},{},[],"The extremely basic Haxe app above, bounced a single sprite around the screen with a movie as a background.",{"data":417,"content":418,"nodeType":83},{},[419],{"data":420,"marks":421,"value":422,"nodeType":69},{},[],"The Haxe Cross Compiler then did most of the hard work with the main “game logic” file being output in C# very easily.",{"data":424,"content":425,"nodeType":83},{},[426,430,435],{"data":427,"marks":428,"value":429,"nodeType":69},{},[],"In a Unity scene a C# script re-implemented the sprite plotting function, this time actually updating a simple 2D Sprite in the Scene.  A further C# script served to bootstrap everything and call the apps ",{"data":431,"marks":432,"value":434,"nodeType":69},{},[433],{"type":317},"Update()",{"data":436,"marks":437,"value":438,"nodeType":69},{},[]," function each frame.",{"data":440,"content":441,"nodeType":83},{},[442],{"data":443,"marks":444,"value":445,"nodeType":69},{},[],"Original screenshot of the proof of concept running in Unity, notice that the sprites are actually present in the retained scene graph, something we’ll discuss further in a later article.",{"data":447,"content":468,"nodeType":206},{"target":448},{"metadata":449,"sys":452,"fields":460},{"tags":450,"concepts":451},[],[],{"space":453,"id":455,"type":39,"createdAt":456,"updatedAt":456,"environment":457,"publishedVersion":459,"revision":44,"locale":27},{"sys":454},{"type":10,"linkType":11,"id":12},"3WNodcAXNW1kz57cQi9kwn","2020-01-22T14:55:54.025Z",{"sys":458},{"id":19,"type":10,"linkType":20},28,{"title":461,"description":461,"file":462},"UNIFY Proof of Concept For Porting The Adventure Pals",{"url":463,"details":464,"fileName":204,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F3WNodcAXNW1kz57cQi9kwn\u002F0dcb98f429afaa82710c253c030f5e51\u002Fimage.png",{"size":465,"image":466},212324,{"width":52,"height":467},414,[],{"data":470,"content":471,"nodeType":83},{},[472],{"data":473,"marks":474,"value":141,"nodeType":69},{},[],{"data":476,"content":477,"nodeType":83},{},[478,482,487,491,496],{"data":479,"marks":480,"value":481,"nodeType":69},{},[],"This was all very straightforward, the cross-compiled Haxe could access functions defined directly in Unity C# by using an ",{"data":483,"marks":484,"value":486,"nodeType":69},{},[485],{"type":317},"extern",{"data":488,"marks":489,"value":490,"nodeType":69},{},[]," class defined with the ",{"data":492,"marks":493,"value":495,"nodeType":69},{},[494],{"type":317},"@native",{"data":497,"marks":498,"value":499,"nodeType":69},{},[]," annotation.",{"data":501,"content":502,"nodeType":83},{},[503],{"data":504,"marks":505,"value":506,"nodeType":69},{},[],"You could either create these classes to expose existing UnityEngine methods to Haxe or to expose custom written C# and we ended up using a mix of both for various reasons.  The example above shows a Haxe interface to the Unity Spine implementation.  Notice that Haxe defaults to double-precision floats so the Single type is equivalent to C# Float.",{"data":508,"content":509,"nodeType":83},{},[510],{"data":511,"marks":512,"value":514,"nodeType":69},{},[513],{"type":407},"@:native(\"UnitySpine\") extern class UnitySpine extends Object {\n    function new(dataAssetName:String, x:Single, y:Single, parent:GameObject):Void;\n    function SetAnimation(mix:Int, anim:String, loop:Bool ):Void;\n    function AddAnimation (mix:Int, anim:String, loop:Bool, delay:Int):Void;\n    function setBonePosition(_name:String, x:Single, y:Single):Void;\n    function setPosition(x:Single, y:Single, sx:Single, sy:Single):Void;\n    function setLayerOrder(layerOrder:Int, z:Single):Void;\n    ...\n    ...\n}",{"data":516,"content":517,"nodeType":162},{},[518],{"data":519,"marks":520,"value":521,"nodeType":69},{},[],"The First Run",{"data":523,"content":524,"nodeType":83},{},[525],{"data":526,"marks":527,"value":528,"nodeType":69},{},[],"The next stage was to get the entire set of source code for the game to compile and “run” in Unity.  This was a laborious task, implementing stubs for all the elements which would need to be ported to Unity and slowly fixing bugs until the code would compile completely.  A few debug trace calls were added to the main Haxe game loop to allow a measure of “success”:",{"data":530,"content":531,"nodeType":83},{},[532],{"data":533,"marks":534,"value":536,"nodeType":69},{},[535],{"type":407},"Main.hx: The Adventure Pals - Unity Game - Version 0.0.1Title.hx: start() called",{"data":538,"content":539,"nodeType":83},{},[540,544,552,556,564],{"data":541,"marks":542,"value":543,"nodeType":69},{},[],"All of the initial port to Unity was done on an Mac OS X machine.  The Haxe code itself did require some modifications to make it more suitable to port.  An editor with good refactoring support is a must here.  At the time the only real option for OS X was an old version of ",{"data":545,"content":547,"nodeType":78},{"uri":546},"https:\u002F\u002Fwww.jetbrains.com\u002Fidea\u002F",[548],{"data":549,"marks":550,"value":551,"nodeType":69},{},[],"IntelliJ IDEA",{"data":553,"marks":554,"value":555,"nodeType":69},{},[]," and an outdated plugin.  However now it seems that the ",{"data":557,"content":559,"nodeType":78},{"uri":558},"https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F6873-haxe-toolkit-support",[560],{"data":561,"marks":562,"value":563,"nodeType":69},{},[],"Haxe plugin ",{"data":565,"marks":566,"value":567,"nodeType":69},{},[],"has good support for current versions.\n",{"data":569,"content":570,"nodeType":162},{},[571],{"data":572,"marks":573,"value":574,"nodeType":69},{},[],"Esoteric Spine",{"data":576,"content":577,"nodeType":83},{},[578,582,590],{"data":579,"marks":580,"value":581,"nodeType":69},{},[],"The final thing to fall into place was that The Adventure Pals was written using ",{"data":583,"content":585,"nodeType":78},{"uri":584},"http:\u002F\u002Fesotericsoftware.com\u002F",[586],{"data":587,"marks":588,"value":589,"nodeType":69},{},[],"Esoteric’s Spine",{"data":591,"marks":592,"value":593,"nodeType":69},{},[]," library for the majority of the animations.  As luck would have it there was a Unity port with an almost identical API.  Within a day spent at the Massive Monster offices we managed to go from the first run to an almost completely rendered and animated title screen.  Here’s the very first video that we took of this to show the other members of Massive Monster situated around the globe:",{"data":595,"content":596,"nodeType":83},{},[597,600,607],{"data":598,"marks":599,"value":141,"nodeType":69},{},[],{"data":601,"content":603,"nodeType":78},{"uri":602},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?time_continue=7&v=ZyaUj210HoI&feature=emb_title",[604],{"data":605,"marks":606,"value":602,"nodeType":69},{},[],{"data":608,"marks":609,"value":141,"nodeType":69},{},[],{"data":611,"content":612,"nodeType":83},{},[613],{"data":614,"marks":615,"value":616,"nodeType":69},{},[],"From then on time was spent replacing the stubs with real implementations in Unity.  Getting all of the various elements to line up correctly on screen and within each frame was a time consuming process given some were rendered in fundamentally differently ways.  However soon, we had broken the back of it.",{"data":618,"content":619,"nodeType":83},{},[620],{"data":621,"marks":622,"value":624,"nodeType":69},{},[623],{"type":96},"Next time we’ll start to talk about some of the challenges getting to a fully playable state while allowing Massive Monster to finish development in Haxe, but output in Unity and utilise effects and items from the Asset Store...",{"data":626,"content":627,"nodeType":83},{},[628],{"data":629,"marks":630,"value":632,"nodeType":69},{},[631],{"type":96},"-MT","document"," In this series of technical articles we will discuss how the existing game written in Haxe\u002FOpenFL, was ported to Playstation 4, Xbox One and Switch using the somewhat unusual approach of going via Unity","The Adventure Pals",[637,929],{"metadata":638,"sys":641,"fields":653},{"tags":639,"concepts":640},[],[],{"space":642,"id":644,"type":14,"createdAt":645,"updatedAt":646,"environment":647,"publishedVersion":649,"revision":650,"contentType":651,"locale":27},{"sys":643},{"type":10,"linkType":11,"id":12},"2c1Wsp77FHS9dZFwFXv8fM","2020-04-06T04:07:18.293Z","2020-04-06T04:41:49.169Z",{"sys":648},{"id":19,"type":10,"linkType":20},557,5,{"sys":652},{"type":10,"linkType":25,"id":26},{"title":654,"slug":655,"banner":656,"content":681,"excerpt":928,"category":635},"The Adventure Pals - Two years of sales report","the-adventure-pals-2-years-of-revenue",{"metadata":657,"sys":660,"fields":670},{"tags":658,"concepts":659},[],[],{"space":661,"id":663,"type":39,"createdAt":664,"updatedAt":665,"environment":666,"publishedVersion":668,"revision":669,"locale":27},{"sys":662},{"type":10,"linkType":11,"id":12},"01pjUFJBTkMT1vvq0GBPbr","2020-04-05T12:05:23.428Z","2020-04-06T04:17:28.206Z",{"sys":667},{"id":19,"type":10,"linkType":20},38,3,{"title":671,"description":672,"file":673},"TheAdventurePalsBirthday","The Adventure Pals Birthday Sale",{"url":674,"details":675,"fileName":680,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F01pjUFJBTkMT1vvq0GBPbr\u002Fc35e6fbfc0fa78dd60491ddebc48162b\u002FBirthdaySale_Pic.png",{"size":676,"image":677},1363318,{"width":678,"height":679},1920,1080,"BirthdaySale_Pic.png",{"data":682,"content":683,"nodeType":633},{},[684,703,710,736,743,751,758,784,791,798,806,832,839,909,915,922],{"data":685,"content":686,"nodeType":83},{},[687,691,699],{"data":688,"marks":689,"value":690,"nodeType":69},{},[],"Hey Pals, \nWe're celebrating The Adventure Pals 2nd birthday!! whoo \n\nThe game is 75% OFF for a very limited time on ",{"data":692,"content":694,"nodeType":78},{"uri":693},"https:\u002F\u002Fstore.steampowered.com\u002Fapp\u002F396710\u002FThe_Adventure_Pals\u002F",[695],{"data":696,"marks":697,"value":698,"nodeType":69},{},[],"STEAM",{"data":700,"marks":701,"value":702,"nodeType":69},{},[],", so get in quick if you are reading this and it's no longer on sale if you send me a picture of a giraffe celebrating I will send you a key! \n\nTo celebrate I thought I would jump into looking at a bunch of numbers, more specifically looking at our revenue over the last two years.\n",{"data":704,"content":705,"nodeType":83},{},[706],{"data":707,"marks":708,"value":709,"nodeType":69},{},[],"Starting with steam which is one of worse performing platforms accounting for around 9.7% (': Despite this we still get an okay amount of revenue streaming through mainly from sales. You can see below how our life cycle looks at the moment. Interestingly we have sold more this birthday than last. Most likely due to high sale % being 75%. The Adventure Pals audience doesn't really line up well with steam and we figured we would sell nothing and would be dead in a month. But as you can see on steam there is quite a healthy long term lifecycle for sales so the business model turns into making sure you are in every sale you can get in. ",{"data":711,"content":735,"nodeType":206},{"target":712},{"metadata":713,"sys":716,"fields":724},{"tags":714,"concepts":715},[],[],{"space":717,"id":719,"type":39,"createdAt":720,"updatedAt":720,"environment":721,"publishedVersion":723,"revision":44,"locale":27},{"sys":718},{"type":10,"linkType":11,"id":12},"1fp05qSHak9jrnqFEujLFT","2020-04-06T03:39:39.828Z",{"sys":722},{"id":19,"type":10,"linkType":20},23,{"title":725,"description":726,"file":727},"The Adventure Pals Steam Revenue","Steam Revenue",{"url":728,"details":729,"fileName":734,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F1fp05qSHak9jrnqFEujLFT\u002F3e351465ef43390c8a225e24f9a92716\u002FSteamStats.png",{"size":730,"image":731},72427,{"width":732,"height":733},1116,422,"SteamStats.png",[],{"data":737,"content":738,"nodeType":83},{},[739],{"data":740,"marks":741,"value":742,"nodeType":69},{},[],"You can see from the above graph, sales are mainly the only income, which don't seem to negatively effect sales down the line. From this you can clearly see that sales result in visibility but it's important to have high enough % to break into this barrier of getting past just wish list conversions. However there may be some strategy in doing lower sales and building up more wishlists than doing a bigger sale. ",{"data":744,"content":745,"nodeType":83},{},[746],{"data":747,"marks":748,"value":750,"nodeType":69},{},[749],{"type":317},"All Revenue",{"data":752,"content":753,"nodeType":83},{},[754],{"data":755,"marks":756,"value":757,"nodeType":69},{},[],"As you can see from our overall sales below, Switch, by far has been our best performing platform, followed by Xbox. Switch sales are a result of being early-ish on the platform along with the different type of audience that uses these platforms being more family & kid orientated, this is why I believe xbox sales have done quite well as well. The Switch platform however sucks at visibility so it's very interesting that we still see revenue trickling in from the platform. My guess is word of mouth is quite strong with switch and has lead to these more long-term benefits. \n",{"data":759,"content":783,"nodeType":206},{"target":760},{"metadata":761,"sys":764,"fields":772},{"tags":762,"concepts":763},[],[],{"space":765,"id":767,"type":39,"createdAt":768,"updatedAt":768,"environment":769,"publishedVersion":771,"revision":44,"locale":27},{"sys":766},{"type":10,"linkType":11,"id":12},"5pxnNXwDt3NhV1zarShL1f","2020-04-06T03:34:44.803Z",{"sys":770},{"id":19,"type":10,"linkType":20},30,{"title":773,"description":774,"file":775},"The Adventure Pals Revenue","The Adventure Pals Sales",{"url":776,"details":777,"fileName":782,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F5pxnNXwDt3NhV1zarShL1f\u002F085c475a6bb24fe6fea6b5936cfa7e6c\u002Fchart__1_.png",{"size":778,"image":779},38318,{"width":780,"height":781},977,604,"chart (1).png",[],{"data":785,"content":786,"nodeType":83},{},[787],{"data":788,"marks":789,"value":790,"nodeType":69},{},[],"\nOne source of revenue we definitely underestimated was doing deals, deals are by far the most effective way to generate revenue short-term for a game and from looking at the data didn't seem to hurt out life cycle much at all, if anything it helped with word-of-mouth. These deals were with our physical release and doing bundles for the game and nearly resulted in covering the recoup for the game. This is something we will definitely focus on in the future and organising nice and early. ",{"data":792,"content":793,"nodeType":83},{},[794],{"data":795,"marks":796,"value":797,"nodeType":69},{},[],"We can also have a look at our life-cycle, unfortunately we only have data from June 2019, but you can see it's still moderately healthy and not what I expected a game two year after launch to look like. ",{"data":799,"content":800,"nodeType":83},{},[801],{"data":802,"marks":803,"value":805,"nodeType":69},{},[804],{"type":96},"Note this is gross profit (before publisher \u002F developer split) ",{"data":807,"content":831,"nodeType":206},{"target":808},{"metadata":809,"sys":812,"fields":821},{"tags":810,"concepts":811},[],[],{"space":813,"id":815,"type":39,"createdAt":816,"updatedAt":817,"environment":818,"publishedVersion":43,"revision":820,"locale":27},{"sys":814},{"type":10,"linkType":11,"id":12},"5GIDxEFZfvaOuZunE5MkZ","2020-04-06T04:04:18.578Z","2020-04-06T04:56:27.964Z",{"sys":819},{"id":19,"type":10,"linkType":20},2,{"title":822,"file":823},"Monthly Revenue The Adventure Pals ",{"url":824,"details":825,"fileName":830,"contentType":55},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F5GIDxEFZfvaOuZunE5MkZ\u002F671427e4c555b4b89899f10b08dbfe81\u002FMonthly_Revenue.png",{"size":826,"image":827},36896,{"width":828,"height":829},1984,918,"Monthly Revenue.png",[],{"data":833,"content":834,"nodeType":83},{},[835],{"data":836,"marks":837,"value":838,"nodeType":69},{},[],"\nI would love to share specifics of how much the game has generated, but don't wanna get in trouble with anyone :') I can say however we are very close to seven figures total net. \n\nTo summarise my findings and to keep this brief: ",{"data":840,"content":841,"nodeType":908},{},[842,858,868,878,888,898],{"data":843,"content":844,"nodeType":857},{},[845],{"data":846,"content":847,"nodeType":83},{},[848,852],{"data":849,"marks":850,"value":851,"nodeType":69},{},[],"Life cycle two years after launch is still alive ",{"data":853,"marks":854,"value":856,"nodeType":69},{},[855],{"type":96},"(enough to cover a very low salary) ","list-item",{"data":859,"content":860,"nodeType":857},{},[861],{"data":862,"content":863,"nodeType":83},{},[864],{"data":865,"marks":866,"value":867,"nodeType":69},{},[],"Sales are the new business model for the game resulting in 2x monthly sales.",{"data":869,"content":870,"nodeType":857},{},[871],{"data":872,"content":873,"nodeType":83},{},[874],{"data":875,"marks":876,"value":877,"nodeType":69},{},[],"Sales = Visibility & Increased word of mouth. Doesn't significantly damage life cycle, increased daily active users. ",{"data":879,"content":880,"nodeType":857},{},[881],{"data":882,"content":883,"nodeType":83},{},[884],{"data":885,"marks":886,"value":887,"nodeType":69},{},[],"Deals are very important if you have a mediocre success.",{"data":889,"content":890,"nodeType":857},{},[891],{"data":892,"content":893,"nodeType":83},{},[894],{"data":895,"marks":896,"value":897,"nodeType":69},{},[],"Being early on a platform is vital! ",{"data":899,"content":900,"nodeType":857},{},[901],{"data":902,"content":903,"nodeType":83},{},[904],{"data":905,"marks":906,"value":907,"nodeType":69},{},[],"Your games audience will reflect in success on certain platform.","unordered-list",{"data":910,"content":911,"nodeType":83},{},[912],{"data":913,"marks":914,"value":141,"nodeType":69},{},[],{"data":916,"content":917,"nodeType":83},{},[918],{"data":919,"marks":920,"value":921,"nodeType":69},{},[],"Okay that's all thanks bye see you next year.\n- Julian. \n",{"data":923,"content":924,"nodeType":83},{},[925],{"data":926,"marks":927,"value":141,"nodeType":69},{},[],"Hey it's our birthday, wonder what is in the cake. Maybe some juicy financial information that may help you make informed decisions around game development. ",{"metadata":930,"sys":933,"fields":943},{"tags":931,"concepts":932},[],[],{"space":934,"id":936,"type":14,"createdAt":937,"updatedAt":937,"environment":938,"publishedVersion":940,"revision":44,"contentType":941,"locale":27},{"sys":935},{"type":10,"linkType":11,"id":12},"327HCKUuA5uIkypWbxMtsK","2020-01-19T02:13:58.422Z",{"sys":939},{"id":19,"type":10,"linkType":20},70,{"sys":942},{"type":10,"linkType":25,"id":26},{"title":944,"slug":945,"banner":946,"content":968,"excerpt":1021,"category":635},"The Adventure Pals - Supporting Australian Fire Relief","the-adventure-pals-supporting-australian-fire-relief",{"metadata":947,"sys":950,"fields":957},{"tags":948,"concepts":949},[],[],{"space":951,"id":953,"type":39,"createdAt":954,"updatedAt":954,"environment":955,"publishedVersion":22,"revision":44,"locale":27},{"sys":952},{"type":10,"linkType":11,"id":12},"5rbFGv7A4tuSicTt1GEIM2","2020-01-19T02:08:23.874Z",{"sys":956},{"id":19,"type":10,"linkType":20},{"title":958,"file":959},"FIRE RELIEF SALE",{"url":960,"details":961,"fileName":966,"contentType":967},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F5rbFGv7A4tuSicTt1GEIM2\u002F82b6ff2c825d1372f2e7669a9b3b9377\u002FFIRE_RELIEF_SALE.gif",{"size":962,"image":963},11759832,{"width":964,"height":965},640,360,"FIRE_RELIEF_SALE.gif","image\u002Fgif",{"data":969,"content":970,"nodeType":633},{},[971,978,1003],{"data":972,"content":973,"nodeType":83},{},[974],{"data":975,"marks":976,"value":977,"nodeType":69},{},[],"The Adventure Pals along with a bunch of other awesome indie games from Australia and abroad have come together to help raise money to support the Australia fire relief through a game bundle supporting charities such as RSPCA, Wires, WWF & The Australian Red Cross. This is being co-ordinated by the awesome folks over at humble bundle and 100% of the profits will be going to charity.",{"data":979,"content":1002,"nodeType":206},{"target":980},{"metadata":981,"sys":984,"fields":991},{"tags":982,"concepts":983},[],[],{"space":985,"id":987,"type":39,"createdAt":988,"updatedAt":988,"environment":989,"publishedVersion":43,"revision":44,"locale":27},{"sys":986},{"type":10,"linkType":11,"id":12},"28pPqi5mFVE1lxUu2WSETL","2020-01-19T02:11:05.280Z",{"sys":990},{"id":19,"type":10,"linkType":20},{"title":992,"file":993},"Humble Bundle Fire Relief ",{"url":994,"details":995,"fileName":1000,"contentType":1001},"\u002F\u002Fimages.ctfassets.net\u002Fi9kiyzrddw2a\u002F28pPqi5mFVE1lxUu2WSETL\u002F1d96e010a83c8dc0749d2d773fa19600\u002Faff2a97a7a7723fd7547cb9b644e3c7576eae38c.jpeg",{"size":996,"image":997},118130,{"width":998,"height":999},1200,628,"aff2a97a7a7723fd7547cb9b644e3c7576eae38c.jpeg","image\u002Fjpeg",[],{"data":1004,"content":1005,"nodeType":83},{},[1006,1010,1018],{"data":1007,"marks":1008,"value":1009,"nodeType":69},{},[],"\nAs I write this the bundle has already made over $1 Million USD for charity, and we're very proud we could be part of it. \n\nCheck it out here: ",{"data":1011,"content":1013,"nodeType":78},{"uri":1012},"https:\u002F\u002Fwww.humblebundle.com\u002Fgames\u002Faustralia-fire-relief",[1014],{"data":1015,"marks":1016,"value":1017,"nodeType":69},{},[],"Australia Fire Relief Bundle",{"data":1019,"marks":1020,"value":141,"nodeType":69},{},[],"The Adventure Pals along with a bunch of other awesome indie games from Australia and abroad have come together to help raise money to support the Australia fire relief through charities such as RSPCA, Wires, WWF & The Australian Red Cross.\n",1777518864952]