Changes from 2.4.3 to 2.4.3-US 1. Added in all the standared US patches I could think of. ie. find_call_out, add_xverb, the '?' operator, typeof, and a few others. 2. Added in catch and throw. catch catches errors :). format: catch statement; (not the semi-colon :) mmcg@bruce, geoff@bruce. Changed from 2.4.3 to 2.4.4 1. All strings are now allocated by a dynamic string pool, which use a hash table for quick searches. This shared string pool reduces memory usage with aproximately 10 %. 2. write_file() has been changed so that strings will be appended to the file instead of clearing the file first. 3. All manipulation of 'struct svalue' has been centralized, which makes debuging much more easy. 4. Bit fields has been implemented. They are stored in normal strings, 6 bits per character. A space (' ') represents 6 cleared bits. The living.c object has been extended with one such bit field. The idea is that wizards should get rights to use a few bits from the administrator. He can then use these bits to store information about for example if a player is a member of a guild, or has solved a once-only problem. 5. The names of all living objects are now stored in a hash table, to speed up find_living() and find_player(). This has the effect that a living object can only have one name that can be found using find_living(). The name is set using set_living_name(). This is automatically done for monster.c and player.c. 6. It is now possible to catch an error, using catch(expr). If there is no error, then 0 is returned. If there is an error, than the error message is returned in a string. There is a lso a function throw(val) that forces catch() to return immediately with value 'val'. 7. A function notify_fail(str) can be called to enable another error message instead of 'What ?'. 8. As programs in LPC usually do use several common leafs, these can be shared. This fix (which was implemented using a new lnode type L_CONSTAT), saves aproximately 8 % of the total memory. 9. There was a severe bug in smalloc.c. When doing sbrk(4), some machines (sun 4) will return 8 bytes. But, smalloc.c depends on the exact number of bytes being allocated. This has been fixed, using brk() instead. 10. New objects in /obj: alco_drink.c, food.c and soft_drink.c. They are using the new stuffed and soaked. 11. The player.c function query_quests has been changed to return the string of all quests when argument == 0, instead of writing them out. 12. Permission has been changed so that a wizard caan clone objects from other wizards. This has always been possible anyway, when using home-made cloners. 13. The command ' has been changed, so that no space is needed. 14. The bulletin boards has got a bug fixed, and some cleanup. 15. Rules in /doc/build for drinks and food. 16. A bug has been fixed in input_to() which could crash the game if the object was destructed. 17. Several bugs was fixed in comm1.c. 18. An average is now computed for number of commands executed per second, and number of LPC lines compiled per second. The average is spread over the last 15 minutes. Changes from 2.3 to 2.4 1. A new reset scheme is used. The idea is, that instead of calling reset() in rooms regularily, a flag is set. reset() in the room will next be called when someone enter the room. This saves memory, as treasures and monsters are not regenerated where no players are. 2. New function: query_snoop(ob). Report who is snooping on 'ob'. Can only be called by arch wizards (from level 24). (Not working properly yet) 3. New, function: find_player('str'). Will use 'query_real_name()' to find a player. This function is much more cheap than find_living(). It will also find link dead players and invisible players. It is used when the player loggs in. 4. Bugs has been fixed in call_out(). 5. Four memory leaks has been fixed: In call_out(), when inheriting, in pre_compile() and in player.c using a better timeout. 6. Password is no longer echoed. 7. The main city road has been extended by two extra "rooms", and an "eastroad". A big (and rather empty) area has been added in the southwest part of the southern forest. 8. 'ed' has been changed, so that when started without any argument, it will edit the last file with an error in it. This works both for runtime error and compile time error. This helps debuging a lot. 9. Restricted usage of '!'. Could earlier be used when the game was asking for password. 10. Improved documentation. 11. String comparisons for <, >, <=, >=. 12. New funcion file_size(file). Returns the size of a file in bytes. Returns -1 for nonexistant or unreadable files. 13. New function: write_file(file, str). Write the string 'str' into the new file 'file'. 14. Access lists has been implemented, that gives write permission to a group of players into a specified directory in /room or /players. This encourages group work. 15. Updated /obj/trace. Changed commands 'i_trans' into 'Trans' to make it easier to use etc. Added the syntax '*name' that uses find_player(). Better help information provided. 16. Made a file room/log.h, that controls what logging is to be turned off or on. 17. add_prog_ref() was called from load_ob_from_swap(), which meant that an object that had once been swapped out, never would be swapped out again. 18. Changed swapping algorithm. Working set reduced by 50 %. It is important that swapping is enabled now. There are no penalties for using swapping, except a minor slow down when compiling an object and a big swap file. All objects are swapped out immediately after they had been loaded. When they are swapped in again, the program block is stored in one sequential memory block. This is what reduces the working set of the game. After this fix, I could change the maximum size of Genesis from 7 Mbytes to 11 Mbytes. The working set when 20-30 players is active, seems to be aprox 5 Mbytes. 19. Improved users() function, that copy the players from all_players[] in comm1.c, and thus is much faster. 20. The variable names are now swapped with the object. 21. Hashed object names, makes find_object("str") much faster. 22. Manuals in obj/trace allows 'man topic', and will search for that topic in all manuals, or present available subtopics. 23. Static file variables. Will not be saved in save_object(). This saves disk space, as the saved player files are smaller. 24. Every time a player of level 10 or higher dies, he will get "nice" scar, to show his friends. 25. Players and monsters now have one of three genders: male, female or neuter. Email addresses are stored for players. 26. for-loops, do-while loops. ++ and --. 27. query_idle(ob) returns the idle-time of a player 'ob'. 28. A new interesting death sequence. Killed players are moved to a special room where they will meet Death himself. It takes some time, and will probably be annoying the second time. But, why should it be harmless to die ? This also prevents the problem where a beginner can attack a BIG monster, die, revive, and attack again to get a good start of the game. 29. If a return-statment follows a destruct(this_object()) statement, then that return-statement will be executed. This enables destructed objects to return a value. 30. The builtin 'ls' has been changed so that .i files are not listed. 31. The bulletin board at adv_inner has been changed to use explode() and implode(). This uses considerably less memory. The board save file is not compatible with the old format (sorry). An extra room with a board, adv_inner2, has been created to discuss LPC related questions. Both these boards do not allow level 21 wizards to remove any other notes then their own. 32. A new much improved post office. 33. An new object /obj/roommaker.c, which can be used by wizards to make rooms. It will interactively ask for long description, short description and exits, and make a file which defines this room. It can load back information from rooms that was originally made by it, and change them. 34. Typeahead is now allowed. All players have a guarantee that no player may give more commands than any other. Also, if the heart beats uses too much time, then it is temporary halted, to be continued after player commands. 35. A new file, /room/log.h has been created, where a lot of logging can be enabled or disabled. It can log how players got quests flags, when and why players were killed, when someone gives money to other and much more. These are the changes to 2.3 from 2.2: 1. query_host_name() Gives the name of the host. Not interesting for normal wizards. 2. tail() Print the last lines of a long file. Good to have to look at the runtime error file '/machinename.debug.log'. 3. Bug fixed in move_current_reset. There was a bug that made current_reset point to a destructed object. 4. Saving value of objects when crash. The value is saved at the automatic save of the characters. There is no value saved when the player quit. If a player log in, and has a value saved, then he will get this as money. 5. Bug fixed in extract() There was an error that made the game crash, if argument 2 was bigger than the size of the string. 6. Extra flag to add_action(). A third flag that if true means that only the leading characters of the command has to match the verb. 7. call_out() uses real time, not heart beats to compute correct time. There was a problem when call_out() would delay very long because the game was slow. 8. The 'wizlist' is compressed. Only an area around the wizard is printed, and the top 15 wizards. A wizard name can be given as argument. If the name is ALL, then the whole wizlist is printed, even those with value 0. 9. #ifdef fixed. There can now be '#ifdef' statements inside functions. There was a bug in lang.y so that there could earlier only be #ifdef outside functions. 10. command() returns success or failure. It can not force players to do anything that is defined by static functions. 11. '!' escape. The '!' command escape from 'ed' now works in all situations, when writing mail etc. 12. explode(str, del). Split string 'str' into an array of strings at the places defined by the string 'del'. explode(str, " ") will return an array of all words in 'str'. 13. crypt(str, salt). crypt() now takes two arguments, and is compatible with unix crypt(). This means that the first two characters in the crypted password for players now is the salt, not a copy of the real password. If the second argument is 0, a random salt will be used. 14. New binary and unary operators: ~, &, &=, |, |=, ^, ^=, <<, <<=, >>, >>= Thanks to Per Emanuelsson for these long awaited operators. I know that some american LPmuds already have them. 15. valid_write(). valid_write() in player.c has been changed to allow cat() for files at the same directory as the file which defines the function that does the call of cat(). 16. Command defined by living objects. There was severe bug when living objects defined commands for other living objects. This bug was pinpointed with the help of Xurbax@PITT, and fixed by merging set_curremt_room() into move_obect(), which should have been done long ago. 17. A fix for inet_ntoa(). The call of inet_ntoa() has been fixed, and if there still are problems, then there is a replacement provided that can be conditionally compiled. 18. New wizard commands: cd, pwd, more, rmdir and mkdir. 19. There is now a replacement for std.h: room.c. It is not an include file, but should be inherited. Look at the new room/vill_green.c for example of how it is used. There is also a file room/room.h that can be used as a replacement for std.h. It is compatible, but supports only EXTRA_RESET, and no other EXTRA_xx. 20. save_object() does not destruct the save file when disk is full, as data is written into a temporary file, and then moved to the correct destination if successful. These are the changes to 2.2 from 2.1: 1. Arrays: allocate(), sizeof(), wizlist An array of size n can be allocated with 'allocate(n)'. You can't declare arrays. The function sizeof() returns the size of an array. The array pointer can be stored in variables, and sent as arguments as any type. They can then be used by indexing: 'vec=allocate(3); vec[0] = 8; ...' You don't deallocate arrays explicitely, they are deallocated when the last reference is removed. An array element can have a value of any type, even pointer to array (thus enabling multidimensional arrays). 2. query_ip_number() can now take an optional object as argument. It can then be used to find out if an object is interactive. Link dead players are not interactive. 3. ctime() takes the value from time() adn returns a nice string with the local time and date. 4. disable_commands() Opposite to enable_commands(). 5. The monster.talk.c has been replaced with just monster.c, which has the chat and talk functions replaced with arrays. The old monster.talk.c remains for compatibility. If you have problems with the game being do big, change monster.talk.c so that the old chat feature is disabled, and thus forcing wizards to use the new method with arrays. 6. predicate functions for all types: int(), objectp(), stringp() and pointerp(). 7. Bug fixed in malloc.c as well as much better speed. The statistics given by the command 'malloc' is now correct. 8. users() returns a vector of all interactive objects. 9. cat() returns success status and takes more optional arguments (start, end). 10. A general purpose object info retriever: obj/trace.c This object has been defined by using lot of good ideas from both Fizban and Anders Ripa. A problem is that wizards always want to make the "perfect" tool. Such a tool usually uses more than 50 Kbytes of memory, and if it is autoloaded, you won't need many wizards until 1 Mbyte has been "wasted". This new tool will hopefully satisfy wizards. It is also an attempt to standardize, so that players that have wizards on more than one mud have it more easy. 11. add_action() takes 2 arguments. And checks that the object defining the command is present. 12. New syntax: ob->fun(args), which is equivalent to 'call_other(ob, "fun", args)'. 13. Fixed a bug in '::'. The bug was when the inheritance depth was bigger than 2, and one of the above bottom objects used '::'. 14. 'sell all' fixed in the shop. 15. String handling has been optimized, using a flag 'constant' in the value nodes. 20. 'ls' is now builtin and is much faster. 21. The call of combine_free_list() frequency is dependant on the length. 22. Aggregate initializations of arrays: ({ 1, 2, "apa", ob, 2 }) Will construct an array of length 5, initialized. 23. file_name() Gives the file name of an object. 24. extract() Extract strings out of strings. 25. tell_room() Can now also take an object file name as argument. 26. command() has second optional argument, the object to execute the command. This object must be living. This new feature makes it possible to force any wizard to do anything, but abusements are of course illegal. The good things with this are big. It is now possible to have objects that defines abbreviations for you as example. It is also possible to construct a "team" object, that enables players to join with a leader into a team, and follow him automatically (not implemented yet). 27. A "graceful" shutdown when the game runs out of memory. The players will be given 4 minutes of warning by a monester called Armageddon (obj/shut.c). This is called automatically from malloc.c. These are the changes to 2.1 from 2.0: 1. A lot of memory leaks removed. 2. A specialised malloc() for LPmud. The new malloc will use the algotrith 'best fit', and use as little overhead as possible. It maintains several free lists for different blocks sizes. A function 'combine_free_list()' is called once 60 seconds that will join addjacent free blocks together. 3. LPC functions can now be 'static'. This fix a lot of security problems, and make programs more documented :-) 4. New functions call_out() and remove_call_out(); Call a function in current object after a delay, with an argument. This takes off load from the heart beat. It is currently used for decaying corpses and burning torches. 5. += Now accepts strings on the left side. 6. New function creator(). Give the name of the wizard that cloned the object. Good to have to trace monsters and weapons. 7. Assignments are treated as expressions, not statements. At last, you can do 'if (flag = 0) ...' :-) Long awaited fix. 8. Big bugs has been fixed. 9. Some of the gunk written to the debug file has been removed. 10. The present() function is changed so that 'get axe from corpse 3' works. 11. Even more security holes removed. 12. The file obj/living.h has been renamed into obj/living.c, and a new living.h now does 'inherit "obj/living";'. Below is a list of new things implemented in LPmud 2.0. Some of them might be older because I had forgotten when they were implemented. 1. Functions can now have more than one argument. call_other() does also support this. 2. An object can inherit from another object. All variables will be copied, and all functions will be available. This is "memory cheap". 3. String managements have been sped up aprox 3 times (since 1.3.3). 4. The ip-number of the player is saved with the player object. If the player calls the game from a different number than last time, the previous will be printed out. This is to enhance security. 5. It is now possible to lock out players from a special ip-address, or a whole area. 6. There is a new function 'time()', that gives the number of seconds since 1970. 7. The 'status' command does better calculation of total memory used. Still not enough, though. 8. A lot of security holes has been removed. 9. A memory saving string space has been introduced. This space contains some often used strings, and reuse them at compile time. 10. The bug/typo/idea command now sends a message to the log file of the wizard that owns the current room. 11. A quest system has been developed. To become wizard, you must solve all quests. The quests is listed at adventurers guild. Any wizard can create a quest (only one), and it must be approved by an arch wizard. These quests forces the players to solve puzzles, not just go around killing monsters. The quests should no be hard to solve. Rather, they should force the player to explore a bigger part of the game.