Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

1411423 Posts in 69363 Topics- by 58416 Members - Latest Member: JamesAGreen

April 18, 2024, 10:56:09 PM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsThe Whisperer in Darkness: Authentic Lovecraftian VN (NOW ON ITCH.IO+STEAM)
Pages: 1 ... 4 5 [6]
Print
Author Topic: The Whisperer in Darkness: Authentic Lovecraftian VN (NOW ON ITCH.IO+STEAM)  (Read 22909 times)
nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #100 on: March 14, 2017, 12:02:03 PM »

Belated announcement: Steam Update #1

Almost a month ago I finally released the game's first update. It adds resolution options to make the game's text less unbearable to read.

Next up is implementing the Spanish translation into the game. The translation itself is already finished, I just haven't had time to get it running for real in the game yet.

Once that's done, I'll start work on a system to allow player gender customization in the text. As I mentioned previously, the player's gender is never mentioned or assigned when playing in English, but in traditional Spanish, every adjective is either masculine or feminine. I can't just avoid gendering the player, so I'm going to let players choose between the masculine -o, feminine -a, or the progressive gender-neutral -x.

For example: (Alex Wilmarth está aterrorizado. / Alex Wilmarth está aterrorizada. / Alex Wilmarth está aterrorizadx.)

Literomancy & Patreon

If you haven't seen it yet, I've started the dev log for my next game, Literomancy, which will eschew narrative for magical, mind-blowing wordplay. I'm also starting a Patreon campaign so I get to do more of this "game" stuff. Links for both will be in my signature if I can fit them all.

Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #101 on: April 07, 2017, 05:17:33 PM »

Juicy Technical Details: The Scripting Engine

Someone asked about the game's scripting engine in his own thread, and my response started to get too big and comprehensive so I'm posting it here instead, so it doesn't clutter up his devlog. Might be it interests someone else, too, because I think I never actually wrote a decent explanation here.

Cool! What did you use for writing your script (was it imported from something, or syntax completely written from scratch)? I'd love to know more solutions -- as I said, mine isn't perfect, but works for what I'm doing now.

From what I can tell, this post might be the only explanation of the scripting system that I did in my dev log. Source code links to the new code base are broken now, because I eventually decided to make the repo private and keep the game closed-source, and it's pretty incomprehensible anyway, because my oh my, was I bad at devlogs back then.

The scripts are all custom syntax that's processed by the game engine. so I'll copy some little snippets here  So to basically explain what happens on the back-end:

The Update() function executes the next command of the script every frame until one of commands invokes a new State. A State blocks the progression of the script while the game waits for something to happen (i.e. the player to click, or finish exploring a level, or whatever). Each State is a class that implements the same basic functioning loop structure of the Game itself. They finish on their own, allowing the script to continue.

Code:
    // Interface for game states
    // Some states will contain other states. For example, a chapter state
    // will execute a script while pausing to wait for states invoked
    // by the script to finish their execution.
    class State
    {
        public:
            // Virtual destructor to avoid memory leakage
            virtual ~State() { }

            // Functioning loop of the state
            virtual void Update(int deltaMS)=0;
            virtual void HandleInput(Input& input)=0;
            virtual void Draw(Graphics& graphics)=0;

            // Called by the game to monitor whether the state
            // has been fully processed
            virtual bool IsFinished()=0;

            // Whether this state requires the screen be refreshed after it draws
            virtual bool MustRefreshScreen() { return false; }

            // Complete this state's execution immediately if possible
            virtual void Skip() { }

            // If the state is finished, this method will return the next state for
            // the game to run
            virtual State* NextState(Game* game)=0;
    };


Functions are executed by looking up the command name (the first token on a line) in a map of commands to C++ function pointers. The function corresponding to the command name is executed, being passed a list of strings, one for each extra token. Therefore commands can be implemented to accept any number of parameters, I just write the C++ function to read as many parameters from the list of strings as it expects to find.

Code:
State* ScriptManager::ProcessCommand(Whisperer* game, string commandLine,
        bool fromScript)
{
    // Commands follow the following syntax:
    // [Command] [Arg1] [Arg2] ... [ArgN]
    string commandName;
    vector<string> commandArgs;

    if (fromScript)
    {
        ++currentLine;
    }

    // If the line is empty, do nothing
    if (commandLine.empty())
    {
        return NULL;
    }

    // Split the line by spaces
    stringstream commandStream(commandLine);

    // The command name is the first token
    commandStream >> commandName;

    // Followed by an arbitrary number of arguments
    string nextArg;
    while (commandStream >> nextArg)
    {
        commandArgs.push_back(nextArg);
    }

    // Call the appropriate registered function using the given arguments
    CommandFunction function = this->commandFunctions[commandName];
   
    if (function == NULL)
    {
        Log::Error("Tried to call invalid script command: " + commandName);

        // TODO handle the error gracefully
        return NULL;
    }

    // Increment the line counter
    ++currentLine;

    // Actually call the function and return the State is creates
    return function(game, commandArgs);
}

And a sample script command:

Code:
// Create an empty message dialog with a style and scroll speed
State* CreateMessageDialog(Whisperer* game, vector<string> args)
{
    // Syntax: CreateMessageDialog [style]
    string styleKey = args.at(0);

    DialogStyle* style = game->contentManager()->styleManager()->GetStyle(styleKey);

    if (style == NULL)
    {
        Log::Error("Tried to create message dialog with non-existent style: " + styleKey);
    }

    game->CurrentScene()->CreateMessageDialog(style);

    return NULL;
}

Actual game text is stored separately in JSON files:

Code: (sample from text/english/chapter1.json)
{
  "P0": "Ms. Akeley,",
  "P1": "To begin with, I must apologize most profoundly for my failure in the end. Though there remains nothing in my power that could help you, I still write to console you of your loss, and to caution you, after the last wishes of your father.",
  "P2": "You may choose not to believe my story. Although comprehensive record of my correspondence with Henry Akeley is preserved in the storage drive I sent you along with my first, rushed, letter, the police found no more evidence to corroborate my final report than the bullet holes in the Akeley farmhouse. Nothing remained to suggest that anyone had ever been there other than the missing Akeley himself.",
  "P3": "You might think it was simply a nightmare that led me to flee the farmhouse that night, recklessly driving a stolen Ford through the wild hills of Vermont.",
  "P4": "I can only testify as to the vividness of the things I saw and heard, and relate in utmost detail the things that occurred in the farmhouse. Credulous of my tale or not, I must beg you to abandon any foolish notion of returning to those God-forsaken hills."
}

And I have a TextManager class which is basically a glorified dictionary for looking up the paragraphs by their keys. Eventually, the TextManager will also handle things like switching between gendered adjectives using some kind of markup in the text files of the Spanish version, but for now the text is all static and just gets strung together.

Tons of work I had to put into the MessageDialog class which handles spreading the paragraphs across multiple frames on the screen when necessary, and also knowing when it has to clear itself to "turn the page" if the rest of the message won't fit. So many edge-cases and workarounds, it's a terrible mess with multiple helper classes involved.

Lots going on here that's probably obtuse. Feel free to ask questions!
Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #102 on: May 03, 2017, 01:38:37 PM »

We're on itch.io now!

I finally got around to uploading the game on itch.io. It was extremely easy to do so compared to Steam! Only took 2-3 hours.

The coolest part was using butler to automatically upload without having to do a thing to the folders I use for my Steam upload. In the future when I release updates it'll be very simple to update both the Steam version and the itch version at the same time.

I also spent a while deliberating on whether to include Steam keys with purchases on itch. I came up with this pro's and con's list:

Pro:

  • Depending on the player, this can be a big bonus, and it won't bother anyone

Cons:

  • Under the new Steam review system, reviews from any player who obtained the game from a Steam key are not counted towards your review score. So I might miss out on a few Steam reviews boosting my score.
  • I have to maintain the supply of keys in the itch page. (This will likely be trivial if my itch sales are low.)

I decided to include the keys anyway. I asked Droqen (who made Starseed Pilgrim) for his approach to Steam keys on itch, and he had this to say:



It's kind of cool coming full-circle back to itch.io with the remastered version, because this game started in their 2014 Public Domain Jam! They might be doing another one later this month... I should check up on that.

Next up:

I'll be getting the game up and running in Spanish, then Russian. Customizable player skin color to better reflect the diverse & international audience I've wanted from the start, and achievements and trading cards by popular request of the Steam forum community.

One more little find

While searching up the thread to make this post I stumbled on a Ludum Dare entry from 2011 that someone posted here. Looks like I wasn't the first game dev inspired by The Whisperer in Darkness! It's pretty cute. I love the voice of the Mi-Go in the end.
Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #103 on: May 26, 2017, 09:58:35 PM »

Just a little PSA: I am $2 away from the Patreon goal that gets me started on a lengthy post-mortem of this project. I'll do my best to touch especially on the points that I missed in this log, and also keep it updated as I learn more from the process of localizing and marketing the game internationally. So, if anyone has any questions about the project they're burning to have answered, ask away!

And of course, if anyone liked the game enough to pledge $1/month to my future projects, that would be fantastic. (At $3/month you get a free Steam code for the game, so if you haven't played it, there's another good idea.)

Fund/follow my strange creations

Much love to everyone who's ever stumbled upon this log, and maybe even stuck around!  Coffee

P.S. I might be announcing another Lovecraftian thing soon. Spread the word.
Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #104 on: September 02, 2017, 01:44:23 PM »

I promised Spanish localization and a postmortem...

...and I am really burnt out on this project, but I have taken baby steps toward both of those things! I've gone through all the posts of this log and tagged them according to the subjects they talk about, so I can include an index of the dev log in the postmortem. It should also help remind me of my real thought processes when it came to different aspects of the project, rather than basing the whole thing off of retroactive explanations which can be unreliable.

For Spanish localization, Marc has had all 8 chapters translated in some form since before launch. One of my biggest mistakes I think, was starting Marc on translating the text before I had fully rewritten it! Because when I overhauled and improved the story in English, Marc had to go back over everything and make big changes. Which I'm sorry to have put him through!

Marc did all of his translation in Google Docs, which is where I did all of my narrative/dialogue overhauling before transferring the text back into game-engine suitable JSON files. So, now I have to go through that process again, but with the Spanish text! I've written a pretty basic Python script that loops through the English dialogue files and prompts me for the translated version for each English paragraph. That way, I just copy/paste from Google Docs without having to also format the JSON myself at the same time.

I might share more info/screenshots on what that whole process looks like once I'm finished. So far I've only done the JSON for chapter 1.
Logged

Bahototh
Level 1
*


Design, Pixels & Art


View Profile WWW
« Reply #105 on: September 03, 2017, 04:46:01 AM »

Hello! I'm always looking for horror games, but I can't find any that I like.

This looks promising for sure! Really like the scene in the trailer with the car and the tree blocking the road.

Good luck!!! Coffee
Logged

-----------------------------------------------------
"An artist cannot fail; it is a success to be one." ~Charles Horton Cooley
---------------------------------------------------
[Thy Sword] https://forums.tigsource.com/index.php?topic=48380.0
nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #106 on: January 13, 2018, 04:33:46 PM »

Long-awaited update delayed for the most obnoxious of reasons

This is what I've been staring at for the last couple of hours:


I have everything (I think) prepared to launch the game in Spanish on Steam. Except for the Mac build. And without fail, every time I go to make a new build for Mac OS X, Apple has force-updated Xcode with new bizarre settings that break my build system. I am So. So. Angry.  Angry
Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #107 on: September 19, 2018, 10:53:31 AM »

Hypothetically...

If I were to undertake developing The Whisperer in Darkness version 3.0 using Unity and Ink, targeting mobile/console ports and following through on the as-yet unfulfilled promise of multiple language support, would anyone be excited about that?

Here's where I'm coming from. I no longer have a Mac to make OS X builds on, making it essentially impossible for me to release more updates to the game without dropping Mac support. Feelsbad. Even if I did, or borrowed one, it's still become painfully apparent that my custom engine is unsustainable, especially as I move forward with new projects. AND, while I'm still sitting on a finished Spanish translation twiddling my thumbs because I can't release it, it wouldn't make sense to put in the effort without questing for a wider audience and some financial payoff involved. I'm a broke college student!

Not to mention I could finally fix all the visual inconsistencies and improve the God awful terminal font typesetting that people have complained about. This video got me thinking I should really do that:




 
Logged

nathy after dark
Level 8
***


Open Sourceress


View Profile WWW
« Reply #108 on: April 10, 2024, 12:53:41 PM »

It's been strange eons since I had any news about this project. Where we last left off, I was still sitting on a complete Spanish translation of the VN, which I hadn't released because my process of doing release builds was almost 100% manual, error-prone, and time-consuming, for all 3 supported operating systems. I was so afraid of how hard/risky it would be to ship the language update, I just kept not doing it! And in the last post (Fall of 2018) I even considered doing a full rewrite of the code to avoid that eldritch build process!

And sales had pretty much petered off, so I stopped paying attention to anything on Steamworks like seasonal sales, changing requirements for store page images, compatibility with new hardware and OS versions, etc... basically TWID became abandonware for 7 years.

I was testing the Mac build of my new project, FLIES FLIES FLIES, when I noticed that in Steam, The Whisperer in Darkness had a sad circle with a slash through it, like this symbol but white:



It was no longer playable through Steam on Mac. No one was complaining about this in the Community Hub or anything, so maybe no one cared, but it just didn't sit right with me--if I'm selling something, it had better run on all advertised platforms.

And then I noticed, that it actually has been selling lately--I have no idea why! Just a trickle of sales, but more than my new project which I'm struggling to lift off the ground marketing-wise.

Plus people are very frequently downloading it on itch.io because it was in one of the mega bundles that sold 10,000+ copies. No one buys on Itch, but maybe they are playing it after they install it. (Or maybe they're installing and forgetting about it, like I do all the time with cool-looking stuff.)

So I bit the bullet and decided--I'm gonna make a fully automated build system for this code, using the 7 years of experience I've gained in automated testing and builds. I put together GitHub actions to build all the dependencies and upload them as artifacts for Windows/Mac/Linux, and a GitHub action for the private VN repo to download those artifacts, build the code & link against them, then package the releases and upload artifacts for them.

This took like 3 weeks, y'all! (Not of full-time work, just nights and weekends). Why is shipping C++ code such a nightmare?!

Anyways, The Whisperer in Darkness on Steam and Itch is now compatible with new MacOS versions, and playable in Spanish. I wrote what I think is a pretty cute announcement in English, had my translator help me translate it into Spanish along with the Store page text, etc., and now it's all live!

Quote
Greetings, fellow humans. Everything is fine and you have nothing to be afraid of.
Today I'm pleased to announce that The Whisperer in Darkness has been updated for compatibility with new versions of Mac OS. Additionally, you can now play it in Spanish!

This update will likely make Whisperer incompatible with older versions of Mac OS and Windows. If you need to play Whisperer on an older system, you can download the legacy version like so...

Quote
Buenos días, congéneres humanos. Todo irá bien, y no hay nada que temer.
Hoy me complace anunciar una actualización de El que susurra en la oscuridad (The Whisperer in Darkness) para nuevas versiones de Mac OS. Además, ahora se puede jugar en Español!

Esta actualización probablemente rompa la compatibilidad con las versiones anteriores de Mac OS y Windows. Si necesitas jugar el juego en un sistema más viejo, puedes descargar la versión anterior...



One more thing I snuck into this update, is a "More By NQNStudios" button in the menu, which shows a thumbnail for FLIES FLIES FLIES and links to the Steam page. I figure, if that steady trickle of Itch folks installing Whisperer actually play it, maybe I can direct their attention to my new stuff? Like, I kinda realized that TWID is still my flagship product, even if I didn't do a good job maintaining it for all these years. That's gotta be worth something.

I checked the Steam developer terms of service to make sure I'm allowed to link to another Steam game from my build, and I'm prettttttty sure it's allowed. I can't think of any other developers that do this. Maybe cuz it's tacky? Idk. I'm trying it.



To make that screen work, I repurposed the code for the VN's chapter selection screen:



So as I make more stuff, I can keep adding them to the list and have a nice left/right ui flow to scroll through them.

I am planning more visual novels now! Over the years many people expressed hope that I would do this in the Steam forum, and business-wise, I probably should have done this a long time ago.  Toast Left
Logged

Pages: 1 ... 4 5 [6]
Print
Jump to:  

Theme orange-lt created by panic