twisterghost

Last Login:
January 21, 2017
Warn:

Rank:
Moderator



User Profile
Follow

Hits: 149,728
Joined August 06, 2005
Games (19)

Elicti (Old version)
February 08, 2006
LOLOMGWTFBBQ
June 26, 2006
64Buddy
April 17, 2006
ludaBAD
April 20, 2006
NoobRageX
April 25, 2006
HummingBird
April 26, 2006
Elicti-Version 1.1.3
June 15, 2006
LOLOMGWTFBBTWO
July 13, 2006
SWP 1.5
July 31, 2006
Total Pwnage
August 21, 2006
Elicti: Patch 1.1.8
September 17, 2006
LOLOMGWTFBBQ3
August 25, 2006
AzNventure!
September 01, 2006
AzNventure2!
November 02, 2006
Spinning Squares
December 02, 2006
Elicti: 2.0.1
December 10, 2006
LOLOMGWTFBBQ4
December 25, 2006
King Cuko's Lost Gold
February 07, 2007
Kevin's Quest
January 01, 2007
Favorite Users


Current Tool Set
Posted on August 25, 2016 at 19:58

Lets talk about tool sets. What are you currently using for whatever your project is?

For my current game project, here's what I'm working with:

Game Maker: Studio 1.4

You may have heard of it. Maybe not. I know people on this site tend to hate on it, probably because a lot of people here grew up with the pre-studio version of GM, but I really like this version of it. Best one yet.

It really brings GM into a place where great things can be made, which we're seeing. Undertale, Rivals of Aether, Hyper Light Drifter, Hotline Miami, the list goes on. It has become a wonderful tool for making games, and I've found that mixing in the programming patterns and architectural organization methods that I've learned over the years has made for a really fun development experience.

Aseprite

This is what I'm using for spriting right now. It's actually amazing, though. I've never been great with game art, but I'm putting in a genuine effort to get better at it so I can handle doing my own artwork for my game. I've come a long way, and its largely due to Aseprite.

It provides all sorts of tooling with an approachable interface. Lots of people recommend graphics gale, but it was so messy and ugly, I couldn't get myself to really work with it. Aseprite is designed with a sprite-like aesthetic, and offers things like layers, frames, continuity, onion skinning, color indexing, symmetry and tiling options, and more. Can't recommend it highly enough for someone doing pixel art.

FL Studio

Yup. Using it for music right now. Specifically, music again for my game. I've used FL studio for years on and off, and it keeps getting better. Its not the easiest thing in the world to learn, but I've learned enough to make stuff sound at least halfway decent. I might reach out to some actual music professional in the future (you know who you are), depending on how its all going, but I'd like to think I can handle doing all of the parts of my game myself. That may be shortsighted, though.

Git

Using Git and Github for version control on my project. Allows for really easy cross-machine development as I go from desktop to laptop, and works great with GM:S. Not much else to say. Learn Git. Its worth it.

Vim

Any non-GM work I do now is in Vim. Specifically, NeoVim. I've never enjoyed working in an editor more than Vim, even though I thought Sublime was the end-all editor. Vim is more portable, powerful, and lightweight than any other editor I've used. I don't actually recommend Vim to people, because it takes a certain kind of person to really want to use it, and it has a very high learning curve, but if you're looking to shake things up, give it a shot.

Trello

It's been talked about before around here, but I love me some trello. Its really simple project management software. Right now, I just have four buckets: Planning, ToDo, Doing, Done. I dump ideas into planning, flesh them out, then move them across the board as I work on them. Helps me to keep track of what I need to do, and see the progress I've made over time.

What are you using for what you're making? Anything at all, game, music, website, application, barn, crime fighting outfit, etc.

Further reading on random suggestions of mine: here. I update that page over time as I find things I want to truly endorse.

~tg




Lifestyle Changes
Posted on August 22, 2016 at 09:24

I remember when having two posts on the recent blog list at the same time was taboo. Unwritten rule was you shouldn't clutter the blog stream with just your posts. That became the "don't post more than once per day" rule, which lead to allowing for non-front-page blogs.

The point I'm trying to make here is I'm posting again because I've been thinking I could probably stand to post more content on this ol' hunk of code to help keep things lively. Who knows, maybe I'll actually stick to it this time. (Spoiler: probably won't, but I'll try.)

Actual content time.

I'm looking for a new apartment. My girlfriend moved in with me a little over a year ago now, and we've decided its time for a change of scenery. My current apartment is actually very nice. Top floor on a 17 flight building, vaulted ceilings, lots of floor and storage space for a one bedroom apartment, and directly across the street from a metro station, so I can get into DC and around the city very easily. All in all, its been a great 3 or so years here, but there's a few complains that I have that seemingly won't be fixed, and I think its time to get out.

At first, we considered looking at upgrading. Townhouses, mostly. I wanted to look at rending a single family home for a bit. The pricing of a 3 floor townhouse a few minutes down the road from where I am now is comparable to what we currently pay, though we'd lose the convenience factor.

The thing is, we actually don't need more space. Over the past few months, we've been working towards paring down our lifestyle, getting rid of clutter, and recognizing what we're actually looking for. What we decided is that we don't actually need more space, and in fact, we could probably be fine with less space.

We've gotten rid of so much junk, nearly half of the things we own, if not more. I only have about 40 items of clothing now, which includes shoes, coats, scarves and hats. I still think I have too much. We got rid of extra crap we don't use from our kitchen, bathroom, bedroom and living room. I got rid of the gaming consoles I never use, so I could dump the disks and cartridges themselves. I either sold the stuff on Craigslist, or gave it to a friend who would get more value out of it.

I got rid of old electronics, phones, turntables, tablets, anything I had packed away in a box because "I might want it again later". Never did, probably never would take it back out. Seeing the people smile as I made the trade with them, a few bucks for some old phone that I had no use for. They'd tell me why they wanted it, and it was heartwarming. One man told me that he wanted to reward his son for getting good grades, but didn't have the money to otherwise buy the phone. One guy was helping out his aspiring DJ friend. It was great to know that this stuff was going to be actually used rather than collect dust.

We've pretty much locked down where we will be moving next. It's not much of a change, but the building looks to be nicer, newer, and better kept. I think we'll be happy there, even though its actually about a hundred less square feet. We will probably have to give up a couple of pieces of furniture, but that's okay.

Just last night, we had to go through all of our cupboards and cabinets, emptying them out because our building is doing an extermination pass through every unit. It was a pain in the ass, and our crap is lying around everywhere, but it was great for us to see just how much bullshit was hiding in the nooks and crannies. My girlfriend is actually posting about it later today, I'll update with the link when that gets posted.

Ultimately, we are looking to keep our buying and living expenses low, as we save towards our current goal of buying a house on some land to get away from the world together. I find the woods very inspiring, and am looking towards a more peaceful living setting surrounded by the woods, hopefully either working a remote job, or working for myself on a website or a game. (Game, preferably. More on that in a later post.)

I want to encourage you to look around your room / apartment / house / cupboard under the stairs that you live in, and see if you can get rid of something. You probably don't need all the stuff you have around. Getting rid of the extras makes the stuff you do have that much more valuable to you, and I've found it to be a great feeling.

If you really want a challenge, try doing what I did to start: a decluttering month challenge. Each day of the month, starting on the 1st, get rid of as many things as the number of the day. One thing on day one, two things on day two and so on. It gets hard in the teens and twenties, but its a fun challenge.

~tg

Update, link, as mentioned: http://rusticwalks.com/2016/08/22/packing-party/




11 Years
Posted on August 17, 2016 at 08:59

I recently celebrated my 11th anniversary on this site. You all have stolen over a decade of my life. Way to go.

I should have posted something on the actual day, but oh well. Here we are. Instead of posting something long and rambling here, I'd like to link out to my personal blog, where I recently posted a long, rambling entry about my journey into becoming a developer, heavily featuring 64Digits, as it was the main catalyst in me becoming a programmer.

Link: http://hellote.com/passion-vs-trade/

At the end of the post, I talk about a project I've been working on. I'm just as guilty as everyone with regards to announcing "I'm working on this game it'll be the best and I'll release it soon".

Well, I am working on a game. It might be the best, I dunno, but I won't be releasing it soon. It's still in its very early stages, and progress is slow, but I'm having a blast making it.

I'll be posting an actual reveal of the game on my site, but I will be posting here as well when I do announce it.

I don't know who everyone is anymore, but that's okay. If I knew you from way back in the day, I'm glad you're reading this, and I hope your life has been as wonderful as mine has been so far. I hope you know you played a part in that. If you're newer, or even if you have no idea who I am, well, I wish you luck in everything you build.

~twisterghost




Unannounced Devlog
Posted on November 10, 2015 at 14:32

Quoting from my other blog again

In my last post, I talked about a project I recently decided to scrap and totally start over. Thankfully, I've stuck with the new version of the project, and I'm really enjoying the work on it so far.

Here is my problem: I really want to talk about this game, but I don't want to announce it because I don't want the commitment to ruin the fun of the development when it's this early on. My solution is to say "fuck it" and start posting a devlog about what I'll just call "Project B" for now. Sweet deal.

It's been awhile since I've sat down and made a full game. I keep telling myself that I want to go back to how things used to be—making games whenever I could, of whatever size and shape. I like to think that there will be a period of time where I will be doing that, but right now, I can't seem to stray too far from Project B for too long before I get distracted. The issue here is that I need to keep my focus on this project, which keeps getting bigger every time I think about what I want it to be. At some point, I'll have to cut myself off if I ever intend to release it.

So, where am I with the project? Right. So far, basically nowhere. I have been working on basic mechanics and the core gameplay for the most part. The game is a turn based strategy game. I am taking inspiration from games I have found myself consistently enjoying: Fire Emblem, Dota and Hearthstone primarily. Now, those are three vastly different games, I know, but I've been boiling down the essence of what I like from each, and I'm trying to bind them together in a way that I find all kinds of cool. I have zero actual art, UI, sound or any actual resource beyond code. For now, I'm focusing on getting the mechanics of the game right, and paving a way for future development before dumping time, money and effort into anything else. I want to be sure that I have a solid basis to work on.

Once I do get to a place where I'm ready to work with art and sound, I will be contracting with others to ensure that things are top notch. I totally acknowledge my lack of artistic ability (save perhaps for a very basic approach to music, but it wouldn't fit this game), so I will be working with others to fulfill that end of the game.

Overall I can't wait to see where this goes. I don't expect much in the near term, but a solid project and the prospect of making something new and enjoyable excites me. More details to come down the road.




On Clean Slates
Posted on October 28, 2015 at 21:32

I have been working on a game side project for a little over a year now, on and off mostly. Whenever inspiration strikes, I fire up GM, hack on it for a while, and maybe try to hit some goal or make a playtest and send it out to a group of friends who provide feedback.

I totally scrapped it a week ago.

I realized I had written myself into a hole. The first thing I did with this game was plan out the mechanics — a complex set of rules that I figured would be captivating enough to make the game stand out. Damage type X is strong against character type Y; stat A influences the chances of hit on ability B; character Ω couldn't harm enemies who followed religion ϴ due to his history as a monk. The game was already too hardcore for itself, and it didn't even have real graphics yet.

When it got to the point that I just didn't want to work on the game for fear of not getting anywhere, I knew something had to give. It wasn't worth working on something I didn't enjoy, so why bother? I made a hard decision to just halt all progress on that file, and start completely anew. Taking a different approach with a different concept that kept to the spirit of what I originally wanted to create.

It took a while to come to the conclusion that I wanted to do this. The first thing I tried was completely gutting the game engine. That's actually how I ended up building gdash — I wanted to reinvent the codebase inside the existing game, replacing the code that had gotten out of hand with cleaner, more declarative code. Once it got to the point where I had totally gutted the ability for the game to run, I realized that I didn't even truly want to re-create the engine. Eventually, I realized that it was all going to be far too complicated to manage. Just too many variables. Literally.

I came to accept that what I really needed was a re-imagination of what I wanted the game to be. Once I came to that decision, I actually felt a pretty big load off of my shoulders, which is ridiculous, because I never had a deadline or even a real reason to make the game besides fun. Nothing I do for fun should weigh me down.

So here I am now, working on the new version of the game. Sure, the gameplay is immensely simplified, but I'd rather complete something simple and entertaining than slog through the building of something that I can't even be sure I can do. Here's hoping I get to post an announcement blog down the line.

~tg

See the the original post on my main blog




Whats Cooking
Posted on October 17, 2015 at 13:20

Update: Released gdash v1: gdash on github

I guess at this point I'm just helpless and can't stop writing frameworks for GM:S. Lots of people are migrating away from GM, and I get that, but there's something at the crossroads of nostalgia, comfort, and simplicity that I like about it still. I see myself working GM:S and making all these little scripts and plugins, and I just get excited. In theory, it is all in the name of helping myself develop a project I've been hacking with on-and-off for over a year. As of recently, I've resolved to totally gutting the engine I've written so far and rewriting it using some new patterns I've enjoyed working with. So, here's what I have made in the past couple of weeks.

gdash

I work with JavaScript every single day. My current job is JavaScript on the front end and the back end. That means I work with lodash to streamline data processing and manipulation. I realized that I could use a similar suite of tools in GM:S to streamline some of the operations I've been doing, and make working with data in GML easier. Some searching around found a couple of script libraries people have made, but nothing up to date and with the functionality and API that I would like. So, gdash.

This will probably be the first of the two libraries I will be open sourcing from this blog, as it has matured enough to a point where I think others may find it useful. Here's an example of it in action:

Code

// Get an array of all characters in the room belonging to the player who are alive

// Get alive player units
var __ownedByPlayer = _partial(__isOwnedBy, 'player');

var alivePlayerUnits = _filter(_filter(_collect(obj_par_character), __ownedByPlayer), _isAlive);

_free(__ownedByCurrentPlayer);


You're reading that right (hopefully) - partials in GML. How, you ask? Don't ask that. The way I made it work is fucking disgusting. Works like a charm, though. Just accept it.

Here, I'm doing something very functionally. Collect all obj_par_character instances into an array. Filter that array by a partial of the __isOwnedBy utility script from my game where we compare the owner to 'player'. Then, filter the result of that by ab __isAlive utility script that checks the HP of the units. The result is an array of all obj_par_character instances, owned by the player with a positive HP value.

I plan to add a chaining utility, so in the future, it might look more like:

Code

// Get an array of all characters in the room belonging to the player who are alive

// Get alive player units
var __ownedByPlayer = _partial(__isOwnedBy, 'player');
var __filterPlayerUnits = _partial(_filter, __ownedByPlayer);
var __filterIsAlive = _partial(_filter, _isAlive);

var alivePlayerUnits = _chain(_collect(obj_par_character), _filterPlayerUnits, _filterIsAlive);

_free(__ownedByCurrentPlayer);
_free(__filterPlayerUnits);
_free(__filterIsAlive);


You have to define more partials, but it reads left-to-right rather than inside out. Also notice that you need to free partials. That is because the system for partials makes use of data structures, and the _free utility is basically just a wrapper for freeing data structures.

Full list of gdash functions I have implemented so far:

Code

_contains, _length, _keys, _typeOf, _map, _isEqual, _reduce, _and, _times, _object, _destroy, _collect, _filter, _partial, _free, _spread, _run, _concat, _arrayOf, _uniq, _push, _find


A couple of callouts of my favorite stuff: _isEqual lets you safely compare any two values, deeply, including ds_lists and ds_maps. _spread lets you take a script and an array and run the script, passing the array as arguments:
Code

_spread(myScript, [1, 2, 3]) -> myScript(1, 2, 3)


_contains will let you check if any arbitrary collection contains an arbitrary value: arrays, maps, lists. _object() is a new paradigm I'm using to use native instances to hold data as maps rather than ds_maps because fuck ds_maps. _object() returns an instance, optionally labeled with a given type, so you can then use _collect() and _filter() to gather these instances at any time.

Polar

The second thing I'm working on is much, much more in beta than gdash. I'm calling it "polar", which is short for "path of least resistance". I wanted the acronym to have relevance to my multiplayer framework, Patchwire. Check that out if you haven't yet seen it.

Polar is inspired by the Flux Architecture, but spun in a way that it works for GML. I work with a flux style package all the time at work, and I have grown to really enjoy working with it. The general idea is that you call an action, which is effectively a function. That action goes out into the ether, then some object, generally called a 'store' will hear the action, react to it, update itself, then say 'hey yall, I'm updated'. Things in the application then change themselves based on the store's data.

For example (not an example of polar code):
Code

// Call an action:
setUserName('Michael'); 

// Meanwhile, in a store somewhere
onSetUserName: function(newName) {
  this.state.userName = newName;
  this.trigger(this,state);
}

// Then, somewhere in your application
onStoreUpdate: function(newStoreData) {
  console.log('Hello, ' + newStoreData.userName);
}


With Polar, I'm taking an approach that changes this slightly. Stores still exist as a way to centrally control shared data, but instances can define their own action handlers, which means that your game controller just has to fire some action, and all objects react in their specified way. Objects of similar type can register the same handler (just a script) in the event that you need things to all work the same. For example, if you had a healing spell in your game, you could fire a 'heal_units' action, then all units could say that when the 'heal_units' action is called, heal me for 10hp.

Actions handlers are all run in the context of the instance that registered them, so you get to write scripts as if they were natively on the object. Think of it as user defined actions on steroids. You get to define custom event handler code now. No need for 'user_defined10' to be some custom code. You just say "hey, you, when this action fires, WHENEVER it does, run this code to modify yourself."

Make them instances work for YOU, damnit!

With this all in place, the theory becomes that you can use Patchwire's action system to control the firing of your actions for Polar. You connect to the server, the server synchronizes actions across clients, the clients have actions fired, the objects know what to do in response to actions, and Bob is your game-synced, over-the-internet uncle.

Code

// User presses space
polar_net_action('fire')

// Some action handler
instance_create(0, 0, obj_bullet);


The "fire" is fired over the network via Patchwire, gets sync'd by the server, and sent out to all clients. They all then run the '"fire" action handler. Boomtown.

More on this all later. Still fleshing it out, but the core code works just dandy.

My fingers are tired. Let me know if you have any questions about what I said.

~tg




Make A Game Competition Results
Posted on October 11, 2015 at 14:45

Winner: The Name of the Demon





This game has a very interesting premise: angry demon kill shit. You play as a blobular demon who needs 9 people to say his name in order to get his powers back. I forget what the name of the demon is supposed to be, so I'm going to call him John. John the demon.



The first thing I did with John the Demon was die, as I do in most games. I saw a wizard, and assumed he was totally down with the idea of saying my name to destroy the world. Well, that wasn't totally the case, and I died for it. Luckily, I saved my game prior to that, which means that I found a big black phallic thing jutting out of the ground, walked up to it, and poked it. "Game Saved", it said, judgingly.

The good



NOTD let me get quick into the gameplay and kept me interested in exploring around. Although drab, it did have a lot of places to poke my little spikey-ball friend around.

The inventory UI is impressive in comparison to pretty much everything else. It is a nice old fashioned slots-are-squares-with-icons deal, and the on-hover tooltips for the items in the inventory were bangin'.

Combat forces you to be in danger, there wasn't totally a way for me to cheat the system as far as I could tell.

The bad



There's not much I can really hate on for this game, though. It looks like it was a relatively quick job, but not in a totally bad way. The graphics are fine for what it is - they take the route of the Limbo-knockoff style where everything is a shadow, but it works. Everything has a blur on it, though, which hurt my eyes a bit after some time playing it.

The other thing that stood out was that the writing was pretty riddled with typos. I'm not totally familiar with the game author, so it could be a second language thing - can't really blame someone for that for a 1-week competition.



Verdict



The Name of the Demon is my choice for winner of the Make a Game competition. Its a fun game, go play it, stop reading this shit.

Public Ridicule: Shoe Racer



Second place in this competition had a very clear prize attached to it: public shaming. If you sent in a game, and it got second place, I made it very clear that I will tear that shit apart. Hold on to your butts and get ready for the biggest waste of hard drive space you'll ever see: Shoe Racer.

The good



lol

The bad



When you first start up Shoe Racer, you are greeted with a screen ... well, it doesn't *tell* you that it is loading, it more *asks* you if it is loading:



If you manage to get past that screen without entering an existential crisis, you have to then deal with what is undoubtedly the worst thing ever pushed through a screen:



The FUCK am I supposed to tell how fast I am going? My goddamn speedometer goes from SLOW to FAST. "Do you have any idea how fast you were just going?" "No, sorry officer, I couldn't tell you because MY FUCKING SPEEDOMETER IS BINARY."

So after avoiding demon-sheep and running endlessly into other shoe-cars that are all on the same dirt path, I made it though one lap of the game. Then I looked up, and saw that I needed to complete FIVE MORE LAPS. Who am I, Jacob Swan?

(Jacob Swan is a random name I picked because I don't know any NASCAR drivers off the top of my head. Quick google search shows a twitter of some dude named Jacob Swan who has a horse race track as his twitter banner, so, lucked out I guess.)

All in all, Shoe Racer is a gobbled mess of a game that clearly doesn't understand the aerodynamics of pedial wear. Oh, and you can accidentally end up in the water under hills:



Verdict



10/10 would shoe again

(I didn't actually think this game was bad, just sticking to the rules of the competition)

Congrats to the winner, I'll be in touch. I might do this again sometime, but if I posted about it beforehand, it would defeat the purpose.

GG

~tg




The Make A Game Competition
Posted on September 18, 2015 at 14:49

Closed-ish. Games can be submitted until the results are posted, which is, to be in theme with the rest of this competition, at some point this coming week (week of 9/28). If you submit your game after 9/27, you aren't totally guaranteed to be in the results post, but might be... I dunno, I'm not your mother.




I'm hosting a competition now and its happening right here on 64digits and here are the rules

1. Make a game
2. Send it to my inbox
3. You have a week starting now (ends saturday the 26th at some point, fuck time zones just have your submission in by then)

Winner gets like $50 or something

Second place gets publicly shamed

I'm not fucking joking.

Go

~tg




Patchwire - Multiplayer Framework for Node.js and GML
Posted on September 05, 2015 at 22:27

(and well...any language really!)

As of writing this, I have officially released v0.1.0 of Patchwire, a multiplayer game server framework for Node.js, and a client framework for GameMaker: Studio

Patchwire was originally intended to be GM-only, but when writing the server software, I realized that it was pretty unassuming about the client side. It speaks in "commands" by way of JSON objects, meaning that the server and client just send chunks of data with a string identifier attached that alerts the other side about how to handle the data.

I've done so much typing already today writing out documentation and whatnot, so instead of explaining it all again here, I will just link out to the repositories.

I have labelled the current release as Version 0.1.0, and will be making my best efforts to follow strict semantic versioning. The API itself will remain intact and backwards-compatible until the first number bumps. The second number will bump when new features are added, and the third will bump for bugfixes and patches.

Patchwire's server framework can be installed via NPM, Node.js' package manager. The GML framework can be downloaded from github and imported into your game. You can find the repositories here:

Patchwire server framework

Patchwire GM gramework

If anyone has questions, let me know and I would be happy to answer. Feedback is also greatly appreciated as I continue to work on this and shape it out. If you make a game, however big or small using Patchwire, let me know! I'd love to see it in action. If you are working on a game with it and find any pain points or have a feaure request, be sure to open an issue on the github repository or contact me some other way.

I really hope this helps people out there who want to make online games but didn't want to deal with 39dll or figure out GameMaker's obscure networking functionality first hand. The aim here is to make it as easy as possible to write up a centralized game server.

Love and hugs

~tg

Update
In addition to the two repositories, I will be uploading a 3rd repository with a full example game (full being a very subjective word here). I'm working on the example now, which will include a server side and client side example, using Node as the server and GameMaker: Studio as the client.

For hype reasons, I was able to get a server running and client connected with 6 lines of code on the server and 2 lines of code in the client when using this framework. Awesome.




Simple GM Multiplayer Server Project
Posted on August 30, 2015 at 13:30

"Help how do I make a mmo?"

Here's how, dammit.

Pre-tl;dr: I've been writing a multiplayer networking server that doesn't require a DLL, extension or anything. Just GM:S. Uses Node.js for the server, and its all super simplified.

I wanted to post a blog about something I've been hacking at for the past couple of days that I'm pretty excited about.

The long and short of it is that I wanted a way to use Node.js to write a multiplayer server for Gamemaker, and I didn't find anything great to help with that, so I set out to write one, and it is coming out pretty fantastically.

Before I jump into more detail, let me just drop half of the readership here by saying this uses GameMaker: Studio specific stuff. So, sorry GM8 people. Upgrade, already. GM:S is real nice.

The system is based on a concept of sending and receiving "commands" which have arbitrary data attached to them. On both the server and client side, you define handlers for the commands. When a command is received on either end, the handlers for that command are called and passed the data associated with that command.

For example, you could say that when the player moves, you send the server a "movePlayer" command, and you pass along the X and Y position of the player. The server would see that it is receiving a "movePlayer" command, and could readin the new X and Y positions, then send those coordinates back out to the other players on the server by sending those players an "updatePlayerPosition" command with the data. Back and forth, sending and receiving commands and data.

Alright, lets jump into some code, here. Now, I haven't released this yet, it is still a WIP, but here is what using this engine currently looks like. First, we'll make a small server program using JavaScript in Node.js (JavaScript running on a server):

Code

var GMServer = require('gmserver/server');
var ClientManager = require('gmserver/clientManager');

var gameManager = new ClientManager();

gameManager.addCommandListener('register', function(client) {
  var playerId = Date.now().toString();
  client.set('playerId', playerId);

  client.send('register', {
    playerId: playerId
  });
});

gameManager.addCommandListener('chat', function(client, data) {
  gameManager.broadcast('chatMessage', data);
});

var server = new GMServer(function(client) {
  gameManager.addClient(client);
});

server.listen(3001, function() {
  console.info('Server is running');
});


This may look daunting if you don't know JavaScript very well, so I will break it down as best I can.

Code

var GMServer = require('gmserver/server');
var ClientManager = require('gmserver/clientManager');


These are just dependencies. We're pulling in the resources from my library.

Code

var gameManager = new ClientManager();

gameManager.addCommandListener('register', function(client) {
  var playerId = Date.now().toString();
  client.set('playerId', playerId);

  client.send('register', {
    playerId: playerId
  });
});

gameManager.addCommandListener('chat', function(client, data) {
  gameManager.broadcast('chatMessage', data);
});


We create a ClientManager object, which is an object that has a collection of Clients (players), and we tell it that when it receives a "register" command from a client, it should generate a player ID (here, I'm using the current timestamp), save that player ID to the client object, and send that player ID back over the network to the player's game.

We also add a 'chat' command listener, which takes in the data sent by the client and broadcasts that data to everyone in the gameManager. On the client side, we could listen for 'chat' and display the chat message.

Code

var server = new GMServer(function(client) {
  gameManager.addClient(client);
});


Here, we are creating an instance of the GMServer object, which is what actually creates the server itself. We pass in a callback function which puts clients into the gameManager we made above when they connect.

Code

server.listen(3001, function() {
  console.info('Server is running');
});


Finally, we tell the server to listen on port 3001, and display a message when it is ready. Keep this port in mind as we will need it for the game to be able to connect to the server.

Now, onto the GameMaker stuff. I have written a package of native GML scripts that you will be able to import into your project to work like native functions. No DLL, no extensions, just plain and simple GML. Let's assume those functions are already imported in our project.

In our game, we can make an object called obj_networking, and in it's create action, we put:

Code

// Initialize the networking library
net_init();

// Connect to our server
net_connect('YOUR-SERVER-IP', 3001);

// Add command handlers
net_cmd_add_handler('connected', handle_connected);
net_cmd_add_handler('register', handle_register);
net_cmd_add_handler('chat', handle_chat);


This is pretty simple, but lets break it down anyway. First, we call net_init() which sets up some stuff in the background. Then, we call net_connect() and pass in our server's IP and the port we are running the server on. Last, we add some command handlers (just like we did on the server) by calling net_cmd_add_handler() and passing in the command to listen for, and the name of the script to run when that command is received.

To make this work, we need to then add a Networking evet on the object (under 'Asynchronous') and add this code:

Code

net_cmd_resolve();


That's it. Really. That function call will take networking events and map them to the handlers we defined above. All that is left is to create the handler scripts, which are just like any other script, but their argument0 is the ID of a ds_map containing the information sent from the server. So, our handle_chat script might look like this:

Code

// net_cmd_read_data is just a wrapper for ds_map_find_value
show_message(net_cmd_read_data(argument0, 'chatMessage'));


Thats about all I can show for now. It is coming together very well, and I hope I'll be able to get it out the door soon enough. I'll definitely be posting on 64D first when I do. All of it will be open source, and again, there's no bullshit here - just some GML scripts you import to your game, and bam.

Let me know if anyone's interest is piqued here, and I'll be happy to answer questions about how it'll work. In the meantime, I'll be hacking on this and getting a demo up soon(tm).

~tg

Update
I have begun work on writing the documentation in full, and I have written the server software in a way that should be abstract enough that it can be used for any system, not just GM. I will still be writing and maintaining a GM client-side codebase for the system, as that is the intended purpose, but will be maintaining the server codebase separately as a generic multiplayer game server framework.

I'm mega-hype about this, yo.

Update 2
I'm pretty close to open-sourcing it. Just finishing up administrative work on the repositories and getting all of the documentation in-place. Added a bunch of tests to the server-side code and got everything in place there - just gotta get the GameMaker codebase up in a repo and get the documentation written for that. Aiming to get it launched tomorrow!




Recent Activity
 
Active Users (0)