Articles - RareSloth Games

Who we met at GDC ’17

GDC is the annual Game Developers Conference in San Francisco. This is our second time at GDC. This year we focused on making friends and meeting people (and of course checking out the games). Here are some of the people we met along our journey… Most of the people here are involved in some way with App development or is an indie. This is not an exhaustive list, so if we forgot to include you – no hard feelings!

Greg Wohlwend and David Laskey

Happened to meet Greg at the Chicago airport! We’ve always been a big fan of Greg’s work. He worked on Threes! and Ridiculous Fishing. Overall his work has been an inspiration, and he may be the most humble dude at GDC. We got to play his newest title — Tumbleseed at the Mild Rumpus. David Laskey who also works on Tumbleseed was there as well and we spoke a bit about his experience in porting to PlayStation. Looking forward to the release of Tumbleseed for Switch, PS4, and Steam.

Paul Brady

Met Paul at IMGA (International Mobile Gaming Awards). He is a PR wizard and told us about an interesting non-profit Swedish accelerator called Stugan, definitely check it out. He was also very willing to share some quick insights on game marketing which we appreciate, thanks!

Butterscotch Shenanigans brothers + Andy and Monique.

We’ve known the BScotch guys for a few years now and it was good to see them again. Adam shared some insights on hiring which will help our studio in the coming year, thanks Adam! They have been successfully growing their company and have added the wonderful Andy and Monique, both interestingly coming from non-game related fields.

Jeff Scott from Slide To Play & beergeek

We’ve known Jeff for some time, and it was good to speak with him again at IMGA. He is clearly a big fan of Apps as he created 148 Apps and is now the managing editor at Slide To Play. Oh, and he loves beer so he does beer things too – check out beergeek.

Simon and Astrid

Met these two at IMGA. They are co-founders of Triple Topping Games and are currently working on a game called Bubble. We got to demo the game for a few minutes, it’s looking fun!

Curt, Mathilde, and Vijay  from  Roboto Games

This trio founded Roboto Games and are very close to releasing their latest game Age of Rivals on Steam. We had first met back in 2015 at Casual Connect, so it was great to see some familiar faces. We talked about the marketing intricacies of a game aimed at both mobile and PC. They are down to earth people with a knack for great games. Best of luck with the launch!

Amir Rajan

Amir made his break with a dark room on iOS. He showed us an early version of his game Mildly Interesting RTS (MIRTS) at the TouchArcade party. He’s also writing a book. We told him we were grateful for his blog where he wrote about his App Store experiences. His insights were helpful and fun to read when we were getting started in the App business.

Chen Li and Greg Killion from Pocket Gems

Chen works for Pocket Gems and found us at the Unity Ads party and invited us to their party the following day. He was very welcoming and helped us get registered and settle in at the party — thanks Chen! Greg has a wealth of knowledge in the industry and recently joined the Pocket Gems team.

Danc from Spryfox

Really pleasant person who is the creative director of Spryfox and author of the lostgarden blog. I find value in his design insights and I highly recommend reading his posts. He revealed a teaser for a VR experience called “Beartopia” featuring their brand of cute bears. What I really enjoyed about hearing about this game is that it has a purpose of fostering community and cooperation… Creating positivity via games. Thanks Danc!

Danel Gray from UsTwo

Briefly met the head of the studio that made Monument Valley. Their new game which is still a secret is coming… I didn’t get to speak with Dan for very long but he was very friendly despite it being the end of an exhausting week of GDC! I had to include him because the work done at UsTwo is simply inspirational.

Dan Fiden & Keeley from FunPlus

We first met this company and team because we were finalists last year for the IndiePlus award. FunPlus recently launched a $50 million fund for indie mobile games, a very cool thing.

They graciously invited us to this year’s award party which happened to have a live sloth in attendance (epic!). Thank you Keeley for making us feel so welcome. Thank you Dan for being generous to us and introducing us to some very interesting people like George Fan (creator of Plants vs. Zombies) and Ryan Green (creator of That Dragon Cancer)!

Adolfo and Edgar from Lienzo

We found these guys at the Mexico booth in the expo center. These guys are working in Chihuahua, Mexico at Lienzo games. They are working on a fast paced action adventure game called Mulaka. We are grateful for Adolfo’s insights on Mexico and his willingness to be a friend and contact. We’ll see you the next time you visit Puerto Vallarta!

Dylan from Featherweight Games

Creators of Rodeo Stampede, the game that won last year’s IndiePlus $10,000 award! A super nice guy that seems to always have a smile on his face. They seem to be in a similar spot as us with updating their game.

Jake and Saam  from taco illuminati

We had breakfast with these guys (creators of Looty Dungeon) and they showed us an early prototype of their next mobile experience — we are looking forward to it! We talked about some intricacies of the App Store and had some laughs about funny reviews people leave on our games. Check out Saam’s funny twitter thread on dumb game ideas.

Ian from Ian and Ellie

An old friend from Bloomington who is the creator of Stacks on stacks on stacks. He introduced us to the world of delicious cream puffs from Beard Papa. Good luck on the release Ian!

Will, Nathan, and Ian from Studio Cypher

Also some old friends from our Bloomington days. They worked on the iOS and tvOS ports of Road Not Taken, and have worked on educational games as well. We also found out they will be creating their own games – exciting news! We wish you the best.

Carrie and Jason from Power Prim

We met these two wonderful people at TouchArcade’s party. It was interesting to learn that they were able to make a living for a while through content they made in second life.. by selling digital babies — Yeah. They are just starting to adventure into the world of indie games and talked about their game called “Weirdables”.

Raphi and Kevin

We met Raphi and Kevin on our way to lunch at an awesome Indian food place called Shalimar. Raphi is working on a top-down action multiplayer that is a blast to play. Its great to see the work he has been able to do as a solo developer. Kevin is also starting on a project in his free time featuring mechs.

Thanks for taking the time to hang with the sloths. We look forward to seeing as many of you as we can next year!

Clean and Secure UGC Environment

The King Rabbit level builder is our first crack at creating an online community for a game. The biggest bottleneck of our game was content since the two of us could only generate so much in a period of time. Opening the level builder up to the community allows there to be a free and constant flow of content that everyone can play.

With any UGC (User-Generated Content) environment, there is sure to be profane or offensive content – trolls will be trolls. Add to that the rampant hacking and cracking of digitial goods and it’s easy to see how an environment can quickly go sour. We want to keep our community clean and fun for everyone so I’d like to share a few steps we’ve taken to do so.

* We use Ruby on Rails, so you’ll see terminology specific to Ruby or Rails like “gem” and “route”.

Cleanliness

Profanity Filter

obscenity is a simple gem that gives you an easy way of filtering out profane words from strings. We use it to keep naughty words from being used in level names and usernames. It’s not perfect since it sources its filter from a simple list of words, but the list is pretty large and covers the most common words. It also has words from a few languages other than English.

Its usage is as simple as:

# Replace bad words with a smile emoji
def clean_profanity
  if self.name.present?
    self.name = Obscenity.replacement("\u{1F642}").sanitize(self.name)
  end
end
Reporting Offensive Content

Reporting Offensive Content

Reporting/Banning Levels

We allow players to report levels if they feel offended. When a level has been reported enough times, it’ll automatically get banned, meaning it’ll no longer get picked by the level picking algorithm. It’s a simple system that keeps the worst content out.

Security

DDOS/Anti-Hack

rack-attack is a simple gem to add to your app server that will immediately provide value. It makes it easy to whitelist or blacklist ip addresses and routes. You can also rate-limit ip addresses to protect yourself from getting DDOS’d. We use rack-attack primarily to rate-limit certain api routes that can spawn heavy tasks.

Invalid Purchases

We have certain purchases that can generate heavy tasks due to purchase redemption logic. For example, our 100 Items Pack purchase has to find 100 unclaimed packs, tie them to the user claiming them, update the user’s available items, and render the contents of the pack. It’s not a terribly heavy process, but when enough people are claiming them at the same time (via cracked/hacked purchases), the server begins to get busy, which slows down response times for everyone else. We’ve only seen about 160 users in the first month who have illegitimately bought our IAP, but a few of them have bought over 50 of the most valuable items. Our process is simple. If players make invalid purchases, they will be banned from using our api, meaning no online content for them.

Feel free to comment or get in touch if you’d like to know more about what we’re doing here at RareSloth.

raresloth_team

A story about discovering a dream and finding freedom.

We had both just moved to Kansas City to start working at a corporate job at a healthcare IT company. Austin and I became friends at our company’s orientation and we started hanging out, partying, and playing video games. We were both new in town and happened to live a mile or so apart. He was an iOS developer and had a few years of work experience, I was a fresh grad from Indiana University’s Human-Computer interaction and design program. Neither of us realized we would eventually combine our skills to start a video game company. I am grateful to have found a motivated co-founder that I can be friends with and also work with, a harmony that I understand is quite rare.

The right conditions

On a cold winter weekend in 2013 we were recovering from our demanding corporate life. My memory is fuzzy on the exact conversation, but we decided that we should try making a mobile game. Austin already had some experience making small apps and I had some design experience.

We watched indie game the movie, and I think we were subconsciously unlocked. We could make games too if we really wanted to, we would just need to stay passionate and persistent. We both recognized that successful artists don’t give up easily.

The first product

Our first game was inspired by a movie called “The Grey” by the universally recognized badass Liam Neeson. In the movie Liam continually stares death in the face when his plane crash lands in a snowy mountain range. As soon as we started putting together some ideas and prototyping, the seed of an idea started to grow. We created a simple winter themed action-platformer on iOS which we named Yukon Warrior.

We sacrificed many weekends and weeknights chipping away at this novice sculpture of a game. For me, making games on the weekends and weekdays felt like an escape and a creative release. I was unhappy with many things going on in my life, but working on Yukon Warrior felt important. This first game took 1 year to create part-time and we made around $200. This barely covered the AppStore developer fee.

In the process of creating Yukon Warrior, I could feel the passion and dream being cultivated. It was a slow process that grew with every goal being accomplished. We didn’t meticulously plan any of this out, I don’t think many things in life work that way.

*We removed Yukon Warrior from the AppStore in 2016.

Quitting the rat race

6 months before our 2-year mark at our corporate job, we discussed leaving and becoming full-time indie game developers. For many it’s terrifying to leave a secure income for something as unpredictable and volatile as the game industry. Young and without dependents, I was not very concerned. I was happy making games. By the time we left the corporate world, we didn’t have anything finished except a decent prototype of an iOS game. We saved our money and moved into an inexpensive apartment in Bloomington, Indiana (my hometown). Our budget and overhead was lean.

Indie success, commercial failure

We released the iOS game Furdemption in June, 2015 — 5 months after leaving corporate life. It was released as a $3.99 premium app and was featured by Apple in best new games. It did OK for an indie game, bringing in a little over $20k in proceeds. It took over a year to develop Furdemption and our savings were dwindling fast. $20k between us didn’t give us much time to create a new product from scratch. I would consider Furdemption an indie success but commercially it wasn’t enough.

We were in a tough spot — we needed to create something with high value as fast as possible, or we’d have to go back to slinging code and pixels for someone else. Players loved Furdemption and there was a lot more we wanted to do. We decided to make a sequel.

Enter King Rabbit

king_rabbit_header
We spent 9 months of grinding and sometimes neglecting other aspects of our lives to bring this sequel to life. The bank accounts were drying up.

In March, 2016 we released King Rabbit. A fresh theme, new levels, and tons of improvements. King Rabbit started as a paid app with optional In-App purchases like level hints and customization options. We eventually made it free with the support of interstitial ads. These business model changes weren’t planned from the beginning but we pivoted as the game evolved. King Rabbit turned out to be a success. In 2016 we had over a million downloads and our net income for 9 months exceeded $100k.

King Rabbit isn’t finished

Austin and I have been working on the same codebase for the past few years, and we want to start developing another product. At the same time we really want King Rabbit to live on.

The biggest problem with King Rabbit is the content bottleneck. We’d spend weeks and months building levels to have players complete them in a single sitting. To solve this problem we decided we should take the time to build out and release a level builder. This will also make King Rabbit a deeper experience where you can exercise your creativity.

I think many developers would have just moved onto the next game, and we almost did. Creating a level builder with good production quality takes a ton of time and effort. Here we are almost a year after the King Rabbit release and now we’re about to release the level builder to the public. After beta testing for a few weeks, 191 players have built almost 500 levels. To put that into perspective, King Rabbit only has 256 levels in total. When we release this month, everyone will get to build and play unlimited content for free.

Our monthly active user count tends to fluctuate between 50k and 100k depending on feature spots and release cycles. With our current player base, if only 2% of players build a level there will be 1k–2k new free levels each month. I believe this will exceed the goal of a constant flood of free content for everyone to enjoy. This update will birth a community of builders and players and an avenue for creative expression. Our plan is to hire another person to help maintain and update King Rabbit, so that we can get another game in the pipeline. We believe it is important for apps to live and evolve!

The level builder will be released for free on iOS on January 26, 2017.
Get notified when its ready.

Game Developer Conference 2017

At the end of February, we’ll be in San Francisco attending the game developers conference. After the conference Austin and I will be heading to Puerto Vallarta, Mexico to live and work until further notice. I will be ridding myself of all material possessions except for two bags and a carry-on.

No dependents, no investors, and no flashy offices. We’ll be digital nomads with complete freedom to work how and where we want. There’s nothing wrong with keeping things simple and taking it one step at a time. Sloth and steady wins the race.

Thanks for reading. If you like, you can follow our company on twitter.

Slothily,

Brian Oppenlander
Co-Founder of RareSloth

Using Sendy

Using Sendy for subscriber emails

Maintaining and communicating with your subscriber base is a great way to make news travel about what you’re doing. However, if you’re not careful you could be spending much more for your email service than makes sense. This post will guide you through our experience with subscriber emails and how we ended up using Sendy.

In the beginning…

We started collecting email addresses using Mailchimp, a user friendly service that’s trusted by loads of companies. They have a great free tier that allows you to collect up to 2,000 subscribers before paying anything. They give you multiple ways of integrating sign up forms in many places and they have a bunch of great features. It’s a great way to get started.

Volume hike

We didn’t have many subscribers for the first several months so Mailchimp’s free tier was perfect for us. Then came the Free App of The Week feature.
Using Sendy
When King Rabbit got the FAOTW feature, we gained 14K subscribers in one month. That put us in Mailchimp’s $150/month tier, which isn’t cost effective for how often we send emails (once a month). After 25K subscribers the rate increases at $5 every 200 subscribers. We didn’t like where this was going so we rethought how we were going to send emails.

Using Sendy

Sendy will save your wallet. It’s a $59 one-time fee and all additional costs are based on Amazon AWS’ SES service. We chose to use Sendy because we already used AWS for our servers, so getting their SES service setup was a piece of cake. AWS SES is cheap and has an awesome free tier. We’ve used Sendy for a few months now and we’ve sent about 60K emails. It’s been reliable and has a solid WYSIWYG editor for drafting emails. It took a day to setup on our server (you host your subscriber database and Sendy frontend). Using Sendy has cut down our monthly email cost to about $0.01 so I can’t say I know of a cheaper way to send mass emails.

Drawbacks

We came from using Mailchimp, so we had high expectations from our mailing service. Needless to say, you won’t get all of Mailchimp’s features in Sendy. We are primarily missing the ability to send emails to segments of lists. Sendy can maintain separate mailing lists, but you can’t send emails to a particular segment of a list (i.e. subscribers in the past month, subscribers who clicked a link, etc.). Also, Mailchimp’s editor is amazing so Sendy’s felt like a step down, but it works well. We are sending really basic html emails, which don’t require assets or tables so it’s not much of a complaint for us.

Localizations

Neither Mailchimp nor Sendy have a good way of sending localized emails. In Mailchimp, you would have to put in a bunch of if/else conditional blocks and check the subscriber’s language in order to send an email in a subscriber’s language. Sendy just doesn’t have a way of doing it. It’s important to us to be able to communicate with our subscribers in their native language so we patched in some code to allow it. We’re now able to send emails in 14 different languages with the click of a button. Contact us if you have interest in our localization code and we’ll publish it if there’s enough interest.

Our switch to using Sendy is saving us $150/month right now and will continue to be affordable as our subscriber list grows. It was a no brainer for us, we hope this post helps you make your mailing decisions!

ReplayKit Implementation Notes

I spent two days digging into ReplayKit’s simple API to discover undocumented subtleties that caused me to write more code. There is very little documentation on ReplayKit aside from the WWDC video’s example code, so it can be hard to find any good information. This is a guide of what to look out for when doing your ReplayKit implementation.

I’m on XCode 8.0 and my devices are an iPad Mini 2 and an iPhone SE, both running iOS 10.0.2. We support iOS 8.0 and up in King Rabbit so we had to do iOS version checks to make sure none of this code was called if ReplayKit (iOS 9.0+) wasn’t available. This means weak linking (making Optional) the ReplayKit framework in the project. We tested some of these issues out on other App Store games and they seemed to have similar failures/stuck points.

Recording

If you’re looking to record video on the device, you’ll use the instance of [RPScreenRecorder sharedRecorder] to call either startRecordingWithMicrophoneEnabled:handler: (deprecated) or startRecordingWithHandler: (iOS 10+).

startRecordingWithMicrophoneEnabled:handler:

If you want to support iOS 9.0, you’ll have to use this deprecated method to start your recording.

Microphone recording

If you deny access for microphone recording (choosing ‘Record screen only’) in the permissions alert view when starting a recording, you can’t turn on the microphone until starting a new recording. Just keep this in mind for your UI, since your “mic” button will be useless.

startRecordingWithHandler:

If you want the front facing camera preview as most streamers have in their broadcasts, you’ll want to look at the isCameraEnabled and isMicrophoneEnabled flags on RPScreenRecorder. I found that I had to set these flags to YES on the [RPScreenRecorder sharedRecorder] instance before calling startRecordingWithHandler:.

Then I found that you have to request video permissions before the flags you just set are honored. Otherwise, the flag will be unset when the handler argument is called. Also, if you try asking for permissions after you’ve already started recording and you try to setCameraEnabled to YES when granted, it’ll stop the recording without letting you know!

Do something like this:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (granted)
		{
			[[RPScreenRecorder sharedRecorder] setCameraEnabled:YES];
			[[RPScreenRecorder sharedRecorder] setMicrophoneEnabled:YES];
			[[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^{
				// Recording started
			}];
		}
    });
}];
Remove CFBundleDevelopmentRegion

From this simple use, I found that the handler wasn’t getting called on my iOS 10 devices (apparently is works fine on iOS 9). I found a tip on the Apple developer forum where someone removed the CFBundleDevelopmentRegion key from their Info.plist so I tried the same thing. And it worked! I don’t know how that could possibly tie in with ReplayKit, but there’s a bug in there somewhere.

Broadcasting (iOS 10+)

Broadcasting allows you to stream your recording directly to a third party service that you have installed on your device. I used Mobcrush and Periscope for testing.

To start a broadcast, you call:

[RPBroadcastActivityViewController loadBroadcastActivityViewControllerWithHandler:^(RPBroadcastActivityViewController * _Nullable broadcastActivityViewController, NSError * _Nullable error) {
}];

Presenting the broadcastActivityViewController allows the player to choose which service he wants to stream with. An important thing to note – when presenting this view controller on an iPad, you have to present it in a popover, otherwise it just won’t do anything. There’s no documentation and no obvious logs that let you know this! You’ll need something like:

broadcastActivityViewController.modalPresentationStyle = UIModalPresentationPopover;
broadcastActivityViewController.popoverPresentationController.sourceView = myView;
broadcastActivityViewController.popoverPresentationController.sourceRect = myView.frame;
broadcastActivityViewController.delegate = self;
[myViewController presentViewController:broadcastActivityViewController animated:YES completion:nil];

The delegate method

- (void)broadcastActivityViewController:(RPBroadcastActivityViewController *)broadcastActivityViewController didFinishWithBroadcastController:(RPBroadcastController *)broadcastController error:(NSError *)error

gives you an RPBroadcastController instance, which you call startBroadcastWithHandler: on to start up the broadcast.

Broadcasting simply did not work on my iPad Mini 2 until I used the CFBundleDevelopmentRegion key hack from above. However, even with that, the broadcast had unusable quality. We’re limiting our broadcasting to only newer devices to try to mitigate these failures. When it fails to broadcast in this manner, it won’t call the handler with an error – it just won’t call it so you’ll be stuck in a loading screen if you have one.

If you want to enable the microphone and/or camera during a broadcast, you’ll have to figure it out. It doesn’t seem like RPScreenRecorder should be dealt with when you’re broadcasting, but it might provide the cameraPreviewView for you. You’ll also have to ask for mic/camera permissions yourself since initiating a broadcast doesn’t ask by default.

Some other notes

We tried starting a recording after finishing a broadcasting, but found that the handler wouldn’t be called on the startRecording methods. The same issue occurs in the opposite direction, finishing a recording and trying to start a broadcast. Just keep this in mind if you want to allow players to do either. We’re simply going to hide the other option for the lifetime of the running app so players don’t get stuck.

If you’re a third party streaming service that wants to implement the broadcasting extension, good luck. There are some classes in the ReplayKit documentation, but you’ll find no written documentation on what they do.

There might be some other gotchas I’ve forgotten, but hopefully this guide will help get you started more quickly than we did!