tag:blogger.com,1999:blog-73241356389050933712024-03-05T09:33:48.153-08:00My Little Investigations Developer DiaryGabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-7324135638905093371.post-15852692538163361702011-12-03T22:36:00.000-08:002011-12-03T22:39:26.094-08:00New home, and we're recruting!Hello, everypony!<br />
<br />
Just wanted to make a post to let you all know that My Little Investigations now has a website! You can find it here:<br />
<br />
<a href="http://www.equestriandreamers.com/">http://www.equestriandreamers.com/</a><br />
<br />
The website is named after the name we've given our development group, which is "Equestrian Dreamers".<br />
<br />
I've ported over all the posts from this blog to the one on that site, so that pretty much makes this blog obsolete. As such, this blog will no longer be updated after this post - all the types of posts that used to be made here will now be made over there.<br />
<br />
In addition to that, we're now also recruiting for My Little Investigations! You can find the recruitment section of our website here:<br />
<br />
<a href="http://www.equestriandreamers.com/recruitment/">http://www.equestriandreamers.com/recruitment/</a><br />
<br />
If anything there strikes your fancy, we heartily encourage you to apply!<br />
<br />
Thanks to everypony for their support thus far, and we hope to see you soon at the new site!GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com4tag:blogger.com,1999:blog-7324135638905093371.post-75158463982964737922011-11-18T22:21:00.000-08:002011-11-18T22:21:17.306-08:00My Little Investigations - Engine Demo - ConfrontationsBada bing, bada boom, there's a video in the room!<br />
<br />
...Or so Zecora might say, if she were here, and in a spunky mood.<br />
<br />
Here you go:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/1iJIf4qp6ak?feature=player_embedded' frameborder='0'></iframe></div><br />
This is the last engine demo video, so just having this up marks quite a milestone! We'll have more information later regarding the next step for My Little Investigations, but for now, enjoy!GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com38tag:blogger.com,1999:blog-7324135638905093371.post-84670522552169200662011-10-30T23:55:00.000-07:002011-10-30T23:55:45.814-07:00And then there were twoSo, a bit of an update for the folks following this project. In <a href="http://mlidevdiary.blogspot.com/2011/09/still-in-progress.html">a previous post</a>, I mentioned that there were three gameplay elements still to be implemented that were unique to My Little Investigations. The second of those three has been in progress, but we now see why I wanted to managed expectations: after wrangling both with the logistics and with the core motivation for this gameplay feature, and after having discussed the matter with ZeusAssassin, I've decided that the best course of action is just to can it. The reason for this is just that it was difficult to see how it could be structured in an organized yet efficient manner, and that I fundamentally felt that it wasn't going to materially improve the gameplay experience for the player.<br />
<br />
I'm a bit disappointed, since at its initial inception this feature seemed like an improvement, but the more I implemented it, the more I got the sense for why Ace Attorney never bothered with it. Don't worry, though - I can assure you that the project definitely is better off and more streamlined without it, and that the remaining element still to be implemented is most certainly rock-solid in my mind and will definitely make the final cut. So we'll still have both that and the partner system to give this game its own personal flair. <br />
<br />
More details after the break for those interested.<br />
<br />
<a name='more'></a>If you're curious regarding what this feature was, the idea I had was to implement testimonial evidence in addition to physical evidence. I had always found it a bit hokey how important testimony always just got added to the physical evidence list in Ace Attorney, and I wanted to improve upon that. The picture I had in my head was that we could store the full text of testimonies that characters give for future reference, such that each line in each testimony could be used in the same way as physical evidence. My vision for this was that it could add another layer to puzzles, such that players would have to parse the content of testimony that characters give in order to pick out information that either is pertinent to a piece of evidence or which contradicts another character's statement in an interrogation.<br />
<br />
Once I began implementing it, however, the problems with this feature started making themselves evident. The first was one of organization - the only way I could see to realistically organize things in a fashion that was easily parsed by the player was to sort testimony first by character, then by topic, and then finally present the text of the testimony that could be paged through and presented or combined with other evidence. This proved to be very cumbersome, considering that it was a three-step process just to get at a single piece of evidence. Another way to organize it would be just to have all of the testimony in one big list, but this would make finding a given piece of testimony difficult once a sizable number of testimonies have been received. So, right away, this made the feature problematic from a practical standpoint.<br />
<br />
From a conceptual standpoint, however, the feature also had issues. As I went through some of the testimony in the cases we have thus far that would be used, I realized that the testimony really was not as complicated as I had expected it to be - in both Ace Attorney and in My Little Investigations, whenever a character starts discussing something, there's usually only one thing they're talking about, and there's usually one key piece of information that they discuss, too. Anything more than that and you start giving away too much information too quickly. As such, there really turned out not to be as much to parse as I had expected in the testimony, anyway - the key piece of information in each piece was always pretty obvious, making the saving of the entire testimony pretty unnecessary.<br />
<br />
Combining these two made me ultimately decide that this feature really did not have the merit that I thought it did at its initial conception. As such, I've gone ahead and canceled it. If there's any key piece of testimony that needs to be available for reference, it's an easy task to just add it to the standard evidence list, as was done in Ace Attorney. I really have become convinced that this is sufficient, and that to do anything else would be to just overcomplicate matters and make things worse for players.<br />
<br />
They always say that the best art is when nothing can be removed without hurting the final product, and I definitely think that applies to game design, as well. <i>C'est la vie</i>. On to the final gameplay element! (Are you excited? I've never been so excited - well, except for that time when I was like <i>gasp</i>, but I mean really, what could top that?)GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com19tag:blogger.com,1999:blog-7324135638905093371.post-27495771235049195762011-10-11T03:44:00.000-07:002011-10-11T03:44:58.699-07:00My Little Investigations - Engine Demo - PartnersAs the Joker might say, "And here... we... go."<br />
<br />
The next engine demo is up, this time demonstrating - drumroll please - partners! This is something that people have been asking about for quite some time, so I'm happy to finally be able to talk about it. Hopefully people like it. It would suck if people didn't. :P<br />
<br />
Anyway, without further ado, I'll let the video do the rest of the talking:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/-y_iHsLA55U/0.jpg"><param name="movie" value="http://www.youtube.com/v/-y_iHsLA55U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><embed width="320" height="266" src="http://www.youtube.com/v/-y_iHsLA55U?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash"></embed></object></div>GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com32tag:blogger.com,1999:blog-7324135638905093371.post-6595666927786533312011-09-29T19:11:00.000-07:002011-09-29T19:17:45.190-07:00Still in progressSo!<br />
<br />
I haven't been posting here for a while. This was for a variety of reasons, and I first want to assure people that one of those reasons is most assuredly <b>not</b> that I'm getting bored or tired of this project. I was away for a weekend, then I had company over for a week, and I obviously wouldn't have been a very good host to work on a project while they were here, and then I had some long days at work - I'm a software engineer, so naturally a long day of programming at work will sometimes make me not want to do more programming when I come home. And then I had more company over last weekend too.<br />
<br />
That said, all of that has now passed, and the project is now well underway again. Which brings me to another reason why I haven't made any posts yet like usual: the territory we're now getting into for this game. The gameplay aspects of this game that are borrowed from Ace Attorney Investigations (or other sources) are now all implemented. Boom. Done. But that doesn't mean that the gameplay itself is completely implemented, on account of the fact that we also have some brand new gameplay elements specifically designed for this game (three, to be exact) that ZeusAssassin and I have been cooking up that have still yet to be implemented.<br />
<br />
Why is this a reason why no posts have been made? Well, the reason there is basically just expectation control - since the designs of these gameplay features are still potentially in flux, I don't want to post screenshots or something similar and then find out that I'll need to change them. Promising something that you don't deliver is way worse than not promising something. So I've been holding these closer to the chest than previous gameplay features I've been implementing.<br />
<br />
That said, however, one of those three gameplay features is well underway now, and hopefully should be ready in a few days' time. Watch this space!GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com5tag:blogger.com,1999:blog-7324135638905093371.post-84243798055178214722011-09-09T02:06:00.000-07:002011-09-09T02:13:52.278-07:00Engine demo - LocationsIT'S FINALLY HERE!<br />
<br />
This video took way longer than I had expected it would take, but it's finally ready to be shown. This time, we're looking at locations, and all the things associated with them. A full explanation may be found in the video, so I'll just post it:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/3mBFETJVerk?feature=player_embedded' frameborder='0'></iframe></div><br />
For those curious, a full explanation of the items found in this video appears after the break.<br />
<br />
<a name='more'></a>If you're reading this, I'm assuming you're interested in the technical details regarding what can be found here. So, let's go over them.<br />
<ul><li><b>Locations</b> - Locations represent a single area that the player character can be in. A given location contains a number of items, including the background for the location, the hitbox defining the areas the player character can't walk into, the characters present in that location, the foreground elements present in that location, and the transitions from one location to the next. Defining these elements effectively defines a location, and enables Twilight to interact with the things in it. Players can click on both characters and foreground elements in order to interact with them.</li>
<li><b>Zoomed view</b> - You can also define which foreground elements may be zoomed into, such that clicking on them will open a new view that shows a close-up of that area of the location in which you can click to examine things in more detail. Defining a zoomed view for a foreground element will automatically cause the player to enter it when he or she clicks on the element.</li>
<li><b>Evidence presentation</b> - Players now have the ability to present evidence to characters and see their reaction to it, which may lead to new information or new evidence. When defining a character, you can specify both their reactions to specific pieces of evidence as well as their reactions to any pieces of evidence that aren't otherwise accounted for. An evidence presentation is just defined as a conversation like any other.</li>
<li><b>Evidence combination</b> - Finally, you can now also specify what pieces of evidence may be combined together, such that combining them can shed new insight on one or both of the pieces of evidence and can result in a logical deduction that gives the player new information. Similar to evidence presentation, an evidence combination is also just defined as a conversation.</li>
</ul>GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com20tag:blogger.com,1999:blog-7324135638905093371.post-5788843231391204072011-08-31T16:20:00.000-07:002011-08-31T16:22:44.641-07:00Behind the Scenes - Structure and Cutscenes<div class="separator" style="clear: both;">Huh boy. Location implementation is taking much longer than I was expecting it to - every time I implement something I realize I need to implement something else too before I'll be satisfied enough to record another demo video. Already I've got locations themselves implemented along with transitions between them, initiation of conversations with characters in locations, cutscenes, and environment examination, but I've still got more to do. On the plus side, this is going to be a pretty huge update when it finally goes live. Hopefully you folks can wait a little while longer.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">While we wait, though, since the last blog entry was pretty well-received, I thought I'd write another one, this time dealing with game structure and cutscenes. ...But first, more screenshots! Just for fun.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLO-4LFm2S4cgfREDk4Nm-PgOevsZXYTRqWnuub8vuQecvK50Y_J-0NEG9VfpCM8XYcWB99sVi2mXz17ylNmtoGYXeuc84dr7O9xHDDtN0k-CABALdiUAs0MvAOvZGdQBKbBZ5Pe2Kg_4/s1600/mli_cutscene_ss1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLO-4LFm2S4cgfREDk4Nm-PgOevsZXYTRqWnuub8vuQecvK50Y_J-0NEG9VfpCM8XYcWB99sVi2mXz17ylNmtoGYXeuc84dr7O9xHDDtN0k-CABALdiUAs0MvAOvZGdQBKbBZ5Pe2Kg_4/s320/mli_cutscene_ss1.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both;">Much more after the break!</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;"></div><a name='more'></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTOHx7X80hgyQwbli56dHZoMMcLXeWhVgVSJVuyqFEpBmCajyzABZcaQmQ-OdoBAM8aXpH6ZLVSqXOuMBOIwt9td5Hpo-rkdtsBRfPXwZ16Fwbw93DDvrwcGCEcXJhqlwYNCgEL1Rmdzw/s1600/mli_cutscene_ss2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTOHx7X80hgyQwbli56dHZoMMcLXeWhVgVSJVuyqFEpBmCajyzABZcaQmQ-OdoBAM8aXpH6ZLVSqXOuMBOIwt9td5Hpo-rkdtsBRfPXwZ16Fwbw93DDvrwcGCEcXJhqlwYNCgEL1Rmdzw/s320/mli_cutscene_ss2.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKRL7ZBypOYOECYxEPH3PGM0FNn2KtEbpEfyRKoi8I41zkC7t4X_bLhW7V8HTlBe7Di_X4pMZHNtvOF2OITrFd_L9lBj2yRS9En42fI4nEeHvwB1i8AqnEU50kO5DJ5FMUXaGohVaATmc/s1600/mli_cutscene_ss3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKRL7ZBypOYOECYxEPH3PGM0FNn2KtEbpEfyRKoi8I41zkC7t4X_bLhW7V8HTlBe7Di_X4pMZHNtvOF2OITrFd_L9lBj2yRS9En42fI4nEeHvwB1i8AqnEU50kO5DJ5FMUXaGohVaATmc/s320/mli_cutscene_ss3.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggHQyJFSXC7HWld8Dj4N7tJ3jxxBeZp9sMmEjKixtlK6VUf6iuC1sfU8xcfkieeGc_6PhNNIGeBwuJj4xywx7hsuorzR4-Q54Ip8q6Z3kbp9PCv94MTMiVpUSi6IHAs9W1pVpE2tdQxIw/s1600/mli_cutscene_ss4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggHQyJFSXC7HWld8Dj4N7tJ3jxxBeZp9sMmEjKixtlK6VUf6iuC1sfU8xcfkieeGc_6PhNNIGeBwuJj4xywx7hsuorzR4-Q54Ip8q6Z3kbp9PCv94MTMiVpUSi6IHAs9W1pVpE2tdQxIw/s320/mli_cutscene_ss4.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-oahd-nIc7X5j5I9QxDQcptkYUAQqBUMhL0eGq53UrZimDa2emASb37CgPiEecwo3Xl5Ajw-iuhe3EX6_W07Dbg2MSBi_S9LiZdJAWz9qYs0mMSPcLTAccgY_FAx7fJuFCCdnan2zNSA/s1600/mli_cutscene_ss5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-oahd-nIc7X5j5I9QxDQcptkYUAQqBUMhL0eGq53UrZimDa2emASb37CgPiEecwo3Xl5Ajw-iuhe3EX6_W07Dbg2MSBi_S9LiZdJAWz9qYs0mMSPcLTAccgY_FAx7fJuFCCdnan2zNSA/s320/mli_cutscene_ss5.jpg" width="320" /></a></div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">(And yes, the proportions are off between the door and the ponies in the third screenshot. That's a product of the fact that that's the only image of an open door to the Carousel Boutique that I could find. As always, you know the caveat... none of these images are final!)</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">So, cutscenes. These were certainly an interesting beast in terms of planning. Before I start specifically talking about cutscenes though, it'd probably be helpful to talk more broadly a little bit on the topic of design structure.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">Software design tends to be a very misunderstood art among those who've never done it before. I constantly have people who have this picture in their heads that software design is basically just sitting in front of a computer writing line after line after line of code and then you're done. That's... not exactly an accurate picture, to say the least. In fact, the actual programming is only a small minority of the process, and that comes at the very end. Computer languages are just tools like anything else - you wouldn't start building a house with no plans and just hope it all works out in the end, and similarly you wouldn't start programming a sizable project and just hope it works out in the end either.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">In fact, the vast majority of time spent on a large software project is in the planning stage - the stage at which everything is laid out conceptually without actually implementing it. The main reason for this is two concerns known as scalability and maintainability. That's roughly tech jargon for, "Its design needs to be easily conceptually understandable, and needs to remain understandable and manageable even as the project's size grows." It's very easy to start coding something quick and dirty that works on a small scale, but which quickly begins to fall apart as the size and scope of the project grows. Any successful large project requires a great deal of logical and hierarchical structure that acts as the glue holding everything together.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">In My Little Investigations, for example, the root object is a case, which holds several areas, each of which holds several locations, which in turn hold characters, foreground elements and transitions, and then characters hold encounters, which finally hold conversations and interrogations. This ups the initial complexity, but ultimately is a big win in terms of the above two qualities - this makes it so that, rather than worrying about the case as a gigantic whole, we can instead encapsulate a lot of the functionality in smaller pieces that can then be easily swapped out in a manner consistent with the user experience. For example, the area that the player is currently in holds a reference to the current location that the player is in, and then when it goes to update and draw, it just tells that location to update and draw rather than directly doing anything itself. When the player then moves to a new location, we just swap out that reference to the current location with a reference to the new location the player moved to, and everything just keeps trucking along happily.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">As another example, within locations, there's a check to see whether there's an encounter ongoing; if so, the location just updates and draws that encounter, whereas otherwise it accepts keyboard input to move the player character (Twilight) around the scene. We want to make it so that the player can click on one of those and have Twilight either comment on the foreground element or start a conversation with a character. In order to accomplish this, given this design, all we need to do is load the encounter associated with the foreground element or the character, and the location will then just automatically do the right thing since encounters are also self-contained objects that run themselves. If we didn't do this, then we'd have to specifically worry about all the details every time, which is not something you want to do in a software project - that very quickly becomes unmaintainable.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">Which brings us to cutscenes. As stated above, cutscenes (that is to say, sequences of character motion and dialog that involves no actual gameplay) are a pretty interesting case in video games. For starters, there's no obvious level in the design hierarchy in which cutscenes fit - intuitively they should exist at the location level, considering that cutscenes obviously take place at a location; however, at second glance the area level might be more appropriate, since a single cutscene can theoretically span multiple locations. Furthermore, one thing that computers are really good at doing is repeating things - same input, same output. Cutscenes really do not fit into this paradigm well at all - they are one-shot deals, things that are triggered and which run once and only once, even if the players go through the same motions a second time that triggered a cutscene the first time.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">So I initially was going to either have areas own cutscenes, or have cutscenes exist independent of this hierarchy. But then came the practical considerations that began to outweigh the conceptual considerations: if areas owned cutscenes, or if they weren't in the hierarchy at all, then what would trigger their display? Would we have to check every single cutscene in every single location to see if the player is in that location and whether the cutscene should be displayed? The more I thought about it, the more it began to make much more sense to associate cutscenes with locations rather than with areas, which was what I was initially going to do.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">And eventually that's exactly what I did: locations own cutscenes, and when you're in a location, it checks to see whether any cutscenes are enabled but have not yet run, and if there are, then it runs them. This also makes it possible to simulate cutscenes that span multiple locations, as well: you can just enable two cutscenes in two different locations and then have the first cutscene move you to the second location when it's done, at which point in time the second cutscene will seamlessly begin, making it seem like one long cutscene.</div><div class="separator" style="clear: both;"><br />
</div><div class="separator" style="clear: both;">And that's all for today's behind the scenes look at stuff in video games!</div>GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com8tag:blogger.com,1999:blog-7324135638905093371.post-33104905731365277932011-08-23T14:46:00.000-07:002011-08-23T15:02:06.726-07:00Behind the Scenes - Storage/LoadingThere are quite a few things in the underlying infrastructure of video games that are caught in a bit of an unfortunate predicament: the only time someone actually even notices them is when they were designed poorly. The field of content storage and loading in video games is definitely one of those areas. So, while you wait for me to finish implementing locations in the game (it's coming along, I promise), I thought I'd talk a little bit about it for your interest's sake.<br />
<br />
Discussion after the break, for those who are interested.<br />
<br />
<a name='more'></a>I'll be upfront about this fact, first of all: this is the first project I've undertaken of this magnitude that's gotten this far. I'm not new to programming by any means - I do computer programming as a career, in fact - but I have definitely not had a personal project of this size come this far before. A big factor in that is the MLP community - if no one cared about this project, it might've ended up in the pile of ambitious projects in the past that I got bored of after the going got tough. As a result of this being the first project of this scale that I've really stuck with, it's definitely very much a learning experience for me in several areas, and the above area is certainly one of the biggest for me.<br />
<br />
When it comes to content storage and loading, there are basically two desirable outcomes that are mutually exclusive - never a good spot to be in when trying to solve a problem, to be sure. The first outcome is that perceived loading times are minimized - nobody likes sitting through a game where every time they go to another screen, they get hit with a black screen and the word "loading"; this can majorly disrupt the flow of the game. The second outcome, though, is that memory usage is also minimized - ideally, a game shouldn't be using any more resources than it needs, and should not allocate tons of memory for resources that it's not going to be needing in the near future, since otherwise it's needlessly bumping up the game's system requirements.<br />
<br />
Obviously, however, these outcomes are in conflict. Perceived loading time can be reduced by pre-loading more resources than you actually need, such that when you go to a new area, all the resources needed for that area are already present in memory. On the other hand, memory usage can be reduced by <b>not</b> pre-loading as many extra resources above and beyond what you actually need. Clearly, a balance is needed here.<br />
<br />
I should say, though, that it's not <b>entirely</b> just a complete tradeoff. There are definitely things that can be done to improve one without harming the other. For example, if <b>actual</b> loading time is improved - that is to say, the time between knowing we want a resource and actually having it available - then we can clearly reduce perceived loading time without adversely affecting memory usage. And this is, in fact, something that I just recently worked on - a little while back, the loading time for a location was upwards of thirteen seconds, which would've required me to load a huge amount of resources in order to prevent the player from seeing a loading screen. I realized that a big source of this problem was the fact that every single image in the game was stored individually, and needed to be separately run through the image decoder, so as an alternative method of storage, I instead created a giant image and pasted into it all of the images needed for that location, and then stored rectangles that indicated where in that image the specific images were that I actually wanted to individually draw. This single change cut the loading time from thirteen seconds down to three seconds. This was much more reasonable.<br />
<br />
The #1 ultimate determinant for any design decision in a game is the impact it will have on the player (well, in a commercial game there are also budget considerations, but that doesn't apply here). In this case, quantifying the optimal outcome for the player is fortunately very simple: the player, ideally, should not be faced with any loading screens, or if he or she is, they should be brief and nonintrusive - no pausing for a minute while the player has to sit and watch for a minute while a progress bar slowly fills. Given the above work to get the loading time down to three seconds, this is fortunately actually fairly easy to accomplish - since the player is likely to spend at least a couple seconds in each location, we can just load all adjacent locations to the player's current location while the player is in that location. This may end up having certain optimizations put on it - for example, it might be worthwhile to also keep, say, the last five or so locations the player's been to in memory in case the player is stumped and is quickly moving between them - but overall this seems to be a good starting point.<br />
<br />
The bottom line for me is that working on this game has really given me an appreciation for the finer details of this sort of thing, as I think there's a lot to video games that we just take for granted but which actually requires a fair bit of thought on the part of those implementing it. I don't know if anyone out there cares about this stuff, but in case anyone does, I may periodically do more articles like this highlighting this sort of thing, in the hopes that it might cause others to recognize these underappreciated areas of implementation as well.<br />
<br />
(I know, I know, you just want to see locations in action. Don't worry; they're coming. :P)GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com12tag:blogger.com,1999:blog-7324135638905093371.post-74505646808094414972011-08-16T03:35:00.000-07:002011-08-16T03:37:06.569-07:00Progress - LocationsOne of the worst parts about designing a game engine is that a whoooole lot of the work you do goes into the underlying infrastructure, which tends to be rather boilerplate work that facilitates content when it's done, but does not actually produce much of anything you can actually show others when it's still in progress as proof that you're actually getting work done. Such is the case right about now - I've been working on enabling location navigation within the game engine now, which is basically taking us up one more level: locations contain characters, with whom you can get into encounters, as was demonstrated in the last video.<br />
<br />
Unfortunately, I've still got a ways to go as far as work goes on this part of the game engine, but since I'm a tease, here are some early screenshots to tide you over and reassure you that I am in fact working on this game:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGvV5t3MlKRmV91DpCBcu8tPNl2C31hdz2e3c04tz2Xt8236tXjH4cPS2tMeyMcUjSKKSzdx21O5ND9f0R6KRkqBEw2GsPu16KnhHSKiyFIgIGXi88H__-YA_N3NeMe_FzHJx8sGi0yns/s1600/mli_location_ss1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGvV5t3MlKRmV91DpCBcu8tPNl2C31hdz2e3c04tz2Xt8236tXjH4cPS2tMeyMcUjSKKSzdx21O5ND9f0R6KRkqBEw2GsPu16KnhHSKiyFIgIGXi88H__-YA_N3NeMe_FzHJx8sGi0yns/s400/mli_location_ss1.jpg" width="400" /></a></div><br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyb92btyQyPX_7Tl-y0rj_KqefV7-7X31h2z-rQ75HQNaYvcK3JKsEkNYCa2tmqO81gJ0sCStMr2BeR2IoavjILKeJZgPL1Jl-CuE4r4NAFD6xu3cXNkpvdDljWGlYYjh30OXKYqf10A0/s1600/mli_location_ss2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyb92btyQyPX_7Tl-y0rj_KqefV7-7X31h2z-rQ75HQNaYvcK3JKsEkNYCa2tmqO81gJ0sCStMr2BeR2IoavjILKeJZgPL1Jl-CuE4r4NAFD6xu3cXNkpvdDljWGlYYjh30OXKYqf10A0/s400/mli_location_ss2.jpg" width="400" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_35FUSxILoin49q1ixAJeTEjHa_FSEmD4gM1iCPtyrElVjN8sjNlATS_5lYvhxzc2hHfjUagu-NLKbOXZK7PwP-V6w9jhubVdmfvNXW8kLUBbsUNLOGeIOaT6cAVVE9yjpBnQhq1FjIo/s1600/mli_location_ss3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_35FUSxILoin49q1ixAJeTEjHa_FSEmD4gM1iCPtyrElVjN8sjNlATS_5lYvhxzc2hHfjUagu-NLKbOXZK7PwP-V6w9jhubVdmfvNXW8kLUBbsUNLOGeIOaT6cAVVE9yjpBnQhq1FjIo/s400/mli_location_ss3.jpg" width="400" /></a></div><br />
Also, since I'm feeling extra tease-y tonight, I can also report that good progress has been made on the actual underlying story for the first case in the game (the one that all videos and screenshots have depicted to date). I've had some people ask me what exactly the plot is, and to be honest until recently I was honestly not too sure - I had a vague sense that was good enough for the mock-up scenarios created to demo the game engine, but I had no real clear, coherent idea where it was going. That's no longer the case - I've been in conversation with a couple of people about that particular case, and I now have a pretty darn good sense for how it's all going to go, so there should now be a coherent narrative in screenshots and videos from now on.<br />
<br />
...Of course, if you want to know exactly what happens, you'll have to just wait! :P<br />
<br />
(And yes, those are the sprites from Desktop Ponies in the first picture. I needed small sprites with walking animations, so those seemed extremely convenient. I hope no one involved in the creation of those sprites minds. Like I keep reminding people... all visuals and audio are preliminary, and exist only to demo the game engine!)GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com13tag:blogger.com,1999:blog-7324135638905093371.post-79023691458084844472011-08-12T03:01:00.000-07:002011-08-16T03:35:43.381-07:00Font poll - The results!Thanks to everyone who responded. The poll regarding the MLI dialog font had a much bigger turnout than I expected. You guys are awesome!<br />
<br />
To get the following results, I took every person's post and added 1 to the tally of each font they spoke positively towards, and then subtracted 1 from the tally of each font they spoke negatively towards. I didn't explicitly say you could list more than one font, but most people did, so I figured this would be the most fair way to make sure that everyone's full opinions are fully accounted for.<br />
<br />
That said, as far as the results go... oh dear. I feel a bit like Twilight in The Ticket Master right about now. Full results after the break.<br />
<br />
<a name='more'></a>So without further ado, the results look like this:<br />
<br />
#1: 21<br />
#7: 7<br />
#3: 3<br />
#6: 3<br />
#5: 2<br />
#4: 0<br />
#2: -1<br />
<br />
Keep current: 23<br />
hurrrr use wingdings: 2<br />
<br />
As far as the proposed new fonts go, #1 is the clear winner. On the other hand, however, basically an equal number of you also spoke positively with regards to keeping the current font as is. Some of you suggested that I could include in the options menu the ability to pick between multiple fonts, but that unfortunately isn't really a feasible option - since different fonts have different widths, a message that might fit within the dialog box in one font might not fit in another font. As such for ease of testing it's much better to just have one font and one font only.<br />
<br />
Soooo... yeah. This is pretty much down to a judgment call on my part. I won't keep you in suspense; after some deliberation on the subject, I've picked <b>font #1</b> as the new font for the game's dialog:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEu9xvkU7pZ-eDO9vWfKmV_EfNLMTw2uaDWE-mEwcfhsz9PR9tzsPLjygqxEq-pFyKS2XY-4rJGYb_W9JGrhTP2pqbIU4oVuUmkkhqlewTn_UUclMk_VhBcxNx3xewRFU3qatG0cukLs/s1600/gamemockup_andy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEu9xvkU7pZ-eDO9vWfKmV_EfNLMTw2uaDWE-mEwcfhsz9PR9tzsPLjygqxEq-pFyKS2XY-4rJGYb_W9JGrhTP2pqbIU4oVuUmkkhqlewTn_UUclMk_VhBcxNx3xewRFU3qatG0cukLs/s400/gamemockup_andy.jpg" width="400" /></a></div><br />
So now the obvious question: why'd I pick this font? At face value, it seems as though keeping the current font should've won just based on the numbers; however, there were a number of considerations that lead to this decision:<br />
<ol><li> This wasn't a formal election; this was just an unscientific poll, so 23-21 is basically effectively a tie, statistically speaking, rather than a win for the former.</li>
<li>Almost everyone who said that they wanted to keep the current font also spoke positively with regards to #1, whereas the same was not true of those who spoke positively of #1. In other words, #1 seemed to be considered acceptable both by those who wanted the current font to stay and by those who wanted it to go.</li>
<li>The more I look at the current font, the more I feel as though those who note that it's in ALLCAPS have a point, and the more I feel as though it would become progressively more annoying as the game progressed. Some of you commented that the font seemed to be a trivial thing to be fretting about, but I actually don't think that's the case - a <i>huge</i> portion of this game is reading dialog, so it's something that has to be perfect in every way for the game to really have lasting appeal.</li>
<li>Of the proposed fonts, it's definitely closest to my vision as well regarding what the font should look like, in that it's rounded at the corners and playful in nature, rather than serious and official in appearance. </li>
</ol>So that's about the long and short of it. Thanks again to everyone for your participation in this bit of fan feedback. Hopefully, if you don't like this decision, you at least can understand where it came from, and can still enjoy the game.<br />
<br />
Thanks!<br />
<br />
-GabuGabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com7tag:blogger.com,1999:blog-7324135638905093371.post-62273623950270159742011-08-10T03:39:00.000-07:002011-08-10T16:27:59.293-07:00Reader input wanted - Dialog fontI haven't been working on this that much lately - was taking a break for the second half of last week, and then over last weekend I was down in <a href="http://www.meetup.com/Bronies-SeaTac/events/20391381/">Northwest Bronyfest</a> having a good time meeting some of you awesome folk! However, now I'm back, and about ready to get back in business. First off, however, I want to talk about, and get input from you on, a topic that keeps coming up in viewer feedback: namely, the font choice for the dialog in the game.<br />
<br />
Currently, it looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjblsunZah07XdwqLNERsiZiAZjbshbL-Mgs4d8c83kJlge3x4i7oSRrMgqKercY3-dWYHteXxsVSO-xZNQoWUz8XrSZQsY3g9aUk0acdayLtdA1TZ4ZL72gYQjEjtpggigLECCZ4EVfR0/s1600/gamemockup_comicbook.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjblsunZah07XdwqLNERsiZiAZjbshbL-Mgs4d8c83kJlge3x4i7oSRrMgqKercY3-dWYHteXxsVSO-xZNQoWUz8XrSZQsY3g9aUk0acdayLtdA1TZ4ZL72gYQjEjtpggigLECCZ4EVfR0/s400/gamemockup_comicbook.jpg" width="400" /></a></div><br />
(If it's not clear, I'm talking about the font for "Apple Bloom, your...") <br />
<br />
Now, let me be clear: I still like this font. I chose it rather than a font more closely approximating the Ace Attorney font because I felt that Friendship is Magic is much softer around the edges than Ace Attorney was - both in terms of dialog and in terms of content - and I felt that I should pick a font for the dialog that reflected that. And this comic book-style font seemed to fit nicely.<br />
<br />
<i>However</i>... if there's one single thing that the entire MLI fan base seems to be united against, at least as far as I can tell... it's this font. Every time I check on people talking about MLI, the one thing that always seems to come up as the thing they don't like is that font. I've already accepted from the outset that I can't please everyone... but something that pleases <i>no one</i> is, well, a little different. So, I'm officially giving you the chance to have your voice heard on this topic, since I'm quite seriously pondering changing that font to a different one. (Alternately, if you <i>do</i> like the font and would like to keep it the way it is, please tell me - I've literally had no one say so, so if you're in that boat, please let that be known!)<br />
<br />
More info after the break!<br />
<br />
<a name='more'></a><br />
<br />
I will say up front that I won't <i>promise</i> to change the font. If one of the following things are true, I'll leave the font as is:<br />
<ol><li>As many people tell me to keep the font as tell me to change it to a particular font; or</li>
<li>There is absolutely no identifiable consensus regarding which font would be better.</li>
</ol>To facilitate this exercise, I've put together seven mockups of the same scene as the above, but with a different font. Basically, what I'd like from you, the reader, is to tell me three things:<br />
<ol><li>Whether you think the font should be changed at all. If you don't, then no need to answer the next two questions. </li>
<li>Which font (just say its number; I'll number the images) is the <i>closest</i> (although not necessarily perfect) to what you envision as the perfect font for the dialog; and</li>
<li>(Optional) If you have a particular one in mind, which font specifically you would choose for the dialog if you were making the game. Can be a free or a paid font; I'm more than happy to pay a little if it'll make the game significantly better.</li>
</ol>So that's what I'd like you to do - basically, I'd like to get just a sense for the general idea of what you think the font should look like, in order to let me know what to specifically look for. Now without further ado, here are the fonts in question; I've gone through all of the fonts on my computer and picked out seven that I think could potentially work:<br />
<br />
<div style="text-align: center;"><span style="font-size: large;"><b>#1</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEu9xvkU7pZ-eDO9vWfKmV_EfNLMTw2uaDWE-mEwcfhsz9PR9tzsPLjygqxEq-pFyKS2XY-4rJGYb_W9JGrhTP2pqbIU4oVuUmkkhqlewTn_UUclMk_VhBcxNx3xewRFU3qatG0cukLs/s1600/gamemockup_andy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlEu9xvkU7pZ-eDO9vWfKmV_EfNLMTw2uaDWE-mEwcfhsz9PR9tzsPLjygqxEq-pFyKS2XY-4rJGYb_W9JGrhTP2pqbIU4oVuUmkkhqlewTn_UUclMk_VhBcxNx3xewRFU3qatG0cukLs/s400/gamemockup_andy.jpg" width="400" /> </a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><span style="font-size: large;"><b>#2</b></span> </div><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eZa9boBiJ-_G9xdUXr4keaXSzNhgi_J7VIrXUYmt-yCMdFTwb4ODdH644a9pme4b7yDPejKy1GMiheM39kbSU37B7aiciqnF8VBIZfYK6DwvZaQzuPVfpBCaxV4NTFMdVcJV97nhEb4/s1600/gamemockup_georgia.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eZa9boBiJ-_G9xdUXr4keaXSzNhgi_J7VIrXUYmt-yCMdFTwb4ODdH644a9pme4b7yDPejKy1GMiheM39kbSU37B7aiciqnF8VBIZfYK6DwvZaQzuPVfpBCaxV4NTFMdVcJV97nhEb4/s400/gamemockup_georgia.jpg" width="400" /></a></div><br />
<div style="text-align: center;"><span style="font-size: large;"><b>#3</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXKtAwlKGz1hibBU_u8iqg9dF8Rbz-zBH3WInlKEQzOht1WBqblDAO1-NKEp7Cv9r4IKAcmrVEvwOWgYvhQ7SBSKzXDd66mokIunW0bmqqu6qu4xbsfOBpcaxxgfc1e8vMMI02q3_TG_Q/s1600/gamemockup_hightower.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXKtAwlKGz1hibBU_u8iqg9dF8Rbz-zBH3WInlKEQzOht1WBqblDAO1-NKEp7Cv9r4IKAcmrVEvwOWgYvhQ7SBSKzXDd66mokIunW0bmqqu6qu4xbsfOBpcaxxgfc1e8vMMI02q3_TG_Q/s400/gamemockup_hightower.jpg" width="400" /></a></div><br />
<div style="text-align: center;"><span style="font-size: large;"><b>#4</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFP9uKO06nB5Fsasm5szmCzgkrFPFOg0HibNg5fvGgYWhVl6XmexyXTIiIJ17988CU2i90ZOkJZhdog0yR56ordIrMWJ_ShLmn0qbPhMEabD_by9DuZ7QuZyDGIQAcDXALxooiGfYHVIM/s1600/gamemockup_kootenay.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFP9uKO06nB5Fsasm5szmCzgkrFPFOg0HibNg5fvGgYWhVl6XmexyXTIiIJ17988CU2i90ZOkJZhdog0yR56ordIrMWJ_ShLmn0qbPhMEabD_by9DuZ7QuZyDGIQAcDXALxooiGfYHVIM/s400/gamemockup_kootenay.jpg" width="400" /></a></div><br />
<div style="text-align: center;"><span style="font-size: large;"><b>#5</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_zAtm_tPT0gO-Sw1C1mgSjCciIymCNGn4nj23T46jUqcV80PHU8OnTn63E2o3ojiufZNtf503jeEGMp0KtAEVBp88LMqUIyvTo4rKYG9Mx8sEQ2QNxJPagwarxQMVgGMF4QG3FacHmYQ/s1600/gamemockup_phagspa.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_zAtm_tPT0gO-Sw1C1mgSjCciIymCNGn4nj23T46jUqcV80PHU8OnTn63E2o3ojiufZNtf503jeEGMp0KtAEVBp88LMqUIyvTo4rKYG9Mx8sEQ2QNxJPagwarxQMVgGMF4QG3FacHmYQ/s400/gamemockup_phagspa.jpg" width="400" /></a></div><br />
<div style="text-align: center;"><span style="font-size: large;"><b>#6</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKKmhu9zdgadAoD2LSPytjRu4t110JY26PTPhU_0ej3AB3_Tklvw9ybL9Js6Vpp0yXTuV9XQPeWWcWPUhUWpkR8nRfTVR1UF2t5IygocGp0RRDpRPuriutDsbz5eZjMlBUq8O9W6YR1Rw/s1600/gamemockup_poorrichard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKKmhu9zdgadAoD2LSPytjRu4t110JY26PTPhU_0ej3AB3_Tklvw9ybL9Js6Vpp0yXTuV9XQPeWWcWPUhUWpkR8nRfTVR1UF2t5IygocGp0RRDpRPuriutDsbz5eZjMlBUq8O9W6YR1Rw/s400/gamemockup_poorrichard.jpg" width="400" /></a></div><br />
<div style="text-align: center;"><span style="font-size: large;"><b>#7</b></span></div><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV5r30ehn-Iz561uy0DQjSgeqP7qLgi-479cZpvCZsf3aDO7UTdl4DjsfTk3fmKMoLR5QBhEhfgmc6Xa4dJyy4Tg25O3u7NzhEq9z7KkPk68eA-kzRuhCaE2dJim9fddcdKfzdVZq8NII/s1600/gamemockup_tunga.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV5r30ehn-Iz561uy0DQjSgeqP7qLgi-479cZpvCZsf3aDO7UTdl4DjsfTk3fmKMoLR5QBhEhfgmc6Xa4dJyy4Tg25O3u7NzhEq9z7KkPk68eA-kzRuhCaE2dJim9fddcdKfzdVZq8NII/s400/gamemockup_tunga.jpg" width="400" /></a></div><br />
Thanks in advance for the assistance!<br />
<br />
-GabuGabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com46tag:blogger.com,1999:blog-7324135638905093371.post-34194188866202932872011-08-03T01:31:00.000-07:002011-09-09T02:14:32.223-07:00Engine demo - Character encountersPhew, this took a bit longer than I expected it to - I kept finding more and more things I wanted to implement for the test content seen in this video - but the next gameplay video is finally ready for display. This time, we're taking a look at character encounters. A full explanation can be found in the video (now with narration!), so I'll just stop talking and post the video:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/bnHLmMRb_q4/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/bnHLmMRb_q4?f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><embed width="320" height="266" src="http://www.youtube.com/v/bnHLmMRb_q4?f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash"></embed></object></div><br />
More details about just what is seen in this video appear after the break.<br />
<br />
<a name='more'></a>So for those who are really keen to understand the progress thus far (which I'm assuming you are, since you clicked to see more), the following things are new as of this video:<br />
<ul><li><b>Character encounters</b> - Obviously. More specifically, you can now define character encounters, which hold multiple questions and interrogations, and you can also specify which of those are enabled at the start. The ones that aren't enabled at the start can be enabled as easily as saying "EnableConversatinon <ID>" within the conversation or action in which you want them to be enabled.</li>
<li><b>Evidence addition</b> - Similar to questions and interrogations, when you define evidence, you can now also specify which are available at the start (if any). Those that aren't available at the start can be enabled within a conversation by saying "EnableEvidence <ID>".</li>
<li><b>Variable background music</b> - Within the context of a conversation, you can now say "PlayBgm <ID>", "StopBgm", "PauseBgm", and "ResumeBgm" to muck around with the music that's currently playing.</li>
<li><b>Inline sound effects</b> - A new bit of markup to dialog has been added, which is of the form {PlaySound:ID}. Adding this to a piece of dialog causes the sound effect with the specified ID to be played when the part of the dialog in which it appears is written to the screen. Examples of this are the glass smashing and the "ding" sound when Twilight says "impossible".</li>
<li><b>Character shaking</b> - One of the most amusing things in the Ace Attorney series was the ridiculous way in which characters seemed to almost take physical damage whenever a new fact came to light that was damaging to their case. That has now been implemented.</li>
<li><b>Custom animations during dialog</b> - Last, but not least, I've put together a rudimentary animation engine that enables case-makers to define a scene with a background and elements in it, and then to control the elements' position and tinting transitions within each frame. Once an animation can be defined, it can be brought on screen just by saying "StartAnimation <ID>" within a conversation, and then you can advance to the next frame by saying {NextFrame} within a piece of dialog. An example of this is the animation of Scootaloo by the Carousel Boutique in Apple Bloom's recollection.</li>
</ul>And that's about it thus far! Thanks for watching and reading.GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com14tag:blogger.com,1999:blog-7324135638905093371.post-64181047465672825192011-07-30T02:47:00.000-07:002011-07-30T02:47:41.253-07:00Character encounters coming soonJust checking in to say that progress is coming along just fine on character encounters. These will take us one level above interrogations - character encounters account for a full session with another character at a given location, which can include multiple questions and interrogations.<br />
<br />
I'm still working on them, but a gameplay video should be out in the near future. Here are some screenshots to tide you over until then! (Click for full size.)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCkas7wONd446Od9wLd30gNRzPXJNbbCPIUo4aT6FxXNo9Uf3BGq_3v2Ll6eA8zKvzfzfOSAuWYXYHMm9D8thEdhg9AdMYM1QCKZSeiil4ExXx0AKs-kM5LfTDWFjNEoBK3GeMD6i1Q0A/s1600/mli_encounter_ss1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCkas7wONd446Od9wLd30gNRzPXJNbbCPIUo4aT6FxXNo9Uf3BGq_3v2Ll6eA8zKvzfzfOSAuWYXYHMm9D8thEdhg9AdMYM1QCKZSeiil4ExXx0AKs-kM5LfTDWFjNEoBK3GeMD6i1Q0A/s400/mli_encounter_ss1.jpg" width="400" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUY_LvKBmfBW_4j_tI-rwvw0zx0dVuU_fCiFvm5KsgKvvvWpSuorIP91DPO4tF8q0oLD1Y4z-UPmz5uYnA8gYpDk3T9fVXA-9ZNV_26vJx3wLOmz7l1kZfM85XFDlE1eWnb5txroZpZtY/s1600/mli_encounter_ss2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUY_LvKBmfBW_4j_tI-rwvw0zx0dVuU_fCiFvm5KsgKvvvWpSuorIP91DPO4tF8q0oLD1Y4z-UPmz5uYnA8gYpDk3T9fVXA-9ZNV_26vJx3wLOmz7l1kZfM85XFDlE1eWnb5txroZpZtY/s400/mli_encounter_ss2.jpg" width="400" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjZ7nzqoMtvBYZray7lvgOidBYwpB37PqXsPWq47xVIzUOLeH9FWgOJF0wyy7RCbFNHkZiGvL3Tq67dId_uzxdK0FYoMgv7DpMipeFMUbTtbO0x2KL5Sn-oY-y1gYrNyxyAtYt2181mY/s1600/mli_encounter_ss3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjZ7nzqoMtvBYZray7lvgOidBYwpB37PqXsPWq47xVIzUOLeH9FWgOJF0wyy7RCbFNHkZiGvL3Tq67dId_uzxdK0FYoMgv7DpMipeFMUbTtbO0x2KL5Sn-oY-y1gYrNyxyAtYt2181mY/s400/mli_encounter_ss3.jpg" width="400" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpM9tXfxUW0m9oO88QqsN0Bk6TlyxsGEShB3h1BY-RVsYJh424zihVPp2lsqGCIL3fJdnXyoMjiWyQ7Be4zSRt2e2oqlyIjlvhBViwpiGvDE3EnCjP-xIRdpjDGfbpZsmJ434ldtx0d4M/s1600/mli_encounter_ss4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpM9tXfxUW0m9oO88QqsN0Bk6TlyxsGEShB3h1BY-RVsYJh424zihVPp2lsqGCIL3fJdnXyoMjiWyQ7Be4zSRt2e2oqlyIjlvhBViwpiGvDE3EnCjP-xIRdpjDGfbpZsmJ434ldtx0d4M/s400/mli_encounter_ss4.jpg" width="400" /></a></div>GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com7tag:blogger.com,1999:blog-7324135638905093371.post-70318960975465936532011-07-27T02:07:00.000-07:002011-07-27T03:22:31.032-07:00All hard-coded values removed<i>Dear Princess Celestia,</i><br />
<i><br />
</i><br />
<i>Today I learned an important lesson on the value of good coding design. If you're writing a piece of software that you intend to be modular, it's always a good idea to plan out the design to actually function this way before you start writing any code. Otherwise, a sudden realization of a fundamental design flaw might require you to rewrite the whole content storage system in your application. And that wouldn't be so good.</i><br />
<i><br />
</i><br />
<i>Your faithful student,</i><br />
<i><br />
</i><br />
<i>Gabu</i><br />
<br />
<br />
OK, so I know that I said in my last blog entry that the next thing I'd be working on was character encounters, but as you probably gleaned from the above, I suddenly realized shortly after writing that that there was a fundamental design flaw in the way in which content was stored in my application that made it impossible to load content (images, audio, etc.) from an external source. This was a Very Bad Thing, because that obviously meant that the entire idea I had behind cases being modular and separate from the executable was not going to work. So unfortunately I had to spent the last two days effectively tearing down and rewriting the content storage system in the game to properly accommodate the loading of external content.<br />
<br />
However, I'm pleased to report that that speed bump is now behind us, and the game is now looking better than ever. I've now broken off the case source compiler from the executable itself, and have gotten it to successfully compile all the case data plus all required images into a single binary file that can then be loaded into the executable. In other words, I've already got a very, very rudimentary version of a case editor up and running. <fluttershy>yay!</fluttershy><br />
<br />
As such, <i>now</i> I can finally begin work on character encounters. Sorry to anyone who was expecting that work sooner. I promise that when that's done, I'll finally actually have some more gameplay footage for you to look at, rather than just this technical mumbo jumbo. :)<br />
<br />
More details for those interested after the break.<br />
<br />
<a name='more'></a><br />
First up, these changes also required an update to the parser - in the case source file, you can now specify both characters and evidence and provide file paths to the images used for each, and it will automatically compile those images in with the rest of the case data in the binary file it outputs. The new portions of the case source file look like this:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">BeginCharacters<br />
<br />
BeginCharacter TwilightSparkle Twilight Sparkle<br />
BeginEmotion Normal<br />
Idle RawContent\TwilightSprites\Normal.png<br />
Talking RawContent\TwilightSprites\Normal-Talking.png<br />
EndEmotion<br />
<br />
BeginEmotion Sad<br />
Idle RawContent\TwilightSprites\Sad.png<br />
Talking RawContent\TwilightSprites\Sad-Talking.png<br />
EndEmotion<br />
<br />
BeginEmotion Annoyed<br />
Idle RawContent\TwilightSprites\Annoyed.png<br />
Talking RawContent\TwilightSprites\Annoyed-Talking.png<br />
EndEmotion<br />
EndCharacter<br />
<br />
BeginCharacter AppleBloom Apple Bloom<br />
BeginEmotion Normal<br />
Idle RawContent\AppleBloomSprites\Normal.png<br />
Talking RawContent\AppleBloomSprites\Normal-Talking.png<br />
EndEmotion<br />
<br />
BeginEmotion Annoyed<br />
Idle RawContent\AppleBloomSprites\Annoyed.png<br />
Talking RawContent\AppleBloomSprites\Annoyed-Talking.png<br />
EndEmotion<br />
<br />
BeginEmotion Defiant<br />
Idle RawContent\AppleBloomSprites\Defiant.png<br />
Talking RawContent\AppleBloomSprites\Defiant-Talking.png<br />
EndEmotion<br />
EndCharacter<br />
<br />
EndCharacters<br />
<br />
<br />
BeginEvidenceList<br />
<br />
BeginEvidence ScootalooProfile<br />
Small RawContent\Profiles\Scootaloo-Small.png<br />
Large RawContent\Profiles\Scootaloo-Large.png<br />
Description Scootaloo, one of the Cutie Mark Crusaders.\nIdolizes Rainbow Dash.\nBest friend to Apple Bloom and Sweetie Belle.<br />
EndEvidence<br />
<br />
BeginEvidence CapeShred<br />
Small RawContent\Evidence\CapeShred-Small.png<br />
Large RawContent\Evidence\CapeShred-Large.png<br />
Description A torn part of a Cutie Mark Crusaders cape.\nFound outside the Carousel Boutique today.<br />
EndEvidence<br />
<br />
BeginEvidence CMCCape<br />
Small RawContent\Evidence\CMCCape-Small.png<br />
Large RawContent\Evidence\CMCCape-Large.png<br />
Description Apple Bloom's Cutie Mark Crusaders cape.\nFixed by Rarity this morning.<br />
EndEvidence<br />
<br />
EndEvidenceList<br />
<br />
<br />
BeginContent<br />
<br />
BeginInterrogation AppleBloom_WhereWereYou Where Were You?</span></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">...</span></div><br />
As you can see, you're now able to define characters and images for their emotions, and evidence and their images and descriptions. You also give these characters and evidence unique IDs (e.g., "TwilightSparkle" or "CapeShred"), which can then be referenced within the content (e.g., to specify what evidence needs to be presented, or what characters are in the scene). Previously, these IDs had been hard-coded into the application, but now they're entirely defined within this source file.<br />
<br />
Note that, currently, we only have one single frame per emotion. That's mostly because I don't have any idle/talking animations yet; however, it shouldn't be too difficult to generalize this to allow for multiple frames of animation per emotion.<br />
<br />
(Also, astute readers will probably wonder where the definition of the background music is. OK, OK, you got me; that's still hard-coded. That will be pulled out into the source file when I work on character encounters, since those have an abundance of background music changes. Stay tuned!)GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com0tag:blogger.com,1999:blog-7324135638905093371.post-13562956339296184632011-07-24T22:16:00.000-07:002011-07-24T23:01:59.881-07:00Interrogation parser is doneI unfortunately don't have much to actually <b>show</b> for this bit of work that I just completed, but it's important all the same. Essentially, as I alluded to in <a href="http://mlidevdiary.blogspot.com/2011/07/gameplay-video-interrogations.html">my last post</a>, I've been building a rudimentary parser for a conversation declaration language that I've put together, which allows me to quickly define conversations in an intuitive and sequential fashion. That parser is now complete - I've successfully gotten a text file to compile into a conversation object that can then be loaded into the game engine and interacted with. As work progresses and I implement other aspects of the game engine, this parser will need to be upgraded to also compile text files into objects for those parts as well, but this is a good start.<br />
<br />
If you're currently wondering why you would care about this - isn't this just an internal implementation detail? - enabling the ability to define the case data in this fashion separates the game data from the game engine, which carries with it a number of tangible benefits:<br />
<ol><li>It enables cases to be defined in a modular fashion - in other words, cases aren't built directly into the executable file. This makes it so that players will be able to install the executable file once, and then just download and open separate case files to play future cases, instead of requiring an update to the executable file itself.</li>
<li>It enables the creation of a case editor separate from the game itself, which can be used to create, edit, and save these case source files, which can then be compiled and loaded into the game itself.</li>
<li>It enables cases to be defined in a platform-agnostic fashion - the game I'm implementing is built in XNA, meaning that it won't run within the context of an operating system other than Windows, but because the cases are defined in this fashion, porting the game to another operating system would only require the re-implementation of the game engine and the case source parser, not a re-implementation of the actual cases themselves.</li>
</ol>For those who are really interested, the definition of the conversation seen in the video in the last post, along with an explanation of the different actions defined within it, appear after the break.<br />
<br />
<a name='more'></a>Here's the conversation from the video, defined in this conversation definition language. Note that this isn't what one will edit in the case editor (it will have a much more user-friendly interface); this is just the source file that the case editor will save to and load from. (Of course, it can be edited by hand if one wishes, but there'll be no reason to do that once the case editor is complete.)<br />
<br />
The conversation:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">BeginInterrogation AppleBloom_WhereWereYou Where Were You?</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ChangeCharacter Left TwilightSparkle</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ChangeCharacter Right AppleBloom</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left Apple Bloom, if you don't mind{HalfStop} I'd like to know whether you did anything unusual yesterday.</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">BeginInterrogationRepeat</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowInterrogation Right Well, I don't know what you're lookin' for, Twi{FullStop} I spent the day with Applejack. Honest!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Aside}{Emotion:Sad}(She WAS with Applejack, but{Ellipsis}){/Aside} {Emotion:Normal}That's ALL you did{FullStop:?} Nothing else?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Annoyed}Uh{Ellipsis} {Emotion:Normal}yup{FullStop:!} That's it!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Aside}(She{Ellipsis} {Emotion:Annoyed}doesn't sound very sure of that.){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndShowInterrogationBranches</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowInterrogation Right I definitely didn't go near the Carousel Boutique{FullStop} {Emotion:Defiant}Not once!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left I{Ellipsis} didn't ask about the Carousel Boutique.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Normal}Oh{FullStop:!} {Emotion:Defiant}Well{HalfStop} {Emotion:Normal}I still didn't.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Mouth:Off}...</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPresentEvidence CapeShred</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left Apple Bloom, your sister represents the Element of Honesty{Ellipsis} {Emotion:Sad}but right now, you aren't being honest with me.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Annoyed}'Course I am, Twi{FullStop:!} {Emotion:Normal}Why, whatever could make you think I'm not?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Mouth:Off}*{Pause:100}s{Pause:100}i{Pause:100}g{Pause:100}h{Pause:100}*{Pause:100}.{Pause:100}.{Pause:100}.{Pause:100} {Mouth:On}{Emotion:Normal}Apple Bloom{HalfStop} I know you were there{FullStop} I found a shred of your Cutie Mark Crusaders cape at the scene.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right Oh{FullStop} Um{Ellipsis} well{HalfStop} {Emotion:Defiant}that could've been torn off at any time, right{FullStop:?} Wasn't last night, no siree!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Aside}(...Apple Bloom, are you really pulling this one?){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> SetFlag ShowedCapeShred</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPresentEvidence</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndShowInterrogationBranches</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowInterrogationConditional ShowedCapeShred Right {Emotion:Normal}Sure there was a piece of my cape there{Ellipsis} {Emotion:Defiant}but that had been there for a while!</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Normal}Apple Bloom{HalfStop} isn't this a bit much?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Normal}Whatcha mean, Twi?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Aside}(Ugh{Ellipsis} I guess I'm gonna have to pry it out of her.){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPresentEvidence CMCCape</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ExitInterrogationRepeat</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPresentEvidence</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndShowInterrogationBranches</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowInterrogation Right {Emotion:Normal}So it looks like you'll have to look elsewhere{FullStop} Sorry, Twi.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Aside}(...I can't think of anything to ask here, but{Ellipsis} {Emotion:Sad}What is she hiding?){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndPressForInfo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndShowInterrogationBranches</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Aside}{Emotion:Annoyed}(Argh... c'mon, Twilight, think{FullStop:!} {Emotion:Sad}She's hiding something, I just know it!){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginWrongEvidencePresented</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Sad}Apple Bloom{HalfStop} this proves that you're not being honest with me.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Annoyed}It does?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Normal}Oh{Ellipsis} well{Ellipsis} I guess it doesn't{HalfStop} does it?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Aside}(Smooth, Twilight{FullStop} Real smooth.){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndWrongEvidencePresented</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">EndInterrogationRepeat</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left {Emotion:Annoyed}Apple Bloom{Ellipsis} you had your cape repaired this morning{FullStop} I talked to Rarity about it{FullStop} Now{Ellipsis} {Emotion:Normal}why would that be, hmm?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right Oh{FullStop} {Emotion:Defiant}Um{Ellipsis} uh{Ellipsis} {Emotion:Normal}all right, all right{FullStop} I'm sorry, Twi.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left {Emotion:Normal}It's OK{FullStop} But, please, this is important{FullStop} Something's been stolen.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left If there's anything you know, please tell me.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right I{Ellipsis} {Emotion:Defiant}can't.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left {Emotion:Annoyed}Why not?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right {Emotion:Normal}'Cause I promised.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left Promised WHOM?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right {Emotion:Defiant}{Ellipsis}</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">MustPresentEvidence ScootalooProfile Left {Emotion:Normal}*sigh* Apple Bloom, I think I know why you're not talking...</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> BeginWrongEvidencePresented</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left It's because of this, isn't it?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Right {Emotion:Annoyed}Uh{FullStop:,} {Emotion:Defiant}no.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Emotion:Annoyed}{Aside}(Argh{Ellipsis} I know she's protecting SOMEONE{HalfStop} {Emotion:Normal}but unless I know whom, I don't think I'm getting anywhere.){/Aside}</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> EndWrongEvidencePresented</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">EndMustPresentEvidence</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left Look, I know you're trying to protect Scootaloo{OtherEmotion:Normal}{Ellipsis} but you can protect her by telling me what you know.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left {Emotion:Sad}If you don't{Ellipsis} it's going to look pretty bad for her.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right {Ellipsis}{Emotion:Normal}All right{FullStop} You promise you'll help her? You gotta promise, Twi.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left {Emotion:Normal}Cross my heart and hope to fly{HalfStop} stick a cupcake in my eye.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right {Ellipsis}{Emotion:Annoyed}That a yes?</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Left Er{Ellipsis} {Emotion:Sad}yes.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog Right {Emotion:Normal}OK, I'll tell you what I know{Ellipsis} although{HalfStop} it's not much.</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">ShowDialog None ...But that's all we've got thus far! Stay tuned for more!</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">EndInterrogation</span></span><br />
<br />
So, a few things to note here:<br />
<ol><li>The interrogation is given both an ID and a name at the very top ("AppleBloom_WhereWereYou" being the ID and "Where Were You?" being the name. The ID is a unique identifier that enables this interrogation to be associated with a given character encounter in a given case, such that all one needs to do in order to say "this interrogation happens during this encounter" is to refer to the ID.</li>
<li>BeginInterrogationRepeat starts the actual interrogatory portion of the interrogation; the stuff that comes before and after it are the lead-in and the eventual outcome from a successful interrogation. Everything that appears within BeginInterrogationRepeat and EndInterrogationRepeat is the portion of the interrogation that you can page through repeatedly, press for info, and present evidence against. Begin/EndPressForInfo defines what happens when you press a statement for more information, while Begin/EndPresentEvidence defines what happens when you present a specific piece of evidence (denoted by its evidence ID following BeginPresentEvidence). If you present a piece of evidence that isn't specifically called out by BeginPresentEvidence, then you'll instead be taken to the Begin/EndWrongEvidencePresented section, and will then return to the interrogation statement you were previously on.</li>
<li>ShowInterrogationConditional enables the time-honored Ace Attorney tradition of testimony revision - once you've successfully presented evidence, if the subject wishes to be particularly obstinate, they might want to add another part to their testimony, which will show up once a flag is set making him or her do so.</li>
<li>SetFlag makes it so that interrogations or conversations can affect other things in the world. Every case will a list of global flags defined that can be set or cleared at any time from any location in the game, making it very easy to advance the story and have new content open up in the case based on something that just happened. There'll also be a similar way to add evidence to a global list of evidence, but that hasn't been implemented yet.</li>
</ol>And that's about all there is to say about the case source file parser! Next on the list is to go one level up from interrogations and define entire character encounters, as alluded to above, which can include a number of conversation and interrogation topics that the player can go through. Stay tuned!GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com5tag:blogger.com,1999:blog-7324135638905093371.post-78424036579264690132011-07-23T23:06:00.000-07:002011-09-09T01:32:18.857-07:00Engine demo - InterrogationsThe very first part of the game that I decided to start working on, since I had a feeling it would be the most involved, was the interrogations - the portions of the game where you listen to a character talk about a subject, press them for more details or to get a reaction from them, and then present them with evidence to expose a lie if they're making one. That portion of the game engine is more or less complete at this point, and I've put up a video demonstrating the gameplay for this part of the game after the break.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/PEwLpx58WJg?feature=player_embedded' frameborder='0'></iframe></div><br />
More info after the break.<br />
<br />
<a name='more'></a><br />
One of the things I really, really liked about the Ace Attorney series was the timing of the text display - it added pauses and slow-downs for effect, which made it very easy to read the text as one would hear it spoken, instead of just displaying it all from left to right without any pauses - and I've tried to have a similar feel to the textual display in this game as well. <br />
<br />
The conversation itself was defined using (at least in my opinion) a very intuitive conversation declaration pattern that I designed myself for this game engine, which looks (in part) like this:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">ChangeCharacter Left TwilightSparkle </div><div style="font-family: "Courier New",Courier,monospace;">ChangeCharacter Right AppleBloom </div><div style="font-family: "Courier New",Courier,monospace;">ShowDialog Left Apple Bloom, if you don't mind{HalfStop} I'd like to know whether you did anything unusual yesterday.</div><div style="font-family: "Courier New",Courier,monospace;">BeginInterrogationRepeat</div><div style="font-family: "Courier New",Courier,monospace;"> ShowInterrogation Right Well, I don't know what you're lookin' for, Twi{FullStop} I spent the day with Applejack. Honest!</div><div style="font-family: "Courier New",Courier,monospace;"> BeginPressForInfo</div><div style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left {Aside}{Emotion:Sad}(She WAS with Applejack, but{Ellipsis}){/Aside} {Emotion:Normal}That's ALL you did{FullStop:?} Nothing else?</div><div style="font-family: "Courier New",Courier,monospace;"> ...</div><div style="font-family: "Courier New",Courier,monospace;"> EndPressForInfo</div><div style="font-family: "Courier New",Courier,monospace;"> EndShowInterrogationBranches</div><div style="font-family: "Courier New",Courier,monospace;"> ...</div><div style="font-family: "Courier New",Courier,monospace;"> ShowInterrogation Right {OtherEmotion:Normal}I definitely didn't go near the Carousel Boutique{FullStop} {Emotion:Defiant}Not once!</div><div style="font-family: "Courier New",Courier,monospace;"> ...</div><div style="font-family: "Courier New",Courier,monospace;"> BeginPresentEvidence CapeShred</div><div style="font-family: "Courier New",Courier,monospace;"> ShowDialog Left Apple Bloom, your sister represents the Element of Honesty{Ellipsis} {Emotion:Sad}but right now, you aren't being honest with me.</div><div style="font-family: "Courier New",Courier,monospace;"> ... </div><br />
Currently this is all hard-coded in the game, but before long I hope to make it so that a source file like the above can be compiled into a conversation object that the game can then interact with.<br />
<br />
I should note that my video recording software doesn't (at least as far as I know) enable the recording of any visual feedback for mouse clicks, so you'll have to mentally fill that in. Clicking in empty space either moves to the next line of dialog, if the current one is completely displayed, or causes the current line of dialog to be completed, if it's still being displayed.<br />
<br />
I should also note at this point that this scenario, although it comes from an idea that I have in mind for my short, first case in the game, is largely simply a testing ground for the game engine at this point. The final version of the first case may or may not include this interrogation, and if it does, it may or may not resemble this version.<br />
<br />
Finally, I should note that, as I said in my previous post, both the visuals and the audio seen in this video are tentative - I've put them up just so I can have something to look at and hear while testing out the game engine. The final product may look and sound quite different.GabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com12tag:blogger.com,1999:blog-7324135638905093371.post-25765005631085934002011-07-23T22:51:00.000-07:002011-07-24T22:32:09.246-07:00Welcome to the diary!Hello, all!<br />
<br />
If you're reading this, you're probably here to check out the My Little Investigations project. So, let me begin first by describing the project.<br />
<br />
<b>What is My Little Investigations?</b><br />
<br />
My Little Investigations (working title) is a video game that I got the inspiration for and decided to start work on a little while ago. It's a MLP:FiM video game with gameplay quite similar to that appearing in the game Ace Attorney Investigations: Miles Edgeworth, although it the gameplay won't be completely copied feature-for-feature. In short, the game will be split up into separate cases, each of which begins with a crime being committed, and each of which requires Twilight Sparkle to investigate, to talk to and confront various characters from the MLP:FiM universe, and to ultimately solve the puzzle and unravel the case.<br />
<br />
If that sounds like a very vague description, don't worry - I plan to periodically post gameplay videos as I work on the game, which should hopefully serve to fill in viewers regarding the specific gameplay mechanics underlying the game. So all should become clear in due time.<br />
<br />
(More questions after the break.)<br />
<br />
<a name='more'></a><br />
<b>There've been a <i>lot</i> of MLP:FiM games posted lately to Equestria Daily. Is this a "me too" project?</b><br />
<br />
Nope! I actually started work on this before any of the great games recently posted to Equestria Daily went up. It's just a complete coincidence that I'm ready to unveil this project at the same time as others. It really is creepily true what Seth says, that MLP content seems to come in waves.<br />
<br />
<b>Why My Little Investigations?</b><br />
<br />
A number of reasons lead me to the decision that this would be a good idea for a game, despite it probably seeming at face value an odd choice. First, it was something that, to my knowledge, hasn't been done before as a fan game, so in that sense I liked the thought of contributing something new to the MLP community.<br />
<br />
Beyond that practical concern, though, another reason that I really liked it is the way in which its primary form of gameplay is through meaningful and involved conversations with other characters. One of the things I've always wanted to do - and I hope members of the MLP community share this dream - is to be able to really be a part of and experience the world of Equestria. I think that a game in this format can potentially go a long way to achieving that goal, since you can really become involved in other characters' lives through a game like this.<br />
<br />
<b>What is My Little Investigations built on? How is it structured?</b><br />
<br />
My Little Investigations uses a completely custom-built game engine built in XNA. It's far from done at the moment - updates posted to this blog for the next while will center around the game engine features I'm implementing, rather than around story content - but when it's done it'll feature, among other things, a robust conversation engine that enables conversations to be easily and intuitively defined in a sequential fashion that closely matches the in-game experience of going through them.<br />
<br />
As in the Ace Attorney series, conversations, which form one of the fundamental backbones of gameplay and character interaction in the game, will take one of two forms: either casual dialog with another character, through which information or evidence may be obtained; or interrogations in which another character's words must be parsed, the character must be pressed for more information, and evidence must be presented to catch the character in a lie, if indeed they're telling one. Conversations may also involve a third setting, that being confrontations, in which, once you have enough information implicating a character in the crime, you then have to nail them with it. However, I haven't yet decided whether or not that has enough potential differentiation from interrogations to make it an official other conversation style.<br />
<br />
Aside from conversations, I also plan to make it so that different scenes of interest can be investigated for clues or leads, similar to the Ace Attorney series (a bit of a recurring phrase, huh? :P)<br />
<br />
Another big goal that I have is to separate the actual case data from the executable file itself, such that once you open the game, you can then open a file and load a case from that. This will make the game highly modular such that the executable doesn't need to be modified in order to create future games, which will make releasing new cases much simpler than it would be otherwise.<br />
<br />
<b>OMG this looks awesome! Can I help out with it?</b><br />
<br />
Absolutely!! The visuals in this game right now are just extracted from frames of MLP:FiM and the audio in the game is taken from the Ace Attorney series, which obviously limits the potential scope of cases to things that can fit what I can find within those two sources. And, unfortunately, I am not a clever pony when it comes to artistic matters. As such, I will definitely hope to enlist the help of awesome people who are much better than I am at visual art, composition, or sound design, in order to make the cases really shine and not be constrained by the above.<br />
<br />
That said, however, right now the most pressing work item ahead for me is to complete the game engine, since without that, nothing can exist. Only once that's done can work begin in earnest on actual story content. As such, if I enlist the help of people now, there probably will be a limited amount of work for them to do in the near future, and I don't want to leave them hanging, not sure of when they'll need to allot time to start seriously working on this game.<br />
<br />
<i>That</i> said, however, if you're reading this and you really really want to help out, and if you're aware of and are fine with the above, I certainly won't forbid you from sending me examples of your work (mylittleinvestigations at gmail dot com) if you want to be considered.<br />
<br />
----------<br />
<br />
I think that should about cover it for now. If you have any questions, comments, suggestions, or if you just want to tell me that this sounds terrible and should never see the light of day (hopefully not that one though :P), by all means feel free to leave a comment to that end.<br />
<br />
Thanks for reading!<br />
<br />
-GabuGabuExhttp://www.blogger.com/profile/03448769646298940650noreply@blogger.com0