00:00
00:00
Xzontar

Male

Freelance Programmer

Joined on 6/25/08

Level:
9
Exp Points:
804 / 900
Exp Rank:
81,305
Vote Power:
5.12 votes
Rank:
Civilian
Global Rank:
> 100,000
Blams:
0
Saves:
8
B/P Bonus:
0%
Whistle:
Normal
Medals:
13

Xzontar's News

Posted by Xzontar - December 19th, 2023


Alpha Release

Welp, it is technically before Christmas so does releasing an alpha count? The game is in a fully playable state so I am going ahead and making it public with the hope of getting some feedback. Whether this feedback involves suggestions, criticism, bug reports, or crash reports, I would love to hear anything anyone has to say!


What's New?

A lot! The game is playable now, so that's something! I ended up going ahead with implementing more than just the 2 power-ups I was initially planning on for this first release. I added 6 power-ups so far and will likely add 2 more down the line.


While play-testing with some family they revealed a lot of "what does this do?" and "what is that?" problems. For some items (such as the spinning plates) a simple graphic redesign was plenty to address the problem. For the rest I ended up adding a help-page with clickable elements so people can see what each item or command does.

iu_1132179_2482287.png


I had planned on adding a Single-player series of maps (with very primitive AI) that introduced you to each mechanic but I just didn't have enough time. I will likely still add this in later on, but for now this help section is plenty to get people started.


Once I had all the items implemented I went ahead and designed 6 maps! 3 of them are taken from the classic Robostrike game and 3 of them are originals. While implementing these I cannot express enough how tempting it was to try implementing a level editor. Due to every map tile being represented by a single number (with each property being a bitwised-together value) you can imagine that designing these suckers was hell. Since each tile can hold 3ish layers of data (two of which can have rotation data as well) all in one number, each cell would have a fairly lengthy chain of numbers being added together and it made my brain hurt on several occasions.


Problems I Had

Everything was pretty much smooth sailing, to be honest, but I came across three primary problems in this last session. The first is that of scaling pixel art and something I completely spaced on. I designed the window and elements to be a good size for scaling up the pixel art on people's monitors but what completely slipped my mind was the scaling of arena graphics within the game itself. Since arena sizes can span from 4x4 to 16x16, the game attempt to scale them up in the view when possible.


By the time I realized this, I somewhat designed myself into a corner. I haven't found a good solution for the problem, but for now I have two view modes that the player can choose; "Stretched" which will simply stretch the arena up as much as possible while keeping the aspect ratio and "Native" which will scale up the arena to the nearest whole number that fits on screen. If this size is pretty close to using all the space, the render will default to it. If not, it defaults to the stretched mode. It works pretty good, but there are some arena sizes that just suck in that they would be WAY too small at native resolution and look god-awful with the stretched mode, as you can see here:

iu_1132180_2482287.png


I thought about limiting arena dimensions to better scale but in the end I stuck with the view mode and may just have to deal with the pixelation. This is a hobby project, after all.


The second problem I had was in nailing out the animation timing client-side. When the server processes movement, I use an animation structure that stores potential player animations in 'layers'. Basically, I can queue 'move from cell A to cell B' for a player and it adds it to the layer. Once there is a collision where a player attempts to assign another animation, the layer is stored and a new layer is created. This works extremely well when combining player movement with pushing obstacles and treadmills because, if a player gets pushed by a dozen items, it will auto-pause all other players until all the player's pushing is done and I don't have to think about triggering 'waits' when calculating interactions. It also lets me know how long the server should wait for the clients before starting the next turn because it can just count the number of animation layers generated.


The problem came with firing weapons and activating the 'hit flash' of other players. I initially had this timed by the server but I came across the issue of moving players that got hit due to moving players queuing an animation for the tank treads. This means queuing ANOTHER animation (that of being hit) would force a whole new animation layer to generate. In short, this would mean you would have "Player 1 shoots at Player 2" combined with "Player 2 is moving", all this would finish animating, and then the 'hit flash' would play (after the shot effect was already long gone). Combine this with power-ups that deal damage at different stages of a command and I was pulling my hair out over this for a long while.


In the end, I ended up deferring the damage animation queuing to the clients instead of the server. It was still a bit of a challenge because the server only tells the clients 1) 'you were damaged' and 2) 'these players fired weapons'. I had to use some context-awareness of player animation states to figure out if a bomb or laser caused damage, or if an arena obstacle caused damage and play / delay the animation accordingly.


The last problem was simply with the GX.Games export in GameMaker giving me too much trouble with the project. The keyboard_string is completely broken, making chatting practically impossible. I couldn't get my Javascript extensions to work correctly with it (which is required for Newgrounds account support), and the game would fail to load if I had any included files (which I require for language data look-ups). The last two issues could be worked around, but without proper keyboard_string support I just wasn't willing to put in the time. Once that issue is addressed then I'll consider uploading to GX.Games but, for now, Newgrounds is where it is hosted since I can use the HTML5 export.


That's All Folks!

A bit of a short update but that is because I just want to get this out and focus on Christmas / New Years for the next couple weeks. I'll be monitoring things a bit in case there are some issues with the server (very likely) or breaking bugs that are discovered, but other than that I'm taking a bit of a break from the project until after the holidays.


If you want to play, I'd love to hear feedback! Grab a friend or family member and try blowing each-other up for Christmas!



Tags:

1

Posted by Xzontar - December 7th, 2023


New Game-play Stuffs

Indeed, there has been progress! Since the last update I have implemented all base game mechanics with the exception of power-ups, of which I will likely only have two before release (bombs and shields).


This means I have now added a proper turn timer, tank boosting (for jumping over pits, through lasers, over treads, etc), treads of 1x and 2x speed, 1x, 2x, and 3x lasers. Things went fairly smoothly, with the exception of some movement rewriting for the boost mechanic. My movement and animation code was really only designed for single-cell movement and just wasn't playing nicely with boost initially (which allows up to 5-cell movement). I took the opportunity to refactor and better modularize the movement code so it could be used for boosts, regular movement, and now all the arena movement stuff. This made me cry tears of joy as I was dreading implementing the double-movement treadmills (that can also apply rotation and pushing effects).


While we aren't there yet, there is now a bit more to the maps. I took a classic Robostrike map and re-made it for testing (minus the power-ups). Due to my tread auto-tiling, however, it doesn't look exactly the same:

iu_1126179_2482287.png

(Don't mind the goofy icon in the disabled command button).


Lobby Stuffs

I lot of my time has actually been spent on making the lobby system functional at a very basic level. First, I needed to add map previews for when people clicked on a room. This was fairly simple as I simply have the server send a copy of the map data to the client upon click if there isn't a cached version available. It will then cache it then generate a preview to display for that map index.


I also needed to add a 'ready' system so players could come-and-go and the match wouldn't start until the players were all-in. The trigger is implemented, and the text console updates when people hit 'ready'. I will need to add a better visualization of who is ready to the sidebar down the line.


Lastly, I needed to add a way to select your map when creating a room. For the time being I have added all the information to the right-side panel as you can see here:


iu_1126178_2482287.png


However, once there are more game-modes and other tweakable settings I will expand this setup screen to a full-screen affair. This will be changed quite a bit down the road, however, once I need more than just FFA and Team death match game modes.


Victory Screen

At the moment there isn't much reason to wipe the floor with someone other than bragging rites. Still, I wanted to help with the taunting so I added very basic "Awards". At match end it will congratulate the winners (or taunt you if everyone died) and list any awards earned by players for that match. Currently implemented awards are:


  • First Kill
  • Most Useless
  • Most Vicious
  • Most Deadly
  • Most Valuable


I have more planned, such as "Most Reckless", the "Goofy Award" (aka., stupidest suicide) and a couple more for other game modes.


What's Next?

Next on the docket will be adding power-ups and then designing 6 initial maps. Once this is done I need to head back to the animation system and look through it as I noticed some odd situations client-side where the clients got to the correct locations, but how they got there was janky. This mostly involved complex movements, so things like boosting onto a spinner, then backing onto a treadmill that pushes and rotates you into someone. Should be fun to debug :'(


Once this is done, I'll be doing some more thorough debugging, testing all cases, implementing better server-side sanitization I've been slacking on, and doing some stress-tests on a test server to see how well my code handles lots of players. My goal is to be able to support 100 concurrent players easily, albeit I doubt I will ever get even remotely near that in actuality.


Once everything is running smoothly work will begin on finalizing graphics, creating sound effects, music, and then basic API login (only for user name support initially).


Can I get this done in time for Christmas? Whoo-boy, I sure hope so, assuming things go smoothly. But this is game dev, and things rarely ever go smoothly so we'll see.


That's it for this one! Ciao!


Tags:

Posted by Xzontar - November 28th, 2023


Intro Stuffs

Okay, does anyone other than me remember the old flash game called Robostike? It was a multiplayer robot-arena combat game between 2 to 6 people where the goal was to kill all the other players in an arena full of deadly traps and obstacles. The challenge was that each player would submit 6 commands and then everyone's tank would execute them at once and you would have to try to predict what other players' moves were and how they would affect your tank mid-command.


It was hard, took lots of strategy, and was a complete blast to play. Alas, it was taken down, what, 10 years ago? I don't even remember; and their 'new version coming soon' website has also since disappeared. So, I finally said "Screw it! I'm remaking it myself!" And here we are.


General Visual Style

I'm a programmer, not an artist, so the visuals are going to be pretty simplistic but this is what I've got so far. A lot of it is temporary or will have a proper color pallet change before release. These were whipped up to give an idea while I was designing things and laying everything out.


iu_1121755_2482287.jpg

iu_1121756_2482287.png


What I Have So Far

I've been working on this in my very limited spare time for the last 2-ish weeks. I have finally gotten all the primary engine logic for the server and client completed which means from here on out it is just building up.


I have a very basic lobby system for chatting, creating, and joining rooms. In regards to game-play, I have player-to-player interactions, pushers, rotating tiles, pit-falls, guns, and bombs implemented. Getting killed will throw you into 'spectator mode' and that's about it. No fluff so far.


A real challenge was implementing the movement logic due to every player's action needing to be executed at the 'same time' and with equal priority. An example would be trying to move forward when there is a player in the way. Is that player moving out of the way at the same time? Are they stationary? Are they trying to move but hitting something themselves? What if the thing they are hitting moves as well? Maybe someone is shooting them and they get destroyed that move? Does an arena hazard push them out of the way first?


Trying to figure out how to handle these collisions with a large number of complex situations (especially when you can have 6 players interacting with each-other) was the biggest challenge. I ended up creating a 'processing layer' system for collisions where it would take all the players and record all their predicted positions w/o collisions. It then would check for situations where these predictions overlapped and then it would work backwards until the issue was solved. Repeat until all unit moves are covered. This entire loop would itself be layered to handle player movement, followed by movement caused by the arena itself until the 'arena's turn' was exhausted.


There are only a few cases where one player might lose out, such as if two players try moving into the same square at the same time. In this case I simply prioritize the player who submitted their commands first.


What's Left?

In short, a lot. However, for a basic level of game-play I think I'll be able to get something going within a few weeks. To get a functional playable state at the most barebones level, I still need to implement a turn timer, the 'tank boost' move, treadmills, 2x treadmills, 1x, 2x, and 3x wall lasers, and at least 1 item pickup type.


As the base system is all in place, building these elements up won't take very long to add, though, and most of the work is the client-side visual representation. Once these are all in place I will likely design a half-dozen maps to start.


The GUI and lobby interface is also very incomplete. Setting room details such as room name, map selection, and game-play mode are completely missing as of now. API work is also nonexistent at the moment but I plan on adding support for Newgrounds and GX.Games at the very least. That is still quite a ways off, however.


What's Planned?

While nothing is set in stone and I may drop things depending on how this project goes, I have a lot of bits planned. My goal is to get a base-level game with a simple free-for-all game-mode and 6 maps released to the public before Christmas.


For the future I will want to expand on the game-play a lot. I want to add a team death-match mode, and a puzzle / challenge mode. A big part of this will involve creating a level-editor for players to use and create their own maps. The scope of map sharing has not been decided yet, however, and I do not know if I will create a database for all this or just have it locally stored and shared for individual matches.


In terms of accounts I want to have achievements and ranked matches to give players a goal and reason to play. I already have the systems planned out in my head and the primary challenge will be linking the data to existing Newgrounds / GX.Games accounts. I have worked with achievements with Newgrounds but I have yet do do anything with GX.Games API and am uncertain as to its flexibility. Worst-case scenario I will write my own system and have peoples' accounts tie into it, which is likely going to be necessary anyway for the ranking system.


Can I Play It?

Not yet. The goal is to have something public before Christmas. I will upload something once the game is available but the timing could change. This is an 'in my spare-time' project and I don't have a lot of that at the moment.


Conclusion

I'm excited to get this game out there simply because I loved the original Robostrike so much. Even if not a single other person pays this mind, being able to play with my own family and just feeling the accomplishment of making this sucker is enough for me.


Anywhoo, thanks for reading this far, I'll likely post again whenever I feel I've made another significant milestone.


Tags:

1

Posted by Xzontar - July 13th, 2020


Welp. Starting from square one so this is mostly a note to myself! Hi, myself.


Joined Newgrounds as a wee lad and I wanted to see where it was at in good-ol 2020. Lots of nostalgia. I make games now; or, rather, pieces of games. I'd LIKE to start making more full games, though, and I'd like to start distributing them on multiple sites so I guess I'll go ahead and do it here as well!


Not sure how active I'll be on here. Totally depends on how much attention my stuff gets, if any. Onward!


1