I wish to do a rogue-like game, but for any rogue-like game, it has to be fun, full of mythology and for it to ascend beyond the “Yet Another Fantasy Rogue-like”, it must be full of brilliant touches.
And I believe the SDMB has it.
I am volunteering to code a rogue-like using C#/SDL.NET (hopefully Mono is good enough) or even C++/Curses if anyone is interested in the project. Of course, to dedicate this to the cause of fighting ignorant, it will be open-source.
Anyone wishes to help out as a programmers? Designers?
I’ve always thought it would be nice to have a science fiction rogue-like. Of course, there is the Doom Rogue-like, but I was thinking in terms of one in which you could explore the surfaces of planets gathering resources like in StarFlight or the Ur-Quan Masters, but there would be explorable areas within those maps, like ancient ruins or crashed starships.
I was thinking of something more surreal other than the usual fantasy or science-fic setting.
How about the SDMB as the dungeon itself? Level 1-5 will be General Questions, and there is a town in the center called Cafe Society, and the next few levels will be In My Humble Opinions, followed by Mundane Things I must Share…
And the final few levels will be patterned after Great Debates and the BBQ Pits
After all those, you have to escort the Great Master Cecil to the General Questions level and you win!
Coding wise, I think it’s easier if I (or a group of people) come up with a framework and making it data-driven first.
I’d offer some coding assistance but to be honest I suspect that I wouldn’t be able to put in the effort that would be fair. Besides a Rogue-type is easy; I’ve coded them in less than twenty-four hours (not a very deep one, of course).
If you’ve never done this kind of project before I’d recommend doing a quick framework for creating levels, enemies, and player interface. After that things become simple since adding character types, treasures, new monsters, and so on becomes as easy as adding data to your existing objects. Balance will take a while to get down especially if you pile on the items, but that comes with the territory.
I wish you the best of luck! If you want some generalized advice feel free to ask and I’ll be happy to give you whatever crumbs I remember from a fifteen year old C toy I tossed together.
I’ve never actually looked at the code for Nethack, but I’ve always assumed that each object in the game must have a detailed record that includes not only a bunch of flagged states like blessed, degree of damage or rust, but even specifications like what happens to it if exposed to certain conditions, like getting a scroll of remove curse cast on it while confused. I don’t see how you’d put in that kind of complexity without creating a huge array of info for each item you pick up, unless instead you have a central ruleset for the object type and then just append the object with status tags only when it is different from the generic object of its kind.
When I did mine that’s how I treated it; essentially an exercise in OOP.
Hmm… maybe I should go into more detail. CrazyChop has probably worked out the basics of this already but it might be interesting for people who are mildly curious about the process. I’m going to make this pretty generic and anyone who has fiddled in computer game design can argue about these concepts for a while, but it might give some of you a better picture of how these things work.
There’s different layers (for lack of a better term) to think about with a game. The foundation of it all can be thought of as the engine. Input and output are handled at this level: how the user’s input gets to the program, how the program reacts on a basic level to that input, and how the results are handed back to the user. In Rogue-like terms this is typically where the commands will be implemented so that it handles me hitting “k” to kick, the routine that checks what happens when I kick, and displays the results of that kick.
The next layer in most modern games is the objects. It’s the most invisible layer to most users since it acts as the go between for the top and bottom. With a Rogue-like I’d say this is the most important section to get right, too.
This is what Johnny Angel was talking about. A way to think of it is as a way of formatting data so your brain doesn’t melt trying to keep things straight. With a player you’d bundle up their statistics, health, forty different kinds of status effects, and everything else into one convenient block of data. You’d do the same with classes, monsters, things you find laying around, traps, and so on.
This is important so that when you’re making your engine and you decide that if you kick a staircase you fall down it then you can add the fall routine to the kick and reference the existing objects to apply the effects (check the objects that the player is carrying to see if they’re flagged as breakable, for example). Do this layer well and becomes easy to create interesting emergent behavior in the lower layer rather than coding each special case for each item.
Finally over it all is the actual data. The monster stats, the class options, the items. This is what most people think of when they say “game design” but really it’s the easiest and simplest thing to manage. The only real complication in it besides spelling everything correctly is balancing the data so it’s a fair game. This is where you’d put in the terrible monster “OpalCat” and flag it as having the power to remove every third item in the player’s inventory. Or add a weapon called “a 1920’s Style Death-Ray” that does 1d2-1 damage and has 582 charges.
Yes, I am aiming for a “NetHack” style game where the devs think of everything. I guess this is where I need help with (such as a 1920-style Death Ray as a weapon, a Cooler in the Backyard as a monster, an obligatory “Hi Opal” reference)
The language I am most comfortable with is C# - I can code real fast with it, but really slow with C++ (pointers and memory management just give me OCD). Heck, I could even do Java.
One cool thing about using C# is that you can introduce C# code on the fly (that is, you use C# as a coding language)
The idea I have in mind is (warning: technical terms to follow)
A core framework for level rendering, entities, movement, inventory etc.
A second layer where the data for the game can be entered without recompiling (I am thinking of just a delimited text file). Each entry could be linked to a LUA/C# script
LUA/C# scripts for “The dev thought of everything!”
Essentially, for each object, we can have a 3D look-up table, with one key being the object being interacted with, the second being the action the player used on the object, and the third the name of the LUA/C# script to executed.
As for the length of the project, I guess we’ll just release build after build. I don’t think this could be done within a year or two.
Oops, the 5 minutes timer expire, so I literate down what I may need help with:
Game design and content - The SDMB has a rich culture and I don’t think I have managed to warp my head around it. The thing is it has to be consistent throughout - Orcs and Nazi Groundhogs don’t really mix
Random level generator
Interface - I am not sure if I want the archaic Nethack numerical interface. I would stick to a simple one for now, but I’ll keep it modular so that a better one could be put on.
Line of Sight/Darkness/Light - not sure if the game would need it but if it does, well, this is one thing I have never tried before.
The project would probably take months/years, but for now I will concentrate on the framework, and after we got a reasonably data-driven system out I guess we can all go wild with it.
If you want it just standard Nethack then this is simplicity itself.
Determine the number of rooms to generate. Presumably 4 < rooms < 10 but this is very tweakable.
Determine the position and size of your first room. If you’re using an absolute classic then you’re on a 80x20 grid. So you determine size first then then position in that grid.
Now make another room the same way. Presumably you don’t want overlap but allowing overlap can give you some interesting architecture. While you’re creating rooms determine if any of them have special properties (darkness, for example).
Make a connection path between the two rooms. When you define that you can define doors at the either end.
Repeat until you have enough rooms generated. Overlapping paths between rooms is not a bad thing since they make it feel more like a dungeon. And you might want to make another connection off a room a common special feature.
Place your up and down stairs.
Randomly distribute some treasure and initial monsters.
There’s a million and one variants on this and you can add layers and complexity to it. If I was doing another roguelike I wouldn’t use this logic myself since I’d be looking to create something with a bit more depth. Still it’s relatively simple math from that framework on.
What I have done on grids in the past is the simple brute force solution of checking an expanding area around the player. Where it intercepts a blocking object the view tracing stops. Since you’ll be dealing with a viewing radius then you shouldn’t overwhelm things too badly this way.
Darkness in most roguelikes is just a square condition where it blocks view. Light can be treated a number of squares to check away from the player. This results in a diamond pattern but if you really want to add a bit more there you can do a distance calculation.
I would be glad to include modern ideas into the rogue-like, rather just following the traditional one. I am thinking of having a generic 'u’se button (or even mouse click) and a menu pops up with the list of possible interactions.
Likewise, I think I be taking a break from the AD&D (or D&D) style and go for percentile and skill-based, and not having a full paper doll like helmet, necklace, rings etc. (perhaps just two hand slots for weapon/shield, one for armor and three for special accessories).
PS. I have downloaded the aforementioned library and it looks promising. The C# wrapper, unfortunately is out-dated; I may volunteer to take over the binding if I know how to do it…
Also, I need VS 2008 to run it. Fortunately I’m a student and eligible for DreamSpark. Hopefully by this weekend there’s 1 level of General Questions to run about in and some Sock Puppets for you guys to kill.
The “travel” command (underscore - I think - in telnet, mouseclick in other versions) tries to move you to a selected location; if the location is in an explored area you will take the shortest route there, if not you will auto-explore rooms and hallways in that direction until you encounter a monster, a closed door or otherwise get stuck.
The “rest” (.) command can be combined with a number (ie, 30. - or n30. if using numpad) to rest for that many turns unless interrupted.