Release #4

Dumping a new release mostly because there have been a lot of bug fixes since the last one. (Particular thanks to Yubin, Andrew, and Alan for their bug reports.)

Version: v0.11003

As usual, you can get it on the download page.

Changes in this release:

  • New title screen
  • New game menus
  • Added character profiles
  • Added achievements for major accomplishments
  • Added more collectables for early choices
  • Current in-game day is shown during gameplay
  • Endings show the characters being referenced
  • Endings change slightly based on friendship/relationship stats
  • New phone conversation with parents
  • Combined a few scene backgrounds
  • Skip button indicates when it’s unavailable
  • (Lots of) minor bug fixes

GUI elements and character profiles are still in progress, but things should be approaching some reasonably-nice state now.

Stats for this release: 27,830 dialog blocks, 214,570 words, 1,121,960 characters

Title Screen Mockup

Mockup of the title screen. The placeholder sprites look terrible when reduced to line art. 🙁

The idea is that all of the characters appear as you meet them, and they’ll be clickable to take you to an in-game profile page for that character.

Hopefully the real sprites will make this look significantly better. If not, this may need to be replaced with something different.

Release #3

Sorry to dump a new release so soon, but I wanted to get the initial GUI changes out there, and also do the game rename before people had progressed too far into things.

Version: v0.10926

You can get it on the download page.





Changes in this release:

  • Renamed game.
  • Customized GUI for main game. (Menus will be next)
  • Adjusted required numbers for “good” endings with guys. 
  • Added collectibles for achieving close friendships and other achievements. 
  • Minor bug fixes.

Stats for this release: 27,862 dialog blocks, 212,798 words, 1,112,466 characters

Todo List #2

I think I’ve ironed out a lot of the particularly weird parts of the game. There’s more I still want to do there, but I want to take a step back and throw some work into the GUI for a bit. TODOs for my own tracking purposes:

  • Finalize the new name for the game. (Hoping to keep the acronym YAGS, but I want a name that emphasizes the story more than the dating.)
  • Continue to condense dialogue blocks to reduce number of clicks.
  • Finish up GUI for dialogue and core gameplay, and start on GUI changes for menus and the title screen.
  • “Finalize” numbers for different endings (good vs bad endings, friendship rewards), as all good endings are currently set at trivially-achievable values.
  • Add an additional opportunity to get on James’ good side.

As always, feedback on things you like, find weird, or hate, are always appreciated.

Release #2

A new build is now available, mostly containing dialogue tweaks. Nothing too major yet, so this release is easily skippable if you’re already playing.

Version: v0.10922

You can get it on the download page.

Changes in this release:

  • Ashleigh and Leigh are more like real people and less like evil caricatures.
  • Jake is more shy initially and opens up to you a little more gradually.
  • Early Dan and Jake interactions should be more consistent.
  • Slight intro edits.
  • Combined a bunch of dialogue blocks.
  • Saves now include the in-game date for reference.
  • Title screen now has things on it.

Stats for this release: 27,893 dialog blocks, 212,779 words, 1,112,314 characters

Todo List #1

Got some amazing feedback from the amazing @pmscenarios, and there’ve been a few things I’ve been wanting to clean up myself, so here’s a list of short-term TODOs for my own tracking purposes.

  • Rewrite Ashleigh/Leigh scenes
  • Continue to condense dialogue blocks to reduce number of clicks
  • Clean up early Jake/Nikhil scenes for character consistency
  • Clean up early Jake/Dan scenes
  • Game opening updates

Codes: Instant Messaging

One thing I knew I wanted in the game from the beginning was instant messenger conversations – I remember using it basically exclusively for short-form communication from middle school through college, and it seemed appropriate that college students in 2006 would be using it.

This would be straightforward to do normally in RenPy. You can make a ParameterizedText object and just show it with your desired text whenever you need a new line.

image imwindow = Image("sp/imwindow.png", xanchor=210, ypos=0.69)
image im1 = renpy.ParameterizedText(xanchor=190, ypos=0.1)
image im2 = renpy.ParameterizedText(xanchor=190, ypos=0.15)
…etc

And then

 show imwindow
show im1 "{color=#f00}Diocusin:{/color} {color=#000}This is a test.{/color}"
$ renpy.pause()
hide imwindow
hide im1

However, that gets very verbose very fast. I wanted to be able to easily script IM conversations using character names instead of raw text, and I wanted to automatically handle coloring and showing and hiding, as appropriate.

RenPy allows you to define your own commands, so I defined one to hide and show the background window. (The one to show it is technically not necessary, but it’s here for completeness.)

python early:
def parse_hideim(lex):
return "”
def execute_hideim(o):
renpy.hide("imwindow")
renpy.hide("im1")
renpy.hide("im2")
…etc…
_window_show(trans=None)
renpy.register_statement("hideim", parse=parse_hideim, execute=execute_hideim)
def parse_showim(lex):
return "”
def execute_showim(o):
_window_hide(trans=None)
renpy.show("imwindow")
renpy.register_statement("showim", parse=parse_showim, execute=execute_showim)

Then it’s fairly straightforward to define a command that shows a message.

    def parse_im(lex):
num = lex.simple_expression()
who = lex.simple_expression()
pause = lex.simple_expression()
msg = lex.rest()
return (num, who, pause, msg)
def lint_im(o):
num, who, pause, msg = o
if(who != "mc" and who != "janet" and …etc…):
renpy.error("Invalid IM speaker " + who)
if(pause != "p" and pause != "n"):
renpy.error("Invalid pause value " + pause)
if(int(num) < 1):
renpy.error("Invalid IM number " + num)
def execute_im(o):
num, who, pause, msg = o
formatmsg = ""
if(who == "mc"):
formatmsg += "\"{color=#f00}Diocusin:{/color} {color=#000}"
elif(who == "janet"):
formatmsg += "\"{color=#00f}CrazyCatLady2588:{/color} {color=#000}"
…etc…
else:
renpy.error("Invalid IM person " + who)
formatmsg += "\"" + msg + "\""
formatmsg += "{/color}\""
if(not renpy.showing("imwindow")):
execute_showim("foo")
imnum = "im"+num
renpy.show((imnum, formatmsg))
if(pause == "p"):
renpy.pause()
renpy.register_statement("im", parse=parse_im, execute=execute_im, lint=lint_im)

This command can then be used to carry on a conversation within a script.

im 1 mc p "This is a test."
im 2 janet n "this is only a test, and clicking just once"
im 3 janet p "shows both of these lines together"
hideim

Note that, if I were doing this now, I would keep a counter variable that automatically increments the im number, and reset it in the hideim command. It would simplify IM conversations to something like

im mc p "This is a test."
im janet p "this is only a test"
hideim

but there’s something to be said about knowing exactly how many lines into a conversation you are at any given moment. 

There are probably better ways to do this, and someone more comfortable with Python and the RenPy engine could undoubtedly make this cleaner. But this got the job done for me.

Also never underestimate the power of lint. It’s a most excellent way to catch stupid mistakes when using your custom commands.