I am creating a room programming system for AntaresMUD. Here is the design document. I am soliciting ideas, suggestions or constructive criticism. The source will be posted to the circle ftp site when it is completed. Please no flames on modeling it after BASIC.. I needed simple.. So it could be finished in this lifetime :-) Design Requirements: Interpreted language for rooms (and later mobs and objs) that would be flexible, simple to learn (and debug), and as fast as possible. This system must allow online entry via OLC.. and dynamic program replacement, so a reboot will not be required. Also a means of reporting syntax errors at the time of entry will be included. Room Program Types: ENTER -- Fires every time a mob or PC enters the room LEAVE -- Fires every time a mob or PC leaves the room TIME -- Fires every time_tick (every second) SPEECH -- Fires whenever something is said in the room (must be a public command: say, talk, shout, lsay, ltalk) Program Structure Keywords IF - The standard decision support. Can test for equality THEN '=', greater than '>', less than '<' or not equal '!' ELSE ENDIF -- examples -- (boolean) IF QBIT(CAUSER, 1) = TRUE THEN (greater) IF CHARS[CAUSER].MaxHit > 25 THEN (equal) IF CHARS[CAUSER].Level = 4 THEN (Not equal) IF CHARS[CAUSER].MaxHit ! CHARS[CAUSER].CURR_HP THEN FOR I = ? to ? - Used primarily to step through a list of people EXIT to do some nasty effect to them.. or just move NEXT them around..or step through a list of items to damage them *grin* INTERVAL - Used to set how often the program runs. (one second granularity) The first line of a TIME proram must be: INTERVAL <val> Val must be in the range of 1-99. This is the number of seconds between 'runs'. NOTE: Setting the number too low will probably waste more CPU cycles than the rest of your programs combined.. Set it as high as possible, while still allowing your program to do what you intend. Don't use this for repopping items.. Wait for the zone programs. RETURN - Done.. End the program. Not required at the end of the program. RESTART - Clear all local vars and start at the top. RUN - End this program, and Run another room's room program. CALL - Run another room's room program, then restart this program when it finishes (this will clear local vars) (I know .. it's lame.. but it will fill the bill.. Plenty of ABITS .. and they are cheap.. at one bit each ) Commands OBJ - Create an object on the ground. MOB - Create a mob. OBJTOPC - Create an object and give to PC X OBJTOMOB - Create an object and give to Mob X OBJEQ - Create an object and make Mob X wear it. OBJREM - Remove an Object from a player or the ground. MOBREM - Remove a mob from the game. KILLPC - Kill a Player (DT) MOVE - Move a mob or player to room x. (RNUM) FORCE - Send a command, as the MOB/PC.. (This command is used to 'make the game think the player typed something' e.g. FORCE CAUSER "LOOK" With creative use of this and timed events, the mud can do a good bit of the work for us.. SET - Used to change information in the ABIT, QBIT and the rest of the data structures. e.g. SET CHARS[CAUSER].MAXHIT +=100 (C style +=, -= is only supported in the SET command) (Set cannot be used to change the value of the index variable (I%). Only a for/next loop modifies the value of I%) CVTRV - Convert Real Number to Virtual number RNUM->VNUM CVTVR - Convert Virtual Number to Real number RNUM<-VNUM SPRINT - Build a string from text and character/player info -- example -- SET A$ = CHARS[CAUSER].name SPRINT H$, "Your name is A$") ECHOPC CAUSER H$ ECHO - Send a string to all chars in the room. (A$-H$) ECHOXMOBS - Send a string to everyone in the room except mobs. ECHOXPCS - Send a string to eveyone in the room except Players. ECHOBUTM - Send a string to everyone except mob X ECHOBUTP - Send a string to everyone except player X ECHOMOB - Send a string to a particular MOB in the room. Handy to fire a mob's speech program.. Basic method for room->mob interaction. ECHOPC - Send a string to a particular Player in the room. INFO - Send a string to the INFO channel. Constants: TIME - The current time (0 - 28) THISROOM - The number of the room.. Used for ROOM[] structure. (rnum) NUMCHAR - The number of players in the room. NUMMOB - The number of mobs in the room PCCAUSED - A PC caused the event.. True/False CAUSER - The number in the list of the mob/PC that caused the event. NUMPOBJS - The number of objects the event causer has in inventory. NUMEOBJS - The number of objects the event causer is wearing. LANGUAGE - If this is a SPEECH program this will contain the language used, otherwise it will contain -1. Data Structures: MOBS[] A list of the mobs in the room. .NAME -- (RO) Mob's short description .VNUM -- (RO) Mob's vnum .MAXHIT -- (RO) Mob's max HP .MAXMANA -- (RO) Mob's Max Mana .MAXMOVE -- (RO) Mob's Max Move .HIT -- (RW) Mob's current HP .MANA -- (RW) Mob's Current Mana .MOVE -- (RW) Mob's Current Move .DEFPOS -- (RO) Mob's Default Position (standing, etc) .POS -- (RW) Mob's Current Position (standing, etc) .FIGHTING -- (RW) True/False (setting to true will not do anything) .LEVEL -- (RO) Mob's Level CHAR[] A list of all players in the room. .NAME -- (RO) PC's Name (short desc if it's on) .CNUM -- (RO) PC's Connection # .MAXHIT -- (RW) PC's Max Hit Points .MAXMANA -- (RW) PC's Max Mana .MAXMOVE -- (RW) PC's Max Move .HIT -- (RW) PC's Current HP .MANA -- (RW) PC's Current Mana .MOVE -- (RW) PC's Current Move .POS -- (RW) PC's Current Position .FIGHTING -- (RW) True/False (setting to true will not do anything) .CURR_STR -- (RW) PC's Current Strength (as reported in Score) .REAL_STR -- (RW) PC's Native Strength (w/o equipment, str spell, etc) .LEVEL -- (RO) PC's Level SKILLSM[] - The skill-list for the mobs in the room. .BACKSTAB -- (RW) % learned (0 is not learned) ... .TRACK SKILLSP[] - The skill-list for the players in the room. .BACKSTAB -- (RW) % learned (0 is not learned) ... .TRACK ROOM[] A list of all rooms in the game. .NAME - (RO) The name.. or title.. of the room. .VNUM - (RO) The Room's VNUM .NORTH - (RO) The RNUM of the room to the North .EAST - (RO) The RNUM of the room to the East .SOUTH - (RO) The RNUM of the room to the South .WEST - (RO) The RNUM of the room to the West .UP - (RO) The VNUM of the room to the Up .DOWN - (RO) The VNUM of the room to the Down .DOOR_N - (RW) Door Flag for North (-1 is no door, .DOOR_E - (RW) Door Flag for East 0 is open, .DOOR_S - (RW) Door Flag for South 1 is closed) .DOOR_W - (RW) Door Flag for West .DOOR_U - (RW) Door Flag for Up .DOOR_D - (RW) Door Flag for Down .DARK - (RO) The room is dark. .INDOORS - (RO) The room is Indoors. OBJ[] A list of all the objs lying on the ground. .Name .Action .VNUM .VAL1 .VAL2 .VAL3 .VAL4 WOBJS[] A list of all the objs the event causer is wearing. .Name .Action .VNUM .VAL1 .VAL2 .VAL3 .VAL4 EOBJS[] A list of all the objs the event causer is wearing. .Name .Action .VNUM .VAL1 .VAL2 .VAL3 .VAL4 ABIT() Players and mobs. Used to record information about mobs and player actions of a repetitive or temporary nature.. Designed as a temporary scratch pad for transport rooms, etc. Either ON or OFF. Values range from 1 to 16, 384. You must use the web page to get an ABIT assigned to your program. Example: IF ABIT(CAUSER, 1) = FALSE THEN SET ABIT(CAUSER, 1) = TRUE ENDIF QBIT() Players only.. Quest Bits. Used to record a player's having completed a noteworthy event. Either ON or OFF Values range from 1 to 16,384. You must use the web page to get a QBIT assigned to your program. Example: IF PCCAUSED = FALSE THEN RETURN ENDIF IF QBIT(CAUSER, 1) = FALSE THEN RETURN ENDIF IF QBIT(CAUSER, 2) = TRUE THEN RETURN ENDIF IF NUMPOBJS = 0 THEN RETURN ENDIF FOR I = 1 to NUMPOBJS IF POBJS[I].vnum = 1101 THEN OBJREM 1101 I OBJTO 1102 I SET QBIT[CAUSER, 2] = TRUE SET H$ = "Thanks for doing the quest!" ECHOPC CAUSER H$ EXITFOR ENDIF NEXT This is an example of a one time quest.. The player starts the quest via a different program and gets QBIT #1 set as a result The quest tells them to get obj 1101 and go to this room. When they do, the room takes obj 1101 and gives them 1102 and sets QBIT #2 true, so they can't do the quest over and over. Some QBITs will be reset when a player DTs and has the quest item(s) on them. RANDOM -- Used to create a random number between x and y -- example -- A hidden trap.. ENTER_PROG IF PCCAUSED = FALSE THEN RETURN ENDIF IF ABIT[CAUSER, 3] = TRUE THEN RETURN ENDIF IF RANDOM[1,101] > CHARS[CAUSER].PERCEPTION THEN SET A$ = CHARS[CAUSER].Name SPRINT H$, "A$ fell into a hidden trap!" SPRINT G$, "You fell into a hidden trap!" ECHOALLBUTP CAUSER H$ ECHOPC CAUSER G$ SET ABIT[CAUSER, 3] = TRUE endif -- In this program, a trap that you can fall in sets a bit on your character so that you can only fall into it once between renting.. Presumably you'd know where it was.. until it was moved... Players in the room could be set to know it was there as well.. Temporary Variables... used for program scratchpad and text output. (Integers are initialized to 0, and strings are initialized to "NULL") Variables: string variables. (each string may store up to 255 chars): --- A$, B$, C$, D$, E$, F$, G$, H$ I% is reserved for FOR/NEXT loops. integer variables. (Values range from -32K to 32K): --- J%, K%, L%, M%, N%, O%, P%, Q%, R%, S%, T%, U%, V%, W%, X%, Y%, Z% Restrictions on code. 1) For Loops. a) Cannot be nested b) Cannot be inside of an if/then construct. 2) If/then/else/endif statements. a) Cannot be nested. b) Can be inside a for/next loop. 2) No ability to store anything other than a TRUE/FALSE.. i.e. can't store the fact that 24 peaches have been bought.. at least w/o using 24 QBITS. The good news is that we can support around 50K QBITs per player before memory use starts to get excessive. (And PFILE size) 3) Recursion, Parenthesis, multiplication, division and the like are not supported.. If we identify a need for such, I will add it. -- http://www.polarnet.com/Users/gbarnett/ -- telnet://mud.polarnet.com 4000 -- +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST