-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Intent to participate: SkiFree, but it's a survival horror novel [now at 50,000] #44
Comments
The basic loop: The text refreshes on its own quite often, so it should be trivial to print a flavor text sentence every time (or almost every time, etc.) TextOutA is called. From there we can get specific; you can get a non-trivial amount of story cues from the text alone. We're extracting strings, and most strings have a unique character sequence. There are two ways to figure out what kind of string we have:
We can also get cues from how those strings change: Time
Potential story takeaways:
Distance
Potential story takeaways:
Speed
Potential story takeaways:
Style
Potential story takeaways:
All of this should at least be enough cues to do some kind of rudimentary story. |
Added the beginnings of parsing text into output. The text will vary quite a bit more than this ultimately, but we have now gone from spitting out the text unaltered to this marginally more riveting work (yes, "950m meters" is redundant, but this is placeholder text anyway):
At this point, one playthrough produces about ~4,000 words. Clearly it needs some bulking up. |
Added some rudimentary flavor text. At some point I'm probably going to need to add a random chance to make it less spammy, but at this point we need all the wordcount we can get. Some flavor text is one-time use, other flavor text is not. When I get the delta processing fully fleshed out there will be more tagging. I also need to add verbose/terse variants to most of them, so that the more "unique" strings don't print as often as they do. Sample output now:
|
Added the beginnings of the distance delta outline mentioned above, plus some (rudimentary again) flavor text for the intro only. Right now a typical playthrough nets you ~15000 words. The tailored text will ultimately be more than one short sentence each, which will bulk matters up.
|
Refactored a bit in order to add the possibility of follow-up sentences. Fleshed those out a bit. Current sample output (one playthrough is now at ~18,000 to 20,000 words):
So now we have some acknowledgement of actual in-game events, but even after I implement them all, there is still a lot more going on than is reflected in the text. A lot of this takes the form of bitmaps appearing, and we do have API bitmap functions that can be hooked. (hooking more than one at once will require some more work on the Deviare side but presumably doable?) Unfortunately we can't just check to see whether a bitmap has been drawn and which it is, because it almost definitely refreshes every frame. So in order to get at what actually is happening and what exactly is possibly, it's time to consult the decompilation again (using Snowman, I do have Ghidra but old habits, etc.) On that note, I leave you with this excerpt from the decompiled code:
|
Really impressive! You've already gone quite far so maybe this won't be useful but one idea i had for the color commentary: you could export youtube video transcript of commentators watching skiing olympics events, then randomly pull some of those sentences in. You can use youtube-dl to download the transcription. Here's a complicated walkthrough. I bet you could figure out a 'good enough' pipeline that's even simpler. |
I realize that my comment above is not so useful since your generated text is a bit more stoic musings, not a sports commentary! You've probably seen Ennuigi I take it! Reminds me of that. |
Thanks! The tone isn't 100% settled yet, since the text that's here has sort of been quickly dashed off placeholders. The horror element hasn't really come into play yet. I wasn't familiar with that previously, also! Kind of similar to my original idea with this. |
Today's update doesn't add any more wordcount (it's still roughly 20,000 per full run) but does do two things: Crash detection:
I do know this produces false positives if you come to a stop normally in some cases; not sure how to handle this at the moment. It may require doing it the hard/real way. Post-route detection Crash text sample:
Post-route text sample:
|
Got sidetracked by life but I did replace the style text with slightly less placeholdery versions. We are still however at ~24,000 to ~30,000. Padding must be done.
|
Getting down to the wire now and still at ~25,000. We can pad more, we can account for multiple playthroughs. We can also pad by adding yeti lines.
|
Now have it producing roughly ~50K words per playthrough; a sample story is now on the Github. Still a few things I want to do (like refactor a certain function) but you get the idea! |
Congratulations! 🌲 ⛷️ 🎄 Repo: https://github.com/katstasaph/skistory |
What is this?
A novel that is automatically generated through playing everyone's favorite Windows 95-era game, SkiFree.
Why is this?
I don't even know.
But seriously, why is this?
The direct inspiration was Mario's Big Adventure from last year. I'd been tossing around the idea of doing something like this with old Windows games since I started the Oregon Trail decompilation thing; the benefit of SkiFree is that it actually runs on Windows 10 without the need for a virtual machine. Also, it has a yeti.
How is this?
The code runs SkiFree (not included, but it is available for free in a compatible version), hooks that process, and captures the text printed to screen, i.e., the time/distance/speed/style points displayed in the top right of the game window. The heavy lifting is handled by the Deviare library, which was definitely not intended to be used for this.
To do: Actually turn that text into something resembling a narrative; guarantee and/or stop after 50,000 words.
Real optimistic thinking: Not depend on so many globals; hook other functions (using the text printed is somewhat limited in the info it conveys, but it's the most immediately usable)
Where is this?
Here. Currently it isn't much of a novel, all it does right now is print what's on screen; this is more a proof of concept to extract the text.
The text was updated successfully, but these errors were encountered: