- in client, check for header for proc of given key. Is it a linear search? If so, make it faster. - allow // comments in language - if unclosed /* comment, show line/col of start of it - follow rockpile doesn't work (no error, but character doesn't move) - sendmail.cf: allow id@graysage... - ioShrink/ioExpand - lose DB space? cache space? - ioExpand: round len up? - when delete prop in addProp must be same as inherited, not zero? (Do I do that at all?) - in findCacheSlot ioFlush0 #1 try to coalesce first? Turn recorder messages back on to test. (in mall entrance) - discard output messages on stuck sockets - avoid excess memory use - ?? extra level of fork for edit in SMUD, then send message to SMUD on edit done ?? - ?? if proc never assigns to string parm, can avoid copy for it on call? Watch out for when *have* dyn value - effects: send row of pixels (useful for terrain gen stuff) - "backup" bug?? - when client further along, work on fractal terrain stuff - perhaps have a builtin to count occurrences of item in list, or occurrences of things which are direct or other descendant of some thing. Could use for display of lists with counts. - using a clickable region, could add buttons for colour choice in build button set. Also show current colour, OK, CANCEL. - log mispellings as potential aliases - Richard Bartle - FindMachineAt: use in spells to first look at machine Here() - "climb up boulder" - save last looked up proc in global var, as micro cache - same for last ioRead key (no change in cachedness!) - any possible string copy opt for user calls, other than already done? - check for bytecode overflow (64K) when compiling - clientId should move to 32 bits in rq_, cl_ - if player does not attempt any defense, then if "killed", just move player and posessions to a location set as "safe place" by that player (init to entrance room). Carefully choose definition of "no defense"! Increase effects of death as player does more to counter it. - armour: some, singular player: , singular - way to allow player to make map using paper and pen? - make *all* verbs global - check bank ones - 3 more maps (+ more dead ends?) - [un]gag spell: cast gag reset on logout - temp blindness when someone photos you? - allow naming of NPC's. Have "name table" on players. NPC sticks around while named, unless killed. NPC can have list of namers, much like I do trackers. - Tak Tang stuff (potions, scrolls) - gems, gemstore in Proving Grounds - radios with channels; telephones? telescope? - multi-word prepositions (use prep phrase instead?) - client: click on word in text window => enter into command Have a type of button to do that, too. Plus an ENTER button. Can then, do pretty much all commands with mouse. - change name: add "who" parameter only used by SysAdmin - add GetPreposition, and scenario AllowAmbiguous (for djm) - "top 10" list of quest solvers? - ?? allow list of pre and post special objects with verbs. If noun in pre list, execute that code instead of looking for object in world. If object not found, but is in post list, do that code, not verb default. - prog lang: on an attribute reference, allow either a value or a function returning such a value. Can only be "pure" function, i.e. one which cannot have side effects outside of some narrow "arena" associated with the attribute and its code. [This was on one page. I'm not at all convinced this makes any sense, or would be desireable if it did.] - here is a biggie that I don't follow anymore! Typed verbatim: concept of "attribute" like property but only string, int, void, bool? if none exists, then use usual default on read set value (or action) on assign if one exists, turn into list of the (value/action) string: concat of values int: sum bool: & void: do all (must mean actions here) add constructs/builtins: Override [] stop going through array after this call. If value, it is final value in total When add one, specify beginning or end of queue/list of them. If action already in queue/list, move to chosen end. some way to do "spoofs"/"watchers"? on assign, merge with anything inherited. Further changes in ancestors have no effect. - ?? disable palette changes based on the "palette" flag from client. Have two flags - one for text, one for graphics? (No!) - treat verb adj noun as verb adj noun # e.g. take first apple from second sack - This is a whole page of stuff, verbatim. Much of it is likely no longer relevant, and it not well thought out. Optimization of Interpreter: 1) compiler may be able to note that a given DB ref is used repeatedly, with no chance of the cache pointer being invalidated. E.g. no other DB ref in between. Could then use special DB ref ex_ codes that cache (in a "register") and fetch the value, avoiding a call to ioRead. Is it worth it? Can I be more adventurous, and cache more? 2) Is it worth it have special ex_ codes for calls to builtins that have precisely 0, 2, 3, 4 arguments? How about for direct user proc calls? 3) Can put loopin the main exec routine. For a unary, it can be done one way, for binaries another way. Avoid recursive calls. 4) For a C version of interpreter, declare all the various vars only inside the case alternatives - much more likely the compiler will re-use native registers. 5) Can "optimize" user code, such as compile time arithmetic, etc. Have ex_op node which then points to both original and optimized subtrees. Execute optimized, print the other. 6) Have complex types, so can avoid most run-time action checks. - have MUD adjust for cursor size. PlaceCursor specifies pos for center of it. Pass offset on GSetCursorPattern. - "list" spell which scans private/spells tables printing names of appropriate things. Move spells to p_pSpellTable. [Both done, used "t_spells" as private user table.] - use old English coinage. - add list of direction alternate names. E.g. "track", "road", "stream", etc. - could add builtin to create a socket and connection. Args: hostname, port. [text/binary] Get read/write file handle, usable like those already existing. - is it possible to forward AmigaMUD binary messages back and forth? - New class of property: [action or constant] Can be assigned a value or an action with one parameter (the thing) yielding that type. At run-time, a reference will call action if needed. How implement? Two codes for the property? Reserve a bit in property pointer? E.g. for ints there is no explicit type in value. - large new scenario - have gods/godesses tha are NPC's - active all the time, and keep an eye on their followers and on major events (need way to flag something as "major") - will sometimes defend followers - will sometimes ask followers to do things. e.g. goddess of plants wants to fight forest fire. - if someone threatens followers, can give warnings, and perhaps destroy bad enough threateners. - a bad god could turn on a follower, e.g. if follower ticks off some other god => squish! - e.g. goddess of plants signals her presence by plant activity (rustling, movement), and/or by plant/flower scents - some could be more direct - lightning, peculiar breezes/winds, very hard rain/hail, etc. - ShowTablesInUse - SetDefaultThingStatus(character, ts) - SetFullPaths(character, bool) [eff = SysAdmin] ??? - ActionToString - icons: have an icon-id generator that id's the image. When send to client, use 2 values: image id and unique character id. 1st is for caching, 2nd for control of when to remove it. Prevents continual sending of monster and bird icons. - add photocopy machine in Builder's Guild library. 1 bluto/book. - use the sum of the costs of the objects than an NPC is carrying as the initial value for its stay-alive time. Thus, if a goblin manages to get a "Hammer of Thor", it will stay around for a long time before vanishing with it. - for Orlando (I forget his last name): could have routine that is called to validate a new character name. New code returned on rt_askPlayer, along with string result of call. - could have some swords: - point towards character - heal/cure - luck? - farslayer - sort of shieldbreaker - luck: affecs your change of hit, opponents chance of hit - cast megahit - cast supershield - have goblin lords (very few) with full goblin weaponry and armour and *lots* of money. Quest to kill some? Other for large trolls? *Exist* in cave. Say want 25? - have mousebuttons for many common actions, e.g. get, drop, read, look, emote [new set], etc. for folks like Craig. - in tile world (large) could have 1 magic locator that works only at long distance, another only at short distance. - remove many decisions about room v.s. object v.s. character - ThingStatus_t: restrict pointers to. Check in AddThingProp & SetParent. - special-case noun-phrase "here"?? - could have days of week be significant: Moonday, ? Woten'sDay, ThorsDay, Freitagsday, SaturnsDay, SunDay. - could have server automatically clone and declone objects. First store of value different from parent/default value causes cloning. Store/delete of last difference causes uncloning. How do pointer messing? Need ptr to ptr all the time! - this must be from some other game. I dunno! suinoleht battle tactics "combat mind" yerut gorf cure nhak righteous "bless" tehctah protection "armour" hold diploma: 1 extra wisdom nadroj healing (less tired) rozar - add 'private' proc flag. If set, not even SysAdmin can examine or edit it. - enough bits => use byte of bits for all proc flags. - Hmm. Perhaps want whole scenario not readable. Make all private to SysAdmin, and remove the SysAdmin character. (Use some *other* char!) Then delete it (delete what?) - use 32x32x8 icons. Have icon editor. Allow user to have multiple icons. Allow setting them by name. Allow "sleep" command. So, can have an alias: (not alias => proc for user to execute) seticon handupleft wait 1 seticon handupright wait 1 ... seticon handdown use GSetIcon. - scenario: in expanded troll area, include troll armoury - like goblin one. Need strength *7* to use trollish two-handed sword. - add passage from back of far goblin city to upper level of rockpile area. Need some hidden tunnels - don't show on graphics, etc. - allow keypad 0 and keypad . - they are needed for Amelon. - more service tunnel stuff. Puzzle to get blutos. - be able to sell in stores for 1/2 of purchase price. Check for item really sold there. If name matches, have proprietor refuse to buy somehow. Can then sell back stuff found below. - have machines in stores. Talk a bit. - troll area: ener at bottom of canyon and have to fight up on near side. Then cross to heard area. Have groups of bodies, some with weapons, armour. Perhaps still have shortcut out at current level of spiral staircase. - have getNounPhrase indicate: a/an|the| If first case, then allow ambiguous reference. In 3rd case allow if global user flag set. - add builtin to setup a proc on a machine to receive all "Print" output. Could setup so can give them "log book" to record stuff! - control for fountain. Empty/fill takes time. When finally empty, can collect blutos there. Add a few per day of being full. Caretaker refill. - if build new scenario, can start it off looking like current one, but add more stuff and have changes. E.g. explosion or something occurred in Playpen, etc. - note: can map by writing letters or bulletins! - define a "pickup" routine for monsters. Have it check flags on monster to see if it should: - pick up weapons/armour and use them [done] - pick up random stuff and carry around [done] - eat letters/bulletins (rat, troll) - turn letters/bulletins into slimey wads (spiders) - could have: @monster .... kinds: random, tracker, route (can have ... .command. ...) - some way to attach actions to monsters? Mainly want conditions on route ones. - autographics using bitmaps. Example show road-type location with branches going only south-west and south. - Do with masks - ony way, I expect ???? 1) blit whole background 2) mask blit center circle 3) mask blit pieces - saved as brushes Where pieces overlap, should be identical [draw with pattern originally] therefore need 10 images: 1 whole rectangle 1 center circle 4 large rectangles for diagonals 4 small rectangles for perpendiculars - for faster execution in later MUD: - have lock and unlock constructs. They lock item in DB cache. Have "locked" be a type attribute. Have special entries into AddProp, etc. that take locked arg (which is just a ptr to cached entity). - to make *compiled* code more useful, have concept of "exploded" locked thing which can be referenced like a struct. How? - part of temple area? Room with large eye on wall - closed. When enter, hidden machine says to say our name. If say correctly, then if you previously added your name to a list of new members somewhere, you are admitted, else refused. If you lie, you are blasted by a bolt from the opening eye. - scenario: fill out park. Ice cream store, burger bar. Pick flowers. Birds sing [done]. - ring road around town. Roads going 8 dirs. To south have sign "Terra Graphica" going to tile area. To ? have sign "Terra NonGraphica". [have ring road, and everything now has graphics] ============================================================================= Here is a file names "future" from the Amiga directories: From ami-cg.GraySage.Edmonton.AB.CA!myrias!cg Thu, 24 Apr 97 06:00:53 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7ya2@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 06:00:53 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7y9l@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 03:50:52 MST Received: from moe.myrias ([198.161.246.38]) by slave.Myrias.AB.CA with SMTP id <1056>; Wed, 23 Apr 1997 14:20:57 -0600 Received: by moe.myrias (SMI-8.6/SMI-SVR4) id OAA06949; Wed, 23 Apr 1997 14:13:47 -0600 Date: Wed, 23 Apr 1997 14:13:47 -0600 Message-Id: <199704232013.OAA06949@moe.myrias> From: cg@Myrias.COM (Chris Gray) To: cg@ami-cg.GraySage.Edmonton.AB.CA Subject: future Can put a capacity on a room, and if too many are in it, just report "Room is too crowded" on entry attempt. Allow for exceeding the limit, because of teleports in, etc. Further future, can base everything (mostly maybe?) on tiles. Each tile position can only hold one person. The world becomes a lot bigger, because the user has to move around in the various rooms. For autographics, the user would move to the appropriate cell of a neighbouring room For display, there are two choices, as I see it. First is to try to display everything "realistically". This means that objects nearby show up in the main picture, and the user can manipulate them with the mouse. Similarly other characters (PC or NPC) in the same room (within the visible range for a fully tile area), show up on the tile they are over. Alternatively, can use part of the display to show such things. On a high-res display, only 1/4 of the right half is needed for buttons, so could use 1/4 for character icons, 1/4 for objects, and maybe the remaining 1/4 for status displays (e.g. hit-points fuel guage). The former is "nicer". The latter is easier to do, in terms of the graphics needed. Also, the latter makes multiple objects in the same place clearer. Hmm. If we restrict the system to only one character per tile, then we almost have to go with the former, else allow multiple characters on a given tile. When defining a tile, include a letter which is the representation of the tile. This can be used if the client doesn't have the graphics file containing the tile needed. Display it dimly, with normal icons over top of it. This may not work well. Having the letter like that (no necessary relation to the encoding letters used in the castle), also allows automatic generation of text maps of a tile region. From ami-cg.GraySage.Edmonton.AB.CA!myrias!cg Thu, 24 Apr 97 06:00:55 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7ya3@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 06:00:55 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7y9q@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 03:50:54 MST Received: from moe.myrias ([198.161.246.38]) by slave.Myrias.AB.CA with SMTP id <1056>; Wed, 23 Apr 1997 14:42:52 -0600 Received: by moe.myrias (SMI-8.6/SMI-SVR4) id OAA07140; Wed, 23 Apr 1997 14:35:46 -0600 Date: Wed, 23 Apr 1997 14:35:46 -0600 Message-Id: <199704232035.OAA07140@moe.myrias> From: cg@Myrias.COM (Chris Gray) To: cg@ami-cg.GraySage.Edmonton.AB.CA Subject: more future A possibility: Use the scheme where things are shown where they should be. Any number of objects can be on any tile, and just their icon shows up. Would be possible to mark an object as "tile-filling", in which case no other object or character could be there at the same time. Only one character can be in a tile at a time, but a character can go into a tile with non tile-filling objects in it. If an object is dropped, it goes to the current tile, even if tile-filling, unless there is already a tile-filling object there, in which case the drop cannot succeed. If multiple object are on a tile, then only the last one dropped there shows up, and a grab with the mouse gets its icon. A double-click on such an icon (or a character icon) does a "look at". Perhaps dragging an object onto the icon for the player does a 'get'. This can be done for any tile in the room (do the rules change for a full-tile area?). An area of the display (1/4 in hires) could be for icons for inventory. We can really go down the garden path with this! Pick a scale for tiles. 160x100 gave a tile size of 32 x 20. Fix that size. Then, the server can have bitmaps hanging around, indicating the state of each tile in any room occupied by a player??? Is this useful? My concern is the searching needed to do anything, when you have to look at the room, then sometimes all tiles in it. How does this relate to the concept of room contents lists, etc.? From ami-cg.GraySage.Edmonton.AB.CA!myrias!cg Thu, 24 Apr 97 06:00:56 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7ya4@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 06:00:56 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7y9v@ami-cg.GraySage.Edmonton.AB.CA>; Thu, 24 Apr 97 03:50:56 MST Received: from moe.myrias ([198.161.246.38]) by slave.Myrias.AB.CA with SMTP id <1205>; Wed, 23 Apr 1997 15:28:20 -0600 Received: by moe.myrias (SMI-8.6/SMI-SVR4) id PAA07381; Wed, 23 Apr 1997 15:21:07 -0600 Date: Wed, 23 Apr 1997 15:21:07 -0600 Message-Id: <199704232121.PAA07381@moe.myrias> From: cg@Myrias.COM (Chris Gray) To: cg@ami-cg.GraySage.Edmonton.AB.CA Subject: more future Of course, any scheme where the nearby objects are visible on the screen (either main view or another view), would have to have the views updated if another character fiddles with them! In the on-main-view case, even shoving something around requires updates. All of this is doable, but there still remains the question of what is vieweable in a full-tile view. Hmm. Perhaps *nothing*. Perhaps it is like early Ultima did - you can only see detail when you are in a detail view, and the room displays are considered to be detail views. Hmmm. How does the user pick? Is this all desireable? ============================================================================= Here is a file called "Games.Thoughts": Some thoughts on adding adventure games, etc. within the MUD framework. - add a "Prefix" builtin which sets a prefix which is put out on the front of all output lines. The default is an empty prefix. Use it in these "computer games" as "CRT: ". [I think this is already done] - add a computer game store in the town. In the store the player can buy computer game disks. E.g. "Adventure", "Mansion", "This", and "Amelon". There should be some computers there. The player sits down at one and inserts the disk. He must then use the "type" command to enter input to the computer. It will do a "dir" to show the disk contents (in CP/M style!). The player must run the ".COM" file. - the "type" command is like chat. By itself it puts you into type mode, and the prompt changes. In that mode, input goes to the computer or game, unless it is just a "." or starts with a "!". Aliases? - have a source file full of stuff that has another set of verbs, properties, etc. of use in adventure games in general. These should all reference a "current adventure" thing attached to the current player. - have a source file for tile graphics handling. - the "Amelon" game uses it, along with some linedraw mazewalk and polygon stuff, just like in the old Amelon. Have to write some Draco programs to convert the Amelon Explore database (grids, mazes, etc?) into equivalent AmigaMUD data structures (e.g. arrays of ints). ============================================================================== Here is a file called "scenario.1": Some thoughts on a possible scenario. - basic world is low-tech (swords, pottery, agriculture, etc.) - structure is that of earth, roughly - magic is powered by the aurorae - increases slightly before, during and after a display - model the displays properly. - magicians in north are the central characters - magicians in south are nasties - they send 'bombs' up north, which are visible to anyone they pass over. They also infiltrate, subvert, and cause general havoc both up north, and everywhere else (they are not identifyable, since they come from the same racial groups) - various major race groups are represented (European, African, Asian, North-Amerindian, Australian, South-Amerindian,...?). They are all put at about the same tech/society level for the game. (So its not historically accurate!) - new players get to pick which group they want to be, and the game will provide a name (they can say no, and go for another). This should make for reasonably authentic names, if the name generator works. - when players make it up north and become high enough in level, then can then choose their own wizard name. - northern area is high, cold and icy, but with volcanic areas. The major site is a deep valley which is temperate to tropical in clime, and, because of its isolation, has animal and vegetable life forms which differ markedly from those of the outside world. ============================================================================== Here is a file called "Possibilities": Future expansion of the current scenario: When the basic quests have all been completed, Questor could give you a: Acme Dial-A-World Transporter Note on it: Dial 0 for a list of worlds. Other wizards can register with it. list shows notes, e.g. Proving Grounds: combat, graphics available Jungle Search: graphics required, files needed Could use MUD code to build a graphics editor which would let builders design their own drawings (not bitmapped ones - the other kind). Store the raw picture as strings which describe the drawing actions. The builder could then use the editor to edit that text description. Then, could have buttons for "compile", which would turn the text into an action to do the drawing. Also have "show" which displays the resulting picture, "add", which adds more stuff onto the end of it. Possible buttons for the graphics editing: colour move draw rectangle circle text Perhaps have an effect to enable/disable display of graphics cursor coords in the text window titlebar. Could produce remote client stuff that uses less memory. In mud.library, could remove all wizard stuff. Would want to add a flag to the EffectsInfo struct saying that there is no wizard mode. In MUD itself, could remove the speech capability. Could also remove all of speech, sound, music. Perhaps have a way for database to exist on more than on disk. E.g. index file one place, 1st part of data elsewhere, next part of data elsewhere, etc. Command line params? Quest ideas: Some thoughts on a quest for the town area: - have several kinds of flowers in the park, all pickable if give daisy to Packrat, get a hint on something. - put an ice cream shop in the park, sell several flavours. Caretaker likes one flavour and can be bribed with one. - have a clerk (45 year old hippy?) in news room. Perhaps in the morgue. have various papers available, with readable headlines. - ask about Skaury - Packrat remembers seeing a headline about him a few years ago. Something happened around Christmas time. Some thoughts on a tiled-map area: - use pseudo-random tiled terrain - in forest have a temple - go into my temple picture area, have a quest there. Get clues about the existence of the area from around the pseudo-random terrain. In big castle, could have, as part of a guest, a hidden object (key?) that was deliberately hidden by, say, brother of lord. In a box on his shelf is note reminding him to replace key if child doesn't soon find it. (+ note to child saying location NOT written down). Then, in child's room, have note from uncle saying about the treasure hunt + clues for the child. Could add more detail to tapestries and use them as clues. Have a guard captain in castle do occasional rounds where he meets other guards. If player does a no-no seen by guard, have word passed on, both ways (stored in guard). Thus, can capture & jail player in dungeon for while. Kitten in surface proving area. If no-one ot follow, go sit somewhere (a new loc?) follow (tracker) first person encountered. Will not follow into sewer or out of proving grounds. if hit, he spits at you and hisses. Starts growing, still tracking. Turns into giant lion and eats you => dead. Towers of Hanoi - puzzle based on moving platforms in the T o H pattern. Guessing correctly and doing something gets you some money in proportion to how long you waited (or something). Possible database fragmentation reduction: Don't assign file sapce for a new entity right away. Wait until it is flushed from the cache. That way, it will only get one chunk, of its actual needed size. May want to run through cache assigning such offsets as first part of a flush. Possible asynchronous database flush method: Count # dirty elements in cache. Have global activity counter - incremented on ioRead, ioWrite, etc. Put a copy of the counter in a cache entry when it is used. That way have some idea of how long it has been since it was last used. At some point(s?) (like after had to do a real disk read), use the above numbers somehow to decide whether or not to flush out the one least recently used dirty cache element (if it isn't too new, or too near the front). Can flush it fully asynchronously, and can directly use its memory in the cache, so long as it is not possible to re-use that space before the write operation has completed. If any real disk I/O is needed, it must wait for the asynchronous one to finish before it is started. Think more on it. If eventually have a truly safe way to fully flush, and stop I/O for a while, so that a backup can be done while the system is up, then it would be a good idea to have the 'build' stuff do a flush every now and then. Base the descision on time and number of things changed. The point here is to avoid losing people's creations. Wishing Well - locate deep in the proving grounds. - have obvious n, s, e, w - have non-obvious ne, sw, nw, se - told about other directions on first wish - have sign saying "... Wishing Well. WISH FOR what you need!" - /heal/health/cure/curing/hits/hit points/ add ~3 hp - wish for x look up x on list of wishable things (register with WishRegister); model must have p_oCancel action - e.g. wish for hammer of zeus - get one, but it soon breaks - wish for everlight lamp - ditto Clone Master makes fake clones of people (and perhaps other NPC's) Goblin master/goblins in Uncle - they can go through small holes too small for the player, who must go the long way around. Also in Uncle: boots - slime on floor somewhere coat - is thick, like armour umbrella - sturdy - use to hook on rod overhead while sliding down a slope. Could have an "Adventurer's Guild" that has a whole bunch of adventures that people can do. E.g. classic Adventure, Mansion, Castle, Odyssey, etc. In these, want to allow exiting anytime, so want to rig things so that the state of the "adventure" is saved on the player. Also want to allow multiple players of the single-player adventures, without interference. ============================================================================= Here is a file called "ToDo". Its *old*! Most of it is done. This file is dated July 1 1991!!!! There is a file "shopping" dated Aug 1992 that was to the Bell South guy about how to use AmigaMUD for an online shopping system. MUDServ: - still get runtime type mismatch after a traceback/error - can FileIO.d sometimes detect the user of a deleted key and do a runError? (Probably, but would slow things down?) - icon and command-line parameters: CACHESIZE= /* 25K - 512K */ MEMORYLIMIT= /* have memory.d keep track and ask for */ /* some back if it goes over this */ PATH= - make MUDCre runnable from WorkBench - use '.' syntax for properties. This would actually be faster to execute. - use more prop-any stuff - what does After(0, ...) do? - only owner of a word can delete it from a grammar. (Does a grammar have an owner?) - Bits on players for 'ForEachAgent', 'OString', etc. - ForceMachine(machine, "command"). OK if effective = owner. - speed up CanSee: FindFlagOnList(list thing, property bool)bool FindFlagOnAgent(property list thing, property bool)bool generalize FindName? - allow parameters on inline procs. And locals. - add comment statement - Page(player, "message") xx pages from YY: (how do yy?) can do to machines too? (allows remote control of them) - gag, gag allbut. Do in server to save message traffic. - can have proc to send message to specific player. Just always prefix with sender name, and/or have player permission bit for it. - Pose - Whisper - WhisperWho(xxx whispers blah) WhisperOther(You overhear xxx whisper to yyy blah)bool then Whisper1() -> xxx Whisper2() -> yyy TailString() -> blah - machine idle/active: go idle after ~10 minutes of no client. Become active when idle and a client connects. - timeout for each inputLine. Settable from icon/command-line MUD: - config file contains a bunch of entries, one per MUD that is connectable. Icons can exist for a given MUD, and double-clicking on them will use the tool stuff in them just like stuff from the config file entries. Possible items for an entry: PORTNAME=MUD.port /* server running on this system */ DEVICE=siosbx.device /* server running elsewhere */ UNIT=1 BAUD=2400 PARITY=NONE /* etc. - see SEREmp stuff */ TIMEOUT=60 /* timeout for a request to the server */ /* if goes off, put up requester and */ /* ask for continue/abort */ PATH= /* others are subdirs of here */ PICTUREPATH= /* specific other dirs */ SOUNDPATH= MUSICPATH= LOGFILE= HISTORY=44K /* size of output history buffer */ - prompt change while input not empty???? - snapshot - dump current output history buffer to a file - use other and shifted F-keys for macros - need a 'source' menu/function-key that works when not in wizard mode - lexer - end string at end of line else error (no error now) - replace command - edit command - a way to break execution? Uncle: - possible to paste together a mazewalk view? Fast enough? Starter: - in build: @ name xxx /* define private xxx as Here() */ @ find xxx /* findAnyName(Here()) */ @ names /* ShowPrivate() */ - whole file of fight stuff? - kill() - send player/machine home. Drop all stuff. Run p_pKillAction on them. Ideas: - perhaps store compile-time types in actual argument list, and thus do away with run-time types altogether? - do apprentices work? Can they use 'setupRoom', 'setupObject', 'ExtendDesc', etc.? Apprentices cannot connect to existing rooms, so how does a wizard do it for them? - could do profiling of code - Have interrupt go off, then run through the TraceBack, incrementing a counter on each active proc. Save the counter with the procs. - build simple serial client - no parsing, inputLine only? - credits? Cost effective player. One per subroutine call? CreateMachine = 1000. CreateThing = 100. CreateProp = 50. Real player gets back when people pay to enter his/her areas. Need prizes? Some way for credits to be created. - should be possible to make a portable castle, which turns into rooms, etc. when dropped. - LPMud uses xx thinks yy on brainwave zz - how about a verb form to allow 'pick the xxx up'? - forgery/spoofing: Identify all system output (or conversely all user- program output) with a special prefix on each output line. Thus it is not possible to fully spoof. ============================================================================== Here is a file called "Toys.cg": From ami-cg.GraySage.Edmonton.AB.CA!myrias!cg Tue, 29 Oct 96 04:16:35 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7pfo@ami-cg.GraySage.Edmonton.AB.CA>; Tue, 29 Oct 96 04:16:35 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <7pfj@ami-cg.GraySage.Edmonton.AB.CA>; Tue, 29 Oct 96 03:51:08 MST Received: from larry.myrias ([198.161.246.40]) by slave.Myrias.AB.CA with SMTP id <1199>; Mon, 28 Oct 1996 13:33:25 -0700 Received: by larry.myrias (SMI-8.6/SMI-SVR4) id NAA00086; Mon, 28 Oct 1996 13:32:33 -0700 Date: Mon, 28 Oct 1996 13:32:33 -0700 Message-Id: <199610282032.NAA00086@larry.myrias> From: cg@Myrias.COM (Chris Gray) To: cg@ami-cg.GraySage.Edmonton.AB.CA Subject: phones, etc. Make a new directory, "Toys", and put the mail/bulletin stuff there. Define the pen and pad there too. For phones, end up with a routine that can be called to add a phone to the current room, and add a name/number for it to the universal phone book, which is along with the phones. Set it up so that there is a way from the builder code to add (remove?) a phone from the system. Use the 'with' command to use the phones. Document this is a notice beside the phone in the arrivals room. Have an instruction plate on the back of the walkie-talkies. It could be possible to limit the range of them, and have a couple of versions - higher strength for higher price. Hard to setup what is reachable from where, however. ============================================================================== A file called "buildActions": Can add a statement type to the build action parser: "repeat" or "recycle". It takes a time as argument. The value is assigned to a variable, and at the end of the proc, if the value is > 0, then the proc is rescheduled for that time after the current. It is an object or room proc, since it needs a 'thing' to be scheduled with. ============================================================================= A file called "chocolate": From ami-cg.GraySage.Edmonton.AB.CA!myrias!cg Sat, 7 Jun 97 06:00:47 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <84m2@ami-cg.GraySage.Edmonton.AB.CA>; Sat, 7 Jun 97 06:00:47 MST Received: by ami-cg.GraySage.Edmonton.AB.CA (V1.17-beta/Amiga) id <84lx@ami-cg.GraySage.Edmonton.AB.CA>; Sat, 7 Jun 97 03:51:41 MST Received: from moe.myrias ([198.161.246.38]) by slave.Myrias.AB.CA with SMTP id <1314>; Fri, 6 Jun 1997 09:23:54 -0600 Received: by moe.myrias (SMI-8.6/SMI-SVR4) id JAA16746; Fri, 6 Jun 1997 09:20:49 -0600 Date: Fri, 6 Jun 1997 09:20:49 -0600 Message-Id: <199706061520.JAA16746@moe.myrias> From: cg@Myrias.COM (Chris Gray) To: cg@ami-cg.GraySage.Edmonton.AB.CA Subject: choc - have service tunnel heading a fair way south. At the end of it will be a small branch heading east, and an access going up. - the branch going east dead-ends, but have a valve there that controls the fill-water for the fountain in the park. The fountain will empty if the valve is turned off, thus giving access to the bottom of the fountain, and all the coins tossed in. Need some reason to toss coins in the fountain - need a sign by it or something. - the access going up can go into the vacant block. The doors their should say that the doors are locked, rather than just saying that you can't go that way. - one place up there can be a vacant office building area - another can be the chocolate factory. Could have a mini-game there that looks like the object is to get yourself covered in chocolate, and then to get it all cleaned off. In truth, it would be hard to get it all cleaned off, so you end up going into the main world covered in chocolate. The key is that in the Proving Grounds, critters can lick off chocolate instead of attacking you. So, need a count of the chocolate - when it goes to zero, you start getting attacked again. Have a few descriptions of people with varying amounts of chocolate. Special case - the guardian troll really likes chocolate - he will simply pick you up and lick off all of the chocolate, and then put you back down - sometimes on the far side of the chasm. - whatever gets chocolate on you needs a while to refill - the door into the chocolate factory from the street can be unlocked from inside. Initially it is locked. Perhaps caretaker relocks it if he wanders by. So, it takes someone who knows the way there via the service tunnels to open it up in general. ============================================================================= A file called "thoughts.nov (Nov 94) Make the 'SetAts' (or whatever) builtin return the old value, so that it is possible to query and later restore the value. Try to think of a way to have a 'QueryFileOnClient' function, so that the more complex decisions about effects can be done in the server. For example, finding out whether or not a file of tiles exists allows the server to decide whether or not it needs to send the tile definitions down. To go along with that, the ability to read a tile definition from a local file would be nice. Want (possible to do the above) the ability to do binary reads and writes from specified positions in files. E.g. seekread/seekwrite. Thus, for example, the floorplans of the castle could be in a file, rather than having to be stuffed into the database. ============================================================================== A file called "watch" Have the command (cancelled by any move or position change) build a machine in the room being watched (an invisible one). The machine gets all notifications for that room, and forwards them to the watcher. Note that this will include anything done with OPrint, which will require changes to the server, and to the machine interface! Hmm. ============================================================================= A file called "mudnotes" miror and brush in carryall when exit squirrel area. "attach tape to branch" 1) Make 'quests XXX' work for any Character, present or online or not. 2) Amigakid crashed the server (twice). He says he accidentally started adding a function (probably just incompleted code entry), and hit the close button to get out. That crashed his end (? not sure), and the server got a problem with not being able to find the needed client, and aborted. That abort seems to have killed the system as well. Sigh. o_securityDoor1 is ts_private (in service tunnel) An idea from Amigakid: how about a photo album (or use the bulletin boards), where people can post pictures they have taken. E.g. of monsters, other players, etc. He suggests that some pictures of players be magic, in that they show the player's current appearance, rather than a snapshot of them. I like the idea of normal pictures, but perhaps have for sale, or something (expensive!) an album that magically can show the current appearance of any player in the system. Amigakid also suggests having buttons that people can pin on, that shows the quests they have done. The trouble I see is how does an observer select a button to read? If the thing being photo'd has a picture, copy over the picture name. When photo a location, could save a pointer to the graphics code to draw it, plus a pointer to the location to get the configuration. Ick. Maybe just do it for ones with pictures. film packs for the camera - reset the shots left. Hard to guess word for non-English speakers. Can 'put out' work? How about allowing one to pee on them? Perhaps make the cots lie-on-able down in the goblin city. "could have caretaker and packrat and garbage room in goblin city. Perhaps on routes to over all of the spells. Perhaps allow painting sacks to identify them? xxx "arrives" but xxx "has left". How about be consistent? ============================================================================== File newSys/FirstThoughts It is difficult to satisfy all users with the same world. So, have multiple. Use the same core libraries, but have some of the facilities on available in some of the universes. So, have a server with several different (non-connecting, except perhaps for very special occasions) worlds: - RP world. Town, shops, clothing, money, building, decoration, chatting, newspaper, phones, etc. A very social place, very safe. You start out with a certain amount of money, and can do things like buy a house, buy a business, lose it all gambling, etc. - "wierd" world. No money here, but there are some nasties running around that will do wierd things to you - like give you an extra leg or eye or something. Play with the things that the users care about. Everything is free, but the price is lack of control. - combat world - like Diku, but done better? :-) Combat magics only. - combined world - all aspects meet here. You *can* set up a shop to sell dresses, but you had better be prepared to guard it! All magic possibilities go here - combat, wierd, modernistic, etc. Players choose where they want their character to live. ============================================================================== File note.aprint.cg Can have a set of mask bits associated with each client. Have them controllable (on a per-bit basis using the bit number) by the scenario code. Add a bit number parameter to 'APrint'. Then, only those characters in the same room, whose corresponding mask bit is set will get the message. This allows APrint to work for visual messages, auditory messages, smell messages, etc., all efficiently (no user code callout needed to check it), but with individual control based on the characters. Could expand on the idea, and have APrint's that take two or three pairs of . For each client in the room, the processing would be: if bit1-set print message1 elif bit2-set print message2 elif bit3-set print message3 fi. This could allow something like: APrint(BIT_SIGHT, "Fred runs through the room\n", BIT_SOUND, "You hear footsteps running through the room.\n", BIT_FEEL, "You feel a slight shortlived breeze.\n"); ============================================================================== August 20, 2000. Thoughts on being able to save on-line built stuff to a source file, so that after a database recreate, the stuff can be easily re-added. [There could be notes on this earlier in this file - I know I've thought about it before. The "tagging" of rooms to be included in the "area" for sure.] One problem is that of identifying what all should be included in the generated source file. Rooms just link to one-another, and there are typically several links out of an "area" to rooms that are not part of the area, e.g. are part of the main world. So, we want to "tag" the rooms that are part of the area. Most areas will have stuff other than rooms that need to be saved; e.g. some objects like non-gettable furniture, the models of things for sale in stores, purely decorative objects, user-written MUD functions that control activity (written with the build commands, rather that with the wizard/apprentice programming interface), properties defined for use with those functions, etc. In the source-file building for the main scenario, I normally make one "table" to hold the symbols for the new area. It appears to make sense to use the same scheme for online created stuff. So, modify the build code a bit, to *require* that a table be active when things are being created. (Right now it is optional - if you don't create and select a table, any symbols you define go into your main private table.) When any "thing" is created (rooms and objects), add to them a reference to the table for the area. This allows us to identify which rooms are part of the area, and which objects are part of the area (rather than just junk some character has carried into the area from somewhere else). All properties and functions already require a symbol in a table. So, the basic method is that the user identifies everything based on the symbol table it is either in or refers to. Since the Java client has no access to files, the writing has to happen on the server machine. The resulting file can then simply be emailed to the player. The whole process is started by specifying the symbol table for the area to be dumped out. The current areas built by source files assume that certain main tables are already in use. For generated areas, don't do that. Have each area source file use all tables it needs, and unuse them at the end. That way, areas can be added to the world independently, and often in any order. (There is still a big question about how to link the new area into the old areas. No answer has popped up for this. If the rooms in the old area have symbols, then they can be found at area compile time based on those symbols, if there is some what to know what table the symbols are in. The emitted source code would have to do 'use-es' of those tables.) Maintain temporary arrays that list the properties, functions and things that have already been written out (since the resulting output file must be compilable, stuff has to be defined before it is referenced). Start by scanning the symbols in the table. If the symbol is a property or function, check to see whether it has already been written out, and if not, just write a definition for it to the output file. If the table entry is a thing, check to see whether it has been written out yet. If it hasn't, check to see whether it is a room or an object. If it is an object, check all of the properties that an automatically built object can have, and recursively handle them. First, add the object itself to the list of objects already handled. If the entry from the table is a thing which is a room, then add it to the table of handled things, then recursively process through all properties that an online built room can have. This will include links to other rooms, and pointers to objects in the room's contents list. This is needed since in online built areas, *most* rooms and objects will not in fact be in the symbol table, and have to be found by this recursive search. We likely need to generate artificial symbols for all of these things, in order for the source-file based construction to work. So, if an area is dumped out after it was rebuilt from a dump file, everything *will* be in the symbol table, except anything added since the dump/recompile. These artificial symbols have to be remembered in arrays parallel to the arrays remembering what has been processed so far. (The names, and a has-been-processed flag could be attached directly to the rooms and objects themselves, but that will cause their database representations to expand, which is extra system effort, and results in lots of holes and unused space in the database.) I *think* this kind of approach will work. Only trying to do it will tell for sure. Since it is something that is rather hard on the server, it is likely something that should only be done by the system administrator, so that he can change the per-command run-time limit so that the activity doesn't time-out in the middle. Since it is hopefully not that common an activity, that ought to be OK. ============================================================================== 2001-07-30 Since adding the tile-based stuff to the scenario, a few more things have come up. One is that I should generalize and re-use the character-finding code in clientFuncs.c, so that the system can directly support the finding of characters in 2D and 3D maps as well as by room. Have builtins to create and manipulate them. Use all that new stuff instead of a lot of the code in the scenario's "tileBase.m" file. Much faster. This would also make it much cleaner to fix a current bug: if you run from a set of backup files, any characters that were in the tile area when the backup was taken will still be there when the server is restarted, since the info about them is stored in the database.