From ec6c28db95243c09b1d595c04fd360faa05ada98 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
__unloggedin_look_command [l, look] (cmdset: UnloggedinCmdSet, help-category: General)
__unloggedin_look_command [look, l] (cmdset: UnloggedinCmdSet, help-category: General)
about [version] (cmdset: CharacterCmdSet, help-category: System)
access [hierarchy, groups] (cmdset: CharacterCmdSet, help-category: General)
accounts [account, listaccounts] (cmdset: CharacterCmdSet, help-category: System)
addcom [chanalias, aliaschan] (cmdset: AccountCmdSet, help-category: Comms)
access [groups, hierarchy] (cmdset: CharacterCmdSet, help-category: General)
accounts [listaccounts, account] (cmdset: CharacterCmdSet, help-category: System)
addcom [aliaschan, chanalias] (cmdset: AccountCmdSet, help-category: Comms)
alias [setobjalias] (cmdset: CharacterCmdSet, help-category: Building)
allcom (cmdset: AccountCmdSet, help-category: Comms)
batchcode [batchcodes] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcommand, batchcmd] (cmdset: CharacterCmdSet, help-category: Building)
batchcommands [batchcmd, batchcommand] (cmdset: CharacterCmdSet, help-category: Building)
cboot (cmdset: AccountCmdSet, help-category: Comms)
ccreate [channelcreate] (cmdset: AccountCmdSet, help-category: Comms)
cdesc (cmdset: AccountCmdSet, help-category: Comms)
cdestroy (cmdset: AccountCmdSet, help-category: Comms)
cemit [cmsg] (cmdset: AccountCmdSet, help-category: Comms)
channels [all channels, chanlist, channellist, clist, comlist] (cmdset: AccountCmdSet, help-category: Comms)
channels [comlist, all channels, channellist, clist, chanlist] (cmdset: AccountCmdSet, help-category: Comms)
charcreate (cmdset: AccountCmdSet, help-category: General)
chardelete (cmdset: AccountCmdSet, help-category: General)
clock (cmdset: AccountCmdSet, help-category: Comms)
cmdsets [listcmsets] (cmdset: CharacterCmdSet, help-category: Building)
color (cmdset: AccountCmdSet, help-category: General)
connect [conn, con, co] (cmdset: UnloggedinCmdSet, help-category: General)
connect [co, conn, con] (cmdset: UnloggedinCmdSet, help-category: General)
copy (cmdset: CharacterCmdSet, help-category: Building)
cpattr (cmdset: CharacterCmdSet, help-category: Building)
create (cmdset: CharacterCmdSet, help-category: Building)
create [cr, cre] (cmdset: UnloggedinCmdSet, help-category: General)
create [cre, cr] (cmdset: UnloggedinCmdSet, help-category: General)
cwho (cmdset: AccountCmdSet, help-category: Comms)
delcom [delchanalias, delaliaschan] (cmdset: AccountCmdSet, help-category: Comms)
delcom [delaliaschan, delchanalias] (cmdset: AccountCmdSet, help-category: Comms)
desc [describe] (cmdset: CharacterCmdSet, help-category: Building)
destroy [del, delete] (cmdset: CharacterCmdSet, help-category: Building)
destroy [delete, del] (cmdset: CharacterCmdSet, help-category: Building)
dig (cmdset: CharacterCmdSet, help-category: Building)
drop (cmdset: CharacterCmdSet, help-category: General)
encoding [encode] (cmdset: UnloggedinCmdSet, help-category: General)
examine [ex, exam] (cmdset: AccountCmdSet, help-category: Building)
examine [exam, ex] (cmdset: AccountCmdSet, help-category: Building)
find [search, locate] (cmdset: CharacterCmdSet, help-category: Building)
get [grab] (cmdset: CharacterCmdSet, help-category: General)
give (cmdset: CharacterCmdSet, help-category: General)
grapevine2chan (cmdset: AccountCmdSet, help-category: Comms)
help [?] (cmdset: AccountCmdSet, help-category: General)
help [?, h] (cmdset: UnloggedinCmdSet, help-category: General)
help [h, ?] (cmdset: UnloggedinCmdSet, help-category: General)
home (cmdset: CharacterCmdSet, help-category: General)
ic [puppet] (cmdset: AccountCmdSet, help-category: General)
info (cmdset: UnloggedinCmdSet, help-category: General)
mvattr (cmdset: CharacterCmdSet, help-category: Building)
name [rename] (cmdset: CharacterCmdSet, help-category: Building)
nick [nickname, nicks] (cmdset: AccountCmdSet, help-category: General)
objects [listobjs, listobjects, db, stats] (cmdset: CharacterCmdSet, help-category: System)
nick [nicks, nickname] (cmdset: AccountCmdSet, help-category: General)
objects [db, stats, listobjects, listobjs] (cmdset: CharacterCmdSet, help-category: System)
ooc [unpuppet] (cmdset: AccountCmdSet, help-category: General)
open (cmdset: CharacterCmdSet, help-category: Building)
option [options] (cmdset: AccountCmdSet, help-category: General)
page [tell] (cmdset: AccountCmdSet, help-category: Comms)
password (cmdset: AccountCmdSet, help-category: General)
pose [:, emote] (cmdset: CharacterCmdSet, help-category: General)
pose [emote, :] (cmdset: CharacterCmdSet, help-category: General)
py [!] (cmdset: AccountCmdSet, help-category: System)
quell [unquell] (cmdset: AccountCmdSet, help-category: General)
quit (cmdset: AccountCmdSet, help-category: General)
quit [q, qu] (cmdset: UnloggedinCmdSet, help-category: General)
quit [qu, q] (cmdset: UnloggedinCmdSet, help-category: General)
reload [restart] (cmdset: AccountCmdSet, help-category: System)
reset [reboot] (cmdset: AccountCmdSet, help-category: System)
rss2chan (cmdset: AccountCmdSet, help-category: Comms)
script [addscript] (cmdset: CharacterCmdSet, help-category: Building)
scripts [listscripts, globalscript] (cmdset: CharacterCmdSet, help-category: System)
server [serverload, serverprocess] (cmdset: CharacterCmdSet, help-category: System)
server [serverprocess, serverload] (cmdset: CharacterCmdSet, help-category: System)
service [services] (cmdset: CharacterCmdSet, help-category: System)
sessions (cmdset: SessionCmdSet, help-category: General)
set (cmdset: CharacterCmdSet, help-category: Building)
time [uptime] (cmdset: CharacterCmdSet, help-category: System)
tunnel [tun] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [type, update, parent, swap] (cmdset: CharacterCmdSet, help-category: Building)
typeclass [swap, type, parent, update] (cmdset: CharacterCmdSet, help-category: Building)
unlink (cmdset: CharacterCmdSet, help-category: Building)
whisper (cmdset: CharacterCmdSet, help-category: General)
who [doing] (cmdset: AccountCmdSet, help-category: General)
aliases = ['batchcommand', 'batchcmd']¶aliases = ['batchcmd', 'batchcommand']¶
aliases = ['del', 'delete']¶aliases = ['delete', 'del']¶
aliases = ['type', 'update', 'parent', 'swap']¶aliases = ['swap', 'type', 'parent', 'update']¶
aliases = ['ex', 'exam']¶aliases = ['exam', 'ex']¶
aliases = ['chanalias', 'aliaschan']¶aliases = ['aliaschan', 'chanalias']¶
aliases = ['delchanalias', 'delaliaschan']¶aliases = ['delaliaschan', 'delchanalias']¶
aliases = ['all channels', 'chanlist', 'channellist', 'clist', 'comlist']¶aliases = ['comlist', 'all channels', 'channellist', 'clist', 'chanlist']¶
aliases = ['nickname', 'nicks']¶aliases = ['nicks', 'nickname']¶
aliases = [':', 'emote']¶aliases = ['emote', ':']¶
aliases = ['hierarchy', 'groups']¶aliases = ['groups', 'hierarchy']¶
aliases = ['listobjs', 'listobjects', 'db', 'stats']¶aliases = ['db', 'stats', 'listobjects', 'listobjs']¶
aliases = ['serverload', 'serverprocess']¶aliases = ['serverprocess', 'serverload']¶
aliases = ['account', 'listaccounts']¶aliases = ['listaccounts', 'account']¶
aliases = ['conn', 'con', 'co']¶aliases = ['co', 'conn', 'con']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['q', 'qu']¶aliases = ['qu', 'q']¶
aliases = ['l', 'look']¶aliases = ['look', 'l']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['offers', 'deal']¶aliases = ['deal', 'offers']¶
aliases = ['@dice', 'roll']¶aliases = ['roll', '@dice']¶
aliases = ['conn', 'con', 'co']¶aliases = ['co', 'conn', 'con']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['q', 'qu']¶aliases = ['qu', 'q']¶
aliases = ['l', 'look']¶aliases = ['look', 'l']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['@callbacks', '@callback', '@calls']¶aliases = ['@calls', '@callbacks', '@callback']¶
aliases = ['push', 'press', 'press button']¶
aliases = ['smash lid', 'smash', 'break lid']¶
aliases = ['feel', 'ex', 'examine', 'listen', 'get', 'l']¶
aliases = ['push', 'move', 'pull', 'shiftroot']¶aliases = ['move', 'push', 'pull', 'shiftroot']¶
aliases = ['push button', 'press button', 'button']¶aliases = ['press button', 'button', 'push button']¶
aliases = ['hit', 'bash', 'fight', 'chop', 'parry', 'defend', 'kill', 'thrust', 'stab', 'pierce', 'slash']¶aliases = ['slash', 'hit', 'kill', 'fight', 'pierce', 'bash', 'parry', 'defend', 'thrust', 'stab', 'chop']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['feel', 'feel around', 'l', 'search', 'fiddle']¶aliases = ['fiddle', 'feel', 'feel around', 'search', 'l']¶
aliases = [':f', ':q!', ':p', ':q', ':y', ':S', ':=', ':UU', ':dw', ':A', ':w', ':fd', ':h', ':::', ':<', ':wq', ':fi', ':u', ':I', ':!', ':', ':echo', '::', ':uu', ':>', ':s', ':j', ':x', ':r', ':DD', ':dd', ':i']¶aliases = [':q', ':I', ':wq', ':x', ':f', ':=', ':dd', ':S', ':dw', ':u', ':q!', ':DD', ':uu', ':A', ':j', ':fd', ':h', ':::', ':w', ':', ':fi', ':<', '::', ':i', ':s', ':!', ':echo', ':p', ':>', ':UU', ':y', ':r']¶
aliases = ['abort', 'quit', 'a', 'back', 'top', 'end', 'q', 'e', 'next', 'n', 'b', 't']¶aliases = ['top', 'quit', 'n', 'e', 'b', 'a', 'back', 't', 'end', 'abort', 'q', 'next']¶
Evennia comes with a MUD client accessible from a normal web browser. During development you can try
it at http://localhost:4001/webclient. The client consists of several parts, all under
-evennia/web/webclient/:
evennia/web:
templates/webclient/webclient.html and templates/webclient/base.html are the very simplistic
django html templates describing the webclient layout.
static/webclient/js/evennia.js is the main evennia javascript library. This handles all
@@ -63,7 +63,7 @@ be used also if swapping out the gui front end.
plugin_manager objects to the javascript namespace, coordinates the GUI operations between the
various plugins, and uses the Evennia object library for all in/out.
static/webclient/js/plugins provides a default set of plugins that implement a “telnet-like”
-interface.
static/webclient/css/webclient.css is the CSS file for the client; it also defines things like how
to display ANSI/Xterm256 colors etc.
The server-side webclient protocols are found in evennia/server/portal/webclient.py and
@@ -72,16 +72,16 @@ these.
Like was the case for the website, you override the webclient from your game directory. You need to
-add/modify a file in the matching directory location within one of the _overrides directories.
-These _override directories are NOT directly used by the web server when the game is running, the
-server copies everything web related in the Evennia folder over to mygame/web/static/ and then
-copies in all of your _overrides. This can cause some cases were you edit a file, but it doesn’t
+add/modify a file in the matching directory locations within your project’s mygame/web/ directories.
+These directories are NOT directly used by the web server when the game is running, the
+server copies everything web related in the Evennia folder over to mygame/server/.static/ and then
+copies in all of your mygame/web/ files. This can cause some cases were you edit a file, but it doesn’t
seem to make any difference in the servers behavior. Before doing anything else, try shutting
down the game and running evennia collectstatic from the command line then start it back up, clear
your browser cache, and see if your edit shows up.
Example: To change the utilized plugin list, you need to override base.html by copying
-evennia/web/webclient/templates/webclient/base.html to
-mygame/web/template_overrides/webclient/base.html and editing it to add your new plugin.
Example: To change the list of in-use plugins, you need to override base.html by copying
+evennia/web/templates/webclient/base.html to
+mygame/web/templates/webclient/base.html and editing it to add your new plugin.
hotbuttons.js Defines onGotOptions. A Disabled-by-default plugin that defines a button bar with
user-assignable commands.
html.js A basic plugin to allow the client to handle “raw html” messages from the server, this
+allows the server to send native HTML messages like >div style=‘s’<styled text>/div<
iframe.js Defines onOptionsUI. A goldenlayout-only plugin to create a restricted browsing sub-
window for a side-by-side web/text interface, mostly an example of how to build new HTML
“components” for goldenlayout.
oob.js Defines onSend. Allows the user to test/send Out Of Band json messages to the server.
options.js Defines most callbacks. Provides a popup-based UI to coordinate options settings with the server.
options2.js Defines most callbacks. Provides a goldenlayout-based version of the options/settings tab. Integrates with other plugins via the custom onOptionsUI callback.
options2.js Defines most callbacks. Provides a goldenlayout-based version of the options/settings tab.
+Integrates with other plugins via the custom onOptionsUI callback.
popups.js Provides default popups/Dialog UI for other plugins to use.
text2html.js Provides a new message handler type: text2html, similar to the multimedia and html
+plugins. This plugin provides a way to offload rendering the regular pipe-styled ASCII messages
+to the client. This allows the server to do less work, while also allowing the client a place to
+customize this conversion process. To use this plugin you will need to override the current commands
+in Evennia, changing any place where a raw text output message is generated and turn it into a
+text2html message. For example: target.msg("my text") becomes: target.msg(text2html=("my text"))
+(even better, use a webclient pane routing tag: target.msg(text2html=("my text", {"type": "sometag"})))
+text2html messages should format and behave identically to the server-side generated text2html() output.
So…lets say you have a desire to make your webclient output more like standard webpages… +For telnet clients, you could collect a bunch of text lines together, with ASCII formatted borders, etc. +Then send the results to be rendered client-side via the text2html plugin.
+But for webclients, you could format a message directly with the html plugin to render the whole thing as an +HTML table, like so:
+ # Server Side Python Code:
+
+ if target.is_webclient():
+ # This can be styled however you like using CSS, just add the CSS file to web/static/webclient/css/...
+ table = [
+ "<table>",
+ "<tr><td>1</td><td>2</td><td>3</td></tr>",
+ "<tr><td>4</td><td>5</td><td>6</td></tr>",
+ "</table>"
+ ]
+ target.msg( html=( "".join(table), {"type": "mytag"}) )
+ else:
+ # This will use the client to render this as "plain, simple" ASCII text, the same
+ # as if it was rendered server-side via the Portal's text2html() functions
+ table = [
+ "#############",
+ "# 1 # 2 # 3 #",
+ "#############",
+ "# 4 # 5 # 6 #",
+ "#############"
+ ]
+ target.msg( html2html=( "\n".join(table), {"type": "mytag"}) )
+So, you love the functionality of the webclient, but your game has specific @@ -184,7 +227,7 @@ window and the first input window are unique in that they can’t be “closed output and the one starting input window. This is done by modifying your server’s goldenlayout_default_config.js.
Start by creating a new
-mygame/web/static_overrides/webclient/js/plugins/goldenlayout_default_config.js file, and adding
+mygame/web/static/webclient/js/plugins/goldenlayout_default_config.js file, and adding
the following JSON variable:
var goldenlayout_config = {
content: [{
@@ -269,7 +312,7 @@ base.html.
Remember, plugins are load-order dependent, so make sure the new <script> tag comes before the
goldenlayout.js
Next, create a new plugin file mygame/web/static_overrides/webclient/js/plugins/myplugin.js and
+
Next, create a new plugin file mygame/web/static/webclient/js/plugins/myplugin.js and
edit it.
let myplugin = (function () {
//
@@ -331,6 +374,7 @@ window.plugin_handler.add("myplugin", myplugin);
check/trigger methods utilize some of these getters, while others are just for developer convenience.
get(key) is the most basic getter. It returns a single buff instance, or None if the buff doesn’t exist on the handler. It is also the only getter
that returns a single buff instance, rather than a dictionary.
+Note: The handler method
+has(buff)allows you to check if a matching key (if a string) or buff class (if a class) is present on the handler cache, without actually instantiating the buff. You should use this method for basic “is this buff present?” checks.
Group getters, listed below, return a dictionary of values in the format {buffkey: instance}. If you want to iterate over all of these buffs,
you should do so via the dict.values() method.
+Note: You can also trigger relevant buffs at the same time as you check them by ensuring the optional argument
triggeris True in thecheckmethod.
Modifiers are calculated additively - that is, all modifiers of the same type are added together before being applied. They are then +applied through the following formula.
+(base + total_add) / max(1, 1.0 + total_div) * max(0, 1.0 + total_mult)
+Multiply/divide modifiers in this buff system are additive by default. This means that two +50% modifiers will equal a +100% modifier. But what if you want to apply mods multiplicatively?
+First, you should carefully consider if you truly want multiplicative modifiers. Here’s some things to consider.
+They are unintuitive to the average user, as two +50% damage buffs equal +125% instead of +100%.
They lead to “power explosion”, where stacking buffs in the right way can turn characters into unstoppable forces
Doing purely-additive multipliers allows you to better control the balance of your game. Conversely, doing multiplicative multipliers enables very fun build-crafting where smart usage of buffs and skills can turn you into a one-shot powerhouse. Each has its place.
+The best design practice for multiplicative buffs is to divide your multipliers into “tiers”, where each tier is applied separately. You can easily do this with multiple check calls.
damage = damage
+damage = handler.check(damage, 'damage')
+damage = handler.check(damage, 'empower')
+damage = handler.check(damage, 'radiant')
+damage = handler.check(damage, 'overpower')
+Sometimes you only want to apply the strongest modifier to a stat. This is supported by the optional strongest bool arg in the handler’s check method
def take_damage(self, source, damage):
+ _damage = self.buffs.check(damage, 'taken_damage', strongest=True)
+ self.db.health -= _damage
+Apply the buff, take damage, and watch the thorns buff do its work!
+There are two helper methods on the handler that allow you to get useful buff information back.
+view: Returns a dictionary of tuples in the format {buffkey: (buff.name, buff.flavor)}. Finds all buffs by default, but optionally accepts a dictionary of buffs to filter as well. Useful for basic buff readouts.
view_modifiers(stat): Returns a nested dictionary of information on modifiers that affect the specified stat. The first layer is the modifier type (add/mult/div) and the second layer is the value type (total/strongest). Does not return the buffs that cause these modifiers, just the modifiers themselves (akin to using handler.check but without actually modifying a value). Useful for stat sheets.
You can also create your own custom viewing methods through the various handler getters, which will always return the entire buff object.
+They have customizable key, name, and flavor strings.
They have a duration (float), and automatically clean-up at the end. Use -1 for infinite duration, and 0 to clean-up immediately. (default: -1)
They have a tickrate (float), and automatically tick if it is greater than 1 (default: 0)
They can stack, if maxstacks (int) is not equal to 1. If it’s 0, the buff stacks forever. (default: 1)
They can be unique (bool), which determines if they have a unique namespace or not. (default: True)
They can refresh (bool), which resets the duration when stacked or reapplied. (default: True)
They can be playtime (bool) buffs, where duration only counts down during active play. (default: False)
They also always store some useful mutable information about themselves in the cache:
+Buffs also have a few useful properties:
+owner: The object this buff is attached to
ticknum: How many ticks the buff has gone through
timeleft: How much time is remaining on the buff
ticking/stacking: If this buff ticks/stacks (checks tickrate and maxstacks)
Buffs always store some useful mutable information about themselves in the cache (what is stored on the owning object’s database attribute). A buff’s cache corresponds to {buffkey: buffcache}, where buffcache is a dictionary containing at least the information below:
ref (class): The buff class path we use to construct the buff.
start (float): The timestamp of when the buff was applied.
source (Object): If specified; this allows you to track who or what applied the buff.
prevtick (float): The timestamp of the previous tick.
duration (float): The cached duration. This can vary from the class duration, depending on if the duration has been modified (paused, extended, shortened, etc).
tickrate (float): The buff’s tick rate. Cannot go below 0. Altering the tickrate on an applied buff will not cause it to start ticking if it wasn’t ticking before. (pause and unpause to start/stop ticking on existing buffs)
stacks (int): How many stacks they have.
paused (bool): Paused buffs do not clean up, modify values, tick, or fire any hook methods.
You can always access the raw cache dictionary through the cache attribute on an instanced buff. This is grabbed when you get the buff through
-a handler method, so it may not always reflect recent changes you’ve made, depending on how you structure your buff calls. All of the above
-mutable information can be found in this cache, as well as any arbitrary information you pass through the handler add method (via to_cache).
Sometimes you will want to dynamically update a buff’s cache at runtime, such as changing a tickrate in a hook method, or altering a buff’s duration.
+You can do so by using the interface buff.cachekey. As long as the attribute name matches a key in the cache dictionary, it will update the stored
+cache with the new value.
If there is no matching key, it will do nothing. If you wish to add a new key to the cache, you must use the buff.update_cache(dict) method,
+which will properly update the cache (including adding new keys) using the dictionary provided.
++Example: You want to increase a buff’s duration by 30 seconds. You use
+buff.duration += 30. This new duration is now reflected on both the instance and the cache.
The buff cache can also store arbitrary information. To do so, pass a dictionary through the handler add method (handler.add(BuffClass, to_cache=dict)),
+set the cache dictionary attribute on your buff class, or use the aforementioned buff.update_cache(dict) method.
++Example: You store
+damageas a value in the buff cache and use it for your poison buff. You want to increase it over time, so you usebuff.damage += 1in the tick method.
Mod objects consist of only four values, assigned by the constructor in this order:
stat: The stat you want to modify. When check is called, this string is used to find all the mods that are to be collected.
mod: The modifier. Defaults are ‘add’ and ‘mult’. Modifiers are calculated additively, and in standard arithmetic order (see _calculate_mods for more)
mod: The modifier. Defaults are add (addition/subtraction), mult (multiply), and div (divide). Modifiers are calculated additively (see _calculate_mods for more)
value: How much value the modifier gives regardless of stacks
perstack: How much value the modifier grants per stack, INCLUDING the first. (default: 0)
perstack: How much value the modifier grants per stack, INCLUDING the first. (default: 0)
The most basic way to add a Mod to a buff is to do so in the buff class definition, like this:
class DamageBuff(BaseBuff):
@@ -312,8 +378,7 @@ never permanently change a stat modified by a buff. To remove the modification,
An advanced way to do mods is to generate them when the buff is initialized. This lets you create mods on the fly that are reactive to the game state.
class GeneratedStatBuff(BaseBuff):
...
- def __init__(self, handler, buffkey, cache={}) -> None:
- super().__init__(handler, buffkey, cache)
+ def at_init(self, *args, **kwargs) -> None:
# Finds our "modgen" cache value, and generates a mod from it
modgen = list(self.cache.get("modgen"))
if modgen:
@@ -367,7 +432,7 @@ example, if you want a buff that makes the player take more damage when they are
class FireSick(BaseBuff):
...
def conditional(self, *args, **kwargs):
- if self.owner.buffs.get_by_type(FireBuff):
+ if self.owner.buffs.has(FireBuff):
return True
return False
@@ -382,6 +447,7 @@ conditionals are checked each tick.
remove/dispel: Allows you to remove or dispel the buff. Calls at_remove/at_dispel, depending on optional arguments.
pause/unpause: Pauses and unpauses the buff. Calls at_pause/at_unpause.
reset: Resets the buff’s start to the current time; same as “refreshing” it.
+alter_cache: Updates the buff’s cache with the {key:value} pairs in the provided dictionary. Can overwrite default values, so be careful!
@@ -432,14 +498,22 @@ file will be overwritten, so edit that file rather than this one.
Apply a Buff
Get Buffs
Remove Buffs
-Check Modifiers
+Check Modifiers
+
Trigger Buffs
Ticking
Context
+Viewing
Creating New Buffs
-- Basics
+- Basics
+
- Modifiers
diff --git a/docs/1.0-dev/_modules/evennia/commands/default/general.html b/docs/1.0-dev/_modules/evennia/commands/default/general.html
index 366ff8630e..e5795324c7 100644
--- a/docs/1.0-dev/_modules/evennia/commands/default/general.html
+++ b/docs/1.0-dev/_modules/evennia/commands/default/general.html
@@ -432,7 +432,7 @@
"{}|n".format(utils.crop(raw_ansi(item.db.desc or ""), width=50) or ""),
)
string = f"|wYou are carrying:\n{table}"
- self.caller.msg(string)
+ self.caller.msg(text=(string, {"type": "inventory"}))| 1 | 2 | 3 |
| 4 | 5 | 6 |