Month: September 2024

MindWare 0.1.6 Is Now Available

I’m happy to announce the release of MindWare 0.1.6, the first version to feature a new mobile-friendly UI.

Play online: https://playmindware.com/

I’ve tested the new UI on iOS Safari, and it makes the game fairly nicely playable in my opinion. Of course, the larger your device is, the better the experience.

Because I wasn’t developing the game with mobile devices in mind until very recently, I had to disable some parts on mobile (some minigames and the games section in the player’s home).

I will eventually replace/update all minigames to be mobile-friendly (I’ve already developed a replacement minigame for the one that lets you resit AVA, but I still need to use it throughout the game), but it will be a gradual process as I want to dedicate as much of my time to writing the story as I can now that the UI is updated.

Speaking of the game’s story, I’ve made progress on the transformation quest, and it’s now technically possible to physically become more feminine. I’m aware that the transformation quest needs more love in terms of pacing and polish (the hospital currently doesn’t charge the player money, for example), and I plan to address these issues in future updates.

The only core gameplay change that I would like to implement sooner rather than later has to do with chat messages and some emails — but mostly chat messages.

Right now, the chat messages are written as if the chat happened right at the moment of the player receiving a notification message. As a result, the longer the player takes before they open the chat, the less sense the chat can make. I know that most of you open available chats as soon as they become available in the game, so I will save you a few clicks and open them automatically as soon as they become available. The chat app can then serve as an archive of past chats.

Changelog (beta versions + public release):

Version 0.1.6 (Public)

  • Coding assistants should now be more balanced (but this part of the game still needs a lot of work).
  • New avatar set (custom avatars can now be placed in the “setX” folder).
  • More content with the psychiatrist.

Version 0.1.6 (Supporters-Only Beta 3)

  • Many minor UI design improvements.
  • Top menu buttons now double as notification indicators.
  • Added ByteBunker OmniPedia entry.
  • Minigames are automatically skipped on mobile.
  • Added notification sound effect.
  • Post-infection white overlay now doesn’t flicker.
  • Significantly more robust system for stat changes.
  • Fixed dish washing minigame.
  • Slightly improved the waveform minigame.
  • Fixed bug that stopped rent payments from working.
  • Added first sex scene with cook.
  • Added second sex scene with cook.

Version 0.1.6 (Supporters-Only Beta 2)

  • New mobile-friendly UI.
  • New UI sound system.
  • New music playback system.
  • New start screen.
  • Updated Listen to Music section in player’s apartment.
  • Many minor UI redesign-related changes.

Version 0.1.6 (Supporters-Only Beta 1)

  • Removed difficulty settings.
  • Removed Quick Start button.
  • Reimplemented minigame skip button.
  • Moved option to enable minigame skip buttons to Settings menu.
  • Removed morality mechanic.
  • Removed some sexuality stats.
  • Fixed bug causing scroll to top button to be created endlessly.
  • Made first bruteforce minigame easier.
  • Added 10 showercam feeds.
  • Added version number below game subtitle.
  • Added first Rent Compliance Specialist visit.
  • Implemented Hive Properties debt leading to installation of SUCKER machine.
  • Fixed bug allowing skipping of BrainFry introduction.
  • Increased earnings from coding minigame.
  • Added visible BrainFry work counter to BrainFry passage.
  • Replaced Synapse Steady VX installation clock with video to fix rare bug.
  • Added unpaid rent notification to home passage.
  • Fixed bug causing psychiatrist to say “hello again” on first visit.
  • Fixed Extra Options menu to preserve player name-related variables.
  • Updated Settings menu to correctly set player name variables.

Thank you for your support!

Smarter Stat Changes in Twine/SugarCube Games

Changing a stat in a Twine/SugarCube game is simple on paper but often complicated in practice.

If your game is very simple, you can do something like this:

<<set $stat -= 5>>

If you want to get fancy, you can even prevent the stat from becoming less than 0 by doing this:

<<set $stat to Math.max($stat - 5, 0)>>

This works fine until you add something like an inventory passage that the player can visit at any time. When they come back to the passage with the stat change, the change will happen again.

One way to prevent this is to do the following:

<<if visited() is 1>>
   <<set $stat -= 5>> 
<</if>>

Again, this works if your game is structured in a straightforward way, but it stops working once you introduce some <> macros that reveal passage content after some interaction.

If this interaction happens after you’ve visited the inventory passage and come back, then the visited value won’t be 1 anymore… it will be 2 or more.

To solve this problem, I’ve developed a more robust system for handling stat changes in Twine/SugarCube games. This system ensures that stat changes occur only once, regardless of how many times a player visits a passage or interacts with certain elements. Here’s how it works:

We create a custom widget called statChange to manage these stat changes:

<<widget "statChange">>
    <<if ndef $statChanges>>
        <<set $statChanges to {}>>
    <</if>>
    <<if not $statChanges.hasOwnProperty(_args[0])>>
        <<set _tempStatValue to 0>>
        _args[1]
        <<set $statChanges[_args[0]] to _tempStatValue>>
    <</if>>
<</widget>>

Let’s break down the statChange widget line by line:

This checks if the $statChanges variable is not defined. If it’s not, it initializes it as an empty object. This object will store all the stat changes that have occurred:

<<if ndef $statChanges>>
    <<set $statChanges to {}>>
<</if>>

This checks if the $statChanges object doesn’t have a property with the name of the first argument passed to the widget (which should be the name of the stat being changed):

<<if not $statChanges.hasOwnProperty(_args[0])>>

If the stat hasn’t been changed before, this initializes a temporary variable _tempStatValue to 0:

<<set _tempStatValue to 0>>

This executes the macro:

_args[1]

This records the stat change in the $statChanges object, using the stat name as the key and the change value as the value:

<<set $statChanges[_args[0]] to _tempStatValue>>

We modify our stat-changing widgets to work with this system. For example, here’s one widget from MindWare:

<<widget "moreFeminine">>
    <<set _amount to _args[0]>>
    <<set _playerGender to State.variables.playerGender>>
    <<set _newGender to Math.max(_playerGender - _amount, 0)>>
    
    <<if _newGender == _playerGender>>
        <div class="gender-change"><span class="gender-decrease">♀️ Your feminine gender identity is already at its minimum.</span></div><br>
    <<else>>
        <<set State.variables.playerGender to _newGender>>
        <<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
        <div class="gender-change"><span class="gender-decrease">♀️ Your gender identity has become more feminine by <<print _pointText>>.</span></div><br>
    <</if>>
    <<set _tempStatValue to _amount>>
<</widget>>

To use this system, we simply call the statChange widget with a unique identifier and the stat-changing widget:

<<statChange "ugly_bastard_quest_2_AVA_submit" "<<moreFeminine 5>>">>

This system solves several problems:

  1. It ensures that each specific stat change occurs only once, even if the player revisits the passage multiple times.
  2. It works with <<replace>> macros and other dynamic content, as it’s not dependent on the visited() count.
  3. It allows for more complex stat-changing logic within the widgets, including checks for minimum/maximum values and appropriate feedback messages.
  4. It provides a way to track which specific stat changes have occurred, which can be useful for game logic or debugging.

By using this system, you can create more complex and dynamic games without worrying about unintended repeated stat changes.

Scroll to top