0.9.0 updates

Just a quick clarification: what I had been previously calling version 0.8.7 has ballooned into quite a big change, and so I’m now calling it 0.9.0. Really, I should have done this from the start: the civilizations and new sector map are conceptually large… why I didn’t realize this at the start, I’m not sure 😛

But anyway, that’s whatever. Who cares.

What I REALLY want to talk about is my current progress. I did not release at the end of January since the game was not in a playable state at that time.

It’s been two weeks, and the game STILL isn’t ready for release, I’m pretty confident it will be ready at the end of THIS month, so look forward to a release then 🙂

There’s not a lot to say about the progress these last two weeks. For one, my full-time job was super-busy last week. A few co-workers came in from out of town for a big meeting (the development team, which I’m a part of, works remotely). Besides the long days that week, several days were made even longer by after-work dinners and socializing. This is all to say that zero Mysterious Space work was done during that week, or indeed zero ANYTHING ELSE 😛 It was a stressful, but fun week – no regrets! 🙂

It also seems that no matter what month, week, or day, there’s always some other side-project I’m working on. An educational game… a board game… a game jam… I’m not going to apologize for these stealing my time, anymore 😛 Even though they’re unrelated to Mysterious Space, they’re all opportunities for me to do something new, and learn something more. Hopefully, I’m learning a little something from each one, leveling up my real-life skills, getting better at everything I do, including Mysterious Space.

THAT BEING SAID: I’d like to talk about my most-recent side-project, since it is Mysterious Space-related, although not in a way you’d probably expect: I have been planning and writing a story which takes place in the Mysterious Space setting. I would not consider myself a skilled writer, but it is always something I’ve enjoyed doing from time to time, and as I sat down to plan I realized that there are some writing-related tips and tricks that I’ve learned from studying game design (a lot of game design pulls from other media, anyway, including movies and books).

How far will I take this writing project? If I had to guess, I’d say one in every 10 to 20 of my side-projects turn into anything worth sharing, so… we’ll see how this one goes! 😛 But even if it’s something I never finish, I’m sure it will inspire changes to Mysterious Space in the future 🙂

Sorry again about missing last month’s release, but I hope you’ll look forward to this month’s. I’ll try to post a game-play/update video in the coming week, as well, to show you guys some of the new content!

Thanks for reading, and thanks for playing Mysterious Space! 🙂

a big change for 0.8.7

I’ve recently been playing the game co-op with a friend, and we’ve been able to beat Mysterious Space! it took a few tries, and I almost never beat the game, even when I sit down and try, so that was kinda’ cool… but we both agreed that the ending is kind of… “meh”.

like, you win, and there’s a tiny cut scene, and you see some credits, but… I dunno. it was hard to beat the game, sure, but somehow “beating a hard thing” wasn’t reward enough for us.

and I can’t help but think that other people will feel the same way.

so I’ve set about trying to fix this. and it’s entirely possible that my approach will fail, but I’m not TOO bothered by that, because I think that my “solution” will still add something fun and unique to the game.

anyway: I’ll stop beating around the bush, and tell you what I’ve done. then I can explain more about “why” afterwards.

The Changes

Mysterious Space will now feature five alien races who are native to the ZZ-Omega-9 Sector. the sector map will no longer have a fixed layout (it will be procedurally-generated), and will also be much larger than bebefore (it no longer all fits on one screen), but most-importantly, about 20-25% of the systems will be controlled by one race or another.

(it may also be worth mentioning: though the sector is much larger, you will still visit approximately the same number of planets in one play-through. it’s just that there are now more possible paths to take.)

the races themselves are not procedurally-generated. I want your interactions with them, and the consequences of those interactions, to be discrete and easy to understand, so making them fixed seemed like the way to go. (I’m sure I COULD still accomplish this with procedurally-generated races, and I may move to having them proceudrally-generated in the future, but for now, in the interest of ease of programming, they are fixed.)

so what are these races? how will you interact with them?

aliens

from left to right, they are:

Lyra (The Lyran Empire)

this civilization is at war with The Aquilan Empire (next) for control over the very same Mysterious Source that the player is after! The Lyran Empire will not let the player enter their systems unless the player agrees to help them. agreeing to help Lyra makes the player an enemy of Aquila.

I don’t have a super-fleshed out personality for this race, except that, being at war, they do not have time to mess about. you can either agree to help them, or be on your way.

Aquila (The Aquilan Empire)

your interactions with The Aquilan Empire is basically symmetrical with The Lyran. I may put in some slightly different bonuses you get for allying with one or the other, but what it really comes down to is “do you side with one of these empires in order to reach the Mysterious Source, knowing the other will hate you? or do side with neither.”

after discovering the Mysterious Source, there will be a confrontation with both of these civilizations, regardless of who (if any) you allied with. how you resolve that confrontation will definitely impact the last half of the game (your journey home).

Pisces

this tentacled race, along with Auriga and Ophiuchus, are each smaller than either Lyra or Aquila, but have joined together to form The Triad. they are not involved in the war for the Mysterious Source; their main purpose in the game is to give you opportunities to trade for supplies and other services.

I haven’t worked out the details quite yet, but the outposts that are currently in the game will definitely be reworked to tie into The Triad (and possibly Aquila and Lyra as well).

Pisces, specifically, are a welcoming and forgiving species, eager to trade. they will have more-unusual items to sell you than the other races (I’m sure I’ll end up making some items which can only be acquired through Pisces).

Ophiuchus

the Ophiuchustians are the most reclusive of The Triad. they are a race of silent watchers, gathering information, and then dispensing it when they feel “it is time.” before they are willing to deal with you at all, you must prove that you have good intentions.

besides basic services, I’m not sure what exactly I will have the Ophiuchus offer. something information-based, obviously… item identification, perhaps… maps… things of this nature.

Auriga

while Pisces is rather cheerful, and Ophiuchus is reclusive, the Auriga are more middle-ground, and straightforward.

obey their laws, and you are welcome.

their services will be similarly basic and straightforward. I don’t really have much to say about them 😛 I’m not sure if I should strive to make them more unique, or if it’s valuable to have something more neutral in the game. I’ll continue to think on this…

Why These Changes?

previously, Sector ZZ-Omega-9 was a kind of empty place. sure, there were enemies and little outposts, but there were no other entities that seemed to have a definite purpose for being there. it was essentially you against space.

my hope is that by adding other entities to the Sector – each with their own purposes, and each of who you can interact with – I can give you (the player) some interesting choices to make beyond just “which armor do I want to equip?” and also give you an enemy (or two) whose motivations make sense and have purpose, so that, when (if) you win, you can you feel like you actually beat someone/something worth beating.

overall, I hope these changes will give a little context to Sector ZZ-Omega-9, and your adventures within it.

… and again: maybe they won’t!

maybe this idea is all wrong, and winning the game will still feel lackluster, even after these changes. but even if that’s the case, I still think it will have been a good addition! I don’t think I’ve seen something quite like this in another roguelike(like(lite)). it feels “original”; gives Mysterious Space a little uniqueness (though if there’s another game out there with a similar idea, I would not be surprised; I can’t say I wasn’t at least a little inspired by the Civilization games). it will also be a good framework for expanding the game in the future.

I hope you’re looking forward to it!

thanks for reading, and thanks for playing Mysterious Space! 🙂

Mysterious Space 0.8.5 release + latest donation + bundle + other stuff!

Mysterious Space 0.8.5 will be released at the end of the month! it’s going to be a smallish update, for a couple of reasons (more on this later).

the most notable addition will be that of music! three new songs from DDRKirby(ISQ)! I’ve also spiffed up the “Sound & Music Test” page a little, and added a playable credits sequence for those who manage to beat the game.

I’m sure I’ll sneak in a new bit of equipment before the end of the month, too 🙂

donation!

another $500 earned through Mysterious Space; another $500 donated! this time to the Project for Awesome.

next up: JAXA – the Japanese space agency! at last!

JAXA had been my first on my list to donate to, but they’re not super-equipped to receive money from people outside Japan, and by the time they got back to me, I had already donated to The Planetary Society. but I’m back around to the “Space” category of donations, so… JAXA! 😀

indiegala bundle!

Mysterious Space is in indiegala’s HUMP BUNDLE, running until December 5th! you can pick up Mysterious Space, and a couple other games, for just $1!

Ludum Dare and… Rail Nomenclature??

I participated in Ludum Dare last week, to make an educational game for work…

yep!

at work we make a boring government training website, and for a long time I’ve been thinking “games would be better.” but I kind of never wanted to spend my own time making a game about learning rail nomenclature >_>

but then Ludum Dare struck, and it seemed like a good opportunity. even better, the theme of Ludum Dare was “two-button controls”, and I had already been trying to think of how to make the game accessible. two buttons is PERFECT.

I didn’t finish the game, but I am continuing to work on it. my boss and I would like to present it to the vice president and see if we can take it further, and I’d like to add a bit more before I present.

once that’s ready, I’ll be sure to share it with you guys, as well 🙂

Christmas

^ it’s a thing, and it’ll be taking up a solid week of the month! between Christmas plans and Ludum Dare, a lot of this month’s free programming time – time I’d otherwise spend on Mysterious Space – is gone.

and that’s fine! it just means the Mysterious Space update this month is going to be pretty light.

TinyUnixTimestamp

finally, unrelated to everything else, I wanted to point out TinyUnixTimestamp. it’s a little Windows program I wrote years and years ago that does one thing, and one thing only: sits in the system tray and copies the current unix timestamp into your clipboard when you click on it.

tinyunixtimestamp

it was useful to me in the past, and for some reason it occurred to me that, “hey! this could be useful to others! I should release the source code!” so I have! check it out on github.

that’s it!

thanks for reading, thanks for playing Mysterious Space, and if it’s snowing where you live, go sledding! 😛 *wishes it snowed more where he lives*

Steam API in C#

this is a class I wrote for Mysterious Space, to handle loading and dealing with the Steam API. C# support for the Steam API is not super-great… there are some other wrappers/libraries out there, but I wanted to use the base API provided by Valve/Steam.

there’s not a lot of information out there on how to do this, so I’m posting my own implementation in the hopes that it may help other C#/Steam developers. it works in both 32 and 64-bit environments. you may notice that it only provides easy access to Steam achievements! (that’s all I’m using right now, in Mysterious Space.) with a little research, though, you could extend this to handle other features, as well.

(the following code has been dedicated to the public domain! feel free to use it in your own project!)

using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Valve.Steamworks;

// remember to add steam_api_interop.cs to your project; it's included
// with the Steamworks SDK <https://partner.steamgames.com/>

// you may want to use a different namespace :P
namespace MysteriousSpace
{
    public class SteamIntegration
    {
        // this is a singleton class; here is our instance and accessor:
        private static SteamIntegration _instance = null;

        public static SteamIntegration Instance { get { return _instance; } }

        // to load the steam_api.dll, we will use LoadLibrary from kernel32
        // (worry not, ye 64-bit app developers: kernel32 is a misnomer; this
        // DLL is used in both 32 and 64-bit environments.)
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);

        // be sure to init the singleton with a call to SteamIntegration.Init()!
        public static void Init()
        {
            // this bit of logic determines if we're 64 or 32-bit, and loads
            // the appropriate copy of steam_api.dll
            string fileName = Environment.Is64BitProcess ? "SteamAPI\\64\\steam_api.dll" : "SteamAPI\\32\\steam_api.dll";

            fileName = Path.GetFullPath(fileName);

            LoadLibrary(fileName);

            // TheGame is a class specific to Mysterious Space, and stores
            // various info, including library versions. feel free to change
            // this var name (perhaps making it a member of this class), or
            // get rid of it entirely.
            TheGame.SteamAPIVersion = FileVersionInfo.GetVersionInfo(fileName).FileVersion;

            // you can find your steam app id on the steamworks website
            SteamAPI.Init(YOUR_STEAM_APP_ID_HERE);

            _instance = new SteamIntegration();
        }

        private ISteamUserStats _user_stats;

        // private constructor (again: I chose to implement this as a
        // singleton; you don't have to)
        private SteamIntegration()
        {
            _user_stats = SteamAPI.SteamUserStats();

            // another Mysterious Space var I keep, used to determine if
            // Steam integration is available, and not call certain methods
            // if it isn't.
            TheGame.STEAM_INTEGRATION_ENABLED = (_user_stats.GetIntPtr() != IntPtr.Zero);
        }

        // don't call this unless TheGame.STEAM_INTEGRATION_ENABLED is true
        // (you could add a check for this, and throw an exception, or
        // something... I chose to make this check elsewhere in the game.)
        public bool HasAchievement(string name)
        {
            bool achieved = false;
            _user_stats.GetAchievement(name, ref achieved);
            
            return achieved;
        }

        public void SetAchievement(string name)
        {
            _user_stats.SetAchievement(name);

            // could be useful, when debugging:
            //Console.Write("got achievement " + name);
        }

        public void CheckForNewAchievements(Sector s)
        {
            // your achievement-checking code here; call SetAchievement if the
            // achievement's conditions are met, and HasAchievement returns
            // false
        }
    }
}

donation to PBS has happened! + 0.8.4 is almost ready!

after my initial goof on Mysterious Space profit calculations, we’re finally back on-schedule for donations! $500 has been donated to Community Idea Stations, but you probably know them better as PBS (Public Broadcasting Station). they’re also responsible for several YouTube channels! I don’t follow all of them, but I do follow a couple, and they are great:

I would also recommend their TV series NOVA, which can also be watched online!


but you probably want to hear about Mysterious Space 0.8.4 progress!

I’ve sneaked in a lot of work these last few days, including boring stuff like code clean-up, and awesome stuff, like figuring out some new music with DDRKirby(ISQ)!

other awesome stuff is new character creation options (which I talked about in this video), including a few options for those who want an extra challenge!

I’ve also been adding a bit of polish: fade and wipe transitions between different scenes, and a new credits “level” to play through when you win the game.

finally, I played with making each cloud produce individual snow and rain drops (instead of the current, cheaty way that snow is handled), because I feel like there’s potential for some fun simulation-driven interactions that could be done with clouds. unfortunately, I had to scrap that, as tracking individual snow flakes and rain drops was proving a bit too CPU-intensive. (it’s not worth spending that many cycles on something that you’ll only rarely interact with!) I still want to add some mechanics/gameplay surrounding clouds; I just have to find a better way!

Thanksgiving is coming up, so a release date is a little less certain, but I will be aiming for the end of November/start of December, as always! sorry in advance if I’m a day or two late!

Mysterious Space 0.8.3 released; a different project next month

I’ve released Mysterious Space 0.8.3! (Get it on Steam, or itch.io!)

It’s got… clooooouds; it’s got… a better settings menuuuu; it’s got… waves of enemiieees; it’s got… all kinds of things! Check out the changelog!

It’s also got a very-incomplete Russian translation, thanks to updated font-rendering code, and partial support for wider characters, including Hiragana and Katakana (the characters are in there, but aren’t always positioned correctly). I’ll be working to improve both of these things in a future release, of course!

NEXT MONTH, however, I’m going to be working on a different project. I’ve started working on a procedurally-generated life sim. A town and its inhabitants are created, and you are given free reign to… do stuff?? My initial plan was to make it a dating sim, and I’ll probably include that option of play, but I’d like to explore other possibilities as well.

I’ve begun work on giving character memories, which they associate with feelings, and the things present during those memories. This will give them the ability to form opinions about new things – including the player character – depending on how those things look, sound, act… taste?? >_>

The basis for all feelings right now is the Triangular Theory of Love, which I have used to simulate relationships before, in PsyPets. I’m not sure how well-suited is to including feelings about objects, but I think it’ll work out okay.

Other systems I wish to simulate: sleep, caffeine, alcohol… but probably not hunger, because let’s be honest: no one wants to spend time eating in a game any more than they want to spend time using the restroom!

As you may have guessed: yes, I spent some of last month starting this thing up 😛 It was not a 100% Mysterious Space month, but then, it never is: I toy with new project ideas all the time, I just don’t talk about most of them, because I quickly lose interest. This idea is sticking with me, though, so I’d like to give it a full month of its own to see how far I can take it. Maybe it becomes a game I release; maybe not.

It’s a little like using your first Alien Artifact in a game: you won’t know until you try 😛

Thanks for reading! 🙂

tractor beams, enemy waves, and other things

hello, Internet. Ben here with another Mysterious Space update.

I wanted to do a video update, but I messed it all up twice in a row, so I’m just gonna do a text update, instead 😛

the first thing I want to talk about is a major change in how enemies are spawned! previously, they came at you in a kind of steady drip-drip-drip pace. one enemy appears… then another… then maybe two this time… okay, back to just one more… etc.

this has two problems:
1. when you want to have a moment to investigate a new puzzle – say you’ve never seen outposts before, or forcefields that require pushing a button – you never have that moment. you start to investigate, then an enemy comes charging at you. you kill it, but then another enemy is on its way just a couple seconds later…
2. the speed at which new enemies spawns increases, and while it SHOULD, it provides a CONSTANT pressure that’s more “ugh! cut it out, already!” than it is exciting. the world has long known that a better way to create excitement looks like this, in the most general:

difficulty curve

or this, in the more-specific:

star wars pacing

excitement curve example

I’ve known about interest/difficulty curves for a while, and have even examined Mysterious Space with interest curves in mind before: every level is a peak; the space between is a trough; but we lacked that initial spike, which is why I added a boss fight to the end of the tutorial. but while I had thought of the overall game structure, I somehow failed to think of interest/excitement/difficulty within a level itself!

and that is why, rather than the steady drip of enemies, I’ve moved to enemies coming in waves! and as the level progresses, the intensity of these waves increases.

mini-bosses are kind of interesting, though: first of all, they’re only sometimes present, so only sometimes provide a spike in interest (hm!) even when they ARE present, though, while they always create a spike in INTEREST immediately (“oh, shit, a mini-boss? do I want to fight him now, or later? oh, hm, actually, there’s going to be extra fuel on this level, so I don’t even HAVE to fight him… but he will have that regenerating armor drop, and I could use an armor upgrade…”), because the player can choose when to face them, they may not create a spike in DIFFICULTY until later (or never!)

I’ll think more on this later, but for now, at least, I will let mini-bosses stand as they are.

ANYWAY: so that’s the first change coming in 0.8.3.

moving on: a tractor beam enhancement! you can now use your tractor beam on a fallen ally!

this came about as a result of talking to a Mysterious Space player – Kyle! – on Steam. Kyle! reported a co-op bug (which I’m still investigating), and I admitted that I don’t test co-op as much as I should, since I’m developing the game solo, so had a question: “since you play a lot of co-op, I’d be curious to know if you’ve been able to successfully protect a friend when they’re reviving. the intent of the mechanic was to encourage players to stick together, but I’ve never really been sure if it does that :P”

Kyle!’s response: “eh, not really. Maybe 1/4 times I am close enough to save him and if I am it all depends on what is attacking him. If it’s a ufo that shoots straight down then he is boned”

it was as I feared! the system was not providing much opportunity for players to help one another out when they need it most.

but then, while mentioning this problem to a friend who doesn’t even play Mysterious Space, he said “it’d be cool if you could use a tractor beam, or something, to pull your friend from danger!”

!!!

YES! THAT’S SO PERFECT!

he didn’t even know tractor beams were already in the game, but the fact that they are is what makes this suggestion even better: it slots in naturally; it works with an existing mechanic…

and so: you can now use your tractor beam on fallen friends. besides the general usefulness, I hope this proves especially useful when spikes are around!

the third thing I want to talk about is less-exciting, but never-the-less useful: there is now, and finally, a SETTINGS menu option on the title menu! the biggest challenge for me here was in not just re-doing all the logic from the in-game settings menu…

what I mean is: if I had just straight-up recoded the UI and logic, we would now have two instances of code where, say, music volume can be changed. if I later decide I want to allow volume to go up to 200% (rather than the current 100%), I’d have to make sure to change it in BOTH places <– and that is a terrible, terrible situation to have your code in. it leaves you open to bugs and other misbehaviors, and I wasn't going to have it 😛

so I abstracted settings away, and created a central “list of settings” that is used in both places. every setting knows how to respond to different button presses, and even how to draw itself (with some options). if I wanted to create a THIRD place to access settings, that would now be much easier, but that's less likely. again, the important thing is that now if I want to change the options for a setting, or even add a new setting, I only have to do it in one place in the code, and both parts of the game will reflect this change.

SO: anyway: those are the three big things I've got in for 0.8.3 so far. there's still a couple weeks in the month, before I release. I will post again (in text, or video) before then, with a run-down of anything else new I add 🙂

thanks for reading, and thanks for playing Mysterious Space 🙂

fun with fonts!

I did a pretty big refactoring of the font system in Mysterious Space 0.8.2.2. I’ve tried to use a couple libraries to handle drawing text for me, but neither has worked out for one reason or another, so I’ve resigned myself to DOING IT MYSELF.

which is fine by me: it’s a fun problem to solve!

so:

font [DEV]

previously, I handled drawing text by simply having a “sprite sheet” (right), and a few methods – “WriteText”, “WriteCenteredText”, etc – that checked out this font sheet, and used it to draw the string you wanted.

computers store everything as numbers, so “A” is 65, “B” is 66, etc… “a” is 97, “b” is 98… and everything from question marks to periods to dollar signs all have their own number. so if the game needs to draw the letter “A”, it says “okay, that’s character 65, and each character is 8 pixels wide and 10 pixels tall…” and calculates out where in the sprite sheet the letter “A” appears, and draws that area on the screen.

SIMPLE!

when I added Advanced Technology, which draws straaaange characters, I just added another sprite sheet, and then updated the code to let me tell it WHICH font to draw; something liket his:

ActiveFont = AlienFont;
WriteText(“this text will appear in strange characters!”);
ActiveFont = NormalFont;

which is messy, but works…

UNTIL: I decide that I need ONE of the fonts to have slightly taller characters (to make room for accent marks over capital letters, as seen in the sprite sheet above…)

why is that problematic? because for the most part, this extra height isn’t needed, so when I ask the game to write out multiple lines of text, I don’t want it to actually space the lines out according to the full height of the font; it should subtract the little extra bit of space on top… but for the alien font, it SHOULDN’T…

so the game is starting to have to do things differently depending on what font it’s drawing with. oof! I need a place to store that kind of information!

and that, of course, is what object oriented programming is for 😛

SO: I’ve now created a Font “class” which has its sprite sheet, but also some extra data, like “how much space between lines?”

I also changed the code a little, in a way that’s hard to describe if you haven’t programmed… but basically, instead of saying “hey, game: draw some text using this font”, I now say “hey font: draw some text yourself”. I’ve moved the responsibility of drawing text to the fonts themselves, since the fonts have all the extra information they need to really do the job. (sure, the game could ask the fonts for that information when drawing, but putting the logic near the data keeps things tidy. did that make sense? I hope that made sense.)

this will also be helpful when I add Cyrillic characters (for Russian), Greek characters, and maybe even Japanese, because: remember how I mentioned that every character has a number? and “A” is 65? well, the first Russian character is 1040! and there are some Japanese characters up in the 20,000s! if you look back at that font sprite sheet I showed before, it only has a couple hundred characters… in order to get up to 20,000, it would have to be ENORMOUSLY tall, but worst of all, most of it would be completely empty! (there are some other language’s characters in there, sure, but also other things, like characters from long-dead languages, mathematical and astrological symbols, some emoji, maybe, and many other things that I don’t need…

what would make more sense, then, is for a single font to have multiple sprite sheets, and for it to know the range of characters that each of its sprite sheets contain. this is going to require even MORE code/logic, and more data, but we’ve already put that all in one place – in the fonts themselves – so it’ll be okay 😛

so! that’s some of the behind-the-scenes involved in the seemingly-simple task of drawing letters on the screen. it’s a problem that’s been solved many times before (y߀ür c߀mρútêr ïs ԁoiлǥ ít rìǥht noɰ!), and I would have liked to have taken advantage of that previous work, but, again, I haven’t been able to find some code that works (especially for Mysterious Space’s retro style), and that’s alright: it IS an interesting problem that, and I’m having fun working through it myself 🙂