Rami Ismail (ramiismail.com)                             

Event Schedule

Biography

Rami Ismail is the Business & Development Guy at Vlambeer, a Dutch independent game studio known best for Nuclear Throne, Ridiculous Fishing, Super Crate Box, LUFTRAUSERS, GUN GODZ, Serious Sam: The Random Encounter & Radical Fishing.

Through his work at Vlambeer, Rami has come to realize that the marketing & business facets of many independent game developers could use some help. As such, he created the free presskit-creation tool presskit() and is working on releasing its first add-on, release().

Believing sharing knowledge openly is the cornerstone of independent development, Rami has spoken on a variety of subjects at dozens of game events around the world, ranging from the Game Developers Conference to Fantastic Arcade & from University seminars to incubator mentorship.

He is a avid opponent of game cloning after Vlambeers Radical Fishing got cloned. He is also a proponent of searching for new, beautiful things in places no-one is looking for them and thus organized Fuck This Jam, a gamejam focused around making a game in a genre you hate. Rami also works closely with the Indie MEGABOOTH team to enable indie studios to showcase at the larger game conventions.

Rami exclusively drinks cane sugar Coca Cola.

 
 
 

On Full Disclosure

Full disclosure: since a large part of what many voices that co-opted GamerGate are asking is full disclosure, so I’d…


RAMI IS CURRENTLY IN THE NETHERLANDS.
YOU CAN REACH HIM AT RAMI@VLAMBEER.COM, , , OR BY CALLING +31 (0) 621206363.

distribute

Introducing presskit() 2.5 & distribute()

For the last few months, my studio Vlambeer has funded work on a project called distribute(). distribute() is a free developer service that allows independent developers to easily handle their press contact list and (p)review build distribution. It’s created to inform and assist developers in creating a good (p)review build strategy, maintaining relationships with the press and verifying that press requests come from verified sources.

distribute() has been in an early alpha state, with about half the functionality live at the moment. It has been a tremendous success – we have several hundred projects actively using distribute(), including Vlambeers’ own Nuclear Throne, and already a dozen full commercial international releases have run their launch using distribute(), and those releases have reached more than a thousand unique members of the gaming press already – be it written, video or livestream. It’s been wonderful seeing the service grow as we work on new functionality.

presskit() changelog
Today, I also want to announce presskit() 2.5, which silently launched yesterday night. presskit() 2.5 removes a security vulnerability related to e-mail, introduces translations for those of you targeting more than just English-speaking press and establishes a way for presskit() to communicate with distribute(). This is a recommended upgrade for all presskit() users.

Upgrading presskit()
To upgrade, you’ll need to reinstate the install.php file that is in your root (the installation recommend you to rename it to _install.php, if that file is there just rename it install.php). If that file does not exist, just download a new installation of presskit() from the website. In both cases, your presskit() data will not be modified by any of these steps.

After reinstating install.php, just head for your presskit() installation and the update should be completed automatically by following the steps on screen. It shouldn’t take longer than a few seconds to go through the entire process. You might see a few debug messages at the top of the screen after your presskit() goes live again, but these should disappear after a refresh.

Translations
To enable translations, look in the /lang/ folder available in the root of your presskit() installation. In it, you’ll find en-English.xml, which you can save as any other language (ie. nl-Nederlands.xml or ar-Arabic.xml). Edit the new language file, keeping the base lines intact, but modifying the local lines. For languages that are right-to-left, change <local> to <local direction="rtl"> in the local tags.

Save and upload the new file to the /lang/ folder. It should show up immediately in your presskit. If you want to localise the content of the presskit() at well, duplicate the data.xml file and rename it data-nl.xml, replacing nl with whatever you put before the hyphen in the language file. You can do this for both the root data.xml as well as for project data.xml.

distribute() integration
To enable distribute() integration, log into your distribute() account, click games and the game you wish to integrate. If you’ve got presskit() linked, you should see a download key file option. If you don’t have presskit() linked, please edit the game and use the load from presskit() functionality.

Click the download key file button and you should receive a file from distribute(). Upload this file to the appropriate project folder in your presskit() installation and you should be done. Visit the page, and you should see a new section named Request Press Copy. If there is a warning message instead, follow the instructions in that warning – if the error mentions it, for security purposes, you’ll have to delete <press-can-request-copy> tags from your project’s data.xml.

distribute() plans
distribute()’s secretary mode is getting large improvements over the next few weeks, along with SSL-security and e-mail digests for both developers and press. Press will be able to opt-in to a daily, weekly or monthly newsletter with new games, while developers will be able to receive digest about activity on their projects. The verification system will be limited to sites with High or above Reach. Based on user feedback we’ll also be introducing a Event Mode that allows developers to easily let press sign up while at events.

As presskit() and distribute() mature, I continue to look for ways to improve both systems. If you have any feedback, thoughts or ideas, the full source to presskit() is available on github. For ideas on distribute(), please just drop me a line on e-mail.


firesalamander_wip2

Nuclear Throne Daily Runs & Why Assumptions Are Bad Programming

Yesterday, we launched one of the most important Nuclear Throne updates yet. In Update #55, we introduced Daily Runs, a challenge every player can take once a day in a pre-generated level. This way, players can compete with players around the world on the same level, but only get one shot at getting a high score. Obviously, this adds a lot of replayability and challenge to the game for those who enjoy that kind of challenge, without changing the game for those that don’t like to compete with others.

Sadly, there was a problem: for many players, the HUD just kind of disappeared halfway through the game. That doesn’t make for fair competition.

For all of you that think of going into programming, the lesson today is *never make assumptions*. I am obviously not the main programmer on Nuclear Throne, so for me a lot of the code, structure and specifics are not as natural as they are to J.W. Since J.W. was mostly busy today, I decided to take a shot at hotfixing the issue.

The Issue
The core issue was that the HUD was disappearing at random moments, without any clear indication as to why that happened. When we started hunting the bug, the first thing we focused on was trying to create a reproducable method of triggering the bug. Using the developer cheats, we’d try walking around in different worlds and the like. The only way we could get the bug to happen frequently was the ‘trailer cheat’. It was originally created for our trailer creator, Kert Gartner, who needed a way to record video while not being quite amazing at Nuclear Throne. Not only does it bring you to the next world, it spawns a lot of radiation, a big weapon chest and some other stuff – so you immediately look badass for the trailer recording.

The Pause Button
We concluded that one of the ways the bug could be triggered was by pausing the game during the end of the level transition. That was a clue – from what we could tell, the bug would only occur while transitioning between levels. We had something to chase.

So we focused on was figuring out whether the code that draws the HUD was still being executed after the bug.

In Nuclear Throne, the HUD is drawn by two functions: scrDrawHUD, which draws popup text and pickup prompts, which then also calls scrDrawPlayerHUD for each active player. scrDrawPlayerHUD then draws the HUD for the player with the player number provided – number 1 for player 1 and 2 for player 2. We checked in scrDrawHUD, and realised quickly that the HUD was still being drawn. We shifted focus: what if, despite the HUD being drawn, the player HUD was not being drawn? We went back, logged gameplay and realised that this was indeed the case. If we had just been more specific, logging scrDrawPlayerHUD instead of scrDrawHUD, we would’ve noticed that right away. Bad assumption.

The code that calls scrDrawPlayerHUD first checks with the ‘main controller’ if the player exists. Our ‘main controller’ object holds all sorts of important information about the player, including what the ID of the player instance is. Game Maker assigns objects and instances an ID in chronological order (the first created object is ID 0, the 2nd is ID 1, and so on).

If the ID number was higher than 0, we could expect the object to have been created (and thus gameplay to have started properly). If the game is over and the player returns to the main menu, we reset the ‘main controller’ and the value gets set back to -1. Each frame, we check if the value for each player is 0 or higher – if it is, the player was created, so the game has started, and we draw the HUD.

In other words, it would be a good idea to keep track of the value of that player ID in the main controller. We set up a realtime log so we could see the value change while we played, and we started playing in windowed mode. When the bug happened again, we noticed two things: the game suddenly forced itself back to full screen, and the player ID value had reset to -1.

Figuring out why the game goes fullscreen.
Confused, we moved on to see if maybe the surfaces were broken or uneven: that might force the game back to fullscreen.

Surfaces are basically render targets. Normally when we render images, sprites or anything, we do that to a buffer that gets drawn to the screen at the end of the frame. Surfaces are basically a sort of imaginary piece of glass we can draw things on, and then we can later overlay those on the screen. Every shadow in the game is drawn to a surface, and the darkness in dark worlds are also drawn on a seperate surface. Since we’ve had a longstanding bug of the darkness disappearing when resizing windows, we thought maybe the solution could be found here.

The good news: when something changes about the window context – so toggling from full screen to windowed, resizing, turning on or off AA – the surfaces are immediately lost. Chances were that the problem was quite simply that the window was being modified, the surface lost and thus the HUD (and the darkness) no longer drawn. We started looking around, quickly found the bug that caused the darkness to stop being drawn and then searched for the HUD surface.

The problem was: there is no HUD surface. The HUD is being drawn directly to the screen, like most of gameplay. We were back to square one, and already hours underway. All we had learned was that the screen changed, and the player ID was reset to -1.

We searched for code that modified the player ID, and found a number of places where that happens. We painstakingly rewrote code, optimized things and fixed dozens of little problems, but we couldn’t find any place where the player ID was modified. What if, instead of being modified, the controller was being reset? That’d be odd, because it’d mean all information would be lost or modified mid-game.

Or would it? We checked and it turns out most information required to run the game is stored in the Player instance itself, rather than in the ‘main controller’. The controller is used only at the end of the game, and when the two got disconnected you wouldn’t notice it until after restarting – when suddenly you’d be playing a different character, your score was incorrect or your daily challenge run was uploaded incorrectly.

In other words, it could be reset. That’d also explain the screen resize – the main controller is the very first object created at game bootup and sets the screen context. It was time to confirm that the controller was being reset, so we caused the game to display an error each time the main controller was created anew. Within moments, it became clear that that was indeed the culprit: the main controller wasn’t being deleted, it was being overwritten with a new copy of itself.

Big Weapon Chests
We obviously couldn’t just remove or work around that code: it’s being used to initialise the game, and it’d be impossible to change it. We needed to find what caused it to be created anew in the first place, rather than fixing the code in the creation of the controller. Luckily, it’s not hard to find out what object causes something to happen.

The debugger gave us a quite unexpected result: the object that caused the controller to be created anew was the Big Weapon Chest.

So we checked the Big Weapon Chest. There wasn’t a lot of code in there, and we caused the game to throw errors every time it was created. We quickly realised that this was every time we cheated to the next level, and the bug would only occur once every few levels. We were clearly on the wrong track – the chest might be part of the problem, but it wasn’t causing the problem. While the Big Weapon Chest would always be around when the bug occurred, it would be created as part of the cheat without any problems.

But why would the Big Weapon Chest sometimes create a new controller and overwrite the old one? It didn’t make any sense, and since we were stuck anyway, we decided to dig a bit deeper.

This is where I went for dinner, which – because I’d been working all day tracing this bug – also counted as breakfast.

We started looking into where Big Weapon Chests were created instead. Obviously, they were created when we cheated ahead, and under certain in-game circumstances. Specifically, Big Weapon Chests cannot be spawned directly – a normal weapon chest is changed into a big one when certain conditions are fulfilled.

Since the timing of the problem was hard, we decided to step through the code instruction by instruction, seeing what would happen when a big chest was created. The problem was that the code that is normally run when an object is created wasn’t run when the Big Weapon Chest would coincide with the bug. That was another clue: the Big Weapon Chest wasn’t created normally.

The solution!
So we started looking at the one place where the Big Weapon Chest was created through a non-standard method: the scrPopulateChests function, which fills the level with all sorts of chests, cannisters and the like after generation is complete. In it, a weapon chest can be transformed into a big weapon chest using a function called instance_change().

We decided to start ‘stepping through’ the code line by line from the point where the game decides to replace a normal weapon chest with a Big Weapon Chest. The code we were stepping through was the following:

with WeaponChest
{
if random(4) < GameCont.nochest
   {
      curse = 0
      with instance_change(BigWeaponChest,false)
         event_perform(ev_create,0)
      exit;
   }
}

This code is not super complicated. It basically does this:

With the current WeaponChest,
{
   Roll a four-sided dice, and if the number is less than the amount of times players did not pick up a chest,
   {
      Uncurse this WeaponChest,
      Change it into a BigWeaponChest, deleting this chest directly instead of normally,
         Run the 'creation' event on the BigWeaponChest that we just changed from a WeaponChest,
      That's all!
   }
}

It ran through every of those lines perfectly, but at the event_perform(ev_create, 0) object, something odd happened. Instead of executing the ‘creation’ code of a BigWeaponChest, it executed the ‘creation’ code of our main controller. It reset all the values to their default values as they are in the main menu, and thus also our player ID to -1. That’s why the HUD wasn’t being drawn anymore.

But why did it do that? A quick scouring of the Game Maker documentation and a chat with Michael Dailly from YoYoGames provided the answer.

Unlike instance_create(), which creates an instance, instance_change() command doesn’t return a reference to the object created. That means that while:

with instance_create(BigWeaponChest)

will allow you to both create and modify a new BigWeaponChest,

with instance_change(BigWeaponChest)

should technically give an error and fail.

Instead, instance_change() always returns a value of zero. So, instead of what we thought the code did, this is what it actually does:

With the current WeaponChest,
{
   Roll a four-sided dice, and if the number is less than the amount of times players did not pick up a chest,
   {
      Uncurse this WeaponChest,
      Change it into a BigWeaponChest, deleting this chest directly instead of normally,
         Run the 'creation' event on the object that is stored in Object ID 0,
      That's all!
   }
}

Object ID 0 is the first object that is created in the game. In our case, as mentioned before, that’s our ‘main controller’. The BigWeaponChest reset all the values to the base values because we misunderstood the subtle difference between instance_create(), which we usually use, and instance_change(). Instead of creating a Big Weapon Chest, we were creating a new ‘main controller’!

The solution was relatively simple: just remove the word ‘with’.

with WeaponChest
{
   if random(4) < GameCont.nochest
   {
      curse = 0
      instance_change(BigWeaponChest,false)
         event_perform(ev_create,0)
      exit;
   }
}

which translates to

With the current WeaponChest,
{
   Roll a four-sided dice, and if the number is less than the amount of times players did not pick up a chest,
   {
      Uncurse this WeaponChest,
      Change it into a BigWeaponChest, deleting this chest directly instead of normally,
         Run the 'creation' event the current WeaponChest (which now happens to be a BigWeaponChest)
      That's all!
   }
}

Either way, this entire bug stemmed from a misunderstanding of how instance_change() works. We assumed it’d work the same way as instance_create() does, and it doesn’t. Well, there goes Wednesday – maybe I’ll try my hand at one of those Daily Runs myself.


Screencheat

Screencheat

Screencheat is a multiplayer FPS with a twist: the only way you’ll find your opponents is by looking at each others screen. Reminds me of the days in which my younger brother was always a bit better at screen cheating than I was. It’s simple, chaotic and so much fun.


Rami Ismail randomly calls… Danny Baranowsky

Rami Ismail calls indie musician Danny Baranowsky of Super Meat Boy, Desktop Dungeon, Binding of Isaac and Crypt of the Necrodancer fame to talk about the cops, content ID and impostor syndrome.


1086942[1]

Taiso

TAISO is probably the most fun game I’ve played that will totally help you break your phone.


On Full Disclosure

Full disclosure: since a large part of what many voices that co-opted GamerGate are asking is full disclosure, so I’d thought I’d try doing exactly that just for practice. Although it may come off as snarky, I just want to illustrate how connections and networking in the games industry work and create a realistic context for any discussion about journalism and ethics before delving into my thoughts on Gamergate. As such, I’d like to preface this article with that I’m friends with many prominent game developers in both AAA and independent gaming, students and aspiring developers, journalists and video content creators.

I have had numerous aggressive e-mails, tweets and comments directed at me, and dealt with a number of failed log-in attempts into several online services I use. I know many of the people that have been criticized, harassed and attacked personally. 

I’ve helped numerous indie projects out with business or marketing advice, and give design feedback for even more games – both independent and AAA. I’ve spoken at various universities and at events that thousands of industry professionals attend, and have had many games pitched to me. I’m a judge on various competitions in the industry, both small and large. I’ve invested small amounts of money into a number of games through Kickstarter or Patreon, and have backed several game criticism publications through those same methods.

I’ve been nominated through work or personally by companies such as Apple, but also DICE, Gamasutra, GDC, IGF, CVG and many other publications. I’ve been interviewed on several occasions in real life by almost every gaming website and many mainstream press outlets, including the New York Times. My work with presskit() has been adopted by thousands of developers around the world freely as a publicly available service. The follow-up to presskit(), distribute(), is still in progress, but will be free to use by developers, journalists and video content creators.

I also spend a significant amount of my time traveling between various indie game communities to be inspired, to learn, to inform, educate, nourish and establish development communities. I am also romantically involved with a fellow game developer and game jam organizer with whom I have been traveling together. Through these travels, I’ve become personal friends with hundreds – if not thousands of game developers, marketeers, critics and journalists – many of which I consider valuable sources of input and information in a highly collaborative industry.

During the years that I’ve been traveling, I’ve stayed at the home address of various game developers and project collaborators, and sometimes events have paid for my flight and lodging as part of the speakers agreement. Locations I’ve done this at include amongst others San Francisco, Seattle, New York City, Vancouver, Los Angeles, Austin, Rijeka, Johannesburg, Berlin, London, Nottingham, Helsinki, Cabo San Lucas, Moscow, Genova, Barcelona and in countries such as Estonia, Australia, India, Sweden, Norway, Denmark, and other locations.

I’ve been to industry parties organized and sponsored by many companies and entities in the games industry, including amongst others EA, Activision, Ubisoft, Microsoft, Sony, BigPoint, Alamo Drafthouse, Unity, YoYo Games, Devolver Digital, the cities of Antwerp, Utrecht, Helsinki, Amsterdam and various others. In many cases, the bar or accommodation the event was at offered free drinks, although as a Muslim I do not drink alcohol.

I use Objective C, C and C++ as main programming languages and GML, HTML, PHP and CSS as main scripting languages. I have a Samsung Galaxy S5 Android phone, although I did really like BlackBerry’s new OS. I also own an Apple iPad and a MacBook Air that came as part of winning an Apple Design Award. I own a Lenovo laptop that was granted to me by Intel to judge certain games for a competition.

In my identity as half of Vlambeer, I’ve worked closely with and in some cases became friends with people at platforms such as but not limited to Valve, Humble, Sony, Microsoft, Nintendo, NVidia, Apple, Android, Blackberry, OUYA (yes, even OUYA) and Amazon; engines and tools such as Unreal, Unity, YoYo Games, publishers such as amongst others Activision-Blizzard, EA, Ubisoft, Devolver Digital, Midnight City; I know developers such as Gearbox, Bungie, Ubisoft, 343 Industries, InXile Entertainment, Cards Against Humanity, Double Fine, Fullbright, Dennaton Games and many, many more. I’ve got ties with events such as GDC, E3, Gamescom, PAX, Indie MEGABOOTH (which I’ve helped organize several times), DICE, BAFTA, Control Conference and many more, I’ve advised on the content of some of these conferences; I’ve worked with publications such as Polygon, Kotaku, Destructoid, RPS, Joystiq, CVG, IGN, Gamespot, GiantBomb, Gamasutra, Power Unlimited, Control Magazine, Gamekings, TouchArcade, Slide2Play, IndieGames.com and a large number of smaller game publications. I’ve also worked with amongst others the NPR, PBS, The New York Times, Slate, VICE, The Daily Dot, The Guardian and the NOS. I’ve also written articles that have been published on my own blog, but also republished on sites such as Gamasutra, Polygon, Kotaku and aggregators of those sites. I receive no financial reward for such writing. I’ve worked together and had my work featured by YouTube and Twitch, but also by personalities on both sites such as TotalBiscuit, NorthernLion, CobaltStreak, MANvsGAME, Bananasaurus Rex, Ster, BisnapLP, Sleepcycles and many more. Many if not all of the above companies and entities and a large amount of independent developers have received free codes for our games, but we have has never paid for coverage (although we do not know if publishing partners have done so, we suspect not). I hav worked with Level Up Studios and Fangamer for merchandise efforts. I’ve had lunch or dinner with various people at such companies or entities, have received or given (proprietary) hardware or free software from several of these publishers, developers or platforms. I’ve been introduced to some of these by fellow developers when such an introduction was relevant or requested, and I’ve made many introductions between people myself. Some of these companies have proceeded to give us visibility through events, articles or video coverage as a result of exclusivity deals for the game or free review copies sent.

I am a university dropout from the Utrecht School of Art & Technology’s Game Design and Development course, even though I’ve eventually graduated on my company and have been advising them and various other game design schools around the world with creating a relevant educational program.

I’m half-Dutch, half-Egyptian and was raised in the country of the Netherlands and was raised in the city of Alphen aan den Rijn, although I spent significant amount of time in Egypt. I currently live in the city of Hilversum, even though our office is housed in the Dutch Game Garden in Utrecht. The Dutch Game Garden offered Vlambeer 3 months of free rent when we first entered the building. We’ve not taken government subsidies, although I’ve used several government grants when we were just starting out to pay for event costs.

I am followed by over 25,000 Twitter users and have 1,600 Facebook users as friend, and I follow over 1,200 Twitter users of which I closely follow about a 100 in a separate list I’ve made available. We’ve experimented with paying for Facebook reach on our posts a number of times, but decided it was dumb to pay for such a thing. I livestream through Twitch.tv, use ask.fm as a platform to answer questions, have recently started a podcast which I syndicate through libsyn. I once received a free Karma device for 4G hotspot functionality because I forgot mine at home while traveling abroad. My main e-mail provider is Google Mail, I use Hangout and Skype for instant communication, although I do like text messaging at events too. I’ve paid for several services that help me backup files, although a Dropbox representative once gave me a coupon at a PAX event. I use Hipmunk and Skyscanner to book flights, commonly use Booking.com for hotel bookings and Yelp or Twitter for restaurant recommendations. Other services I use include Asana, Trello and WordPress.

My company occasionally but rarely discounts games, but has handed out gifts such as t-shirts, birthday cake, hats and discount coupons (up to 100%) at events. The identity of gamers that received such gifts is sadly unknown to us.

For further questions, feel free to contact @tha_rami on Twitter.

What is Gamergate?

As far as I see things, Gamergate is a hashtag on Twitter that originated in a harassment campaign against prominent industry members that was co-opted by people who are upset about videogame journalism ethics. It is now a confusing mess of people using the legitimacy of the hashtag to further an agenda of harassment, a lot of unsubstantiated conspiracy theories and a well-intended group of people trying to raise concerns about journalistic standards. While I think continuously evaluating the way industry members interact is important, using something that started as and continues to act as a harassment campaign purely as signal booster only serves to weaken a message that would be far better and more effectively made without attaching the negative connotations of the hashtag to it.



recommendation
675526_20120627_screen013[1]

Thomas was Alone

Thomas was Alone is a game about friendship and jumping rectangles and it has somehow captured me over the last…

recommendation
ASYNC Corp.

ASYNC Corp

At Fantastic Arcade, Antichamber‘s Alexander Bruce suddenly got me back into a shamefully long addiction of ASYNC Corp, which is…

recommendation
Glitchhikers

Glitchhikers

There’s something about driving late at night that makes me introspective,  and the (pay what you want) Glitchhikers perfectly captures…