Super Plexis is now on the App Store! Follow the link to download and play free: https://appsto.re/us/kmN5eb.i Still lots more we plan to update and add as we go, and we’re all ears for feedback!
seen from Finland
seen from Uzbekistan
seen from Thailand

seen from Brazil
seen from France

seen from United States

seen from China

seen from United States
seen from Philippines
seen from China
seen from United Kingdom

seen from United States
seen from South Korea
seen from United States
seen from China
seen from China
seen from Malaysia
seen from China

seen from United States

seen from United States
Super Plexis is now on the App Store! Follow the link to download and play free: https://appsto.re/us/kmN5eb.i Still lots more we plan to update and add as we go, and we’re all ears for feedback!
Inspired by games like Tetris Attack, Puzzle League, and Meteos: a twist on the puzzle fighter formula with classic 16-bit SNES flair!
Super Plexis is back on Kickstarter and this time you got until the 6th of May to get it funded and reach it’s $20,000 stretch goal for it’s release on the Nintendo Switch
Our Roadmap for Super Plexis - Dev Blog
It’s been a crazy past few weeks for the team! We released the first taste of our new single player experience, Adventure mode, then dived right into Kickstarter with their time-sensitive promotion for 1 week projects.
The First Attempt
We knew this next stage of development was going to be a challenge, another huge time commitment that, without funding, might have to be completed at a part-time rate. So when Kickstarter presented itself as an option, it felt right, and looked like our chance to continue working full time on the game as we bring it to a wider audience. While I was preparing promotional materials and writing, Andrew started work our brand new game engine, re-designed from the ground up to support Android devices and beyond. Our 1 week campaign proved to be a risky bet, but despite the final numbers the reception overall was inspiring and eye-opening (turns out people really want more games on the Nintendo Switch! But more on that in a bit).
We’ve learned a lot over the course of that one week, not just about Kickstarter itself, but about who are audience is and where Super Plexis fits in the gaming community. This is by far the most public we’ve been with our game, which has been both exciting and terrifying. We face the challenge of pitching our dream game and our long-term vision for it as a multi-platform title, but while only being able to show the current mobile version: a platform which comes with all sorts of complex stigmas and expectations. Not to mention the puzzle genre itself! But all reactions aside, one major thing has been confirmed: there is a passionate community ready and waiting for the return of classic puzzle action games.
The Refreshed 30-day Kickstarter
About halfway through our first campaign, It became clear that we didn’t give ourselves enough time to prepare. From confusion about the “All in 1″ promotion and what that really meant, to our rushing to get it live before March ended, a few major details were missed or glossed over in our urgency. It was our crash course on all things Kickstarter. We’ve since gained a lot of advice and had people encouraging us to try again, this time with a full 30 day campaign and revamped goals/rewards. Our original funding goal was based on our ideal year-long road map for development, a full package including: a brand new game engine, the Android port, the fully completed adventure mode, and any associated equipment/living expenses. But that amount proved to be incompatible with our uniquely short 1 week funding duration. For this refreshed Kickstarter, we’re splitting our goal into stages, just to ensure we can at the very least fund the most important part: the new engine. The rest will be up to our backers! With the ultimate prize being a version for the Nintendo Switch. In our first campaign, that Switch stretch goal ended up being an unexpected focal point for peoples excitement. So in our new campaign, we’re happy to announce that we’ll be prioritizing the Switch version as soon as we launch on Android. This means the stretch goal will also be much lower and hopefully obtainable!
Edit: here’s the link to the new campaign!
https://www.kickstarter.com/projects/1997496052/super-plexis?ref=nav_search
New Things on the Horizon
There’s a lot keeping us busy at the moment, some of which we aren’t allowed to talk about! But we can say it means good things for the future of Super Plexis. This coming month is likely to be our biggest and busiest yet! And a final, huge thanks for everyone who’s supported us to this point.
Stay tuned here or on our other social media platforms @medleystudio to get the latest updates!
How we solved our “Persistent Data Problem” - Dev Blog
Made this post over on reddit today but figured we’d archive it here! If other devs would be interested in more posts like this about our game or gamedev in general let us know! Even though Super Plexis is our first game, we committed ourselves to make something great from scratch without compromising the fun, the performance, or the original vision. But as I’m sure many of you know, developing for mobile is not always conducive to lofty ambitions, and creating our game’s back-end turned into a year and half long boss fight. We’d like to share what we’ve learned since it might benefit other indies (especially those with little-to-no budget) starting with: persistent data.
Here’s two things we can probably all agree on: 1) Independent mobile games tend to have issues syncing account data between multiple devices. 2) It’s frustrating when a mobile game that doesn’t require multiplayer still requires an internet connection to play.
These two problems usually intertwine into what we call the “persistent data problem”.
So here’s the cool thing about the account system we created for Super Plexis. We solved both of these problems without any monetary overhead or delayed user experience. We don’t spend a dime on servers (if we could afford it we wouldn’t be opposed to that), we don’t make users sign into iCloud or anything like that, and users can play offline if they want. Here’s the real kicker! All players’ customizable profiles are publicly viewable in the ladder, and the system is very fast and memory efficient.
How did we do it? I’ll be speaking in terms of iOS because that was our launch platform, but rest assured, these tricks with GameCenter also have an equivalent in Google Play for Android devices (for which we’ve recently started developing) . I won’t be talking too much about how we prevent cheating because that is a variable and game dependent subject. Here are just the basic ideas and feel free to ask any questions in the comments!
Pre-emptive TL;DR We found a way to use Game Center leaderboards as a server for our player data, bypassing the need for a paid server, and avoiding messy private databases like iCloud.
User requirements: As long as the user is signed into Game Center, all of these features become available. A guest account is provided for users that don’t want to be signed in.
The server: Time to get comfy with binary arithmetic! We store entire accounts using hidden leaderboard score values / meta data. Each Game Center leaderboard score gives you 16 bytes of data (a 64 bit integer value named “score”, and a 64 bit unsigned integer value named “context”), and you can store 100 leaderboards if you want to. The trick is to string the leaderboard scores together. For example, in version 1.1.9 of our game, we are using 599 bits of data (75 bytes, 5 leaderboards) to store all of the ranked progress, unlockables (characters, portraits, skins, achievements, block sets), game-mode dependent progress, important user preferences, stats, and account meta data. We scramble this data to prevent cheating and unscramble it when we are reading from it. In Game Center, leaderboard scores are usually “loaded” and “reported”. For more information on that implementation, check out the GameKit API documentation regarding the GKScore object. In our game, we report and save the most recent score as opposed to “best” or “highest” score as that wouldn’t make sense even for a poor man’s server like ours.
Offline accounts: On each machine, we create one offline guest account and one offline player account for every Game Center user that opens the app. There are billions of ways to save / load account data on any machine. On iOS, “name.plist” files are the easiest solution. We use a combination of encrypted plist files and serialized binary files. In general, it’s important to try to make these files unreadable so that you can minimize cheating. Anyway, whatever the user does on that device is always saved to their offline account. The localhost’s Game Center playerID looks like this: G:##########. In short, that is their sign-in username and password, so it is most convenient for the user to log them in immediately. If a change-of-users is detected, interrupt the game, immediately cancel any important background operations, save / sync the last user’s game state, and ask the new user to restart the app (or send them back to the title screen, this is also game dependent).
Online accounts reflecting offline accounts (longest and most important section): TL;DR, “GL HF” If the user is signed into Game Center and has a stable internet connection upon opening the app, we search for their scores in our leaderboards. In Super Plexis, this is when the first load screen says at the bottom “Retrieving data from Game Center…”. If this user’s score does not exist on a leaderboard, a new score is generated and submitted to that leaderboard. This just sets them up with some space in the online world. Now we have to use that space. Recall “The Server”, and lets use a small example. Suppose that we only had 16 unlockables in our game and they were all achievements. We only need 16 bits (2 bytes) to store the state of all these achievements in the leaderboards. It may look like this, I’ll separate my binary into byte sizes (pun very intended).
Achievements: 00000000 00000000 -> no achievements unlocked Achievements: 00000000 00000100 -> achievement #3 unlocked Achievements: 00000000 00001101 -> achievement #1, 3, and 4 unlocked Achievements: 01010000 00001101 -> achievement #1, 3, 4, 13, and 15 unlocked
How to know which bit index reflects which achievement is up to your implementation. In Super Plexis, we created a parser object that links ambiguous bit indices with offline account object values. This way, when we set the offline value “Super Cool Achievement Bro!” to “unlocked”, the leaderboard bit that is linked to that achievement is set to “1” from “0”. There is one parser object per update, that way we can view player profiles in the ladder who have not yet updated to the most recent version (because your “newer” version remembers their “older” versions). This also allows us to rename data, move data, and resize data, without corrupting your progress when you update. As you can imagine, you cannot view the player profile of someone who has a more recent version of the game than you. Also we do not allow players of different versions to match with / invite each other in online multiplayer because we may have renamed, moved, added, or (hopefully never) removed a character. For things like selectable characters, portraits, and block sets, you would normally store the related identifier string value in the server. We definitely do that for the offline accounts, but not the online reflection of them. As I said earlier, we have so little space to work with, so the data has to be very small. In this case, your best bet is to put all the character identifiers in a static array like this: [“my_character_id_0”, “my_character_id_1”, ….]. For N updates, we require N of those arrays (one per version, again incase we rename, move, add, or remove one). Now we can just use the index of the identifier as the online data instead of using the identifier itself! So now, the offline account says your selected character is “my_character_id_1”, but the bits that are linked to that account object value (the same bits that we are storing in the leaderboard to keep your data synced) say that your selected character is “1”. I.E, if you have 16 characters, you only need 4 bits to store which character the player has selected. When we save data to your offline account, we also try to report this compacted version of your account data to the Game Center leaderboards.
Syncing between multiple devices: When the user is opening the app, we make sure that we are storing the identifierForVendor (returns from [UIDevice currentDevice].identifierForVendor) on the user’s leaderboard data. This is 16 bytes of data, so it takes up an entire leaderboard score. If the score does not exist, then we report a new one where those 16 bytes are set as the identifierForVendor. This is going to be used to check if the user has changed devices. Each time we report new data to the leaderboards, the current “identifierForVendor” is reported as well. This does not have to be saved as offline data. Also, we want to store some offline data like “lastAttemptedReportTimestamp” which will be updated and saved each time the user “tries” to report some data. The report can fail if the user is in offline mode, so we must track the last time this current device attempted to do that. Here are the three cases we need to look at: 1) If the user has not changed devices (if the offline identifierForVendor = the online identifierForVendor): We do not need to sync at all. The best option is actually to report all of the user’s offline data to the leaderboards. 2) If the user did change devices, but the last successful report timestamp (the GKScore’s date) is more recent than their offline data’s “lastAttemptedReportTimestamp”: Take all of the previously loaded leaderboard data and sync it to the offline account of the user. Save the offline account and report the current identifierForVendor so that we can record the next time a device change occurs. 3) If the user did change devices, but the last successful report timestamp (the GKScore’s date) is older than their offline data’s “lastAttemptedReportTimestamp”: There is no way to know what we should do in this case. This usually never occurs but it is possible if the player is constantly switching devices and playing some of them in offline mode, then playing the same ones in online mode later. The trick here is to prompt the user and ask them to upload or download their data. If they don’t know which one to choose, we offer a “play offline” option where they can check their offline account’s progress. If there is no missing progress, the user is guided to restart the app and tap “upload”, because the user would have been satisfied with their offline account. Otherwise, the user is guided to tap “download”, because the only way for there to be missing progress at this point is if their progress is in the leaderboards and NOT on their device.
That’s the gist of it! I left lots of small details out, and believe me there are many. This how we solved the persistent data problem in our game without paying for a server, using private databases like iCloud, or delaying the user experience. But when we are able to afford our own servers, we definitely will upgrade for all the obvious benefits (like cross platform play between iOS and Android devices, something that is not possible using this method). But for a dev team of only 2 guys, this method has been a life-saver on a budget. Hopefully it will help some of you as well!
Beta Patch #1 (Build 36)
The new build is finally on Testflight! If you haven’t signed up yet, use the following link:
https://www.signupanywhere.com/signup/PZxFAXiS
(We’re using Apple’s Testflight platform which means there will be a delay between when you sign up and when you actually receive your invite depending on when we can update the list)
What’s New:
Improved matchmaking that should get you into more matches and much faster (e.g. you wont see timeouts nearly as often)
Added a Friendslist with the option to invite Friends directly into private matches! (see below for more info*)
The difficulty levels in VS AI now actually do influence the AI’s speed of play.
App Icon has been updated!
All sound effects and music have been balanced into a cleaner, overall mix (but feel free to use the sliders in the options menu to make any adjustments for personal preference)
Health blocks will appear 30% less often compared to before, and health gained from health blocks has been reduced by 50%.
*For the Friendslist, we’ve implemented a “Friend ID” system that will like you add and remove friends based on their ID number (seen at the top of the Friendslist menu). To add a friend, press “Add Friend” and input their Friend ID. With a friend on the list selected, you can use the bottom buttons to view that friend’s profile, invite them to a private match, or delete them from the list.
note: this a new feature so you might encounter some bugs, and in general restarting the app will resolve any issues.
The ladder/leaderboard has been reset, everyone’s rank points will now start at 1050 with a fresh win/loss ratio! (this may not be the last time we do this moving forward, just a heads up! All part of the testing process).
VS AI difficulty now actually increases difficulty, so if you haven’t checked out that mode yet, or found a sense of pride in beating “impossible” in the previous build, you might want to prepare yourself.
And lastly, all the sound volumes have been rebalanced (with only a couple other bugs left to resolve, like the slight delay in music loop, or disappearing UI sounds). The new mix still isn’t perfect, so as the balancing act continues on our end you might want to bring the music volume below the sound effects for a better experience overall.
What follows is a list of known issues and a glimpse at what we’ll be working on next:
Gameplay/UI:
Game balance in general is still in it’s early stages. The frequency of health blocks, rate of damage, character stats, and abilities will be adjusted in future updates to reach more comfortable, fair, and satisfying match durations.
In the Gallery menu, the “Enemies” are temporary and are related to classic mode which is unplayable in this version.
Music stutters a bit between loops, and certain sound effects might stop playing altogether (we’ve identified the issue and will most likely push out a small update for this soon)
The Friendslist and Invite features have a few bugs that are being worked on, but in the mean time restarting the app will usually resolve any issues.
Visuals:
On iPad, the game’s aspect ratio may appear slightly stretched.
Character skins are being tested with temporary recolored sprites.
Block skins are also being tested with recolors (expect many more in future!)
The character “Vulmir” is still in a rough-draft phase and will be receiving a fresh coat of paint in the next update.
Some portraits are using placeholder art.
Some rank emblems are using repeated/recolored sprites.
Some rank emblems appear too dark and will be brightened slightly.
Future Content Roadmap (from soonest to furthest updates):
An in-app tutorial to teach new players
Chain-combos will be given more weight than fast successive combos when calculating how many deadblocks are sent (This is to reward strategic and calculated players and provide alternative play-styles). Chain-combos will also have their own distinct sound effect.
A shop where players can use their “blocks cleared" as a currency to purchase unlockables.
Additional Achievements for the Battle modes, Multiplayer, etc.
Rank Emblems will be added to the Gallery
Rank Emblem promotion and demotion animations will be added to the end game screen.
A “Forfeit" option to end battles early (currently the only way to quit is to lose/win the match)
New characters and abilities
New portraits, achievements, levels, and music
A glimpse at the “Classic Mode” single-player experience
Additional modes in the “Battle” menu
We hope you guys enjoy the game in it’s current state and look forward to your feedback to help improve it! Follow/Contact us on twitter/instagram/tumblr @medleystudio to get additional updates and stay in the loop when we’ll be online the game!
Thanks guys and see you online!