In the past month, I've been showing off the game to friends, sometimes in the browser, sometimes on my phone or my tablet. In that time, I've noticed a crash that seemed to happen just on the phone, and just when using the "Pass" command in combat, and not consistently.
I finally plugged my phone in to my development PC, and watched the error log. Sure enough, I was able to trigger the crash - I think I was just missing the "Pass" button, and the touch event was trying to move a character out of the world, which was recognized as incorrect by part of the code, but some other part of the code wasn't checking for an error condition.
Long story short (too late), there's a new build up on the site
Before I deployed that version, I took a party through all of the wilderness and all (almost all?) of Level 1 of the dungeons. At that point, the game exited, and there was a message in the logs:
07-22 21:22:08.547: D/playn(7089): onPause
07-22 21:22:08.547: I/playn(7089): notifyVisibilityChanged: 4
07-22 21:22:08.547: D/playn(7089): Pausing game loop
which doesn't look at all familiar to me.
So, there's still at least one lurking issue in the build, but it's more conceivable that you could actually play the game to completion now.
I spent a little bit of time tinkering with the map rendering, and I got it working on Android, so if you've been waiting to try the game on your phone or tablet, wait no longer - it's working again. I adjusted parts of the UI so that they look good on my tablet, or at least as good as the HTML and Java versions of the UI.
I still want to spend some time tinkering with the way that I lay out UI, to deal with different sized devices, and to deal with the different sizes that buttons need to be if you're clicking with a mouse versus a finger, and that different displays have different resolutions in pixels per inch.
Ok, I think I'm really done now. More or less.
I've fixed a few bugs and made other improvements:
- monsters now pick randomly from the adjacent targets to attack
- dead characters don't spawn into combat (whoops)
- random encounters for the cellar and dungeon levels
- easier encounters in the wilderness, harder encounters below
- tweaked the healing costs
- made encounters drop all the different inventory items in the game (woo, plate mail!)
- encounters reward gold, XP based on number of enemies
- added a cheat key to heal the current player in combat (press 'H'. Shhh!)
- rearrange some tile art
- created title screen (above)
- when you kill the rat king, trigger a win screen (below)
I think I want to also have one more cheat code in the game. I may or may not get it in, and if I do, I may or may not tell you about it. You can hunt through the sourcecode (once I post it), or you can just try well-known cheat codes in various parts of the game. Good luck!
Balancing the economy of the game is important. But that doesn't mean I'm going to to it in the next 26 hours. Above, you'll see a somewhat unfortunate party - Evro fell in the first battle, and Frodo managed to level up before dying, too. Lando continued on, and with the somewhat broken way that the experience and gold gets distributed, he managed to get strong enough to hold his own pretty easily. If he had died, the whole party would have respawned, which might have been a good thing. But they'd lose all their gold, so maybe not so good.
I decided to clear out all the fixed encounters, and I took out a bunch of random encounters, too. Eventually, I managed to scrounge enough gold to raise Evro from the dead, but by this point, Lando was level 35 - a huge gulf from Evro's level 1 stats.
Oh, and right now, raising Frodo is cost-prohibitive; a level 2 character costs twice as much as a level 1 character to raise. Hm, a while ago I played Spelunky
on the PC, which explored perma-death (and, of course, the various Roguelike
s had that as part of their design). If respawning is impractical, that's almost like perma-death.
This is the party stats screen. It's transparent, for no particularly good reason - I guess in some way, it feels like party stats are something you can look at without taking you "out of" where ever you are. For most of the rest of my screens, they're either an interface at a location (stores, healers), or they're interstitials between modes (end of combat, splash screen).
Here, you can see the experience and the level of each of your characters. It doesn't (currently) show the health or armor class, which would be handy.
And this is how you select your gear. I'm deliberately not doing the Diablo thing of having a player portrait that you drag items onto. There's a number of reasons, some of which are compelling, and some are less so.
- Quick and Dirty so I can get done by tomorrow night. This version takes somewhat less work to get working, I think.
- Dragging is poorly suited to touch devices. Maybe this is true. I could do a tap to select, and a tap to equip. Or, if items have a single location where they can be equipped, I could just tap. Maybe that's OK, something to consider.
- The classic Diablo interface is geared around an individual inventory, not a party inventory. All of the party's loot is owned collectively by the party, so you don't have to trade gear from one character to the next. This means I can't do encumbrance, but bleh, I don't want to do encumbrance. I imagine I could build an interface where the party inventory is clearly communicated, so people wouldn't get confused.
- The classic Diablo interface gets ponderous with lots of similar stuff. You could stack potions, but when you have a dozen rusty swords in your backpack, it begins to get boring.
- The Diablo interface has been done before. By, amongst others, Diablo. I wanted to try something a little different. I'm not entirely sold on this design - the only way to view your inventory is to cycle through objects.
- The Diablo interface isn't well suited to small screens. Maybe. This interface has really big buttons, which should make it suitable for big fingers. I suspect this could also be designed around. You know, once I get the Android build working again.
One thing that's not obvious is that I've added in a cheat code. In the shop, if you type in "funds", you get money. Try it. Only works on platforms with keyboards, but then again, Android is the one platform that I can think of that doesn't have a keyboard, and that's still not working.
Some stuff to get done, in no particular order:
- populate the dungeon levels - There's a single encounter down at the bottom of the caves, but there should be wandering monsters, and probably some fixed encounters.
- change the wilderness encounters - maybe the wilderness should have rats and mice, while the dungeons have rat men.
- adjust the drops - the experience and gold drops are poorly balanced.
- revisit weapons and armor (again) - I jammed in some weapons and armor as an enum, but I think it should be more data-driven, probably loaded from a JSON data file.
- revisit store interface - right now, stores can only reasonably display 4 items. By rearranging things, there should be more stuff that fits on screen, and if I add in pagination, even more.
- enforce class restrictions on weapons, armor - your mage wants to wield a sword and plate mail? Hm, have fun for now, I'll be fixing that at some point.
- get ranged weapons working - I've got bows in the game, but they operate no differently from maces, staffs, or swords.
- get spells working - your mage wants to do something after I removed most of the weapons and armor in the game from his reach? Healing, magic missile, and chain lightning ought to sweeten the deal. Also, summoning a dragon might be fun. Tanglefoot, Charm Person - the list goes on.
- revisit the art - As much as I like stick figures (Hello, RISUS, Order of the Stick), every bit of art in this game needs to be reconsidered. Maybe I'll keep the stick figures, but it'd be neat if your marker actually showed what sort of weapon you were carrying. Oh, and maybe more character configuration than that, like hair color.
- fix the Android build - by which I think I mostly mean the following point. But the Android build hasn't been working for a week, so it may not feel right, and I suspect that at least some of my dialog boxes won't display right on an Android screen.
- store progress - write to disk, or to cookie storage, or to server-based storage, as dictated by the specific platform.
- rework the map renderer to only have visible (or soon-to-be-visible) tiles fully realized - I've built tiled map displays before (e.g. Infection Wars, Game Project 150 - SailN, Cars With Guns (SDL, PyGame), Cars With Guns (PlayN) ), and it's not a difficult thing to create an image with the composited tiles assembled in place, which gets rendered in one go. For whatever reason, I didn't do that with this implementation - maybe the hex grid got me worried about how to handle edges. So, I just make images for every tile, and put them together into one big group, and move that around to get scrolling. The unfortunate thing is that all those tiles seem to eat into the texture memory on the Android, causing it to crash. This seems like a pretty high priority task, almost as high as...
- call it good, and go outside and play - right now, none of the above are keeping me from saying that I made a playable RPG in a month. And I'm on vacation now, so I should take advantage of the pleasant weather while I can. As I've said before, I'm not planning on stopping all development at the end of June, but I am planning to take a breath and choose elements to really give a good treatment to. But having a skeleton to build from feels good.
What you see here is a working interface for a shop. You can buy stuff from the shop, and sell it back, and quickly go bankrupt, because the shop takes a healthy slice out of every round trip. That's what we call "simulation".
When you buy and sell, it's actually moving items in and out of the party inventory, and encounters now actually drop stuff, so I've got a working economy in place, more or less.
Small improvements for this screen: display the party cash, and indicate when an item is too expensive for the party's budget.
Next up: equipping the party members. Also: party stats screen.
The layout of that screen notwithstanding, it's a usable interface for going to the healer and healing individuals in the party. It'll cost 40 to heal Evro, and 30 to heal Lando, so who do you choose? If it helps, Lando's got a bow, and Evro has a staff. But I still don't have ranged attacks working, so what are the stats for a bow? d6 damage? I forget. I think the archer has more hit points to begin with, so maybe it makes sense to heal Lando now, and keep Evro in the back rows until I can save another 20 gold to heal him, too.
The frustrating bit about this screen is that it was nearly working for quite a while, but for some reason, it was reporting that all of my guys were at full health. I stuck some breakpoints in, and sure enough, they were all fully healthy. I added some logging on the way out of combat, and they were definitely taking damage out of the combat. I added some logging so that I could check the party status while wandering through the wilderness, and sure enough, they still had the damage from the previous combat. (Note to self: add in a stats screen already.)
Turns out, my first dorky pass (even more slipshod than the above screen) healed you automatically when you landed on the healer location. I hadn't taken that out, and what do you know, by the time the interface was waiting for input, yes, everybody was fully healed, just like I had specified.
Another frustrating bit was that my characters kept leveling up, and you get full hit points when you level up, so it makes it that much harder to test the healer's behavior.
Next up: stores and inventory. These both have to do with inventory items, which need to be revisited. Characters have a notion of armor and a weapon, but that's not really tied to inventory, which it really could be. One screen to select a character to equip, one screen to equip that character's gear, one screen to buy gear, one screen to sell gear. Maybe a confirmation screen. Not hard, but they'll be, at best, functional screens. Not pretty.
But if I can get those two things done in the next 3 days (should be easy, right?), I'll have a pretty reasonable checklist of features of a bare-bones RPG. I might even play around with content and redistribute the monsters so that the wilderness of the island is appropriate for 1st level characters, and the tunnels are better suited for, say, level 3, and the rat king is suitable for level 5. Somethng like that. Man, that sounds like real design work. Dig me.
I've been kicking around names for this project, and I had been amused with calling it "Castle of the Undead Naga King" or some such, but there are no naga (nagas?) in the game yet, so maybe I'll hold on to that idea for later.
Instead, I think "Caves of the Rat King" or "Tunnels of the Mad Rat King" fit better. I'll need to see what fits well in the Android app menu on my tablet to see how much space I have.
I spent a tiny bit of time this morning trying to figure out where the appname and icons were specified, and I didn't see anything, but I know I've seen it before, in some XML file.
For being random encounters, they're pretty rigidly defined.
I've added a field to my map file format to indicate the frequency of random encounters. Or, if you prefer, "wandering monsters". Each time you move a hex on the island map now, there's a 1/10 chance of triggering a fight with 2 rat men.
One of the next things to put in is some facility for healing. Also, some facility for looking at the party's stats.
I'm about to call it quits for the day, but I put together a "sand" combat map, which has a little different feel from the "grass" combat map. There's also a "cave" combat map, but you have to find that one yourself.
Now the Android build is not even starting. Adding extra maps isn't helping things.