Up to Main Index                         Up to Journal for September, 2020

                  JOURNAL FOR THURSDAY 10TH SEPTEMBER, 2020
______________________________________________________________________________

SUBJECT: WolfMUD v0.0.16 released
   DATE: Thu 10 Sep 22:04:39 BST 2020

The next release of WolfMUD, v0.0.16, is now available for download[1].

This is the sixteenth official release of WolfMUD. It's been a long while
since the last release, hopefully all of the new features — for players,
authors and developers — plus all of the bug fixes will justify that. For
those who want to be more sociable the SHOUT, TALK/TELL and WHISPER commands
have been added. Players now have a health attribute and can use the new HIT
command to attack other players. The HIT commands is currently experimental
and is a small step towards implementing a full combat system. Players can
control how health is displayed in their prompt using the new /PROMPT command.
Players now have bodies and can WEAR, WIELD, HOLD and REMOVE items. There is a
selection of items to use with the new commands, available from Merkle's Fine
Emporium and the Bladesmith's workshop. The EXAMINE/EXAM command when used on
another player will describe them in their new finery. Authors can now design
clothing and weapons using the new WEARABLE and WIELDABLE fields in zone
files. Authors are also able to have items load initially disabled and then
gradually brought into play - instead of everything being available all at
once when the server starts. There is also a new debugging systems available
to help developers, and authors with problematic items. Last of all the
spawning and resetting of items and containers has been overhauled to work as
initially intended. Of course no release would be complete without numerous
other bug fixes and tweaks…

Main highlights from the release notes:

Added

  - New Thing.Freed method added to use in place of 'len(Thing.Attrs()) == 0'
    to reduce allocations and copying.
  - All Attributes now have an Is method that return true if the Attribute
    implements a particular interface - usually the interface named for the
    attribute type.
  - New Thing.FindAttr and Thing.FindAttrs methods which use the new Attribute
    Is method to replace the current Find* methods.
  - Removed Thing.Attrs method.
  - Added Attribute.free method to free Attribute without locking.
  - New Health attribute added. Players automatically upgraded on login.
  - New player /PROMPT command to set/query current prompt.
  - Experimental HIT command added for testing new Health attribute and health
    regeneration. Can be vetoed via HIT or the more general COMBAT pseudo
    command.
  - New cmd.state.asParticipant method to allow an actor to script a command
    for a participant.
  - Players can be killed in-game, currently via the experimental HIT command.
  - A hyphen '-' or underscore '_' can now be used in the name of a name/value
    pair in a record jar file and will no longer be interpreted as a name/value
    separator.
  - A exclamation mark '!' can precede the name in a name/value pair list in a
    record jar file and will not be treated as a name/value separator.
  - Added a text.List convenience function for turning a []string into a string
    that is comma separated except the last two elements which have 'and'
    between them. For example: text.List("A", "B", "C") → "A, B and C".
  - A new Body Attribute has been added allowing items to be worn, wielded and
    held. Players are automatically upgraded on login.
  - New REMOVE command to stop wearing, wielding or holding an item.
  - New Wieldable, Wearable and Holdable Attributes added. Documentation in
    docs/zone-files.txt updated. While Wieldable and Wearable have to be
    defined on an item Holdable (in one hand) is applicable to all items except
    players and mobiles. Holdable can be vetoed if something should not be
    held. Specifically defining Holdable on an item can override the default
    behaviour, for example to require two hands.
  - New WEAR, WIELD and HOLD player commands added.
  - Added Merkle's Fine Emporium (clothier, L73) with a selection of clothing
    items that players can wear.
  - Added a text.tree sub-package for producing textual tree graphs.
  - Added new attr.Thing.DumpToLog helper method.
  - Queued events now record when they are expected to fire. Queued events can
    also be suspended and will record how long is left before they are due to
    fire. Suspended events can be resumed to fire after the remaining time.
  - The Action, Cleanup and Reset attributes have new Suspend and Resume
    methods to suspend and resume their events.
  - Added a attr.Reset.Spawnable method to check if an item is spawnable.
  - Added a attr.Reset.Unique method to check if an item is unique.
  - New SHOUT, TELL/TALK and WHISPER player commands added.
  - New test zone reset.wrj added under data/zones, disabled by default. Old
    test zone quiet.wrj removed.
  - In the zinara.wrj zone file there are two new barriers. One to stop the
    rabbit and frog from wandering out of the gardens, the other to stop random
    creatures wandering into the gardens.

Changed

  - Lazily allocate maps in message.Buffers.Silent to reduce allocations.
  - $CLEANUP and $RESET commands updated to use new Thing.Freed method.
  - All Attribute Find* methods reimplemented using Thing.FindAttr and
    Thing.FindAttrs methods. Cleaner implementation causes an average 5%
    performance hit to in-game commands. Needs revisiting.
  - The event package now uses a reference to attr.FindName instead of manually
    processing the result of calling attr.Thing.Attrs - a butt ugly hack that
    allows attr.Thing.Attrs to be removed.
  - The frontend package now locks the outermost Inventory of the player's
    starting position when player is placed into the world.
  - attr.Locate now uses the sync.rwmutex from the embedded Attribute instead
    of allocating its own.
  - Player prompt displays current / maximum health, dependant on prompt style.
  - Default player prompt changed from StyleBrief to StyleShort.
  - The frontend package now uses a player's attr.Locate.Where being set to nil
    as an signal to exit, instead of checking if the last command was 'QUIT'.
    This allows other means of exiting, such as being killed ;)
  - The Dragon's breath tavern and the sheltered area in the garden have been
    reinstated as sanctuaries - no fighting/combat allowed.
  - The city guard's peacekeeper status has been partially restored - they can
    prevent fighting, but cannot attack players killing things in return.
  - The message.Buffer.Deliver has been optimised, avoids copying buffers.
  - The QUIT command has been updated to sync body slots when forcibly junking
    non-collectable items the player cannot keep.
  - The DROP and PUT player commands have been updated to sync body slots when
    a worn, wielded or held item is dropped or put somewhere.
  - The INVENTORY/INV player command shows items being worn, wielded or held.
  - Clarify SPAWN and unique item documentation for RESET in docs/zone-files.txt
  - In docs/zone-files.txt the section on Alias/Aliases has been rewritten and
    now includes details of qualified and bound aliases.
  - Cleaned up chest, pouch and ball references and moved items from the tavern
    to the trading post in the zinara.wrj zone file.
  - Moved the curious brass lattice from the tavern to the pawn shop in the
    zinara.wrj zone file.
  - Added specific Holdable definition to rabbit and frog mobiles in zinara.wrj
    so that they can be held by players - mobiles are not normally holdable.
  - Moved bag and sack from tavern to the trading post in zinara.wrj zone file.
  - The EXAMINE/EXAM command has been updated so that when used on another
    player it describes items being worn, wielded or held.
  - attr.Thing and all Attribute switched to new debugging scheme using new
    text.tree package. Debugging information for attributes standardised.
  - Removed ability to dump Thing by arbitrary memory address using #DUMP.
  - Updated #DUMP to use new debugging scheme.
  - The attr.Thing.Copy method has been renamed attr.Thing.DeepCopy and is
    recursive into Inventory. The attr.Thing.Copy method has been reimplemented
    and is not recursive.
  - Removed Thing.ClearOrigins method as no longer used.
  - In the zinara.wrj zone file the "weapon shop" is now "bladesmith workshop"
    and has a selection of weapons to try with the new WIELD command.
  - The game.init method has been renamed game.enter to better reflect its
    purpose and to avoid confusion with package init methods.
  - Updated the meaning of what is a collectable item in  the Thing.Collectable
    method. Updated junk.dispose method as it can no longer use the Collectable
    method to determine if an item should be freed for garbage collection.
  - The SAVE command now also saves a player's disabled items waiting for a reset.
  - When a player exits the game any pending Reset events are suspended, when
    entering the game any suspended Reset events are resumed.
  - The attr.Inventory.Unmarshal method has been updated so that references
    with a leading exclamation mark '!' are loaded disabled.
  - The SAVE command cmd.save.fixInventory method, frontend.log.assemblePlayer
    method, zone loader zone.linkupInventory and zone.linkupLocation methods
    have been updated to understand disabled references. This means players can
    be loaded with disabled items, usually because they are waiting for a
    reset. Also items can be loaded disabled into zones via INVENTORY and
    LOCATION fields. Documentation in docs/zone-files.txt updated with details.
  - Added 'to' and 'with' as stop words in cmd.internal.stopwords so that
    players can 'TALK with' and 'WHISPER to' other players.
  - The street vendor in the zinara.wrj zone file now uses SHOUT instead of SAY
    to attract potential customers.

Fixed

  - Don't try logging a connection error if there isn't one.
  - Thing.Freed only needs to take a read lock instead of a read-write lock.
  - Missing comment added to attr.Name type.
  - In frontend.Write don't write data to client if error already raised.
  - Always send prompt to client, even if player.PromptStyle is StyleNone, so
    that the text colour is always reset.
  - Set stale attr.Locate,where to nil in Inventory.Remove method.
  - In attr.Inventory.Remove set attr.Locate.Where on Thing removed to nil so
    that we don't end up with a stale reference.
  - The QUIT command should also notify any participant.
  - Extraneous colour resets sent to clients reduced.
  - The attr.Player.Write method no longer modifies the passed []byte and now
    conforms to the io.Writer interface.
  - Green and red balls used as test items removed from zinara.wrj zone file.
  - Added TAVERN qualifier to tavern door in zinara.wrj zone file.
  - Fixed aliases for entrance to the mages tower (L48), Mage's tower (L49),
    entrance to temple (L53), entrance to warrior's barracks (L65) and magic
    shop (L67) in zinara.wrj zone file. Fixed aliases for track near small cave
    (L13) in zinara_south.wrj zone file.
  - The attr.Locate.Copy method should include the origin in the copied data.
  - Fix attr.Thing.SetOrigins method setting origins twice.
  - The attr.Thing.SetOrigins method should include disabled Inventory items.
  - The cmd.junk.dispose method should also dispose of disabled items.
  - Reimplemented Reset.Spawn to fix item respawning nil panics, items not
    resetting due to lost Reset events and duplication of unique items.
  - Fix clean up of Reset event if event not seen and code shortcut taken.
  - In attr.Thing.SetOrigins only set origin for items with a Reset attribute.
  - Fixed data race in cmd.state between cmd.newState and cmd.state.sync methods.
  - attr.Inventory.Move should be able to move disabled items instead of
    silently failing.
  - In junk.lockOrigins lock origins of disabled items.

Known Bugs / Issues

  - If a player is wearing, wielding or holding items and completely log out of
    the server the items will no longer be worn, wielded or held when they log
    back in.
  - Buying and selling are not currently implemented so items at shops, like
    Merkle's Fine Emporium and the Bladesmith's workshop, can just be taken by
    players so they have some items to test the new WEAR, WIELD and HOLD player
    commands.
--
Diddymus

  [1] Download area: ../../../downloads/


  Up to Main Index                         Up to Journal for September, 2020