Category Archives: Development/Production

Project Exist 0.2.5b

TL;DR:


All of Project Exist:

  • Implemented secrets.

Blog:

  • Now running WordPress 3.9.2
  • Various under-the-hood plug-ins updated.

Wiki1:

  • We mostly left Wiki1 alone.

Wiki2:

  • Added a ridiculous (12?) number of templates.
  • Finished Athena’s page.
  • Conceptualized the Project Exist page, which details Lawrence’s ulterior motives.

Game Engine/UI:

  • Wallet works slightly differently
  • Thorium made our wtf_iorpy_magic module safer.
  • wtf_iorpy_magic now can delete the complete save directory; both the one Ren’Py makes by itself, and the one wtf_iorpy_magic makes by default
  • Episode markers
  • Athena’s parameters were changed to prevent a very embarrassing exception
  • Countdown now includes a bar, it will be colored by 0.3.0 hopefully
  • Implemented the MusicRoom (but badly)
  • Added two songs from AgentAbacus and Nihilore

Game Story:

  • Small branching point continuation

Project Exist 0.2.3b

All of Project Exist:.

  • The new game build is titled “Coldfixup” for now, please use the in-game updater.

Blog:

  • Added application
  • Moved Previous Builds to Other Links

Wiki1:

  • Fixed Memories of Ultraman 7 formatting
  • Added this

Wiki2:

  • See Wiki1

wtf_iorpy_magic:

  • Version is now 0.1.1
  • begin_game() is slightly more thorough
  • added filify_string(given_message, magic_folder, magic_file), which returns string if given a UTF-8 encoded file.
  • added kill_save(savename), which deletes a save.
  • added freaking_delete_every_external_file_associated_with_this(). What it does is left as an exercise to the reader.
  • added label reset_button. (freaking…() should not be called directly)

Game Engine/UI:

  • Fixed loading an NVL screen within an NVL context within some other context by use of “centered” instead of actual NVL.
  • Slightly changed the way the debug menu works.
  • Several non-working menus removed

Game Story:

  • Absolutely nothing notable.

wtf_iorpy_magic 0.1.0

Today marks the first release of wtf_iorpy_magic. You can also call it WTF input/output Ren’Py magic. Maintaining it is a side-project, and not a priority. It is a very unpythonic and not-so-optimized module for Ren’Py, but does make file management much easier (I really don’t like the persistent system… I just don’t).

It’s a pretty much undocumented in-line, mostly because we figured it’s easy enough to use (as long as you actually read the README). That being said, standalone documentation is available in the zip file. We’re releasing it under the WTFPL. Happy coding.

wtf_iorpy_magic_v0.1.0 (19 KB)

Project Exist 0.2.2b

TL;DR:

  • Build/Link/Name: ProjEx_v0.2.2b_(1014): WTFPL = LMFAO
  • All of Project Exist: The update server has been replaced. ProjEx_v0.2.1b should properly patch to ProjEx_v0.2.2b.
  • Game Engine/UI: Regression: Saves from previous builds will nigh-definitely break at some point due to readback.rpy.
  • Blog: Readers that use feeds and would rather not read everything The Project Exist Team writes should use the following feed: http://blog.projectexist.net/?cat=7&feed=rss2

All of Project Exist:

  • There is now a second wiki. This is where things will be broken, fixed, and drafted. Hopefully, this will help maintain the integrity of the first wiki. Once a draft on the second wiki has been made, or a plugin has been thoroughly tested, then and only then will it be moved to the first wiki.
  • The main parts of Project Exist (that is, the blog, first wiki, and game) will be updated in staggered waves. This means that for all intents and purposes, the blog, first wiki, and game are all considered to be running ProjEx_v0.2.2b, and that all three of these components will be updated at the same time. Small in-game patches will continue normally. Blog posts will continue normally, but features will no longer be added “as they are available”. Change logs will look like this post from now on.
  • The update server has been replaced. ProjEx_v0.2.1b should properly patch to ProjEx_v0.2.2b.
  • Regression: Percussive maintenance applied to server. Effects unclear.

Blog:


Wiki1:

  • Now running MediaWiki 1.23.1, fixing a bug where pages could be blank.
  • Class spoiler (used by Template:Hidden) now works via hovering.
  • Regression: staying logged in feature does not seem to work as well as in MediaWiki 1.22.0.

Wiki2:

  • Actually exists now.

Game Engine/UI:

  • Implemented surprises.
  • Implemented a version of readback.rpy, which was released under the WTFPL (link not safe for work/profanity firewalls, read the first three letters). Readback is independent of rollback; to activate it, scroll up while in-game to display page(s) of previously viewed text.
  • Fixed a bug (which end-users could not experience) whereby questions asked in NVL-mode opened a new window rather than continue from current dialogue.
  • Hacked around a bug (which end-users could not experience) whereby colored text was not preserved in readback.rpy. :(
  • readback.rpy breaks with a KeyError when trying to recall an iterated integral problem due to left bracket [ handling. Temporary workaround was to change brackets to parentheses (). Permanent fix will be to add images for parts of mathematical operations.
  • nvlq(question, *answers) implemented in screens_extra.rpy, which quickly builds a question in nvl_mode and its follow-up. Code will be released in-blog shortly.
  • Answers/choices are no longer explicitly stored, and are instead implicitly stored by answer_add(new_answer).
  • Menu option for Report a Bug added.
  • Regression: Saves from previous builds will nigh-definitely break at some point due to readback.rpy.

Game Story:

  • Absolutely nothing notable.

Ultraman 7

Okay, before I get into the nitty-gritty of this particular post, two things. First is that the build put out today doesn’t really fix anything major or minor, but does allow everyone to make sure that the update system actually works. Second is that umm… I kinda sing the song sickly and badly, so 90% of you are going to want to skip over the audio file in the middle of the article. The 10% of you that are also sick have something to laugh at. Haha.

So for those of you that don’t know, Rin is not exactly a nice person, and that’s by design. Part of why that is due to her purpose as a second playable character. When we first decided “aww gee, it would be nice to have more than one playable character”, the next thought was “well it could be a female character”. Then I got around to surveying folks, and the general consensus was that there aren’t enough visual novels in which you can play as a female character, and even then, there’s almost always some poorly-done romance element that makes the story fall to pieces. So okay, now we had an idea for another main character; the villain for the first main character, which I personally think is kinda cool. But a new character means new background, and we figured Rin’s background would make more sense if she were an orphan or something.

That got another one of our writers thinking: what if Kazuki has to deal with Rin’s father? It was a cool thought, but I wasn’t really sure how to throw it into the current game. Then I thought “what if Rin had a brother?” And thoughts fired like a minigun from there. “What if he was fictional? What if he was a Dream Guide? What if he was unlockable?” And so on and so forth. But if he was going to be a Dream Guide, he’d need to be based off of something… At this point, I had yet to design a pop culture (or modern) Dream Guide.

Well in Japan, there was this internet meme song thing – it was popular for a while, called Omoide wa Okkusenman, which translates to Countless Memories. The lyrics for it were posted by PiggKingg on February 6, 2007, and they were set to a re-arrange of the background music from Doctor Wily’s Stage in Mega Man 2. The re-arrange itself was done by Aoi Kiba, and the lyrics revolve around the singer remembering his childhood, and then realizing that the lives of his group are nothing like they used to be. Which is only fair, considering they were pretending to be Japanese television heroes from the 60’s. God only knows why, but my next thought was that I could totally breathe some life into this character. Problem was… the song wasn’t in English. There was a translation floating around on justsomelyrics.com but it has since been removed. It is available on our wiki, but even then, the translation wasn’t a very good match-up with the actual music. Long story short, I edited the translation so it syllable-for-syllable (or close to it) matched the music.


This does mean a few odd things for Rin’s storyline. Theoretically, her brother could end up having two different ages at the same time. I could write off the unlockable content as non-canon I suppose… Time will tell. This is just an idea.

I also would like to take this time to point out that we absolutely do have openings on the staff team if anyone wants to get involved. I’m sticking my tongue out, but I’m not on camera. Anyway, that’s all for today. Hope all your eardrums are still intact. You’ll need them.

~Nolan

Gullible isn’t in the Glossary

Do note that the second half of this article is more tuned to programmers, and likely not suitable for a general audience.

[Side note: new build tomorrow fixing a few typos in the glossary and a few other places.]

If you were to ask me, one of the most annoying things about… life in general really… would be realizing two specific problems at the exact same moment.

The first would be that of “not knowing” something. Which shouldn’t be so bad on its own, since it’s basically impossible to know everything about everything (if that makes any sense). It might grind your gears that you don’t have the information, but hopefully you could get it at some point.

The second would be realizing that obtaining said information wouldn’t be a trial-and-error (or similarly easy) process. This is perhaps the most frustrating in larger games where the lore may only be given to the player once, or recipes make absolutely no sense, and thus have to be found on the Internet. A particularly offensive example would be the Ascended back items in Guild Wars 2. Consider the following:

You need a Vial of Condensed Mists, which drops from monsters in the Fractals of the Mists, which itself is a somewhat randomized high-level dungeon. You need 40 Crystals, which you purchase from vendors using skill points. You need 50 Globs of Ectoplasm, which are items obtained from salvaging rare items. You then need 250 Vials of Powerful Blood, which drop from a wide variety of high-level monsters. Nowhere in-game are you told that these specific items need to be combined to get a book of all things. And even once you have these items, you can’t make the book yourself. You have to go to some djinn who lives in some hourglass-looking thing who makes the book for you. (Did I mention that this is the basic version of the book?)

Now quite clearly, the simple solutions are always those that avoid the problem altogether: having exceedingly simple lore and gameplay to the point of, for all intents and purposes, not having any! A step up would be to manage your own wiki (although now would be a good place to reiterate that our wiki is for development and not gameplay). While we’re talking about other games, RuneScape also has a wiki, but it may as well not exist. What’s better, of course, is embedding a glossary into the game – you shouldn’t have to tab-out of a game to fully enjoy it.


 

Here’s a sub-problem though: not all writers are programmers. This is what the first three paragraphs of this article look like if put into the game engine:

Gross!

Gross!

*sigh*

*sigh*

The glossary looked like this for a very long time, and maintaining it was becoming a headache. It would make sense to allow the glossary to be edited directly via text files… the question was how? As it turns out (thank you for being well documented Ren’Py), there were functions built-in for this.

renpy.file(fn) grants the game read-only access to file fn.

renpy.file(fn).read() then, places the contents of file fn into a String.

renpy.file(fn).read().decode(enc) then, gets the contents of file fn, decodes it in accordance to encoding enc, and then places them into a String. Which explains why the following is in the code:

Automatic and simple, if not weird-lookin'.

Automatic and simple, if not weird-lookin’.

Hope that all made sense. And if not, I did warn you. Rin will be the subject of the next blog post. I think.

~ Nolan

“Oh, good!”

It works, in a way.

It works, in a way.

So as I promised yesterday, I put out a new build today. (No More Safaris.) It fixes a few things you probably didn’t notice (such as a comma splice), and added something you’re going to hate me over: the built-in update system.

See, this game uses Ren’Py for its engine, and as of Ren’Py 6.14 “Steampunk Hamster” (technically a little before it, since Ren’Py itself has beta builds), the Ren’Py SDK is made with Ren’Py itself. And Ren’Py updates itself just fine. The long and short of all this is that Pytom (the guy who makes Ren’Py) made it very easy to integrate his updater into games. What this means is, that this build of the game can check this server for updates and take care of itself. No more re-downloading the whole game to update. Not bad, for being the first build of the month.

Dun good.

Dun good.

That said though, most of the programming is done now. (I’ve been saying this for a while, it was still true when I started saying it I swear! You don’t want to see the source code…) Which is good, because technical stuff would just bore the general populace. I figured I might as well talk about Lilian Crawford for just a bit.

One point of Project Exist is to create a game that breaks standards – not that we’ll go out of our way to do so, mind you, but if something seems fun, our writers will probably find a way to at least give it a shot. Lilian Crawford is a character we are going to use to create a side story. It will mean nothing to either Kazuki Kamata or Rin Faust. It will not have an impact on the main story. There will be no choices to make in the Lilian-William arc. It will simply be a story the player catches pieces of as s/he plays for a bit of extra comic relief. I mean, it’s a psychological horror for crying out loud. In fact, there will be (almost) no way for the player to intervene in the arc. For those that haven’t been playing the game, Lilian is the girl who Wil just so happens to have a crush on.

Lilian gets the joy of being the stereotypical shy somewhat-quiet book-smart mild-mannered girl. She gets to be a foil for… well, pretty much every character that has dialogue, really. The first scene involving Lilian revolves around Wil thinking the poor girl looks panicked during a fire drill, and Kazuki dryly responding with “Firstly, I’m fairly certain that nearly anything would make Lilian panicked. Secondly… when did you start referring to Lilian Crawford as ‘Lily’?” Of course, Wil responds by stuttering a bit. Tough guy ain’t ever so tough when chicks are involved.

Next week should see the completion of Rin and Wil’s respective character profiles on the wiki. Stay cool – Summer is a strange season.

~ Nolan

Writing about writing?

I figured I’d start a blog regarding my game’s day-to-day progress. Mostly because writing keeps me sane… I guess that’s a bit backwards, since writing the game itself drives me insane, but as the cliché goes, “it floats my boat”. Logging progress is also a good self-motivator to keep up said progress, as a few psychologists have proved and disproved.

By the way, I had a 3 ounce serving of lemonade. In a tea cup. At 4:20 in the morning. Because I could.

Anyway, much of this morning and last night was spent re-structuring the debug menu and changing the rollback mechanic. (For those of you aspiring to work on your own independent project, that is how you say “I fixed something”.) As the game is a psychological horror, keeping the gameplay realistic is very important, even if the story itself is not. Visual Novels however, lend themselves to a feature called “rollback” – by scrolling up on your mouse wheel/trackpad (or through some other equivalent gesture), you may view previous text or even change previous choices.

… In what universe is that realistic? There are of course, some Visual Novels where you can rollback but not to previous choices. But as part of this game is a Ren’Py experiment, we might as well give the player the choice.

Change Rollback Mode (alpha)

Alpha screenshot of the Preferences box

Clicking that choice brings you to this menu:

Hard choice (alpha)

A bad selection screen (alpha)

The code that changes the way rollback works is very simple because Ren’Py builds in a function. In other words, I just have to tell Ren’Py (at every say and choice screen) to be ready to stop the player from being able to rollback. It should be noted that calling this function also makes it impossible to rollback to before the call.

Screen code (alpha)

Screen code (alpha)

Yadda yadda yadda. I should also point out that enabling rollback during the combat scenes breaks things (more on that later), so that was hard-disabled. The major changes to the debug menu really involves most of the menus so you can’t open a menu while in a menu while opening a menu while in a menu while… you get the idea.

I also gave Rin Faust a little more text in the wiki. Yay!

~Nolan

P.S. New build goes out tomorrow.