Tag Info

Hot answers tagged

79

There are several reasons for that. I'm just gonna touch on a few: It makes your source code a mess. If you have a lot of dialog (trees), a huge part of your codebase is just text that has nothing to do with your actual game code. You'd need to recompile every time you change so much as a single character. The dialog itself is hard to navigate. I imagine ...


29

Putting game content data in code means that to see any potential change or iteration of that game content data, you have to recompile the game itself. This is bad for two reasons: Many languages that games are written in have long compile times. C++ is particular can be very bad in this respect, and C++ is a very common language for large commercial ...


13

std::vector is a fine way to store "dynamic" (as you call them) things like items, but the real benefit of the vector is not that the thing you are storing can change, but that the number of items in the vector can change without minimal effort on your part. To illustrate, were you to have store your Item objects as an array, you'd have to fix the size of ...


12

If you're not completely wedded to C#, then the "more standard" way of doing this is to use one of the many text adventure creation tools which already exist to help people make exactly this kind of game. These tools give you an already-functioning parser, handling for death, save/restore/undo, character interaction, and other similar standard bits of text ...


9

Did you search in the interactive fiction community? They still write parsers and some try to push the envelope by implementing new techniques such as natural language processing. See for example this link for articles describing approaches used: http://ifwiki.org/index.php/Past_raif_topics:_Development:_part_2#Parsing


9

You could build the entire game in JavaScript for sure. Be aware that the source-code will be visible to the user. So if you're concerned about cheating (probably a non-issue if it's just a single-player game), then you should have your game logic on the server. JavaScript and PHP is definitely going to work. If I were creating such a game, I would do the ...


8

The %attacker% approach can be extended to include some information other than just the names of the objects: The verb may be singular or plural. This depends on the subject. "You attack X" (singular 2nd person subject) vs. "Extrakun attacks X" (singular 3rd person subject) vs. "The goblins attack X" (plural 3rd person subject). Most verbs just need an -s ...


8

You could think of individual places as "rooms" with "doors" connecting them: To implement this, you could create a struct Room to hold a room, with fields for a set of items currently in it and what directions its exits lie in. Then simply keep an array of all rooms and have a pointer to the one the player is currently in. There are ways of getting ...


7

If you never return from functions, you may risk running out of stack space, but practically speaking it sounds like your case may be subject to tail call optimization. It's not an optimization I'd rely on, though; you may want to consider passing some concept of "current state" around or storing it, and letting a "main loop" (literally a loop in your ...


6

EDIT: After a comment by @ChristianIvicevic I felt compelled to reword my answer to emphasise that the Article link I provided is a far better alternative to using a system call as it is more secure and does not risk producing false positives with anti-virus software. Try and use this Microsoft solution: Performing Clear Screen (CLS) in a Console ...


6

Philipp's answer already shows the right direction. I just think the data structure is needlessly verbose. Shorter texts would be easier to write and read. Even if shorter texts would make the algorithm a bit more complex, that's worth doing, because you only write the algorithm once, but most of your time will be spent writing and maintaining the story. ...


6

As always, as always, it depends. But first, I would like to argue that hard coding is not bad by itself. I have hard coded content, specifically dialog text, in some simple games, and the world didn't end. We programmers love abstracting things, but remember that each layer of abstraction you make will make your program more complex and more difficult to ...


4

Instead of having a single string, and trying to substitute into it properly, you could have a whole set of them. Start with the objects. You know, when creating the mob, what to refer to it as. You can give it a specific property, separate from it's name, for substituting into attack strings. Weapons can have multiple strings for variety, and can substitute ...


4

There is a set of modules for Perl starting with Lingua::EN::Inflect that deals with these issues. Even if you're using a different language, the API choices made might help you frame your own design.


4

The common answer you'll get is "with components". There are lots of questions with that phrase in them that you can search through. In particular, here's a good article that has been linked to several times that's worth a read: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


4

That is the standard way of getting the time from C#. And using a BackgroundWorker I think is better than multi threading it in this particular scenario. Though I think the above comments are a bit confused as with most games, there is no waiting around for inputs its always updating. It will be hard to perform time based actions when you aren't using a ...


4

Most game loops I've encountered like to check an input state of some kind (not wait around for input, instead have it buffered). I'm assuming your making some game with the Command Prompt in C#. You'll probably want to buffer input via ReadLine() in a thread safe queue. You should then implement a more normal game loop in a separate thread that checks this ...


4

In my first-year at university we made an adventure game in Prolog, and for the user input we had to use definite clause grammar or DCG. See http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGCommandLanguage for an example of using it as a command language. It seemed like a principled (it was uni after all) and flexible approach at the time.


4

Rather than making a separate function for every combination of nouns and verbs, you should setup an architecture where there is one common interface that all the objects in the game implement. One approach off the top of my head would be to define an Entity object that all the specific objects in your game extend. Each Entity will have a table (whatever ...


4

This is a tricky question. It's possible to extract the text parsing functionality from one of a number of IF engines written in general-purpose programming languages (i.e. not something like Inform). Some possibilities might be Pyf, and the Aunt and Butler's engine. If you expand your search to muds you'll have an order of magnitude more choices (here are ...


4

Ok, let's go at this in a multi-stage fashion: Room representation Before we can do anything else, we need to consider how to represent the rooms internally. This is just a rough thumbnail sketch, refine as necessary: @interface TARoom : NSObject { NSDictionary *_links; // Contains neighbouring rooms. NSString *_identifier; // This will become ...


4

In case you ever need it in the future: For even more control of the display in consoles and cross platform support take a look at the ncurses library: https://en.wikipedia.org/wiki/Ncurses It is a bit of an overkill for just clearing the screen, though to my knowledge it is currently the only portable way, but it also allows for colors, menus etc. ...


4

Editline library (and GNU readline) works only with terminal capabilities. To use these libraries with your in-game console, you would first need to implement a terminal emulator (TTY). Instead (since doing that for a game would be crazy), I would recommend you to implement cursor movements and editing yourself. I once wrote a C++ class to handle this for ...


3

The term you want is 'natural language processing', or NLP. However, bear in mind that formal methods are designed to try and understand real world texts, whereas you only usually need something that works for a limited subset of your natural language. Typically you can start out with a simple grammar and vocabulary, then write a parser for it. A grammar ...


3

You can find a good list of commands in many places in the IF community. You could try downloading Inform 7, TADS 3, ADRIFT, QUEST, and so on and looking at their default commands. There's a less comprehensive list in this guide, http://inform7.com/if/anth/IntroductionToIF.pdf . Your second question is much less clear-cut. Some IF games successfully ...


3

When you watch a race, it unfolds sequentially, until by the end there is a history of that race that you could tell someone as a story. Some research like watching races with your buddies might show off what the most exciting parts are, or how the story tends to divide itself up. In the "race" part of the game, you could randomise a story like this, having ...


3

If you'd like to see what one approach to this looks like far down the evolutionary path, take a look at the MudOS parser. This is a complex, powerful mechanism for defining pattern-based parsing, meant to be able to intelligently route command handling for targets with multiple nouns and adjectives, and handle cases like put ITEM in CONTAINER vs. put on ...


3

Old MUDs and Talkers (mostly the talker code bases) would use an array of arrays of structs for keeping lookups only to possible alphabetic matches. This would be done with input[0].ToLowerInvarriant() - 'a' == the index of all the commands starting with the same letter... In C# however I would say just use a Dictionary. Their hashing routines for strings ...


3

Instead of distinguishing them by different names or colors you could give the player a variety of commands with the power to distinguish. For example, if "five goblins attack you", you could invent either numbered or named commands like - "attack first goblin" or - "attach goblin 1" This approach is almost like you already suggested, but instead of naming ...



Only top voted, non community-wiki answers of a minimum length are eligible