Sunday, May 5, 2013

The End

I suppose this blog deserves a proper conclusion. So, here it goes.

I managed to implement the murder mystery game and get it working the night before my presentation. There are demo videos below (finally). 

The way it works is this:
You start as a player character in a world of NPCs (some randomly generated, some not). You can walk around and talk to them, affecting their moods with different actions. At a certain point, either because of you (indirectly) or not, someone will get angry and will murder another character. You will be alerted, at which point you can go around and ask each person how they're feeling and what they've been doing (the murderer will lie about committing murder). You figure out who you think did it and accuse them. If you're right, you win! If you're wrong, you lose.


Relative to the rest of the project, the game was actually pretty easy to implement. The storytelling engine was already defined... All I had to do was define a start state (when someone is murdered, allow the player to accuse) and an end state (when the player accuses, gameover). Everything else just came out of the emotions and actions I defined for the murder mystery, meaning I was able to set it up in almost no time using the code that had already been built. The ease with which the engine was converted into a playable game was a welcome surprise, and a clear indication that this model is great for use with games. Even more of a surprise was how much fun the game was to play. I found myself spending up to half an hour trying to follow characters around and figure out which one had the best motivation for killing the victim (in the demo videos above the murderer says "I did not do anything to (name of victim)" so that the game can be ended quickly, but the hard version has the murderer cover the murder with a good lie like "and then they stormed off."). That's what really works about this murder mystery game. The murderer isn't just chosen at random - they murder because of motive, and the motive is what you investigate. The motive is generated dynamically, and will be different each time. Simple as it is, the model works. I created a game that has a different story each time you play because the characters in the world behave differently every time you play.

Friday, April 19, 2013

Final Stretch

Okay. So, less than one week until the final presentations. Whew.

If you'll remember, at the beta review I was told I had two ways I could take what I showed - the debugging route and the game route. You might also remember that I really wanted to do both. I still really do. So far, though, I've only focused on the former.

I added colors to the characters so you can tell their genders. This was relatively straightforward, but it still took me a while to figure out how to do it and what code to use. I implemented a way of keeping track of character histories and asking about them as well. All that's left for me in the "info" mode is GUI changes - making it look a bit nicer, adding real time emotional values of the characters you're talking to, and adding a button that lets you access your interaction partner's character history. While all that might sound intimidating, I do think the hard part is done. What's left to finish off the info-mode should only take me an afternoon.

I still hope to make good on my mystery idea that I proposed. While I do think you can understand the reasoning and potential behind my dynamic narrative proposal just from the "info mode" I've constructed (and will be completing soon), I think to make people really feel the full impact of what this could mean to games is to show off an actual game. More importantly, to show off how easily a game can be built from this concept. I'm predicting I'd be able to implement this game mode if I work on it for two days straight. I realize I still have to plan and prepare my final presentation, so I'll be cutting it close, but I do think if I can pull it off that it will be well worth it.

Poster Day

We had our project poster demonstrations on Wednesday.

It went fairly well all things considered. Unfortunately we were a bit off the beaten path in the SIG Lab, so we wound up presenting to each other. That said, everybody's projects, posters, and presentations were really fantastic. I presented first to Norm, Aline, and the DMDers. People were already familiar with my project, but I think overall it went well and was good practice for next week (I can't believe I have less than a week left).

The only real concern that came out of the presentation was that Aline told me I had to do a live demo. I'd been planning just to record videos, and a live demo is a little scary. Not because I'm afraid of how my code will behave - every presentation I've ever done for Aline and Norm has been a live demo - but because I don't have a computer that can easily connect to the projection system and run my code. Oh, well. Maybe I can transfer all those files to the pc in the lab and run tests before the presentation on Thursday, or maybe Aline can teach me how to export the unity scene so it plays outside of Unity itself. I'm not too concerned about this, but it bears addressing.

Anyway, the poster I presented is below. I'll do a separate blog post about my progress since last time.



Tuesday, April 9, 2013

Early Blog Post! Steps Forward

The Beta Review was yesterday, and I think it (hopefully) went pretty well. Aline said that all that really needs doing from this point forward is polishing. Norm, though, said that I was about "halfway done either way" - not having a real (fun, objective oriented) game or a fully illustrative demo with character emotions and histories visible onscreen.

With what I now know about Unity, the demo mode should be easy. I've already begun working on character histories, which I feel is the missing link between my original objective (teach computers to tell stories) and what I have now (dynamically generated, non tree based character behaviors that you can build a story out of). Once I implement character histories, I can show how easily the framework I've built can be distilled into coherent, always different stories.

The real reason for this post, though, is that I've thought of an easy way to extend my code into something simple yet playable. A murder mystery like we've been discussing, with only minimal changes to the framework I built. The main problem with the murder mystery is that because everything now needs to be extendable based on input from txt files, I can't have any actions get too specific in their behaviors - then I'm essentially just hard coding actions/emotions like before, instead of leaving that to the "writer". The plan was to create two or three different "game worlds" with different tones to show off how you could create new, shifting experiences for players within a multitude of different kinds of games, and I still plan on doing something similar to this (after all, it shouldn't be that complicated - just creating new action/emotion/config text files). But here is what I would have to do to make a simple playable murder mystery that takes full advantage of my work so far:

  • Start that simulation. Give all characters but the main character a "murder" action that removes one character from the game. The first time a character has been murdered, remove the "murder" action from existence (no serial killers or multiple murderers) and display the message: "Help! Someone's been killed!" Along with a message of who was killed and an alert telling the player to get to the bottom of it.
  • Add an "accuse" action. Every character (player, non player) can accuse other people of murder, but it only ends the game if the player accuses someone. For someone else, it just enrages the person they've accused. Potentially, I could have it so that someone who accuses the murderer is then also murdered.
  • End the game when the player accuses a character. If they are correct, they win. If they are not, the wrong person is incarcerated and they lose.
  • Add just one more "player only" action - "Question". Have each character store their emotional states and whether or not they ever interacted with the victim at the time of the victim's death. "Question" yields "I never knew him" or the emotional state at the time of murder "I was in love." "I was so angry." "I was bored." Thus, we can easily get simple motivations.
  • Modify the "get history" action (assuming I've already implemented it at this point for the data version) so that murderers skip over the line in their history where they've murdered someone, replacing it with another interactions ending moment (so there isn't a conspicuous gap between them talking with the victim and their next action, where the murder obviously went).
  • If I end up making it so that the murderer kills anyone that accuses them that isn't the player, I could have a secondary lose state where you lose if the murderer kills everyone but you.
Hopefully I have time to implement this. I think it's a great example of how a story can be generated dynamically with minimal guidance from the "writer". Simple as the system is, it gives us not only a full murder mystery but motives for the murder, which is what I would say separates it from simpler murder games like "clue" and makes it richer than something like "the Sims."

Sunday, April 7, 2013

PreBeta Updates

Oops. Late post again this week. Sorry. Progress has been slow going, but I've been working really hard. It's hard to think of what to post about... This has been mostly about implementing and debugging what I've already talked about (and debugging, and debugging). I'm finally (finally) getting the hang of Unity GUI. I've been focusing pretty heavily on the "playable" version of the code, which isn't a full game yet but will allow the scope of what I'm doing to be visualized (hopefully). It's a bit frustrating, because it's all a bit tangential to the focus of my project (creating dynamic story) and yet has been taking up the majority of my time (since all of this is really new to me). Even so, I can see why it's necessary - when I show off what my code does to friends and family (despite the fact that it's not actually doing much more with story than it was when it was text based), they seem to grasp the concept and get excited about it much quicker. It's a much better vehicle for proving my thesis: dynamically generated story is possible, even if this won't be the most sophisticated implementation of it.

I'm taking a break the night before my Beta Review to fill you in on my current progress. I've been fleshing out the "game world" a lot in the last few weeks - little tweaks to make the world nicer as I learn Unity. The direction you move your character in with the keypad is now based on the camera position rather than world coordinates. You can "run" by holding down shift (the rate the characters walked at was maddeningly slow). More importantly, other characters now recognize the main character and try to interact with it/you. There's been a lot of tweaking, since the character you control needs to share certain behaviors with NPCs even as you control it.

I've finally got in game pop up menus working (took a while to figure them out). I've got one working, but I'm going to pull an all-nighter trying to get the second one done in time for the beta review. The one that is working works like this: after you get close enough to an in game character that he/she notices you, you freeze and a pop up window appears asking if you want to talk to them (they keep walking up to you while you're frozen). If you say no, the window disappears and they walk away. If you accept, you walk up to them and engage them in conversation. This seems small, but it took forever to implement and I'm hugely proud of it. The conversation right now is one-sided, but what I'm trying to do for tomorrow is take turns in which you pick an action from a popup window (trickier, since the number of potential actions is arbitrary and established by the config file) and then the other character reacts. The real trick is that I want the other conversations that other characters are engaging in to continue in the background, so if you took 5 minutes to decide what course of action to take an entire story could have unfolded in the background.

I don't think I'll have "tell me your story" ready for the beta review (an action in which the other character actually puts into effect the storytelling algorithm I devised and shares with you their personal story) since there's a lot of work I need to do just in terms of testing what the best way of getting the character to remember the story will be. But I'm confident this will be done in time for the final presentation.

Finally, I'm pretty sure once I'm done with this framework that turning this into a demoable game should be fairly easy. I've been working on the concept of "story design" - since the game no longer needs writing, the game now needs a designer to determine what actions/emotions will be prevalent in the game and therefore define it, how common each will be and what their effect will be. By building up dark actions/emotions, light ones, funny ones, etc., radically different kinds of experiences can be had within the same framework. I hope to show that in my final presentation. Since everything is config file based, I don't foresee this being a problem - I just need to make sure my framework works and then do some emotion/action rewriting.

Next update will have video!

Monday, April 1, 2013

Slow Week

Slow week this week, and so short update.

Discovered a bug in my code where apparently ending interactions is no longer a one sided decision (as it used to be). Almost didn't notice, as usually the character on the other side of the interaction ends their side of the interaction soon after, but for a short moment they will follow around the character that's "broken up" with them and continue to interact with them even after the interaction should have ended. This has proven to be a more deeply rooted problem than I initially realized, and I'm just trying to uncover its root right now.

Also backtracked a bit to try and flesh out some of the potential actions by giving them different animations, and discovered that some of the animation files seem not to link up. Also trying to find the root of this problem, though this might be a question for Aline (since it seems like only the four or so animations in the demonstration she wrote up seem to have transferred intact into my code).

Finally, I've just been trying to implement the player 1 controls for the beta/poster next week. It took a backseat to debugging, but it's still my main focus (and it's still giving me some trouble).

Until next week, when hopefully I have something visual to share...

Saturday, March 23, 2013

The Votes Are In

After taking some advice from Aline, I've decided to try to make a "playable" version of my code, where you control a character walking around a 3D world in which story is created in real time. So far I've implemented a character that you can control yourself (in terms of walking around), and my next step is creating character interactions. I need some sort of menu screen that will let you choose the action you wish to take when talking to someone. I have no idea how to do that in Unity yet. I've been doing some research, but so far I haven't been able to figure out how to do it myself. I haven't been trying too long yet, though. The next step after that is making a way to ask characters about their past interactions, so you can get other people's stories (what just happened to them) besides just your own, and learn about why someone might be acting the way they are.

I'm optimistic about finishing this in time for the beta. If I can, I might either try to implement the "story cuts" technique of having the program show you what it deems important through cutting, or else rework a version of the code and the action/config files so that you have a genuine story to play through (a soap opera, a murder mystery, etc), which seems like relatively little work and probably would make the demonstration much more enjoyable.