Never Assume, Always Make Sure

After the popularity of the earlier articles, we’re happy to share another devlog by Rapha, diving deep into a very obscure bug you never saw in the live game, and why it matters!

We hope you enjoy reading it!

 Background: We had a phantom message appearing on chat in the testing of a specific update:

 > ” turned from player to spectator”

 Who was this unnamed person? Where did this come from?

But to make sense of the problem, first we need to dig deep and start from the basics!

 *This mostly doesn’t talk about a specific computer architecture, unless specified*

*Code examples are written in a Pascal-esque way for easier understanding*

The ideal computer runs instructions in series

CODE

 That’s good and all, but every single program cannot be linear, memory isn’t infinite nor problems can be unwrapped completely at compile time to make it possible. Sometimes you need to go back and redo a calculation. That’s why programs JUMP *ぴょい~ん, JUMP, カンガルーのように!*

 So things like, increasing a number can be done by:

CODE

DATA

 But what if there’s something after that JUMP 0x0000, that needs to be executed afterwards? What if we could jump to somewhere else and know where to go back? That’s when the stack is useful.

 The stack is a structure of data that is normally filled bottom to top (imagine a stack of dishes). Let’s imagine it here, the bottom is, let’s suppose, the last address we can use, in this example 0xFFFF. 

One of it’s important functions is keeping track of where you were before. Using more complex “JUMP” instructions that store the next instruction address to them into the stack, and points where the stack ends using the special register known as “stack pointer” we can know where to go back afterwards. Let’s call it “CALL”. And let’s say it currently points to 0xFFFF in our stack above. 

 As soon as that call executes it would add 0x1008 to our stack, and change the stack pointer register accordingly to 0xFFFB.

That way, once that function ends and executes, let’s call it, a RET[TURN] instruction, it would fetch that value from the stack 0x1008, move execution there and update the stack pointer again, so it goes again to 0xFFFF.

 That’s how computers the keep execution flow!

 But the stack also have another function, it stores on most architectures… local variables!

> Their counterpart would be global variables, that are stored
> inside the executable memory space or in the heap, a memory space that
> you ask the OS for, and if not properly released when not used, ends
> up as that thing people love to call “memory leak”

 Imagine you have a function that’s something like:

     function add_two_numbers(a: Integer, b: Integer):Integer;

    var

      c: Integer;

    begin

      c := a + b;

      Result := c;

    end;

That variable c, for convenience will be stored on the stack, that’s why whenever you call that function, it will have a wrapper code, that I won’t explain, but basically expands that stack pointer up, so you can use the space below it. Something like:

As soon as the function exits, it will simply change that modification to the stack pointer, before getting the address to return to:

Observe how c is still there, because is most implementations of languages, it’s too expensive go around zeroing that memory, so the value just lingers.

Now imagine that you have a similar function, that blindly believes that value is zero, and it’s called right afterwards:

    procedure prints_value(a: Integer);

    var

      b: Integer;

    begin

      b := b + a;

      WriteLn(‘The result is ‘+b);

    end;

You see were this is going right? It’s value will need a place on the stack:

But that memory still contains the result of the previous operation, so when the operation b + a is executed, its not doing 0 + a, but whatever was there + a, this incurs an undefined behavior, we cannot know what is there, so it could be a totally different value, and our function will never properly execute.

 You never want that, unless you are doing something malicious!

The Bug

But why such a long post to explain this concept? Well, during the internal testing of a new build we had a bug.

 A message was printing saying:

 > ” turned from player to spectator”

 without a name.

It only started happening when we change some of our logging code, why???

Well, there’s a function that sends to the player the current information the host knows about the players and spectators it started with;

    procedure sends_stuff_to_client;

    var

      the_data_to_send: SOME_BIG_STRUCTURE;

    begin

     end;

That the_data_to_send variable was allocated at the stack, and was never properly fully initialized. For *ab immemorabili*, time immemorial, the bits we weren’t initializing afterwards were inheriting the memory of whatever was on the stack before. It always *seemed to work*, until we changed how our log messages were formatted for security reasons.

Now a message to be logged that contained both text and numbers, was formatted more or less like this:

    game_log_message(format_message(“This happened with this {} value”, value));

The return of format_message isn’t magically stored away if its big, so the compiler was just adding a new value to the stack, an unnamed one. In a function call that executed before sends_stuff_to_client this made the stack be aligned slightly different, but different enough so when the_data_to_send was allocated, a specific bit of it ended up aligned with data lingering from previous function calls. The data was specifically the SteamID of the host, and it was ending up exactly at the spot on the_data_to_send that contained the SteamID‘s of spectators.

 So that stuff was sent to clients, the clients would interpret it and see *”well, this person, with an ID pertaining to a player, was changed to a Spectator”*, then the code to log that was checking *”what is his name really?”* and found nothing, because there was no name associated with that spectator entry. So we got:

 *” turned from player to spectator”*

 It didn’t affect the game in any way, no state was being changed based on that, but every time that packet was to be sent to the client, it had a specific miss-initialization that caused that message to be displayed.

The coolest thing in this history (but also the most scary one, since it made us run around in circles until the cause was fount out), it only happened on Windows. Only the Microsoft C++ Compiler was generating this specific stack structure and making this happen, our Linux and macOS versions, compiled by GCC and Clang respectively, just didn’t display the bug, because the memory was still uninitialized, but the format didn’t exactly match so that specific SteamID ended up aligned where we were expecting a SteamID.

The fix was easy, and should be there from the start:

     FillChar(the_data_to_send, SizeOf(the_data_to_send), 0);

 This ensured the thing was always zero, nothing was lingering and so the bug never happened again.

Conclusion 

In our case this just caused a message to appear, but it could be a security problem, important data could leak via a similar bug, that’s why an important security feature to be implemented in some compilers is zeroing the stack on function exit, so doesn’t matter what was there, it will turn into zero, so no one will be able to see it by mistake (or on purpose) afterwards.

I know this wasn’t the easiest post to follow around, and that people normally aren’t interested in such specific stuff, but hopefully you liked it!

504403158265497090 Points, or A Day in the Life of a Save File – 100% Orange Juice Devlog

We’re happy to share with you another devlog by 

Rapha, this time about the recently implemented big save rework, why it was necessary and what went into it! Hope you enjoy reading it.

The Perils of Binary
In the realm of video game development, preserving a player’s progress is paramount. This is where game saves come in, capturing the state of a game so it can be resumed later. However, the methods used to store these save games can significantly impact their susceptibility to corruption, be it by external or internal factors.

The problem

100% Orange Juice since time immemorial used binary storage, it used to be the go to for this kind of data when processing power and storage space weren’t plenty available. It’s more efficient to write, to read, and uses less space in disk. But this efficiency comes at a cost, it’s easy to mess up. It’s why we’ve added more and more ways the game backups your saves at various points over time, to make sure players have some backup to return to if their save with years of progress gets corrupted.

Now let’s imagine a theoretical game, 

Poppo Saves The World! Let’s imagine it as a beat-em-up, where you go around fighting enemies, one after the other, until you win and save the world. Lets supposed you have the following section of data that needs to be saved:

– Wins

– Points

– Last stage cleared

Lets supposed you have 10 victories, 393939 points and the last stage cleared as stage 7. Let’s imagine you used 64 bit values for everything. So:

|Data | Explanation|

|–|–|

|0A 00 00 00 00 00 00 00 | 10 in hex padded to 64 bits|

|D3 02 06 00 00 00 00 00 | 393939 in hex padded to 64 bits |

|07 00 00 00 00 00 00 00 | 07 in hex padded to 64 bits |

In the file would be:

    0A 00 00 00 00 00 00 00 D3 02 06 00 00 00 00 00 07 00 00 00 00 00 00 00

But then you introduce abilities to the game, you decide to store it as a single byte, that will keep if you have each of the 8 abilities available unlocked, one in each bit.

|8|7|6|5|4|3|2|1|

|–|–|–|–|–|–|–|–|

|0|0|0|0|0|0|0|0|

Let’s suppose your player unlocked only the first one so it’s a 1, so in binary:

|8|7|6|5|4|3|2|1|

|–|–|–|–|–|–|–|–|

|0|0|0|0|0|0|0|1|

You inadvertently decided to write it between wins and points, so you would have the new binary:

|Data | Explanation|

|–|–|

|0A 00 00 00 00 00 00 00 | 10 in hex padded to 64 bits|

|01 | 01 in hex, it’s a single byte |

|D3 02 06 00 00 00 00 00 | 393939 in hex padded to 64 bits |

|07 00 00 00 00 00 00 00 | 07 in hex padded to 64 bits |

In the file would be:

    0A 00 00 00 00 00 00 00 01 D3 02 06 00 00 00 00 00 07 00 00 00 00 00 00 00

And as logically implied, you would change your reading code to expect that too! But then comes the problem! Your old save doesn’t agree. Let’s see what your game would read from an old save.

    0A 00 00 00 00 00 00 00 D3 02 06 00 00 00 00 00 07 00 00 00 00 00 00 00

It expects 8 bytes for the Wins, so it reads 8 bytes:

    0A 00 00 00 00 00 00 00

That reads to 10! Seems ok! Up until now everything have gone correctly.

But then it tries to read the byte for abilities…

    D3

D3 is byte, your game doesn’t know if it is valid or not, it’s binary, it believes in the binary. Let’s look at it for a bit, in binary:

|8|7|6|5|4|3|2|1|

|–|–|–|–|–|–|–|–|

|1|1|0|1|0|0|1|1|

So not only the first, but the second, fifth, seventh and eighth abilities are unlocked?!? Wow! That’s a problem.

Let’s continue, more 8 bytes:

    02 06 00 00 00 00 00 07

That’s 504403158265497090 points… That’s definitely not what was written originally. By reading that byte that wasn’t there, you misaligned the whole thing, and now your player has more points than literally the universe has seconds of life. And then you continue, last 8 bytes:

    00 00 00 00 00 00 00

But that’s not 8, you only got 7! If you really try to read that, you will get an unexpected behavior. What happens depends on what system, what processor and what contingencies are in place. In some systems you may read a byte from memory that has nothing to do with your save, in others you may read some leftover on the memory bus, in some you will crash… The ideal behavior would be the crashing.

But lets supposed it didn’t. It loaded.

Now you have:

10 victories

5 abilities unlocked

504403158265497090 points

And never cleared a single stage

If this happens to your user, they won’t understand a single bit of what’s happening, will they?

The conclusion
You must be thinking now, “Well, that’s easy, just don’t mess up”. Yeah, but that’s easier said than done, with less than a dozen of information to save, and total control over it you can’t commit this mistake.

But what about having 200000 different bits of data that need to be read and written correctly, by code written over 15 years, written by different people, with different designs in mind, written by functions in different files, some keeping proper spacing between data, with spare data for future use, some not. That was our situation! Years of updates adding numerous incongruities that we didn’t account for, despite fighting against it all day.

Yeah, that’s a design flaw, and that’s why we are fixing it, starting with this step! 100% Orange Juice is a bigger game than one might imagine, and such huge code base being kept alive by less than 10 people is nothing less than a miracle driven by passion and willpower over the years.

The solution
We won’t enter into detail, because our new save system not only is 100% reliable but has a good number of protection layers against people editing it. But firstly, if your save was changed externally, it won’t load.

This is to avoid the game crashing if your storage is faulty and some bit flipped. That’s why the backups are now more important than ever, if your main save corrupted, it won’t load, no one will be able to restore it, its gone forever. The game won’t even try to read it.

But not only that, now generally speaking, each bit of data inside the save games has a proper name to address them.

Let’s bring the example from before:

  • Wins
  • Points
  • Last stage cleared

Now we build a database in memory, naming each value in a proper structure before writing it to the save. So it would be something like this:

    wins: 10, points: 393939, last_stage_cleared: 7

For reading, you simply search for the value name and loads the value attributed to it: wins → 10, points → 393939, and it goes on.

If you add a new value:

    wins: 10, abilities: 1, points: 393939, last_stage_cleared: 7

It doesn’t matter, you aren’t reading in sequence, you have a proper system to encode and decode the values and search them by name. If abilities doesn’t exist on the save, you load the default value and go on.

This basically clears the future from unwanted data changes, but nothing in life is a perfect solution. We still need to load the old save, and if that’s corrupted, the new one will be too, as the old save system trusted above everything else what was written, in the exact order it was.

The game also may after some update write something wrong, that’s a bug, it can happen, it doesn’t mean the save is corrupted stricto sensu, but in lato sensu the data was handled wrongly, so that’s still a bug, that’s still a thing that needs to be reported.

So if after the save conversion on the last big update, you got more dice than the universe has seconds of life, the best we can suggest is contacting us! We will do the best in our power to fix your old corrupted save. But be aware there may be some times that it’s impossible (mainly if you didn’t play for the last 7~10 years, the amount of uncounted problems can be beyond any repair), but even in this horrific situation, talk with us, say what you hold dear about your old save, and we might be able to find a path that will make you happy.

Why we’re starting a Patreon

2023 was in many ways a challenging year for us. Some reasons may be obvious – the post-Covid economy which has been hitting creative industries hard for the past year, as people have less disposable income, others less so, and though I have hinted at some developments in a past livestream, I promised to go into more detail though I find it a heavy subject to write about.

During the early Covid years, we were lucky enough to enjoy a large influx of new players, thanks to both people staying at home more, and us giving away millions of free games in a stay-at-home campaign. We invested the increased sales into hiring more developers so we can put in more work for you – the team currently has 5 developers working on 100% Orange Juice alone, in addition to artists, translators, QA and other support staff.

A specific goal in this recruitment drive was to be able to work on a certain project simultaneously with the ongoing 100% Orange Juice development.

For many years, people have been asking, “when will 100% Orange Juice be ported to Switch? Will it be available on mobile?”

The answer to that question has been that the engine made it rather impossible to port the game to other platforms. But in fact, we’ve been secretly working on a full remake of 100% Orange Juice in a new engine since 2018, with the goal of both modernizing the internal architecture and visuals of the game, and being able to release it on other platforms as well. The project restarted once on the way after staff changes, but the latest version was getting far enough that at the start of 2023 we temporarily assigned most of our developer team on it in the hopes that we could boost it to completion before the lower dev time spent on the live version of 100% Orange Juice becomes an issue (working on a remake of a game that’s also getting constant changes at the same time isn’t the most efficient way to develop something, after all).

It was supposed to be a fun surprise when we can reveal it to everyone (which we were planning to do soon). Then something happened.

You may have noticed I avoided mentioning the name of the engine we were developing the remake in, and some of you might’ve already guessed where this is going from that.

Yes, we were porting 100% Orange Juice to Unity.

From the beginning this came with some caveats, as the development cycle for the Unity engine has always had some issues, but it also had the best terms of use, and was determined to overall make development much easier once the remake is finished.

Then in September 2023, Unity announced their “controversial” new pricing model, which would’ve completely annihilated us as it was originally laid out. Shocked, we instantly froze work on the Unity version while waiting on more news to come out. While Unity eventually walked back the worst details of that decision, all the info that came out as a consequence coupled with the way they rolled out that change out of the blue in the first place had already done the damage. With our port approaching the halfway point to completion, we could either continue working on the Unity port full power for another 2 years, hoping things don’t get worse, or we could cut our losses and kill the project. Given the status of the project and our loss of faith in the engine for the game that’s basically keeping the food on the table, we chose the latter with heavy hearts.

That doesn’t mean we’re giving up on porting the game to other platforms, but we don’t have the resources to start a new full port from the scratch. Instead we’re now looking at steadily replacing the old modules of the live version of 100% Orange Juice to eventually make it compatible with more hardware and other platforms. What it does mean, though, is that all the time and money spent on the Unity version over… 6 years was more or less entirely wasted, apart from the experience gained from it.

Due to the aforementioned dev reallocation, 2023 was a slow year for new content in 100% Orange Juice. At the same time, with the economy at large returning to normal, 2023 saw an overall drop in sales, leaving us with a bigger development team, less sales, and at the same time people understandably complaining about a lack of new content.

Sometimes stars just don’t align the way you want them to.

I want to emphasize that this doesn’t mean we’re going to have layoffs, or that we’re stopping work on our games, or anything like that. This post isn’t about that. While 2023 left us in the red, we’re dealing with it in other ways as best we can. In fact, this Patreon is one of those ways – we’re seeking alternative revenue streams to help support our ongoing development work.

As of late 2023, all of our 100% Orange Juice developers are back working on the live version, and while we had a lot of backlogged content to wrap up (such as the Bounty Hunt rework), you can expect a lot more in 2024 – the 10 year anniversary of 100% Orange Juice on Steam! There are a ton of things we’ve wanted to do but figured out make more sense in the Unity version, which has become almost an internal meme at this point. Now we will be focusing on gradually implementing those in the live version.

If the Patreon doesn’t take off, or ends up being more trouble to maintain than it’s worth, it may end up short lived, but I figured it’s worth a try.

So what will you actually get in return for supporting us on Patreon? Not much, really, and we don’t recommend you do it if your finances are tight. We will be posting random stuff from behind the scenes irregularly relating to whatever we’re working on – some disaster screenshots from things gone wrong in development, ramblings by developers, and possibly teasers for new content. For those curious, I’ve attached a small gameplay video from an earlier Unity build on the page. There might be more stuff like that. The last thing we want is for people feel they need to sign up on Patreon for exclusive in-game content, so that’s not going to happen.

If we get good ideas, we might add more tiers later, but for now there’s just a single $5/month support tier that will give you access to all of our posts.

Thank you for reading this far, and thank you for your support over the years.

– Jakke Elonen
President of Fruitbat Factory

Fruitbat Factory Patreon Page:
https://www.patreon.com/FruitbatFactoryDevelops

The Tale of a Newbie Programmer

Do you know Sora, our newest crew member? Please enjoy this self-introduction. We’re giving the floor to him now!

Hello! You may have not heard about me before, as I quietly slipped into the crew.

I come bearing the mame of my favorite character: Sora as my nickname. I discovered 100% Orange Juice through a friend back in 2016. If I had to quickly give an introduction: I live in France, am 24 years old at the time I’m writing this, and I love heavy metal music. Atreyu’s band is my personal favorite. \m/

My favorite hobbies are pretty much: gaming, creating things, drawing, and hugging my Sora & Suguri plushies.

I joined the Fruitbats on the 10th January 2020. It’s my first professional experience as a programmer, and I was super excited to get started. After setting up the project files and everything, I got assigned my very first task: making the master volume option, which needed both UI modification, and save file changes.

The game engine used, Luna3D, is made in a very specific way which does not use OOP everywhere – I just got out of intense C++ practice before getting hired, so seeing old methods of coding felt a bit threatening at first.

The fun part of working with a brand new environment was first getting my bearings, finding what does what, and putting those two together into a decent code. Thanks to the team, I asked whenever I needed help, and I had my answers quite fast. Something I wasn’t used to though, is that logic and drawing are both handled in two different places, which I was not doing before. That said, a lot of the basic concepts were completely unknown to me as I had no previous experience with them. 7 hours of work were needed before I managed to get a decent result that worked quite well. Later on, I kept on going with other voice options, as well as other tiny changes here and there.

The first big project I had to handle on my own was one of the new Playground mini-games: Poppo Shooting. It went through several prototypes, the one that comes to mind being stationary balloons, and a score based gameplay. It got changed later to moving balloons carrying rewards.

It was also the first time I had to tackle the wonderful network code, and managing the AI behavior. When starting the development, I was unsure of which direction I should go, there wasn’t (from my understanding back then) any hitbox functionality, which was crucial for a balloon & dart based game, which was the base idea. A quick search on google led me to an SDL example, which I could adapt to our code. And miracle of miracles, it worked. Besides that, some of you might remember that the CPU was really bad at this minigame. I came back to it weeks later (I think it was a few days before School Crashers event ended) and improved the AI by a lot, giving them priorities, a (way) better aim, and decision management.

Afterwards came some QoL features, such as saving the lobby name & password between game sessions, and changing those in the lobby directly if you were the host. The previous experience I gathered made that way easier for me to implement. It was the first time I had to bother Tony (Rive, our lead programmer) for some AoS2 code snippet, which I took about 30 minutes (and a lot of re-explanations) to understand. If you read that Tony, please forgive me!

The next “big” feature I made was the integration of the Rich Presence feature of Steam & Discord, as well as fixing steam invites so they would make you join your friend’s lobby directly. It took a lot of effort to debug, but in the end everything worked quite well. The funny part was working with an old framework (discord-rpc) which has no more support at all. I remember having some issue about the game invitations, but trying to email discord would redirect me to a server that gives support to the newer version and not the old, which was not helping me at all. But in the end, I eventually found out the issue myself and corrected it. We had to implement a way to retrieve Steam avatars and convert it into a usable texture, which took me a lot of research in order to know how to do it, as I had little to none knowledge about how DirectX works. With the help of hexun, we managed to get the avatars working together, which were added later in the lobby screen.

Later on, the project I have probably spent the most hours on (a full month and a half!) was handling, along with trackftv (yet another of our programmers), the Bounty Hunters event. While Track was creating the quest & bounty side of the game mode, I was creating the shops as well as thinking of items. It was a lot of suffering fun to debug all of this. (And even if some horrible desyncs got through when it was put live, we managed to fix it quite rapidly.) The one thing I remember the most is all the panel layering issues we had – Basically, the panels had way too many things on them at once, which completely messed up the layers (For example, BH shops going over Arthur’s shops, like competition was a crime!)

Thankfully, Track managed to fix all of it… I think. I’m sure we’ll have to look back at it again once we’ll tackle the remastered version of Bounty Hunt!

You can notice here that we originally planned items to be locked behind your current Norma level.

Lately, you saw me pulling out the official modding support. It was something I really was looking forward to, knowing that I came myself from the modding scene in other games. The whole system took about 20 hours of work. It’s of course not yet finished. A lot more is coming for it, including the much requested Steam Workshop support. I don’t have any big details to share about the system overall, just that it was a second take at it after failing the first time a few weeks back. But I’m glad that today so many people enjoy making custom skins for their favorite units.

I could expand that list of projects even more, but some things have yet to remain private for now. I’m super happy to be a part of this wonderful team, and I can’t wait to see how far we’ll be going together!

Editor’s note: everyone be nice to Sora!

When Jiangshi Met Daoshi

It’s finally out, a visual novel we’ve worked on for some 3 years in one way or another!

Jiangshi x Daoshi is now available on both itch.io (regular version) and Steam (more YouTube friendly version)!  Also, both versions are free to play.

Check out the kick-ass trailer for this kick-ass game developed by Dendo-Denkido here:

It’s been an eventful journey to get here, so I wanted to dump some info about it.

The Background

Jiangshi x Daoshi defies explanation. On the other hand, it’s free so just go and play it for yourself.

It’s the product of many years of work by the developer Dendo-Denkido, who are awesome folk and you could always find their booth at Comiket (back in the day when those actually took place). Even if it’s not “long” in traditional terms, you can see their effort on every screen of the game. I don’t think there’s a single screen that passes without some animation. I rather think of it as playing a SHAFT anime. Oh, and it’s also fully voiced, with a very prolific cast of seiyuus!

The game is episodic, and after 8 years of development there are currently 3 complete episodes. Episodes I+II are now available for free at our end, and we will release Episode III – Lady Hexers later this summer, at which point it’s caught up with the current doujin release. The game is still very much in active development, and there should be more coming… eventually.  This quality doesn’t come overnight, but good things come to those who wait. If you like the game, you can show your support to the developers on Twitter!

Up to this day, Dendo-Denkido has distributed the game for free in Japan, which we also took into consideration in our decision to release the game free of charge. Of course we still need to cover the translation bills eventually, but you can take it as a sign of how much faith we have in this game. Episode III is planned to be released as a paid DLC on Steam, and with a PWYW model on itch.io so people can still play it for free if they want.

The Translation

Jiangshi x Daoshi is our final full translation into English by the late Conjueror (we still have one secret project that was partially translated by him, but that’s for another day) and edited by Garejei. Drenched as the game is in Chinese lore and the supernatural (as well as bizarre humor), Conjueror mentioned it was the hardest game he’s had the pleasure of translating. I hope you will like the result every bit as much as I have.

As there’s a large Chinese-speaking audience on Steam now as well, and it was something the developers wanted in the first place, we also more recently decided to translate the game into Simplified and Traditional Chinese, which translation should be released alongside Episode III – Lady Hexers later this summer.

The Steam

Okay so this is where things got spicy. Of course we’ve followed the developments with Steam’s approval process with concern for some time, and as such I’m always worried whenever I submit a new visual novel for approval. Still, despite joking about it we didn’t seriously expect the game to get flat-out banned on submission (a rejection wouldn’t have been surprising, it happens more often than not, then you address issues and resubmit). Well, it did. Ticket closed. No resubmission option, no room for dialogue.

This despite the fact that Jiangshi x Daoshi doesn’t feature any adult content.

There’s certainly a lot of offensive content of various sorts (think South Park when it comes to the mature humor of the game), but… yeah, that response was unexpected. Moreover, as a consequence of that game ban, we learned that games that get banned on Steam… leak from the database. So certain sites knew of the ban and thus, of the secret project, as soon as we did.

This wasn’t a very pleasant situation for a release we had high hopes for, and we had to scramble to put together emergency plans with all possibilities considered, including a rapid ninja release the very next day in case that we’d have to release the game to obscurity outside of Steam, and with intense press scrutiny if the story ended getting picked up more (which I’m glad we ultimately didn’t have to do, as we’ve put the time to good use polishing the title, squashing bugs and adding more user friendliness features, such as the option to hide the UI for cool screenshots).

Luckily we received a response from our Steam rep (yeah, we’re fortunate enough to have one, I’m well aware most devs don’t), which gave us some hope for resubmission, and after some back and forth we ultimately were able to resubmit the game. Of course, info regarding what was wrong the first time was rather vague as you might expect (we got one general pointer, but no idea of the scope of what they wanted us to address, and whether that really was all that would be objectionable or if that was just the first thing they ran into), so the resubmission (for which we might only get 1 chance for all we knew) took some thinking. We worked with Dendo-Denkido to alter key graphics under the info we -did- get, while otherwise staying true to the game’s artistic style, and after an initial rejection (fortunately, not a ban this time) with further required adjustments outlined, we ultimately got the game accepted for release!

In good news, the Steam version is probably a lot more YouTube friendly. But if you prefer to play the game as it was originally intended, we have a patch up on our homepage which will restore the Steam version to its original shape.

The End

Make sure to enjoy the craziest game you (probably) never heard of!

Tales from SeaBed

With the release date of December 19 fast approaching, we wanted to take a look back on the development process of the Steam version of the upcoming yuri-themed visual novel masterpiece, SeaBed.

SeaBed has been one of our most intensive projects so far, and we absolutely fell in love with the game while working on it. In total, we have worked on the game for roughly a year, from translation to polishing the user interface.

To start with the basics, SeaBed has been translated into English and edited by industry veterans Conjueror and Garejei, respectively, and we’re extremely satisfied with the flavor and life they have brought to the complex story.

While the translation work was ongoing, there was another big project that we undertook: the HD upgrade of the game. Well, HD isn’t technically accurate since the new base resolution is 1440×1080, rather than the 1080p standard, but I think it paints an accurate enough picture of what we did.

SeaBed was originally released in 800×600 resolution, but it features boatloads of stellar art (with around 100 unique CGs and over 1000 character tachies across the game) and we really wanted to make that shine. In a rare fortunate turn of events, the developer Paleontology had the original resources in higher resolution .PSD files, so we proceeded to recreate all the art in the game in the new target resolution. This work alone took months, but after playing the new version we hope you will all agree that it was well worth the effort.

Since not everyone has a 1080p display, we also added support for multiple different resolutions, including an automated resolution selection that by default always uses a resolution your screen can display.

Another visual aspect that we always pay attention to in visual novels especially is the fonts. When done right, you, the player, will never think about them. Especially not in the sense of “wow, this text sure is ugly/hard to read”. We typically evaluate dozens of different fonts before finding one that captures the tone of the game just right – so far, all of our visual novels use different fonts, not by any particular decision to never repeat the fonts we use but simply as the result of this process.

There can be a lot of text on screen in SeaBed, so the main font we chose for the English text has a calm and slightly clinical feel to it, befitting of the narrative tone of the game. It’s first and foremost easy to read.

A secondary font is used when reading through written materials in the game, and we aimed for a compromise between a handwritten feeling and still being easy on the eye.

The font size we ended up using is fairly large, so it’s readable even when playing on a lower resolution screen, but it can accommodate all the text that was meant for one screen and is not obnoxiously huge if playing full-screen on a large display.

SeaBed is our first visual novel that has in-game support for both Japanese and English languages – easily changeable at any time from the settings menu. This compounds all the effort that went toward polishing the text settings, as we had to make sure they would work even if people play around with language options.

Other improvements we have made to the game include improving the text skip mechanics, which will especially help those re-reading the story and looking for particular passages.

Moreover, our programmer Tony and one of our testers, Denis, worked together to loop all of the game’s 60+ music tracks in the game, so they now replay seamlessly while playing. The BGMs have been carefully chosen by the developer and play a crucial part in establishing the mood of each scene, and removing any distracting pauses was a way to further strengthen their effect.

Lastly, the original 800×600 ending video of the game has been recreated in loving detail in the 1440×1080 resolution, with bilingual credits. Look forward to it at the end of your journey!

Finally, the Steam version of SeaBed will come with full Steam features – achievements, Steam Trading Cards, Cloud support. Did you know that Steam overlay doesn’t work in all games automatically? There are various changes we’ve made under the hood in SeaBed – like many of our other games – to get the overlay working smoothly so you’ll never have to think about it.

Soon you’ll get to experience all of these changes live – and if you never have to stop to think about them, they’re working as intended.

First Look into AoS2 Multiplayer Options

We wanted to give everyone a quick update on the progress of Acceleration of SUGURI 2, as well as post some yummy new screenshots! We’re very excited to see the features clicking into place one by one.

This is the first official look into our new multiplayer options!

At this moment, the lobbies support 8 players. The players can freely challenge each other to matches, or use “Auto-Battle” to set themselves ready to battle anyone who challenges them. There are also various new additions on this screen, including avatar support, country and connection quality display, and reworked match options.

You can see the results of considerable effort on the character selection screen, in the modest form of an input delay setting. This lets you adjust your input delay to desired smoothness at any latency. Optimal delay is set automatically, and suggested range is color coded. We’ve had very good results with the solution in internal testing so far!

Kae shares some bonus words of wisdom! You can click on any of the screenshots for full 1920×1080 size. The Steam store page has also been updated with the new screenshots.

Two more bonus shots!

There are still a few major features missing, such as a list of active lobbies, but we’re confident the multiplayer beta won’t be far now!

Acceleration of SUGURI 2 – First HD Screens

We’ve been making some good progress with Acceleration of SUGURI 2 recently, and I wanted to share with you some of the fruits of our labor – the first HD screenshots!

That’s right, the Steam release of AoS2 will support Full HD resolutions and beyond.

Battle of the midgets – click on the image for full size.

Two cool women – click on the image for full size.

Hime wants you – click on the image for full size.

The multiplayer already works through Steam, in a basic form. Once we’ve finished upgrading the graphics and the multiplayer’s at a reasonable point in internal testing, we plan to have a public BETA for it on Steam. The framework for that is already prepared. We hope to have more details for you about that soon!

Look forward to accelerating!

Fruitbat Factory ローカライゼーションプロジェクト 『Chuusotsu – 1st Graduation』(Kickstarter)

更新履歴

2017年5月11日
・支援額を問わずアドオンをお申込みいただけるようになりました。(※Collector’s Editionは除外)
・アドオンにアクリルキーホルダーを追加しました。
・DualShockersによるインタビュー記事(英語のみ)が公開されました。

2017年5月10日
・ソーシャルストレッチゴールとしてThunderclapキャンペーンを開始いたしました。100名の支持者が集まれば、新規イベントCG×1枚がバイリンガル版に追加されます。

2017年5月7日
・『白兎』に『Collector’s Edition』を追加しました。
・『白兎 アーリーバード』(450ドル)を追加しました。

2017年5月5日
・『1st Graduation』に『Collector’s Edition』を追加いたしました。
・新しく『ソウルディスペンサー』(99ドル)と『1st Graduation アーリーバード』(800ドル)を追加しました。

2017年4月28日
・限定パッケージ版『Chuusotsu – 1st Graduation Collector’s Edition』を追加しました。詳細はアドオンセクションをご覧ください。

『ちゅーそつ!1st graduation』は、セカイ系ビジュアルノベル『J.Q.V 人類救済部 ~With love from isotope~』で知られるStudio Beastが手掛けた、全年齢向けビジュアルノベル作品です。日本語版は2016年8月にHD解像度で発売されました。

弊社Fruitbat Factoryは、『ちゅーそつ!』バイリンガル版(テキスト:日英、キャラボイス:日本語)を世界中のビジュアルノベルファンへお届けします。最高の形で本作品を発売するため尽力しておりますが、さらに素晴らしい作品として世に出せるよう、今回キックスターターを通してファンの皆様からご支援を募りたいと思っております。

ご支援いただいた資金は以下のように使用させていただく予定です。

・『ちゅーそつ!1st graduation』の英語ローカライズ費用
・Studio Beastによるバイリンガル版の内容強化費用
・同サークルの今後の作品制作資金

C1_CG1
ずいぶんやんちゃだった過去を持つ恋色だが・・・?

本プロジェクトへご支援いただくことで、バイリンガル版をベストプライスで入手できるだけでなく支援者限定のリワードを獲得できます。
また、日本語でしかプレイできない作品を、今後弊社がローカライズして世に出すための資金としても利用させていただきます。

BackerKitを利用いたします。それにより、リワード送付にかかる正確な送料や、KSキャンペーン終了後でも支援増額によるリワード内容の変更やアドオンの追加などが可能となります。なお、BackerKitは支援くださった方全員が利用可能となります。

01about
<ちゅーそつ!1st graduation~ちゅーそつの Time After Time~について>

新時代の統一国家・[世界人民連邦]によって定められた[P3法]にもとづき庁人シールの等級が人生を左右するこの世界。シールを与えられないちゅーそつは、すなわち[無能力者]を意味する。長きにわたる闘病生活の末、まんが大好き少女・毬須川アルエは、この春からちゅーそつとして生きていくことに相成った。

庁人硬度、たったの[5]。若くしてお先真っ暗なアルエの前途。

C1_CG2
アルエは夢を叶えることができるのか?

『わたしには、やるべきことがあるのに……』

自分に課した目的の為、この絶望的状況を打破し、人生をリカバーするために応募したのは――――

[ちゅーそつを集めたルームシェア生活!?]

より詳しい情報は公式サイトをご参照ください。
Fruitbat Factory – Chuusotsu!公式ページ
http://fruitbatfactory.com/chuusotsu (英語)
Studio Beast – ちゅーそつ!公式ページ
http://www.studio-beast.com/chuusotsu (日本語)
Visual Novel Database – Chuusotsu!
https://vndb.org/v18770 (英語)
Steam – Chuusotsuストアページ
http://store.steampowered.com/app/630870/Chuusotsu__1st_Graduation_Time_After_Time/
DualShockers – 英語版制作についてのインタビュー記事
http://www.dualshockers.com/fruitbat-factory-interview-talks-localizing-chuusotsu-1st-graduation-bringing-games-west/ (英語)

02goals
<目標額とストレッチゴール>

2017年5月10日
・ソーシャルストレッチゴールとしてThunderclapキャンペーンを開始いたしました。100名の支持者が集まれば、新規イベントCG×1枚がバイリンガル版に追加されます。

今回設定した目標金額は、本作をより洗練された作品へすることを可能にする額です。
もし多大なご支援を頂き目標額を超えた場合は、Studio Beastによる新規CGやその他の新要素を加える予定です。

03stretchgoals

本キャンペーンにご支援いただき、さらにお友達などへご紹介いただければ、目標額以上の達成確率が高くなるだけでなく、本作製作者への支援や、弊社が日本で製作された素晴らしい作品をより多く世界へ配信できる機会を増やすことにも繋がります。

コスト内訳

Pie

(右上から時計回り)
・Kickstarter手数料とその他諸経費 – 10%
・Backerkit – 2%
・リワード – 30%
・管理・宣伝 – 5%
・英語ローカライズ費用 – 53%

ご支援金の一部は、新規イラストやその他新要素の制作費として直接Studio Beastへ渡されます。
ご支援金額が大きくなるほど、より多くの人員でゲームのブラッシュアップが可能になります。

05pledgerewards<支援額別リワード>

C1_KS_01■支援要員
1ドル以上
パーティへご招待!:キックスタータープロジェクトページの『Updates and Comments』にて、最新情報の確認や弊社スタッフ・他の支援者(全リワード対象)とやり取りができます。

C1_KS_02■庁人シール
15ドル以上
ゲーム:DL版ゲーム(DRMフリー)+Steamキー

C1_KS_03■アーリーバード
18ドル以上(限定数:200)
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
OST:DL版公式オリジナルサウンドトラック『Sound Disc』

C1_KS_04■ちゅーそつ
25ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
アバターセット:キックスターター限定壁紙とアバターのセット

C1_KS_05■シンクロ
50ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
クレジット:ゲームクレジット欄に特別支援者としてお名前を記載(※公序良俗に反するようなお名前は記載できません)

C1_KS_06■お隣さん
75ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
スティックポスター:アルエ、あらら、恋色のスティックポスターを各キャラ1枚計3枚(約48x18cm)

■ソウルディスペンサー
99ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
Collector’s Edition(限定パッケージ版):トールケース、ゲームDVDディスク、サントラCDディスク、ゲームデータ入りオリジナルUSBメモリ、限定ポストカード×3枚

C1_KS_07■ホログラム
100ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
・スティックポスター:アルエ、あらら、恋色のスティックポスターを各キャラ1枚計3枚(約48x18cm)
OST(ディスク版):昼王氏と葛飾太子氏のサイン付きディスク版公式オリジナルサウンドトラック『Sound Disc』

C1_KS_08■セカイ系
200ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
・OST(ディスク版):昼王氏と葛飾太子氏のサイン付きディスク版公式オリジナルサウンドトラック『Sound Disc』
スティックポスター(サイン付き):アルエ、あらら、恋色のスティックポスターを昼王氏のサイン付きで各キャラ1枚計3枚(約48x18cm)
ポスター:新規イラストを使用したB2ポスター1枚

C1_KS_09■白兎(送料無料)
450ドル以上(アーリーバード)
500ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
・OST(ディスク版):昼王氏と葛飾太子氏のサイン付きディスク版公式オリジナルサウンドトラック『Sound Disc』
・スティックポスター(サイン付き):アルエ、あらら、恋色のスティックポスターを昼王氏のサイン付きで各キャラ1枚計3枚(約48x18cm)
・ポスター:新規イラストを使用したB2ポスター1枚
タペストリー:ビーチシーンを使用したB2タペストリー1本
抱き枕カバー:両面印刷の抱き枕カバー1枚(キャラクター:アルエ)

C1_KS_10

■1st Graduation(送料無料)
800ドル以上(アーリーバード)
1000ドル以上
・ゲーム:DL版ゲーム(DRMフリー)+Steamキー
・OST:DL版公式オリジナルサウンドトラック『Sound Disc』
・アバターセット:キックスターター限定壁紙とアバターのセット
・クレジット:ゲームクレジット欄に特別支援者としてお名前を記載
・OST(ディスク版):昼王氏と葛飾太子氏のサイン付きディスク版公式オリジナルサウンドトラック『Sound Disc』
・スティックポスター(サイン付き):アルエ、あらら、恋色のスティックポスターを昼王氏のサイン付きで各キャラ1枚計3枚(約48x18cm)
・ポスター:新規イラストを使用したB2ポスター1枚
・タペストリー:ビーチシーンを使用したB2タペストリー1本
・抱き枕カバー:両面印刷の抱き枕カバー1枚(キャラクター:アルエ)
色紙:お好きなキャラクターがモノクロで描かれた、昼王氏のサイン付き色紙1枚。

C1_H_04
<アドオン>

■24ドル
・ポスター:新規イラストを使用したB2ポスター1枚(200ドル以上のリワードに付いてくるものと同様)

■59ドル
・タペストリー:ビーチシーンを使用したB2タペストリー1本(500ドル以上のリワードに付いてくるものと同様)

■49ドル(支援額50ドル以上で選択可)
・Collector’s Edition:トールケース、ゲームDVDディスク、サントラCDディスク、ゲームデータ入りオリジナルUSBメモリ、限定ポストカード×3枚

■29ドル
・アクリルキーホールダーセット:主要キャラ3名のキーホルダーセット

アドオン1点をお申し込みの場合び送料は5〜15ドル程、複数お申し込みの場合はそれより少なくなる見込みです。
送料は本キャンペーン終了後BackerKitを通じて集められます。
なお、支援額が75ドル以上の場合、どのアドオンでも送料無料になります。

アドオンをご希望の場合は、元々のご支援額にアドオン分の額を加えてください。
その後、キャンペーン終了後に利用可能になるBackerkitにてどのアドオンを選択されたかをお伝えください。

C1_H_05
<送料>

下記は、現時点で試算された各リワード別の送料です。
各地域への発送数などの影響で金額が変わる場合がありますのでご了承ください。

本キャンペーン終了後、Kickstarterを通じて発送に必要な情報を収集いたします。
この情報を利用して正確な送料を算出した上で、Backerkitを通じてその額を請求させていただきます。

世界各地への概算送料は以下の通りです。

75ドル支援:10〜15ドル

100ドル&200ドル支援:15〜25ドル

500ドル&1000ドル支援:送料無料

いずれの国・地域へ発送でも、上記の料金幅で収まるかと見込んでおりますが、特定の国や地域については若干お安くできる可能性があります。
正確な送料はBackerkitにてお支払いしていただく予定です。

 
 C1_CG3
フレンドリーなお隣さん、こころ


なお、輸入に関する法律や税関など要因となり、ウクライナ、カザフスタン、アフガニスタン、ロシアへはリワードを発送することができませんのでご了承ください。

C1_H_06
<印刷系リワードについて>

オリジナルサウンドトラック『Sound Disc』以外の、物理的なグッズは全て本キックスタータープロジェクト限定です。
今回を逃しますと手に入れられる機会はほぼないかと思われます。
また、使用されているイラストもグッズのための描き下ろしであること、本キャンペーンが成功しなければグッズの製作自体が実現しない点もご考慮いただけますと幸いです。
弊社のウェブサイトやイベントなどで販売されることがあるかもしれませんが、基本的には本キャンペーンを通してのみ入手可能です。

各グッズの詳細は以下の通りです。

・Collector’s Edition

内容
トールケース
ゲームDVDディスク
サントラCDディスク
ゲームデータ入りオリジナルUSBメモリ
限定ポストカード×3枚
ジャケット内側に新規イラスト

・スティックポスター
75ドル以上のご支援で獲得できるスティックポスターの線画です。
メインキャラ3名の新規イラストとなります。

・キーアートポスター
ポスターで使用されるキーアートの線画です。
完成版の背景には満開の桜が描かれる予定です。

C1_KS_KAp1a

・タペストリー
B2サイズタペストリーに使用されるイラストは、ゲーム内でも登場するビーチシーンです。
完成品は画像とは異なる場合がありますのでご了承ください。

Wallscrolla

・抱き枕カバー
描かれるイラストはアルエはPrefundiaでのファン投票で決定されました。
Dakimakura
・アクリルキーホルダーセット
主要キャラ3名のアクリルキーホルダーセットです。

※上記の印刷系グッズは現在製作段階のため変更される場合があります。

C1_H_07

<スケジュール>

『ちゅーそつ』の英語ローカライズは既に着手されており、2017年終わり頃の発売を予定しております。
また、グッズの発送は2017年の終わりまでに完了する予定です。

C1_CG4
見つめるあらら

アメリカ合衆国内が対象となる作業についてはInterweave Productions LLSと協力して実施いたします。
本キャンペーンの管理とグッズ発送は弊社Fruitbat Factoryが行います。

C1_H_08
<Studio Beastついて>

始めまして。同人ゲームサークルStudio Beastと申します。

私達は主に成人向けのノベルゲームやアドベンチャーゲームを制作しているのですが、
この「ちゅーそつ!」という作品は、いろんな人に楽しんでもらおうという思いから
一般向けに作らせていただきました。

誰もが一度は経験のある、思春期の少年少女にありがちな葛藤や悩みを、
コメディを交えて描いている作品です。

「1st graduation」と言うことで、シリーズ作品の第一話にあたる作品ですが、
単体でもお楽しみいただけます。

また、JQVのような従来のStudioBeast作品が好きな方はもちろん、
女性が読んでも満足していただけると思います。

アルエ達“ちゅーそつ”トリオの青春ストーリーを是非お楽しみください。

Studio Beast 葛飾太子 昼王

Studio Beastは日本を拠点とする同人ゲームサークルで、『J.Q.V 人類救済部 ~With love from isotope~』などで知られており、質の高いシナリオと美しいイラストで非常に高い評価を受けています。

『ちゅーそつ!1st graduation~ちゅーそつの Time After Time~』はStudio Beastの手がけた4作目です。
現在は、サークル設立10周年を記念した作品『Suicide Fence』を鋭意制作中です。

C1_H_09
<Fruitbat Factoryについて>

2012年の設立以来、日本で制作されたあらゆるジャンルのゲーム作品をパブリッシングしています。

オンラインボードゲーム『100% Orange Juice』は弊社が取り扱う作品で最も知名度があり、その他にも『Eiyuu Senki – The World Conquest for PlayStation 3』、『ENIGMA:』、『War of the Human Tanks』シリーズなどが知られています。
また、VisualArt’s様が制作した『リトルバスターズ!』の英語ローカライズでは弊社が主体となりました。

『ちゅーそつ!』は社内の翻訳担当により翻訳されており、校訂担当はGareJei(Tokyo Babel、Himawari – The Sunflower, SeaBed, Dies Iraeの校訂を担当)です。

<リスクと課題>

『ちゅーそつ』の英語ローカライズは既に進められており、キックスターターの成否に関わらず、英語版は発売予定です。
そのため、余程のことがない限り、ゲーム自体は確実にプレイしていただけます。

今回のプロジェクトは、弊社が初めて手掛けるキックスタータープロジェクトとなるため、その過程で予想もしていなかった事態が起こる可能性があります。

それでも、他のサービスを利用してクラウドファンディングを成功された実績から、プロジェクト開始から実際にゲームやグッズをお届けするまでの過程についてはある程度予見できているとも自負しています。

本作を最高の形で発売したいという理由から、現時点ではっきりとした発売日を発表することは残念ながらできません。
また、ローカライズ中に何か改善点が見つかれば、当初のスケジュールを押してでも取り入れます。
本キャンペーンの成否により、Studio Beastによるゲーム内容のアップデートが予定されており、それによりさらに開発時間が長くなる可能性があります。

また、グッズの制作や発送については予見できない遅延が生じる場合もあり、そういった場合には関連業者の変更などが必要になる可能性もあります。

要約しますと、本プロジェクトで1番起こり得るリスクはグッズの配送遅延です。
そのため、本プロジェクト内で記載されている日付については、あくまで目安とお考えください。

哲学しましょう!

Guide: How to Recognize a Review Key Scammer

To start with some background: we receive requests for review keys from scammers nigh daily, especially around new releases, so I figure there has to be a pretty substantial industry revolving around it. With hundreds if not thousands of small developers on PC, and more appearing all the time, there is probably always new prey to be found. As such, I figured sharing our experiences might help someone out, especially on the long term.

Why would anyone want to bother scamming a key from us?

I’ve often seen the opinion “the benefit of getting a review from a legit source outweigh the risk that it’s a scam” or “if someone goes to all that trouble just to get a free game, let them have it“. I’m here to show you otherwise.

It’s my belief that this attitude is exactly why the scammers are so abundant. Their motivation shouldn’t be underestimated, since most of them aren’t looking for “free games” for themselves, but rather money, plain and simple. One scammer often operates several fake accounts, and every key they receive (possibly from the same dev) will turn into real currency on the P2P key marked. I don’t have any estimates for how much money they are actually making off this, but it wouldn’t surprise me if some were making more than a good living wage off it.

A real jackpot for them would be something like 4 review keys for an unreleased game, and being added on your reviewer mailing list to receive all of your future games too.

But I’m not getting fake review key requests,” you say? This may change very quickly. Or perhaps after reading to the end you realize that you have, in fact, been getting those already.

If you give a scammer a key, you may first realize you made a mistake when you almost immediately receive half a dozen similar requests from other fishy accounts. (If it’s a Steam key, I recommend revoking it at this point – this has recently been made possible in SteamWorks). You’ll however almost certainly stay on scammer hotlists ever after (and these lists are quite possibly shared/sold between scammers) and be subject to every new type of scam they come up with.

So, let’s get to the real meat of the topic.

How do you recognize a review key scammer?

If you were hoping for a simple mistake that marks all scam emails, I’m sorry to disappoint. However, there are a number of clear warning signals that you can evaluate. When in doubt, I would recommend taking an extra step to verify their business, or if you don’t have the time for that, just ignore them. If you’re a small developer, and not a full-time PR person, you should have better things to spend your time on. I’ll go into ways you can verify their identity later.

Tip #1, which will get you most of the way, is to have a healthy dose of skepticism. If something looks too good to be true, it probably is. If something looks a little fishy, it probably doesn’t stand the light of day.We all get these mails. There are countless variants depending on how brazen/stupid the scammer is, and some of them have enough effort to look legit. Some things to look out for:

They tell you they are sure to give you a very positive review. Read no further. A legitimate reviewer would never tell you this. Whether the contact is real or not, you don’t want anything to do with them.

They advertise in the mail how many subscribers they have. A real channel typically wouldn’t be so crass about it. They’re just trying to establish their importance and make it look like they’re doing you a favor by taking some keys off your hands.

You got several similar mails in a short period of time. This usually doesn’t mean you suddenly got popular. It means a single person entered your email onto their list and activated the automated scam accounts they operate. The emails may not be same word for word, but their structure (greeting, body, signature) is very similar, including how they for example link their channel and twitter account at the end of the mail.

Some text appears in a different font in the email. Usually your company’s name / game name. This doesn’t necessarily mean the email is a scam, but it does show it’s a copy-paste job at best, not someone writing you a personal email in their own words.

They have 3 million subscribers. These guys wouldn’t email you for a review copy. No harm in checking their contact info of course, but I’d put the odds any such mail is legit at roughly around zero.

They are requesting multiple keys for their “friends” to help review the game, or for “promotion”. Especially for streamers, unless you personally know the other party, you can just write all of these off as scammers. Legit review sites may occasionally ask for additional keys for giveaways, but they would never present it as a condition for reviewing the game.

The channel they are linking to doesn’t list a contact email and the email doesn’t provide any other way to verify it’s their channel. How convenient. Don’t take a leap of faith, either ignore or take an extra step to verify (see later section). Any legit YouTuber who would take it upon themselves to email developers for keys ought to have their contact info on their channel’s ‘about’ page.

The linked channel’s ‘about’ page actually mentions that they will never mail you for a review key. This is because they’ve gotten contacts from other devs who were targeted, so it means someone is posing as this channel. It may even explicitly mention the fake email the scammer uses. Always worth reading the ‘about’ page.

The YouTube channel’s contact info matches the email, and their videos have a nice amount of views. This is where things start to get more interesting, let’s take it up a notch.

Tip #2 – A mail from a “YouTuber” requesting a key has a 90% chance to be a scam (not an actual statistic, but it doesn’t hurt to think so). Bear this in mind, and you may realize that the channel that looked OK at first glance has some glaring issues.

The channel’s last video is from a year ago. Probably not the original owner of the account, or even if they are, this channel is now only used for scamming devs.

The channel displays videos with a massive amount of views, but their more recent videos have only a handful of views. Something sketchy in the channel history. Maybe a few videos’ views were boosted with bots to make the channel appear more popular, but it doesn’t actually have any human subscribers.

The channel’s front page isn’t actually listing their own videos but favorites or some such. Just trying to bait people who only give it a cursory look.

The channel seems relatively active, but all the videos are F2P games / FPS footage / MOD reviews (and this has nothing to do with my game’s genre). Uploading generic videos to give the appearance of activity, possibly with views boosted by botnets.

The videos have 50k views but no comments. This isn’t normal activity. Probably a bot channel.

The email came from [channelname]@yahoo/hotmail/gmail.com. Just a statistical factor, most scammers use something like this for their email address. Exhibit more caution.

The channel’s in a non-English language. Obviously not exactly a sign in itself, but a very high number of these scammers use non-English channels to make it harder to look up information on the channel and get an idea of what it’s about. Usually combines with the features above, and is just an extra reason to discount the mail.

The channel doesn’t list an email address, how can I verify the mailer’s identity?

If the channel itself looks real and relevant enough that you’d want to be featured there, but you can’t verify the email address of the person who contacted you, and you want to go the extra mile to make sure, there are a few things you can do.

Use a social media profile for verifying them. If their ‘about’ page doesn’t list an email address, but does link to social media like Twitter, Facebook etc, and you have an account on one of those, email them back and tell them that to verify their identity you need them to follow your account on chosen social media with the associated official account. If they’re for real, they should have no problem doing this.

Use a 3rd party review key distributor. There are services such as Keymailer that do their own screening of streamers, and you need to only add your keys and send them to people requesting them at will. When in doubt, you can tell the person that you hand out review keys through this service, and direct them to the relevant page to request a key there. You will see whether the streamer they are claiming to be appears on the list. This saves you a lot of headache (and also allows you to reach other actual streamers).

Well, this section was mostly about streamers requesting keys, but what about review sites? Much of the same critical evaluation applies, but here are a few specific points to consider:

Recognizing a fake game review site

There are 2 general types of scammers, those impersonating a representative of an established site, and those faking the site itself.

It’s an established review site. Verify the email address from their contact information. Even if there isn’t an email listed, they should at least have a contact form where you can ask if this person really works for them. A larger site’s email address is unlikely to be “sitename@gmail.com” and more likely to have the same domain as the site itself.

It’s an unknown review site. Again, this is where things get juicier. The site may list a contact email that matches the one that approaches you, so it should be legit, right? Well, most likely it isn’t. Check against the following criteria:

The review site is based on a blog platform. You can tell these apart pretty easily by the simple scrolling design. Though this may change in the future, at the moment most fake review sites are built like this. Of course there are perfectly OK review sites that are hosted on blog platforms, but this is a strong warning sign.

There is no user interaction. The site doesn’t feature any kind of forums, and has no comments or other interaction on any of its articles.

The review articles are ripped off other review sites. Copy paste a bit from the middle of a review on the site into Google, and see if the same review pops up on an established review site. You might be surprised.

The site is in a foreign language. This is a pretty devious variation of the above. The whole site and reviews have been google translated into language X. If you speak that language, you will be able to tell right away, otherwise you can ask a friend who speaks that language. They will almost certainly tell you that the text is google translated. Of course there are review sites in all languages, but this is a very popular scamming tool since it obfuscates your attempts to verify the legitimacy of the site. When combined with other warning signs (especially getting several similar review requests for similar blog-hosted “review sites” in different languages within a day), you may just ignore these with a good conscience.

An example:

or…

The site actually posts unique reviews, but they are completely generic. This final point is a bit tricky and somewhat a gray area. The site may have real interaction with you, and they will write a review for the game, but when you read it, it only uses stock screenshots, and only speaks in generalities, without citing any detail that wouldn’t be obvious from a few minutes of research into the game. In other words, it does not appear they used the review key you sent for writing the article. I’m not sure if I should include this as a scam, but beyond lazy writing it’s possible they do not act honestly either. The end-game for them may be to give you a review that will satisfy you, and be included on your reviewer mailing lists to receive all of your future games. They will keep writing generic reviews to avoid suspicion, all the while selling your review keys. This behavior can be hard to even identify, but if you suspect this is happening, you can try to track the activation of the review key you sent from SteamWorks (if it’s a Steam key, obviously).

This turned into a longer article than I expected when I set out to write it, but I hope I was able to give you some good tools for recognizing scammers. I may update this later if I run into some especially interesting or innovative scam attempts. Did I miss something? Let me know in the comments.

If this article was able to turn your bubbling excitement over receiving a review request into brooding cynicism, good. Instead of hoping for reviewers and streamers to approach you, you need to actively look for new contacts yourself. Because all review requests you receive are more likely to be scams than not. Sad but true.