This is Bananattack.

Resonance Rebirth

Posted by Overkill on November 30, 2008 at 6:20 pm under Uncategorized

So this week, I began working on Resonance for the first time in a long while!

So what did I accomplish? Read on!

Walk Cycles: Boy, I suck at animating

First thing I spent time looking into was trying to make some walk cycles. I struggled with a 4-frame walk cycle, but there’s a bunch of things off with it that still need to be fixed.

Here’s the sprite sheet with a walk frames:

I’m too embarrassed to show it off in motion right now because it looks really… odd. I think I need to up the frame count and stop using ping-pong style frame switching.

I might just start over, since it only took a couple hours.

Abilities: Take Two

I also started to give thoughts to another aspect of Resonance, the ability system.

Currently abilities in Resonance just don’t feel “fun”, and are sort of overcomplicated with the whole level-based-on-position-to-beacon. I decided that this need to be changed. I present my — I hesitate to say “new”, but — fresh ideas on ability management!

All abilities are on/off, not level scaled. This means that you don’t need to worry about a level 3 jump boost becoming a level 1 jump boost and trying to memorize what the hell the difference is.

It means that I actually KNOW where each ability’s useful range begins and ends. Right now, the level 4 power is given by a like 1/8 of the broadcast range, and level 3 by 1/4 broadcast, and level 2 by 1/2 broadcast, which is just horrendous to deal with level design wise, and also DEFINITELY not clear to the user where something starts and ends.

This also improves how I can present the information on the HUD, since now I can show a show a gauge that indicates your distance from a beacon, instead of an arbitrary “level” indicator. And when an ability is near the “fizzle-out” distance, I can display nifty warning effects.
Abilities are distributed over “channels”, and are received by “equipment”, where each beacon in the world has an assigned channel it broadcasts on, and each equipment piece has a channel/channels it “listens” to. So you have, say a Weapon, Armor and Shoes, which determine different aspects of your ability listening.

At first this seems like a complicated thing to introduce, but hear me out!
Abilities on the same channel can be mixed.

So let’s say an “Alpha” Pistol can pick up on all modifiers broadcasted to the Alpha channel.

So there’s a base power: shooting stuff. Overlayed on top of that are the abilities in that channel.

So say you bump into an Alpha beacon which broadcasts “Frenzy”, it will turn your weapon into an automatic. And another Alpha beacon elsewhere broadcasts “Electrify”, which will make your weapon shoot powerful shockwaves. Walk into a region that broadcasts both Frenzy and Electrify, and you get a machine gun with electrical rounds.

Meanwhile, a “Beta” Sword picks up on all modifiers broadcasted to the Beta channel. A beta Frenzy will give you a rapid slashing attack, which is different behaviour from the gun.

Perhaps your final Shoes pick up on every channel, then, you get a Alpha Double Jump, a Beta Sprint, and you can use either at the same time, since the equipment listens to both channels.
But there’s more! Channels can be jammed and “bad” broadcasts can be made.

So listening to only one channel with equipment has the disadvantage of jamming preventing any abilities on the channel going through.

Bad broadcasts are also possible, so equipment that listens to multiple channels is more vulnerable. So something like reducing visibilty on screen, or gradual damage to the equipment holder could be employed.

These are both mechanics the enemies (who I plan on describing more in a later post) can use.
New channels are found as you go on, so for starters, there might be two channels, but later you’ll get equipment that listens to far-out there channels.
Certain enemies can listen to channels for abilities too, so any ability (good or bad) is picked up by the enemy’s equipment that can listen to special “enemy” channels (which you get access to later). And later enemies could be able to listen to every channel, to introduce a challenge further on.

Abilities: The Tough Part

Okay, so I sort of lied, I made the system more “comprehensible” and simpler for level/game design.

This isn’t exactly making the game’s ability any system simpler codewise. It’s more complex in code.

So in summary the new immediate things to do:

  • Make beacons that are on/off by range
  • Channels are introduced — need to give them cooler names than greek letters
  • Beacons have a single assigned channel for their abilities
  • Equipment has a base ability, and a list of channels it can listen to
  • The equipment interprets how to apply each power received to its base skill, and (weapons especially) should smartly mix combinations of powers on a channel.
  • A HUD of some sort needs to be planned out
  • I need to make enemies
  • Those enemies need to use equipment + modifiers and employing jammers smartly somehow, and this means clever AI (eek?) or smart scenario planning.

That’s about it for now. Also a warm hello to Kael and Zaril, who also seem to be making sidescrollery things.

Tags: , , , ,

No comments (make one!)

Composting misspelled off-colour vegetables.

Posted by Overkill on November 16, 2008 at 9:40 pm under Uncategorized

People were right. I was pointlessly reinventing the wheel in an attempt to make something that nobody would’ve used anyway.

I discontinued Brockoly.

I was hitting major roadblocks, and redoing code that I didn’t really want to rewrite from the bottom up. I would never finish by myself in this lifetime.

However, I still assert that I learned a fair deal while suffering of Not-Invented-Here Syndrome. I learned how to write C++ code better, and how to do slightly-complicated software image blitting techniques. I also took a heavy inspection of ways to structure internal file formats like sprites, tilesets, and maps (which I am actually interested in — and what threw me into making my own engine to begin with).

But this madness stops.

From now on, this engine know-how should be invested smartly. I should be fixing things that are already out there. Things that just need improvement. Fix the wheel, don’t make a new one.

Verge is a great candidate for this. It’s already enough-to-make-games-with, just needs a push to make the whole ordeal of making a fully-fledged game a less tedious experience.

I think the internal engine stuff should be improved. And now let me go on about how.

Entities must have custom animation strands.

The .chr file format itself should allow animations to be scripted. This way you don’t need to write a custom animation system on top of Verge’s. This means that you can tell your hero to strike a victory pose without having to hardcode “F10W10F11W10B” and such in your engine — and it allows sprite editor to handle all sprite animation instead of HAVING to write out code for it.

Entities and Layers should be referrable by name.

So you don’t need to memorize index numbers. So now you can say in your script something like “Move Bob” instead of “Move Entity 34″, or “Change the rooftop transparency” instead of “Change the transparency of Layer 23″. It keeps you a lot more sane, and prevents scripting mistakes from creeping in.

Obstructions, Entities and Zones should be on each Layer.

Allow every layer on the map to have an obstruction channel, zone channel and entity channel. Instead of ONE obstruction layer, ONE zones layer, and so on. This, in turn, allows you to have bridges that you walk both above and below, without hacky tricks.

Maps need Waypoints.

Waypoints would be for a single spot on a map that have a name (constant lookup by name) and allow you to work it into your scripts quite easily. It would allow tile regions on a Layer to be referred to by name.

This is different from a zone, because Zones are for many spots on the map that all share the same events (constant lookup by (x, y) position).

Additionally, this single name to single position mapping means it’s ideal for pathfinding!
So say you have a water fountain, and you want your player to walk towards it. Currently, you need specify an exact path to walk to the fountain through a series of EntityMove(player, "X10Y11U10L10") like commands probably with a bunch of if statements and stuff.

Contrast this with just saying something like EntityMoveTo(player, "fountain"), which could pathfind automatically. It could be pretty quick about its search, and maybe have a restraint on distance to pathfind from, after which you could chain a bunch of Waypoints together and move from point to point.
Perhaps more interesting is, say, when you have a bunch of treasure chests on a map.

You can use zones for their activation on map, and waypoints for actually telling where the chest IS on the map, so you don’t hardcode positions.

So when you return to the map later, and need to set tiles for all the chests again, you can change the tiles at the waypoints! As opposed to needing to write coordinates in your map startup event, which gets messy quickly.

LuaVerge needs to be faster.

LuaVerge, the new twist on Verge, which has Lua instead of VergeC for scripting. Lua’s a language that I figure could replace VC at some point, because it’s much more expressive, and less restricted. LuaVerge has a lot of potential.

Sadly the potential that has gone sour by the fact that the LuaVerge is several magnitudes slower than the VC version right now. Surprisingly, the problem isn’t Lua, or its helper LuaBind. It’s our code that glues Lua into Verge. It was supposed to be fixed a long time ago, but I never figured out how to represent array-of-structure like things through LuaBind directly.

LuaVerge needs to play nice with packfiles.

Right now Lua scripts need to be outside of .vpk files, because otherwise they can’t be included by Lua. In short, this means people who release demos have to include source, which could be fun-ruining. Also I respect peoples’ desire to have their code stay private, just so nobody outright steals stuff.

This is probably a fairly easy fix, just make the Lua code use verge’s I/O stuff instead of the <stdio.h> library that comes with C. Kind of hairy though, since you need modify Lua itself.

I need write tutorials for vx.

So, vx (Verge eXtension) is my little code library that makes LuaVerge even nicer to use. The problem is, I need to write a tutorial on how to use it. Unexplained code means very few people are going to jump on it.

This brings me to my next point…

I need to entice people to switch over to LuaVerge.

Right now almost nobody uses LuaVerge, and I know that’s mostly because nobody has been encouraged or taught how to use it. So we need to get people interested in the newer Verge and to demonstrate how it’s better. Ey, ain’t that right, Kildorf, ustor?
Anyway, that’s a lot to think about. Hopefully I can redeem myself of my grand suckitude. School is murdering me, so I want my dev time to be useful and rewarding. That is all.

Tags: , , , , ,


I meant to hit the snooze button.

Posted by Overkill on November 5, 2008 at 11:02 pm under Uncategorized

Ahoy! This post was a delayed by two days on account of sleeping when I had planned to post for Gruedorf, and then having a midterm in some icky Differential Equations topics like Lyapunov functions.

Over the weekend, I revamped this website somewhat.

For starters, I changed the banner background to be less harsh. I removed the white glow at the top, and added in another layer of greenish shadow at the top.

I adjusted the sidebar to use fixed font sizes considering it’s a fixed sized box that, and something relative, like 0.6em could look ridiculous on certain browsers.

I got rid of the Trebuchet MS on the text. Instead, we have just plain ol’ Verdana (or sans-serif for fallback). It was sort of getting on my nerves with a few of the letter stylings it did. I figure a more common font might be nicer.

Secondly, I finally posted my old games to the site. Yes, most of the games I’ve worked on are now listed all-nice-like in the Games section of Bananattack (which you could also find on that big honking Games link).

Thirdly, I whipped up a JSON parser in about two nights. It needs to be more thoroughly tested, and it needs a name, which I normally don’t have difficulty with.

It’s a JSON parser for C++, and you know, all the unoriginal namings like “libjson” or “jsoncpp” or “json++” or “cjson” or whatever are already taken, so I can’t throw back to a shortcut. I need a unique name.

I temporarily called it “jsome”, which I guess means like JSON AWESOME EDITION. But that name annoys me, partially because I butchered the original acronym name and made it no longer an acronym. Also because starting with “j” immediately makes me think of a Java-based library, not C++.

I’m in a bit of a rut. Halp.

Oh, and I’m pleased to see that Glambourine isn’t dead, that Grue and Gayo got Sully fighty at long last, that Ustor promises good things in the near future, that Eldritch has some thoughts about character levelling, and that Kildorf drew a sexy, cushioned wooden chair. The rest of you need to stop losing, mmkay.

Tags: , ,

No comments (make one!)