Subjunctive Games

MindWareReleases

MindWare v0.1.4 Is Now Available

I always dislike releasing updates that don’t contain a significant amount of new playable content, but sometimes it’s necessary for me to focus on stuff you can’t see. To give you at least something to enjoy, this update contains one randomly triggered encounter when you visit the SynTech location.

While you can currently only experience the encounter as a guy, I’ve also implemented the female experience (note: there’s one GIF used in both the male and female version of the encounter that should technically be used only for the female version — I haven’t been able to find a good alternative for the male version). This is something I will be doing a lot from now on, so I wanted to practice on something smaller first.

Besides the random encounter, I’ve been working on a new avatar system, one that will reflect each of the 5 possible stages of the player character’s male -> female transformation. The code is almost ready, and I now just need to generate a good set of avatar images. To give you some idea, here’s an early test (this character image set won’t be used):

The new avatar system will be available in version 0.1.5, and it will likely feature only one or two sets of character images to choose from. To make up for the limited number of avatars, I will add support for custom avatars so that you can add your own images to the “imgs” folder. Maybe some members of our Discord community will be able to come up with something amazing. If so, I would be more than happy to include their creations in the game as “official” avatars.

Changelog:

  • Fixed a few typos and poor word choices here and there.
  • Added a random encounter when you visit the SynTech location (1 in 20 chance of happening). Hint: you need to be infected with AVA for the encounter to get naughty.
  • Done some preparatory work to implement a new avatar system (will be included in the next version).
  • Implemented several custom macros to change various stats.
  • Made the AVA minigame far easier to reuse.

Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.

MindWareTwine

MindWare’s New Loading Screen and Why It’s Important

I’ve recently implemented a loading screen for an upcoming version of MindWare, and I would like to take a few moments to explain why and share the solution with you.

The Problem

One of the biggest and most persistent issues I’ve been dealing with (responsible for most bug reports I’ve received so far) has been missing or improperly initialized variables when starting a new game or loading a save. This can cause all sorts of weird behavior and frustrating bugs for players.

When a person with limited understanding of how the Twine engine works and virtually no experience with the creation of larger interactive fiction games sets out to create a game like MindWare, they may start by placing important variables in the StoryInit passage. All variables placed in this passage are initialized when you start a new game.

The same inexperienced developer may then add additional variables to the StoryInit passage, such as variables for a new part of the UI, and release a new version of their game. You then load your old save and are greeted with an error message because your save is missing the newly added variables. To fix the error, you would have to start a new game—not desirable at all.

The Solution

I’m not the first person in the world to have dealt with this problem (see here and here, for example), so my solution isn’t something groundbreaking, but I think that it’s polished and reusable enough that others might benefit from it. I also hope to receive feedback from those how are more knowledgable than me.

How it works:

  1. When a new game starts or a save is loaded, a function is called.
  2. This function navigates to a special variable initialization passage.
  3. The variable initialization passage displays a loading screen and includes passages with variables to be initialized (being able to divide variables in to different passages makes it easier to stay organized).
  4. A simulated loading process updates the progress bar.
  5. Once “loading” is complete, the player is returned to either the previous passage (for loaded games) or the Start passage (for fresh playthroughs).

With this solution, I’m able to load variables (most of them anyway) that I have been very generously collected by a Discord user and MindWare supporter UnwrappedGodiva (thank you again!). These variables provide a solid starting point on which I can expand. More importantly, I now have a way to declare future global variables in a way that won’t break old saves.

The Code

This script sets up the logic for when to run the initialization process:

:: Scripts-StartingVariables [script]
// Initialize a flag to track whether StartingVariables has run
setup.startingScriptsRun = false;

// Function to run StartingVariables
setup.runStartingVariables = function() {
    if (!setup.startingScriptsRun) {
        State.variables.previousPassage = State.passage;
        setup.startingScriptsRun = true;
    } else {
    }
};

// Run for new games
$(document).one(':passagestart', function (ev) {
    if (ev.passage.title === "Start") {
        setTimeout(setup.runStartingVariables, 0);
    } else {
    }
});
// Alternatively, you can delete the block of code above and call the runStartingVariables function directly from the Start passage like this:
// <<run setTimeout(setup.runStartingVariables, 0); >>

// Run for loaded games
Save.onLoad.add(function () {
    setup.startingScriptsRun = false;
    setTimeout(setup.runStartingVariables, 0);
});

This is the actual loading screen passage:

:: StartingVariables 
<<nobr>><div id="loading-screen">
  <div class="loading-content">
    <div class="loading-bar-container">
      <div id="loading-bar"></div>
    </div>
    <div class="loading-text">INITIALIZING...</div>
  </div>
</div><</nobr>>

// Include as many passages with variables as you want here
// You can also add your variables directly here 
<<include "UI Variables">>

<script>
(function() {
    // Simulate loading process
    var progress = 0;
    var loadingBar = document.getElementById('loading-bar');
    var loadingInterval = setInterval(function() {
        progress += Math.random() * 10;
        if (progress >= 100) {
            progress = 100;
            clearInterval(loadingInterval);
            setTimeout(function() {
                // Return to the previous passage
                SugarCube.Engine.play(SugarCube.State.variables.previousPassage || "Start");
            }, 500);
        }
        loadingBar.style.width = progress + '%';
    }, 100);
})();
</script>

A passage with variables to load:

:: UI Variables
<<if ndef $scrollToTopEnabled>>
    <<set $scrollToTopEnabled to true>>
<</if>>

The CSS code for the loading screen:

#loading-screen {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: #000;
    z-index: 9999;
    display: flex;
    justify-content: center;
    align-items: center;
}

.loading-content {
    width: 80%;
    max-width: 600px;
}

.loading-bar-container {
    width: 100%;
    height: 20px;
    background-color: #111;
    border: 2px solid #55BBBC;
    box-shadow: 0 0 10px #55BBBC;
}

#loading-bar {
    width: 0;
    height: 100%;
    background-color: #55BBBC;
    transition: width 0.3s ease;
}

.loading-text {
    color: #55BBBC;
    font-family: 'Orbitron', sans-serif;
    font-size: 24px;
    text-align: center;
    margin-top: 20px;
    text-shadow: 0 0 10px #55BBBC;
}

If you’ve noticed any mistakes or areas that could be improved, please share them with me here or on Discord. Any feedback I receive is greatly appreciated.

Twine

SugarCube Custom Video Macro

This custom macro will help you embed videos of various formats such as .mp4, .webm, .mov, .ogg, and .avi in your Twine stories using the SugarCube story format.

Macro.add('video', {
    handler: function () {
        if (this.args.length < 1) {
            return this.error("The video macro requires a path argument.");
        }

        const videoPath = this.args[0];
        const videoWidth = this.args.length > 1 ? this.args[1] : '100%';
        let videoType;

        // Determine the video type based on the file extension
        if (videoPath.endsWith('.mp4')) {
            videoType = 'video/mp4';
        } else if (videoPath.endsWith('.webm')) {
            videoType = 'video/webm';
        } else if (videoPath.endsWith('.mov')) {
            videoType = 'video/mp4';
        } else if (videoPath.endsWith('.ogg')) {
            videoType = 'video/ogg';
        } else if (videoPath.endsWith('.avi')) {
            videoType = 'video/x-msvideo';
        } else {
            return this.error("Unsupported video format.");
        }

        const videoHTML = `<video width="${videoWidth}" autoplay loop muted>
                              <source src="${videoPath}" type="${videoType}">
                              Your browser does not support the video tag.
                           </video>`;

        new Wikifier(this.output, videoHTML);
    }
});

I use this macro to include videos that play automatically in a continuous loop while muted (just like GIFs do). You can easily create other versions of this macro that behave slightly differently by editing the “videoHTML” constant. For example, you can remove the “muted” attribute to play videos with sound and save the modified macro as “video-sound” or something similar.

Alternatively, you could modify it so that it behaves more like the HTML

Macro.add('video', {
    handler: function () {
        if (this.args.length < 1) {
            return this.error("The video macro requires a path argument.");
        }

        const videoPath = this.args[0];
        let videoWidth = '100%';
        let videoType;
        let additionalAttributes = [];

        // Check if the second argument is a width or a video attribute
        if (this.args[1] && !this.args[1].includes('=')) {
            if (!this.args[1].includes('autoplay') && !this.args[1].includes('loop') && !this.args[1].includes('muted') && !this.args[1].includes('controls')) {
                videoWidth = this.args[1];
                additionalAttributes = this.args.slice(2);
            } else {
                additionalAttributes = this.args.slice(1);
            }
        } else {
            additionalAttributes = this.args.slice(1);
        }

        // Determine the video type based on the file extension
        if (videoPath.endsWith('.mp4')) {
            videoType = 'video/mp4';
        } else if (videoPath.endsWith('.webm')) {
            videoType = 'video/webm';
        } else if (videoPath.endsWith('.mov')) {
            videoType = 'video/mp4';
        } else if (videoPath.endsWith('.ogg')) {
            videoType = 'video/ogg';
        } else if (videoPath.endsWith('.avi')) {
            videoType = 'video/x-msvideo';
        } else {
            return this.error("Unsupported video format.");
        }

        const additionalAttributesStr = additionalAttributes.join(' ');

        const videoHTML = `<video width="${videoWidth}" ${additionalAttributesStr}>
                              <source src="${videoPath}" type="${videoType}">
                              Your browser does not support the video tag.
                           </video>`;

        new Wikifier(this.output, videoHTML);
    }
});

How to Use the Macro

First, add the Macro to your Story JavaScript passage. You can then use the macro in any passage like this:

:: Start
Welcome to my interactive story!

<<video "path/to/your/video.mp4">>

The width of the video is set to 100% by default, but you can manually overwrite the default setting by entering the width as an additional argument.

<<video "path/to/your/video.mp4" "50%">>

If you’ve decided to go with the second version of the macro, the one that works more like the HTML

<<video "videos/intro.mp4" autoplay loop muted controls>>

or this:

<<video "videos/intro.mp4" "75%" autoplay loop muted controls>>

Supported Video Formats

This macro supports the following video formats:

  • .mp4 with MIME type video/mp4
  • .webm with MIME type video/webm
  • .mov with MIME type video/mp4
  • .ogg with MIME type video/ogg
  • .avi with MIME type video/x-msvideo
MindWareReleases

MindWare v0.1.3 Is Now Available

Changelog:

  • Added the first taxi camera hack mission from Ray, which leads directly to the second one.
  • Added the second taxi camera hack mission from Ray.
  • Added cum eating fetish (unlockable during the taxi mission).
  • Added a chat with Cipher about cum eating (available after the taxi mission).
  • Added information about fetishes in the character screen.

As you can see from the short changelog, this update is all about a new taxi camera hack mission that you can accept from Ray. The mission will trigger automatically when the following conditions are met:

  • You’re more than 5 days deep into Chapter 1
  • Your relationship with Ray is at least 40 points out of 100
  • You’re located in the BrainFry main hub area

I hope you’ll find the mission(s) fun because I had a lot of fun making them. On Monday I will FINALLY start fixing reported bugs (THANK YOU!!! for taking the time to let me know about them — it helps a lot) while also working on the game’s story.

Specifically, my goal is to begin a major relationship sidequest with Trix to which the taxi mission servers as a kind of prequel. Of course, there are also many blank spaces that I need to circle back to and fill, such as the rent mechanic, EroSphere, PornNexus, and others.

On top of that, I have received a lot of excellent suggestions from you, my amazing supporters, and many of them have made it on my todo list.

Thank you for your ongoing support. Stay tuned for more content and improvements coming your way soon!


Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.

MindWareReleases

MindWare v0.1.2 Is Now Available

Here’s what’s new:

  • Three neuroimaging sessions with Xavier added. Supporters can skip waiting using a button in the task description (visible only with Extra Options unlocked).
  • Gender change status messages now say 1 point instead of 1 points.
  • Added sexuality statistics in the Character screen.
  • New bar area in EroSphere.
  • You can now order a drink in EroSphere (doesn’t have any effects yet).
  • The SynTech location is now accessible (but there’s nothing to do there yet).
  • You can now go inside the Panacea Clinic (but there’s nothing to do there yet).
  • Supporters can now teleport inside EroSphere from the Extra Options menu.
  • You can now dance in EroSphere (but it doesn’t lead to anything yet).
  • You can now enter the Glory Booths area (but there’s nothing to do there yet).
  • It’s no longer possible for implantCharge to be lower than 0.

In this update, I’ve focused on adding more neuroimaging sessions with Xavier. There are now three sessions in total, and you can bet that AVA will attempt to exercise her will during them. Depending on your choices, the sessions can lead to future encounters with Xavier, but those are not implemented yet.

I’ve also made several areas accessible and created visuals for them. Unfortunately, life has been pretty busy these last few weeks, so progress on implementing these new parts of the game has been slower than anticipated. However, I am committed to continuing to improve and expand the game.

The next update will begin what I hope to be one of the most fun parts of Chapter 1—a drama-filled quest with Trix and Ray.

Thank you for your patience and continued support.


Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.

MindWareReleases

MindWare v0.1.1 Is Now Available

Here’s what’s new:

  • Expenses are now stored and manipulated more intelligently.
  • Added Community Zone and Panacea Clinic in the navigation hub (in Chapter 1).
  • Navigation hub “Go Back” links now work as they should.
  • GitGud now has a hub passage.
  • AI coding assistant becomes available when you work at BrainFry for the first time since your infection.
  • You can talk with Yuki about your surgery.
  • You can talk with Xavier about your surgery. This leads to a side mission (NOT IMPLEMENTED YET).
  • There’s a chance that Xavier will be “busy” when you visit him at GitGud.
  • Added a few post-surgery linear passages.
  • PornNexus website is now available (NOT FULLY IMPLEMENTED YET).
  • BrainFry and GitGud dialogs now display in the right order (newest first).
  • The prank mission now becomes available on day 4 of the open section of Chapter 1.
  • Relationship status change messages are more informative.
  • The Notifications box now displays available ByteBunker jobs instead of hacking targets.

The story continues! With your Steady Synapse VX implant installed, you can now finally resume your life and see whether it can contain AVA.

To experience all new content, I recommend you use the Quick Start menu to start from the open section of Chapter 1. Later this week, I will publish a walkthrough so that you can easily see what content is and isn’t available in the game.

Unfortunately, I haven’t been able to address many reported bugs in this version because my work life has been keeping me too busy again. If you’ve already reported a bug and it’s still in the game, please give me until the next release to fix it. If you notice a new bug (one that isn’t caused by using an old save) — please report it right away!

Thank you for your continued support!


Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.

MindWareReleases

MindWare v0.1.0 Is Now Available

Here’s what’s new:

  • The skip prank job minigame link now works as it should.
  • HOPEFULLY, sidebars and topbar are fixed.
  • It’s now clearer which ByteBunker jobs are taken.
  • Nicer scrollbars in Safari.
  • Fixed the following reported bug: Notes deleted after saving.
  • Fixed the following reported bug: When starting a new game, if we change the “Stats Box” location to “Top” in the settings, there will be a padding-top (2em) applied to the CSS even if there isn’t anything shown yet.
  • Fixed the following reported bug: There is an S at the top of the settings menu (before the “Display Settings” text)
  • Fixed the following reported bug: hypnosis screen infinitely changing gender to female
  • Fixed the following reported bug: Character Profile “go back” button going to wrong passage
  • EroSphere introduction now shows as intended.
  • Added task descriptions during the linear section of Chapter 1.
  • Added post-surgery chat with Cipher.

This whole update basically continues where version 0.0.9b ended, giving me at least somewhat polished foundation to work with as I gear up to progress the story in the upcoming versions.


Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.

MindWareReleases

MindWare v0.0.9b Is Now Available

Here’s what’s new:

  • The last Project XX hypno now affects player’s gender if looked at for too long.
  • Added volume slider in the sidebar music player.
  • Improved how various status changes are handled.
  • Fixed issues with identical actions potentially triggering multiple variable changes.
  • Changed how APs are displayed.
  • Changed topbar behavior.
  • Fixed a back button bug on the Extendo website.
  • Added an OmniPedia entry for NeoUrbania.
  • Added an OmniPedia entry for SynTech.
  • Added a shuffle button to the large music player.
  • Finished the implementation of the Synapse Steady VX cyberware.
  • Lowered the maximum number of dishes to clean.
  • Fixed the following reported bug: there is an typo in emailss on the left side bar
  • Fixed the following reported bug: Spilling mistake: “bathrooms of possibly hundreds of his tenatns.”
  • Fixed the following reported bug: The side bar comes out every time I click to move forward. After I click sleep, bam, it opens, work, bam.
  • Fixed the following reported bug: “extendo.omninet” on our personal laptop “opens” someone else’s laptop
  • Fixed the following reported bug: Stuck within the body details section of the Quick Access Menu, clicking “Go back” Just “refreshes” the page. Refreshes is in quotes because it takes you to the same page. You can permanently get stuck in the body details page with no way to go back to where you can leave your place.
  • Fixed the following reported bug: I find that whenever a track finishes, it always goes back to the top, instead of moving to the next track for me
  • Fixed the following reported bug: Oh right, very minor bit of feedback: If you talk to a colleague but you dont actually talk to them (ie: you dont have anything to talk about, or you click “back” instead of picking an available topic), it probably shouldnt consume energy?
  • Fixed the following reported bug: Brick breaker has no ending
  • Fixed the following reported bug: Click on the Extendo website in your laptop browser, it will output an error
  • Fixed the following reported bug: playing erosphere SIMS did not cost money
Read More
MindWareReleases

MindWare v0.0.9 Is Now Available

Here’s what’s new:

  • Added top bar to display player stats.
  • Added play stat location setting to optionally display the information in the left sidebar.
  • UI is now partially visible during linear sections.
  • The Synapse Steady VX implant is now functional.
  • Added a character screen and a corresponding shortcut button.
  • Added a computer shortcut.
  • Added a right sidebar customization tip.
  • Added a Start button hover effect.
  • Added a Quick Start button.
  • Added an option to skip the Prologue.
  • Added an option to completely disable right sidebar.
  • Fixed a web browser 404 page back button bug.
  • The SIMS watched variable now resets as it should when the player goes to sleep.
  • Added a resist minigame.

As you can see, this release is all about core gameplay systems, and it doesn’t include any new story content at all.

Read More
Releases

MindWare 0.0.8 Is Now Available

This update brings two main additions to the game:

  • S.I.M.S. pods
  • Optional ByteBunker hacking job

S.I.M.S. pods are located in EroSphere, and they are used by NeoUrbanians to experience everything from a relaxing virtual hike to a gangbang. For user safety, S.I.M.S. are categorized into levels based on their intensity. Right now, only four level 1 S.I.M.S. are implemented, but more are coming soon.

The ByteBunker hacking job was a lot of fun to create, and I encourage you take things slow and explore as you play it. The job becomes available during the second post-operation day and it remains available for the next 7 days. I have prepared a quick link in Changelog, so please take advantage of it.

For the next version, I will focus on making the VX implant functional, so that AVA can start showing up in the game properly.

Changelog:

  • Added sidebar settings (visible only when the right sidebar is visible).
  • Successful bruteforce now reveals the correct password.
  • Added anoptional hacking job. Becomes available on the second day of Chapter 1.
  • Added mobile compatibility warning.
  • Fixed empty space at the bottom of passages.

Archived release announcement. The current version of MindWare is always available at playmindware.com and on the downloads page.