3rd time lucky
Instead of socialising with mates down at a local winery like I should have been, I was feeling too antisocial so I spent most of yesterday investigating using db-je for duskz ... and pretty much ended up rewriting the whole codebase; resulting in a 3rd totally incompatible game. And I still have about a days work to get back to where I was before ...
In the end the changes are more minor than I thought they would be:
- I simplified items to 3 classes (from 7) - general items, wearable items, and training items;
- All items are now read-only in terms of the game;
- Items in the inventory or on the map are stored via a holder object which tracks wear and usage;
- I moved the 'read only'/prototypical information from 'actives' to 'race';
- Mobiles have their own race subclass but otherwise there's one big race table (so no demon players anymore, at least not with that name);
- Moved things like name/description out of the base object, but provided abstract methods for them. This way a player can have a unique db constraint on the name, but nothing else needs to;
- I toyed with using interfaces (and infact did in the end) but the interface is so big and messy I don't think it's really worth it. However having done it I can use it as a tool for cleaning it up since every function that is necessary is easier to see. Thinking I maybe fucked up a little with the Battle rejig.
These aren't very big changes in reality and i just turned them into much more work than was required. However, along the way I cleaned up a few things:
- Pared down the interfaces a bit - removing helper functions where they weren't really necessary. e.g. getArmourMod() now takes an argument for including boosted attributes rather than a separate method. I wanted to do more but that will be harder;
- Store the passwords properly, e.g. only use bcrypt. Based on code from this nice howto for bcrypt;
- Moved more internal data to 'private' and provided helpers which force correct usage. e.g. a check password function rather than access to the crypted password;
- Got to ditch all the i/o code, although I still need tools which work in human formats. Currently I have some tab-separated-file format for loading old game data but it would be nice to automate it (or automatically generate tools for it).
But the big benefits of dumping into a db are ...
- I/O code is much simpler and more reliable;
- Automatic contstraint checks ensure the validity of all data in the database. e.g. you can't have an item on the map or inventory which doesn't exist, and you can't delete it if used. You can't create a user with the same name (and accidentally overwrite the old one), etc.;
- Transactions! Just simplifies a bunch of stuff;
- Indexed access to every object.
I still need to have my own in-memory indices for some objects because db-je is only an i/o layer and doesn't manage java object instances but it is only needed in some cases (e.g. in-game live objects) and is thin anyway. Actually I don't necessarily need these; it may be something i look into in the future although scalability isn't really an issue ...
But today i'm having a day off and will go read a book outside or something (and have an AFD at that).