Got bored, decided to write something for coding.doc, what do you think? diff -u ../doc/coding.doc ./coding.doc --- ../doc/coding.doc Tue Feb 6 15:24:02 1996 +++ ./coding.doc Wed Sep 10 23:25:27 1997 @@ -299,7 +299,115 @@ 3. Adding Features + 3.1. Adding Commands + + Adding commands to extend the CircleMUD world is extremely easy with a +basic set of utility functions already created. The first step is to decide +what you want your function to actually do. Once you've decided what you're +going to have it do, you'll need a unique command word to type that will be +used to invoke that function. When you pick a word (we'll use 'test' for this +example) you place it on a line as so in any existing CircleMUD .c file: + +ACMD(do_test) +{ +} + + These three simple lines are currently your entire command. The +first line allows access to four variables, only two of which we need to +be concerned with for this example. 'ch' is a pointer to the character +who has invoked this command whether it be a switched mob or a player +character. The other useful variable is 'argument', a string containing +whatever the character typed after the command. If the person types +'test this function' (don't worry about how we figured out test is this +function, we'll go over that in a bit) then the variable 'argument' has +" this function" in it, NOT "this function". + + Once we have the basic framework up, we need to actually do +something with this command. The most typical thing we need to do here is +to parse the arguments to figure out what they mean, assuming we have a +function such as 'give' that expects something else, some do not. To do +that, we havee a handy function called skip_spaces() which strips all +leading spaces from the string given. + +skip_spaces(&argument); + + Now that we have the argument, we want to split up the string into +something manageable. We do not have just one function for this, but three. +If we only care about the first space-delimited field, then we use: + +one_argument(argument, buf); + + or if we want two fields: + +two_arguments(argument, buf, buf2); + + to get more than that, we use half_chop(). That isn't covered +in this document but you can find an example on line 803 of act.wizard.c + + Now that we have what was typed in the CircleMUD buffers (buf, +buf1, buf2, or arg), we need to make sure there is something in there. + +if (!*buf) { + send_to_char("What should I do?\r\n", ch); + return; +} + + If there is nothing in the variable 'buf' then we print a message to +the character (ch) with the function send_to_char() and then exit. + + For this example, we're just going to take the first word that +the character types and send it back to them, saying hello. So far we have: + +ACMD(do_test) +{ + skip_spaces(&argument); + + one_argument(argument, buf); + + if (!*buf) { + send_to_char("What should I do?\r\n", ch); + return; + } + + /* Do stuff. */ +} + + To create the string, we're going to use sprintf() and think of +send_to_char() as a puts() to that person. So using the global buffers: + +sprintf(buf1, "Hello, %s. You typed %s!\r\n", GET_NAME(ch), buf); +send_to_char(buf1, ch); + + Notice the GET_NAME(ch), it is one of many helpful macros in utils.h +to access various information about a character. Then we send the string +to the character and we're done with the function! + + To actually let people access the command, we need to modify the +master command list found at about line 196 of interpreter.c. This is the +structure searched everytime someone types a command. Commands are +searched in such a way that if you were to put 'lookie' above 'look' in +the chart, you could never get to 'look' because the interpreter would +always find 'lookie' first because it is an abbreviation of 'look' that +the player typed. Here, find a good spot to add the command, between +teleport and thank looks good. + + { "teleport" , POS_DEAD , do_teleport , LVL_GOD, 0 }, + { "test" , POS_SLEEPING, do_test , LVL_IMMORT, 0 }, + { "thank" , POS_RESTING , do_action , 0, 0 }, + + The first entry is the name of the command. It does not have to +correspond with the name of the function although it is usually a good +idea. The POS_ entry means that we can only use this command if we are +asleep, resting, sitting, or standing, we cannot use it when incapaciated +or mortally wounded. Most immortal commands are set to POS_DEAD so that +they are always available. The third entry is the name of the function +you just added. The fourth entry contains the lowest level allowed to use +this command, here immortals. The last field is used to allow one +function to do many commands but it is normally not used and left at 0. +Now just add a prototype for your function in the huge block of them at +the top of interpreter.c and you have made a new command! + 3.2. Adding Socials 3.3. Adding Spells 3.4. Adding Skills -- George Greer - Me@Null.net | Genius may have its limitations, but stupidity http://www.van.ml.org/~greerga | is not thus handicapped. -- Elbert Hubbard +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST