Category: games

Ludum Dare 35

Ludum Dare 35 happened a weekend ago, and although I published a postmortem on my LD48 blog, I haven’t posted here about it.

The theme for this one was Shapeshift. The first idea I had was to do a game that played like the arcade classic Asteroids, but where your ship’s shape would shift according to its state. I did a quick proof of concept Friday night, where the ship stretched under acceleration, and while it was a pretty cool effect, it wasn’t really something that made the game better or more interesting than the original. By late Friday I was convinced I was on the wrong track, and should start over with something else, but wasn’t sure what.

Saturday morning, I woke up and briefly considered just giving up my efforts for the weekend, and working on other stuff with my weekend time. In the afternoon I attended a Cleveland Game Developers “Excuse to Create” event, and started over with a new project. In the morning, I’d thought about another arcade classic, Robotron 2084, and I started getting interested in making a twin-stick arena shooter. In part I was spurred by the discovery that the keyboard for my new Lenovo ThinkPad P50 laptop has poor rollover characteristics, which make playing games on it all but impossible. I started building it at Excuse to Create and by the end of the 3 hour session I knew that I was on the right track. What I ended up with was much closer to a Geometry Wars clone than I had originally wanted, but it plays pretty well and I had fun making it.

I would have preferred to come up with a more original concept than that, but oh well. It’s not an attempt at a straight up clone of Geometry Wars, but more of a knock-off. The shape-shift theme comes into play with the target shapes, which “lose a side” when shot and shift into the (N-1)th sided polygon. This gives the larger shapes a kind of “hit points” which makes them take several hits to completely destroy. I thought that would be a novel enough twist, but in practice it plays feels about the same as the original Geometry Wars.

Along the way I learned a few things, all of which are game design rather than programming lessons.

  1. At one point in my development, I had the power-up items be vulnerable to the player’s shots, and also if the player shot a power-up item, they would lose one level of that power-up. This would have made the game a lot different from Geometry Wars, where it’s safe to shoot indiscriminately because your shot has no bad effects in that game. I had hoped that this change would make my game more about aiming and looking where you are shooting, and being careful. But in testing, it just made the game too difficult. As the difficulty of the game ramps up, it becomes a frenetic twitch game where you mostly dodge and run away from a swarm of shapes that are following you, and there’s not really any opportunity to be selective about when you’re shooting or where you’re aiming, and if you do lose a level of power-up, it’s pretty much instantly lethal.
  2. Spawn location matters. I knew that I needed to spawn enemies far enough away from the player that they would not be prone to crashing into a newly spawned instance that appeared directly in their path, leading to unfair death. But I also learned that spawning near the edge of the view makes the game seem more active, and puts more instances in view especially in the opening seconds of the game, when there are few objects and the pace of the game is slow. The compo release has enemies spawning randomly anywhere in the room, and as a result feels much more sparse and too slow during the opening.
  3. Code mistakes can be fun! My original code for spawning a swarm of enemies accidentally placed them all in the exact same location. Since the movement of the enemies is purely deterministic, this resulted in a “stack” of enemies all piled up on top of each other, looking like a single instance. When shot, instead of destroying the entire stack, the bullet would only destroy the first instance in the stack, and the rest of the stack would continue to advance, looking to the player as though a early-invincible “super shape” that took a great many shots to destroy was inexorably running the player down, and the player’s shots merely chipped off lesser shapes, which then joined in the attack. I liked the effect so much that after fixing the swarm spawn code in the compo release, re-added a toned-down version of this to the post-compo branch.

In looking back over my Ludum Dare games, I’ve come to realize that I’ve felt overly negative about my performance in LD48. I do have high standards for what I think makes a good game, and so naturally I feel disappointed if my efforts fall short of that mark. In my first few events, I was happy just to have proven to myself that I could build something playable in under 48 hours. In later events, I became disappointed that my abilities didn’t improve as fast as I wished they would. And, really, unless I take game development as a full-time occupation, it’d be hard to improve as fast as I would like. But perhaps an even greater sense of frustration has come from my inability to come up with a good idea for a game — or rather, a good idea that I could complete with my abilities in 48 hours that fit the announced theme. Particularly after the submission deadline, when I’d see so many good games produced by others. But if I focus on the 8 games that I did complete, rather than the 6 LD48 events I didn’t submit for, I’m able to view my work more positively. In the immediate aftermath of the event, I would always feel a certain amount of frustration and disappointment in some aspect of the game I’d made — some feature I struggled too much with implementing, some stupid bug that I got stuck on that took too much time to fix, some feature I had to drop for lack of time, something that was missing, but I couldn’t figure out what it was that the game needed, or something that just wasn’t quite right. But looking at what I have produced, there are some good ideas in six of the projects, and I’m happy about that.

>>> Play Shape Struggle <<<

GMC forums upgrade

YoYoGames recently decided to overhaul the GameMaker Community Forums. Formerly run on IPBoard, they are moving to a new solution.

YYG did the right thing, by asking the community for feedback on how they’d like to preserve the historic threads in the old forum system. The old forum will be retained, frozen in read-only mode, with no sign-in allowed. I’m a bit concerned about not being able to log in any more, since it was easier to find content that I had posted or replied to that way. It would be nice if the forums could be read-only but still allow existing users to log in. But, as I understand it, the IPBoard has had many security problems, and so disabling login probably helps mitigate privilege escalation attacks.

When the new forum goes live, users will need to re-register their username. I had suggested that YYG reserve the user IDs of all existing users and send an invite email to them, to claim their old username. I don’t believe that this suggestion was adopted, however. It would have been a good thing, though, as there’s been concern that pranksters might claim famous user names from the old forums and impersonate users. Hopefully this will not be a big problem, but a way to either carry over the old user accounts or else reserve the account names and send invites to users to claim their old username would have been a great way to avoid the problem altogether.

Currently the old boards are down while the upgrade is happening. The migration is taking several days, during which the boards will continue to remain down. I don’t understand why it should take such a long time and having the boards unavailable for an extended time is disappointing; I would think that YYG could have the new forum software staged in a testing environment that could be moved to the live server with a simple press of a button to trigger an elevate script. Likewise, I would think that putting the old forums into read-only mode could be achieved without taking the forums offline at all. Why this wasn’t possible, or wasn’t the best way to take on the migration, I don’t know. There was a very active thread discussing this, but… it was on the old forums, which are currently down.

Based on what I read, it’s unclear at this time whether the url of the old forums will continue to be gmc.yoyogames.com, and the new boards take a new domain name, or if the old forums will be moving to a redirected url. My hope is that the old URL will be preserved, so deep links to old threads will not be disrupted, and the new forums will have a new domain name. However, my guess is that the new forums will use the existing gmc.yoyogames.com domain, and the old forums will probably be redirected, or simply moved.

It will be interesting to see the new forums, how they are organized and curated. Hopefully YYG have learned from the years they maintained the old forums, and will have many improvements. The biggest item on my wish list is to allow file uploads and hosting, so that project files no longer have to be hosted on external services, which tend to fall victim to link rot over time.

The developer community surrounding GameMaker has long been a valuable asset to YYG. In a lot of ways, it’s probably their best asset — the community has always been very helpful for helping new users solve problems and turn into seasoned, experienced programmers. Hopefully the new forums will continue this tradition for many years to come.

Cleveland Game Developers Level Up 2/20/16 workshop

Excuse to Create – West Side – featuring “Level Up”

Saturday, Feb 20, 2016, 1:00 PM

Lakewood Public Library Main Branch
15425 Detroit Avenue Lakewood, OH

14 Video Game Developers Went

About Excuse to Create”Excuse To Create” is our casual working meetup event. Want to brainstorm or ask questions of other developers? Want to turn up your headphones and code without family distractions? Maybe look for opportunities to collaborate, pair-program or share your latest prototype? Just want to draw, sketch, or compose? This is the meet…

Check out this Meetup →

Global Game Jam 2016: Pug Pug’s Bathtime Ritual

Global Game Jam 2016 has concluded. I completed my project this year, and I’m pretty pleased with it.

pug_pug's_bathtime_ritual_alpha5

The theme for Global Game this year was “ritual”. I didn’t have an immediate idea what to do for my game, but after about 20 minutes I decided to do a game about a Pug’s bath time, which I called Pug-pug’s Bathtime Ritual. It is pretty common knowledge that I like pugs, which made this project especially fun.

Taking inspiration from this video:

I decided to make a simple minigame about knocking down bottles. I had some ideas for other minigames that I could link together, but there wasn’t time to do more than one. I worked at a relaxed pace, didn’t stress or overwork myself over the weekend, and completed the project about an hour before the 3pm submission deadline. It’s not terribly challenging, but it’s cute.

There’s a playable HTML5 build and a Windows build, along with full source, as well.

#ilikepugs

Global Game Jam 2016

Once again, this Friday I’ll be joining with my fellow Cleveland Game Developers friends to participate in the 2016 Global Game Jam. I’m looking forward to hearing what the theme will be this year, and seeing all the games the different groups at the Shaker Heights location will create. Special thanks to Launch House for hosting us again this year!

Adventuring with Warren Robinett

One of my earliest videogaming experiences was with the classic Atari 2600 game, Adventure. A favorite of many who played on the system, this game has attained legendary status for it’s brilliant design, a technical accomplishment that pushed the Atari well beyond what its designers had intended it to be capable of, fun and replayability, inspiring a genre of adventure games, including the Legend of Zelda series, and of course becoming as known as the game to feature the first “easter egg”.

The game is still fun to play today, and remains one of my favorites to revisit. It is extremely replayable, and much of the fun that I had playing it was with investigating and experimenting. In 1981, I played this game with my brother all the time. We learned the basics in Level 1, which was a truncated version of the full game, with a smaller map and only two of the three dragons, and no bat. I moved on to Level 2, which introduced an expanded world with one more castle, a dragon, and the bat, and had all the items in prescribed locations so that the quest was the same every time, but you had to go to every castle and defeat every dragon in order to win. The new dragon, Rhindle, was so fast and aggressive that he scared my brother, who was about 4 at the time, so much that he could only watch me play. After winning Level 2 a few times, I proceeded to Level 3, wherein the item placement was randomized, making each re-play a unique experience.

One time, my older cousin came over and we were playing Adventure, and she showed me a secret room in the Black Castle, accessible only by using the Bridge, where she found a mysterious, invisible Dot, which she used to reveal the most amazing thing: the first Easter Egg: a hidden secret that revealed a message from the game’s creator!

tumblr_lyq4oaXr2M1qzmhdko1_500[1]

This was how I came to know the name of Warren Robinett, who designed and programmed Adventure and became famous for being one of the first game developers to have their name known publicly.

Even before being shown the easter egg, I had spent many hours exploring and experimenting in the world of Adventure. I played not just to win the game, but to do crazy things with the objects in the game to see what might happen.

I put the Bridge in walls and used it to exit the screen and appear on another screen, where normally you couldn’t get to.

I tested putting all of the objects in one room to see if anything special would happen. I discovered that when there were too many objects in one room, the Magnet would stop working. Or the Sword would not be able to slay a live dragon. Or keys would fail to unlock the castle gate. Somehow, if there were too many objects in one place, the Atari couldn’t handle it. But I could always move, I could always pick up objects and carry them, and walls always worked (with the exception of the wall involved in revealing the Easter Egg room.)

I learned how to “break” the game in other ways. I discovered that if you dropped a key in the doorway of a castle while you were closing the gate, the gate would close in front of the key, which would disappear inside the castle, forever sealing it. I learned that if a castle’s gate was closed, if there was a dragon or the bat inside, it couldn’t get out. And I learned that unlocking a castle would release any creatures inside, and that if a dragon did not have an item to guard, it would leave and roam around, hunting me down.

I learned that while I couldn’t carry or move a dead dragon, the bat could, and I could catch and carry the bat, which allowed me to use it to move dead dragons (or live ones, which was always a risky proposition!) So then I took to using the bat to grab dragon carcasses and move them to an otherwise-empty castle, and lock everyone in there so that in the event that I got stuck and had to reset the game to get unstuck (an action which resurrects every dead character in the game, you and the dragons) the dragons would be safely contained, leaving me free to continue exploring and experimenting without interruption, for hours.

I took time to carefully explore the mazes and learn how to move through them quickly, and to get to any area in the maze that I needed to. I learned places to put the Bridge to take shortcuts. I puzzled over three empty rooms in the vicinity of the White castle, wondering what their purpose was, if they contained any hidden secrets, and how to unlock them.

Despite being pretty sure that I knew everything there was to know about Adventure, I never could say for certain that there wasn’t something that I didn’t know, and this (as well as the fun of speedrunning the game) gave me the incentive to play the game endlessly, for years. While I figured that I’d found all of its secrets, I still had questions.

Recently, I was thinking about Adventure again, and played it a few times, and did some reading about it on various websites, and stumbled upon Warren Robinett’s website. There, I learned that he is writing a book on Adventure that will be coming out in 2015! I am so excited about this. His webpage mentions that to receive updates about the book project to send him an email with the word “annotated” in the subject line, so I did. I wrote him a short note thanking him for creating such a wonderful game that I have enjoyed these many years. And I wasn’t sure if he would read it, or if he merely set up a listserve bot that would automatically subscribe me to his mail list, and maybe he’d never read my message. But a day later I had a response from Mr. Robinett in my inbox!

11903757_10206856024977227_1235429922435834157_n[1]

Holy shit! Granted, it’s a sentence long, but he read and replied! So, not wanting to be too intrusive, but curious about some of the questions I’d had about his game since forever, I wrote back and politely asked. And he responded again, short and sweet, but I’m thrilled to have corresponded with a true legend of the industry.

At any rate, here’s the excerpt from our correspondence where he answers my questions:

csanyk: I have always wondered about the empty rooms in the area outside the labyrinth near the White Castle. Apart from occasionally holding random objects, I always thought that those rooms felt like they should have had some more purpose than they did. After learning about the easter egg with the dot, I spent a lot of time trying to figure out if there wasn’t some kind of hidden secret in those rooms, and as it turned out, there wasn’t. But boy did I try everything I could think of just to make sure!

Warren Robinett: Well, you are probably aware that the game world was bigger for levels 2 and 3 than for level 1. Level 1 was for beginners, and some of the difficult stuff was intentionally left out of the game world. I regarded level 1 as being “truncated”, because I changed the room-to-room links to leave out more than half the rooms. So the two rooms you asked about had different functions in level 1 — one was the interior of the Black Castle (just a single room in level 1), and the other was where the Catacombs are in levels 2 and 3 (again, just a single dead-end room).

In level 3, the random positioning of object was supposed to put stuff in those rooms sometimes, but I made some mistakes in the random number generator, and it seems they were nearly always empty.

csanyk: If you could have had more time or more computing resources to put something in those rooms, to make a Level 4 game, what would you have populated them with? Another castle and dragon? Some type of new item? Was there something that was meant to be there, that never made it in to the game due to constraints? Or were these rooms always intended to be empty spaces?

Warren Robinett: I talk about that in my book The Annotated Adventure, which I hope to be finished with this fall.

csanyk: I discovered that if you press select until you have the option for game 3, and then pull down on controller 1, the player spawns into the game select screen and can walk about the room. Was this something that was put into the game deliberately, and if so why? How did it come about?

Warren Robinett: The game-select screen was a room. I re-purposed a room as the meta-game UI screen to save memory. I put the Man down in the corner (I thought he was totally trapped) so he wouldn’t be there to distract you. You found a way to break him free.

csanyk: As a kid, after killing the dragons, I spent hours trying to put the Bridge everywhere I could think to and see what would happen. In a few screens, there are places where you can put the bridge off the top or bottom of the screen, and use it to “break through” the bottom wall of a room that you shouldn’t be able to pass through, and end up somewhere else, only to become stuck. To me, a huge part of the game’s lasting appeal and replayability was that it seemed to invite this kind of experimentation. For example, if you go one room down and left from the Yellow Castle, and stick the bridge in the bottom wall of the screen and pass through it, you end up in the White Castle screen, stuck between the towers:

Adventure (1980) (Atari)_7

Adventure (1980) (Atari)_6

or in the room one screen down from the Gold Castle, putting the bridge in the bottom wall will warp you to the Gold Castle, again between the towers:

Adventure (1980) (Atari)_8

Adventure (1980) (Atari)_9

or from this room in the labyrinth, you can travel to the room next to where the secret is hidden — only you appear at the bottom of the room, and can’t quite break free into the room, and have to retreat back up through the bridge to get back to the labyrinth.

Adventure (1980) (Atari)_10

Adventure (1980) (Atari)_11

Warren Robinett: Every room had a link to four other rooms. No exceptions. If you could get through the wall, you could find out which room that was.

Since the Bat and Dragons could move around in different directions, there had to be a new room off each edge.

csanyk: I loved the fact that when you are eaten by a Dragon, you can still move, confined within its stomach. Also, when two dragons are on the screen, and one eats you, the second dragon will come up and eat you again, while you’re in the first dragon’s stomach. And most fun of all was if you left the game run, and the Bat would come by and pick up the dragon whose stomach you were in, and fly around with you, giving you a bizarre tour of the kingdom. The idea that the game world continued after you died was very novel.

Was that a design choice or an accident?

Warren Robinett: The thing you need to understand was that developing the game was incremental. You add some code, you fix a bug (or try). And see how it plays.

I didn’t plan for the Man to be able to wiggle after he was eaten. But when I saw, I liked it. I could have eliminated that by re-ordering some subroutine calls. But it didn’t do that.

I didn’t plan for the Bat to be able to pick up a Dragon that had eaten the Man. But I had coded each piece separately. So it just fell out of the simulation with no effort required. I liked it — it was hilarious. No way would I “fix” that.

csanyk: How did you ensure that the randomization in Game 3 would not result in the game sometimes becoming unwinnable, such as by locking the Black Key in the Gold Castle and the Gold Key in the Black Castle?

Warren Robinett: I tried to make sure each random positioning was winnable, by choosing from certain ranges of rooms for each object. But I botched it, and it DID sometimes generate unwinnable configurations.

csanyk: I think I’ve played the game enough to have seen everything you can expect to happen. I’ve seen the Bat, carrying the Sword, accidentally kill a Dragon. I’ve closed the castle gates and dropped the key inside as it was closing, locking it in forever. I’ve seen so many objects on one screen that the Sword or Magnet wouldn’t work any more. I’ve seen the Bat fly by the castle gate with a Key, opening it. I’ve worried ever since that I could get locked inside of the castle by the Bat if I left the key outside where it could grab it, but this has never happened. It doesn’t seem like objects can interact with each other unless they’re on the current screen, with the notable exception that if you hold the Magnet off the edge of a screen, you can attract objects in the next screen. And also the above-mentioned trick with the Bridge going off the top or bottom of certain screens. The amount of exploration and experimentation that I’ve done in this game, for as small as it really is, is pretty breathtaking, when I think about it. Were you ever surprised to hear from fans just how much they replayed your game? What things have players done in Adventure that surprised you?

Warren Robinett: The stuff you mention above is correct. The Bat could also pick up objects off-screen.

I am now eagerly awaiting the publication of his book later this year. So stoked!

Fiction is all in your head: Everyone can have it their way

Personally, I don’t buy this theory of Metroid’s Samus Aran being transgender under our noses all along.

In the 1980’s, the secret of Samus being female was cool, and I liked the surprise. I don’t know of anyone who didn’t. Literally no kids who I know of played the original Metroid back in the day, learned of the reveal and thought it stunk, or felt betrayed to learn that “they” had “been” [playing as] a girl all along. Gamers have pretty much universally always accepted Samus as a female character.

I grew up with a few notable female heroes in sci fi, like Ripley from Aliens, and one of the Metroid minibosses was an alien named Ridley who takes some design cues from Giger’s alien, and it was later revealed that the creator of Metroid was doing homage to Alien with the character. Samus’s gender reveal has been understood to be another homage to the Ellen Ripley character. There was also Star Wars‘s Princess Leia, who, although at first seemed to be another damsel in distress needing to be rescued, stood up to Grand Moff Tarkin and Darth Freaking Vader and his interrogation droid, and upon being rescued turned out to be a strong and formidable character every bit as wily and capable of the heroic male characters who broke her out of Death Star detention block AA-23.

Nonetheless, I do think it’s fair to say that there’s plenty of sexism and stereotyping in our culture. In fact, it’s more than fair — it’s obvious, blatant, pervasive. While individuals are all over the map in terms of how open and accepting they are, as a culture overall we have made a tremendous amount of progress toward gender equality in the time since I was born. Yet, there’s still plenty of sexism and misogyny everywhere you look. It’s true there is a lot of the closed-minded thinking still around, and I’m sure it will continue to persist in our culture after I’m gone.

The Japanese culture that birthed the Metroid universe is different enough from American culture that we do find some of their ideas about gender and sexuality to be strange. But that’s part of what makes learning about other cultures cool. It is a subject that is too complex for me to adequately summarize in even a few paragraphs, but suffice it to say for the purposes of this article that comparative cross-cultural sexuality is a pretty fascinating field to study if you want to get into it, and aren’t too uptight. (Seriously, go out and do a PhD on the subject if you want to.) For our purposes here, it’s probably enough to know that there’s a streak of chauvinism, and in terms of traditional gender roles in Japanese culture the differences between traditionally masculine and traditionally feminine is even more pronounced than in American culture. But there’s also a lot of counter examples in Japanese entertainment, of strong, heroic, badass female characters as well. We might say that in Japanese culture, as compared with American culture, there’s greater contrast between gender stereotypes, but perhaps a greater acceptance of the exceptional.

I’ll admit that I don’t really feel like an authority on such matters, so I could be well off the mark. But I feel reasonably safe in assuming that the guys who came up with Samus were probably not the most advanced thinkers at the time when it came to gender identity. We should not hold an expectation for them to get it “right” or be “sensitive” or “politically correct” in how they think about, or talk about, or portray the character of Samus Aran. And when looking for characters to become more realistic as they develop over time, we should not hold an expectation for them to mirror our ideals. Real people are complex and flawed, and have similarly “problematic” views with regard to social justice issues as is present in our real culture. So for a fictional character to conform to some ideal in order to be a role model is neither necessary, nor realistic.

Even if that’s “problematic” for some, that’s acceptable. Nobody has all the answers, or has it all figured out. And the stories about how we struggle with ourselves are usually a lot more compelling than stories about ideal perfectly who always behave in exemplary fashion that should serve as a model for the behavior of others. The notion that “problematic” depictions of characters is acceptable doesn’t mean that there aren’t things that are problematic. But that people aren’t perfect, and sometimes artists offend, sometimes without meaning to. People talk about things they don’t understand all the time, and that’s great. That’s a part of how we make progress toward greater understanding.

I don’t pretend to know everything that I’m talking about, either, and that is why it’s important that I talk about it. I’m not trying to tell everyone “the way it is” or how to think. I’m talking about how things appear to me, from my perspective, and to the best of my knowledge. I think that’s all we can ask of anyone at any time. That, and to go and dig for the truth. Which, you may never know, but can often get closer to.

But basically, at its core, Metroid didn’t feel to me at the time like it was a game about any of that gender stuff, at all. And it still doesn’t today. For all I know, maybe the creators of Metroid did consider it in designing Samus, or perhaps joked about it as a way of getting around their own lack of comfort in thinking about a female character who does things that are more traditionally regarded as “masculine”. Perhaps they even really did conceive of the character as transgender, at least in terms of what their concept of transgender means. But in any case, regardless of Samus’s gender or sexual identity, the important aspects of Samus are that she runs, jumps, and shoots, explores, powers up, and is a galactic bounty hunter and a total bad ass who is fearless, cool under fire, and utterly competent. Because that is what Metroid is mainly about. “Surprise, you’re a girl!” was a twist at the end, revealed only to players who beat the game fast enough to deserve to be let in on something cool. But it wasn’t what Metroid was about.

Samus’s character and story becomes more important in later games in the series, where storytelling elements of the game design became stronger, but Metroid was in its conception a game about exploring a hostile alien world and defeating a grave danger. Whether it was a man in the suit, or a woman, was secondary. But it was cool that Samus was a woman. And if she’s a transgender woman, then OK. But regardless of what the creators might have said about the character while creating the game, or left on the cutting room floor, there’s basically nothing in the published material that points to Samus being trans.

Which means, of course, that if you like Samus and have a need to see her as a transgender character for whatever reason, the published material is open to such interpretation. Just like we can have black Santa Claus for black people to better identify with for Christmastime, why can’t we have Samus as a transgender woman for the trans community, and people who don’t prefer that “edition” of Samus can have it the way they want it? Why does every detail in every fan’s head about a completely fictional universe have to agree with every other detail in every other fan’s head? It doesn’t!

Nintendo did have a transgender character in the 80’s, though — Birdo, introduced in the US release of Super Mario Bros. 2 — so it’s not completely out of the question that they might have had others, but I still think that the early concept of Samus that we got in 1985 was a cisgender female warrior. Birdo was a creature, though, not a human, and the portrayal of Birdo’s gender confusion is, I’m sure, a bit problematic for GLBTQ allies in 2015 — Birdo is presented as “confused” about his/her gender, and this is presented as at least somewhat comical, and (as I’m trying to indicate by my use of his/her, which normally would be considered offensive to a transgender person who knows what gender they are) the folks at Nintendo weren’t entirely sure what to make of Birdo’s gender, or at least didn’t want to spell out all the answers for their audience, and instead wanted to raise questions. That was in 1988. Whereas, in 2015 I think the message we get from the transgender community these days is that they are not at all confused about their gender identity — it just doesn’t happen to match up with their genitalia. So, Birdo’s treatment is not exactly a paragon example for GLBTQ allies to hold up as an ideal of what they might like to see in popular culture. But while Birdo may not be the answer to questions for those who are curious about non-binary gender norms, he/she was a starting point for asking questions and having conversations.

Although, there’s nothing to suggest that Nintendo intended to open up a serious dialog about any of this. I suspect that most of us just took eggs and threw them at him/her until we got past the end of the level, and that was about it. Whatever Birdo’s gender, it doesn’t affect how you play the game one bit.

As my friend Jacob says, “As long as it’s side scrolling and has a screw attack, I don’t care who’s in the suit.” I think that sums up the attitude of the largest block of gamers in gamer culture. That’s not to say that there aren’t minorities who are vocal with their opinions, of course.

All that said, characters from video games and, more broadly in all types of serial fiction, are always open to redefinition. This happens all the time to comic book characters, and they routinely do radical character changes, not especially caring about preserving continuity — because ultimately it’s not important. Character driven serial fiction has come to be understood as a form that explores a mulitverse of possibilities around a loosely defined core template for the character. The original incarnation is usually received as canon, but as new artists work with the character and write new stories, they take liberties, and always have. It’s not about making sure that everything ever published about the character is logically consistent and describes a concrete, objective reality. It’s about taking a core concept that is malleable, and running with it to tell cool stories that inspire and entertain. And about being allowed to take risks and maybe miss the mark sometimes. Not every story is the best. And not every fan will agree about which story is the best.

This is why we get to be entitled to our own opinions and to have our own preferences, and why no one can tell us we’re wrong about what we like and what we don’t. Samus isn’t just a person. She’s a mannequin which we can dress up with our imagination. She’s the paint on the brush, with which we may paint vivid pictures. She was created by Nintendo, and Nintendo may hold the copyright and trademarks, but in an important sense, Samus belongs to us.

So, I am a “geek” who can “handle” trans Samus, even though my Samus is a cisgender woman, and I can also have my Samus multiple ways, depending on how the creators who are working with the character decide to use the elements from her milieu to create new works that (hopefully) I will enjoy, and allow different interpretations of the character. I could enjoy Black Samus, Boy Samus, Shapeshifting Alien Samus, Trans Samus, Hetero Samus. Original Samus. As long as they don’t suck. I don’t even mind Samus as an adult sex fantasy.

The point is this: It’s all fiction. If you want to point at a “canon” of fiction that is “more true”, and divide it from alternative fictions that are “less true”, or unofficial, or false, and attack those who posit an interpretation you don’t happen to like, maybe you don’t understand what fiction is, and need to get out more.

iMprOVE_WRAP extension for GameMaker Studio

Today I’ve released a new asset on the YoYoGames Marketplace, called iMprOVE_WRAP.

Many video games have the feature that exiting one side of the screen will “wrap” you around to the opposite side — notable examples of this include the smash hit classics Asteroids and Pac Man. GameMaker: Studio has a GML function, move_wrap(), which is intended to provide this feature easily, but it has a few limitations. iMprOVE_WRAP addresses these limitations, resulting in a more powerful, flexible implementation.

iMprOVE_WRAP improvements over move_wrap()

Wrap behavior is no longer based on the built-in GML speed variables.

One of the most troublesome limitations of move_wrap() is that it only works for instances that have a speed. In standard GML, the variables speed, hspeed, and vspeed are used to move instances. But you can also “move” an instance by changing it’s x and y position in the room, without setting a speed. Many GM:S users will implement their own movement systems that eschew these variables, in order to give themselves complete control over the movement engine. When they do so, they are often confused when they discover that move_wrap() doesn’t do what they expect.

iMprOVE_WRAP eliminates this dependency, so that an instance no longer need to use the GML speed variables in order to wrap; wrap behavior in iMprOVE_WRAP is based entirely on an instance’s x,y position.

iMprOVE_WRAP_animation

Wrap region no longer limited to room borders

Another problem with move_wrap() is that it is intended to work with the Outside Room or Intersect Boundary GML Events. This means that move_wrap() is only useful when an instance moves outside the room, or encounters the edge of a room. But in many games, the “play field” may not be synonymous with the entire room — the room might have a border, or “dashboard” or “heads up display” which ideally should be considered “out of bounds” with regard to the play field.

iMprOVE_WRAP allows you to define a “wrap region” — a rectangular area inside the room, which instances wrap around the borders of, rather than the borders of the room.

Independent horizontal, vertical margins

With move_wrap() the margin argument which determines the margin by which the instance must be outside of the room is the same for both horizontal and vertical travel; with iMprOVE_WRAP the horizontal and vertical margins may be set independently of each other.

Wrapping instances can (optionally) draw themselves on both sides of the border

With move_wrap(), an instance still draws its sprite in the default draw in only one location: at (x,y). If the instance is off the edge of the wrap boundary, but hasn’t yet crossed over, the instance draws on the “pre-wrap” side of the room; after the instance progresses by margin pixels over the border, then the instance’s position is moved over to the “post-wrap” side of the room, and the instance is drawn there. This is not a big deal if the instance crosses the wrap boundary quickly, and has a relatively small sprite; but for slower-moving instances, or instances with larger sprites, it creates a jarring “jump” effect, where suddenly the instance appears on the “post-wrap” side of the boundary, with no real warning, rather than gradually entering the room.

iMprOVE_WRAP solves this by providing a new function, iw_draw_self_wrap(). This new function augments the default draw by drawing the calling instance four additional times, at positions left, right, up, and down from the actual instance, the width or height of the wrap region away from the actual instance. Thus, when your wrapping instance is moving off the edge of the wrap region, one of these extra drawings is poking out on the opposite side, creating an illusion of continuity as the instance leaves one side and emerges from the other.

For a wrap region that is smaller than the room itself, it’s best to do your drawing on a surface that is sized to the area of the wrap region; otherwise the parts of the drawing that should be outside of the region will be visible outside of the wrap region. Alternately, if drawing to a surface is not something you want to do, you can “mask off” the portions of the room outside of the wrap region by layering objects at a higher depth around the border, like a picture frame or dashboard.

Collision detection on both edges of the border

To compliment the iw_draw_self_wrap() function, I’ve added a new collision function, iw_collision_wrap(). This function checks for collisions at the four places occupied by the four drawings drawn by iw_draw_self_wrap(). There are actually two iw_collision_wrap() functions.

The more basic, iw_collision_wrap() sets five instance variables in the calling instance to store the id of any instance in collision: other_center, other_up, other_down, other_left, and other_right.

The more advanced, iw_collision_wrap_map(), returns the id of a ds_map, which holds those same five instance variables as keys, which you can access using ds_map_find_value().

Which to use is up to you, and the style of programming you prefer. iw_collision_wrap() is easier to use, and if you don’t mind the instance variable names, is probably slightly faster at runtime. iw_collision_wrap_map() is for programmers who get pedantic about “correctness” and want their functions to return something, not cause side effects in the application state. Since it’s not possible in GML to have a function return 5 separate values, we return a data structure that stores the five values. The downside of this is that you have some overhead, namely a need to clean up the ds_map when it is no longer needed. Fortunately, it’s not hard. The example project will demonstrate how to do this properly, so don’t worry.

iMprOVE_WRAP is available at the YoYoGames Marketplace for $2.99; however I am making it free for the first 10 downloads. Please rate it and review it if you give it a try!

Get iMprOVE_WRAP

scrollsnap extension for GameMaker: Studio

My latest GameMaker extension, scrollsnap, is published!

Asset listing at the YoYoGames Marketplace

Documentation

Demo video:

What’s scrollsnap?

Scrollsnap is a way of setting up a View in your room so that it “snaps” to the next screen’s worth of space when the followed instance moves outside the view. Simply put, it’s a view that stays put, but if you walk off the edge of the view, the view updates, giving the appearance that you walked off the edge of one screen and on to another.

Old-school video games such as Adventure, Pitfall!, and Berzerk used this approach to provide a larger game world to explore and play in, before programmers figured out how to make the hardware support scrolling.

Thinking about a human-like AI for playing Scrabble

[I got into playing Words With Friends on Facebook and my mobile phone back in 2012, and started writing a lengthy article on designing an AI to play scrabble-like games in a manner that convincingly simulates a learning human. This weekend, several years later, I’m a spectator at a local Scrabble tournament, and decided to finally finish up my thoughts.]

Designing AI for Scrabble-like games

I’ve been playing the Zynga game Words with Friends with various people for a few weeks, and have gotten progressively better at the game. After looking back and reflecting on the evolution of my play, and the development of my strategy, I became inspired by the idea of a convincingly human-like AI that embodied the various stages of my development as a player.

While actually programming it is a little more effort than I want to put into it, even just thinking about the design for such an AI is interesting.

(more…)