Some people have expressed interest in my loggers, so here's the Penn version (I'll add the Rhost version later).
This isn't actually anything like super clever or advanced/special code, its really pretty basic and easy, so its not a big deal. But it has a dramatic and positive effect on those games which like logs.
Some of the key features:
- By default it ignores lines that have 'OOC' in the first word, though this can be turned off.
- It logs everything it hears, but if you make a mistake in a pose, you can simply +log/undo to delete the last entry and repose.
- You can +log/show with an argument of like '5' to see just the last 5 poses, useful if you disconnect and need reposes without anyone having to repose to you.
- It formats your logs for wiki output (will need to be customized for your game's particulars)
On my games, I modify the room parent so the @conformat actually changes get(%i0/shortdesc) to be: objeval(%i0,u(%i0/shortdesc)) for the express purposes of these loggers use their shortdesc to report their on/off status brightly to avoid confusion.
The usage is pretty simple: @create an object, drop it, +log/make object, and voila. Its now a logger. +log/on object and pose away. +log/capture is a quick shortcut command to set all the metadata for the log, or you can set them individually. Then +log/wiki
On the parent you'll want to modify SHOW_HEADER_WIKI to match whatever the wikicode your logs need for your wiki.
This is the parent:
-- START --
@create Logging Parent; LP
@set Logging Parent; LP = NO_COMMAND
&AHEAR Logging Parent; LP=@include me/CHECK_INCLUDE_OOC[v(include_ooc)];@include me/CHECK_CONNECT;&log`[inc(after(last(sortby(sort_log,lattr(me/LOG`*))),`))] me=[secs()] %0
@set Logging Parent; LP/AHEAR=no_command prefixmatch
&CHECK_CONNECT Logging Parent; LP=@break strmatch(%0,* has connected.);@break strmatch(%0,* has disconnected.);@break strmatch(%0,* has reconnected.);@break strmatch(%0,* has partially disconnected)
&CHECK_INCLUDE_OOC0 Logging Parent; LP=@break strmatch(first(%0),*OOC*)
&CHECK_INCLUDE_OOC1 Logging Parent; LP=
&DESCRIBE Logging Parent; LP=Status: [ifelse(v(logging),[ansi(hg,ON)],[ansi(hr,OFF)])]%ROOC Included? [ifelse(v(include_ooc),[ansi(hg,YES)],[ansi(hr,NO)])]%R%R[ansi(hw,Scene Information:)]%R%T[ansi(hw,Summary)]: [get(me/SCENE`SUMMARY)]%r%t[ansi(hw,Date)]: [get(me/SCENE`DATE)]%r%t[ansi(hw,Cast)]: [iter(get(me/SCENE`CAST),name(##))]%R%t[ansi(hw,Location Name)]: [get(me/SCENE`LOCATION)]%R%t[ansi(hw,Location Description)]: [get(me/SCENE`LOCATIONDESC)]%R%R[ansi(hw,Log entries recorded)]: [words(lattr(me/LOG`))]
@set Logging Parent; LP/DESCRIBE=no_command visual prefixmatch public nearby
&DO-SET-LOG-OOC Logging Parent; LP=&include_ooc me=[not(get(me/include_ooc))];@remit %l=[ansi(hy,OOC)]: [name(me)] is now set [ifelse(v(include_ooc),[ansi(hg,TO)] include OOC communication,[ansi(hr,TO NOT)] include OOC communication)].
&DO-SHOW-LOG Logging Parent; LP=@dol/inline HEADER [setq(0,sortby(sort_log,lattr(me/LOG`*)))][ifelse(t(%2),extract(%q0,mul(%2,-1),%2),%q0)] FOOTER={@pemit %0=[switch(%i0,HEADER,u(SHOW_HEADER_%1),FOOTER,u(SHOW_FOOTER_%1),u(SHOW_LOG_%1,%i0))]}
&DO-START-LOG Logging Parent; LP=&logging me=1;@listen me=*;@remit loc(me)=[ansi(hy,OOC)]: This scene is now being logged by [ansi(hw,name(me))].
&DO-STOP-LOG Logging Parent; LP=&logging me=0;@remit loc(me)=[ansi(hy,OOC)]: This scene is no longer being logged by [ansi(hw,name(me))].
&DO-UNDO-LOG Logging Parent; LP=&log`[after(last(sortby(sort_log,lattr(me/LOG`*))),`)] me;@pemit/contents loc(me)=[ansi(hw,OOC)]: The last entry in the log has been undone.
&INCLUDE_OOC Logging Parent; LP=0
&LISTEN Logging Parent; LP=*
@set Logging Parent; LP/LISTEN=no_command prefixmatch
&LOG Logging Parent; LP=
&LOGGING Logging Parent; LP=0
&MESSAGE_LOGGING0 Logging Parent; LP=[ansi(y,OFF)]
&MESSAGE_LOGGING1 Logging Parent; LP=[ansi(hg,ON)] [ansi(hr,- SCENE IS BEING LOGGED)]
&SHORTDESC Logging Parent; LP=is currently [u(message_logging[v(logging)])].
&SHOW_FOOTER_PLAIN Logging Parent; LP=[line_with_text([ansi(hw,end of log)])]
&SHOW_FOOTER_WIKI Logging Parent; LP=[line_with_text([ansi(hw,end of log)])]
&SHOW_HEADER_PLAIN Logging Parent; LP=[line_with_text([ansi(hw,[name(me)]'s Log)])]
&SHOW_HEADER_WIKI Logging Parent; LP=[line_with_text([ansi(hw,[name(me)]'s Log)])]%r[[include LogInfoBox%r|summary=[get(me/SCENE`SUMMARY)]%r|date=[get(me/SCENE`DATE)]%R|location=[get(me/SCENE`LOCATION)]%r|related=If there are no related logs, put 'None', -- please don't leave blank! [!-- IMPORTANT: The formatting MUST be: [http://marvel1963mush.wikidot.com/log:name NameOfLogGoesHere] --]%r|themesong=None%r]]%r[[include LogPlayerTop]]%r[iter(get(me/SCENE`CAST),[[include LogIcon name=[lcstr(name(%i0))]]],%b,%r)]%r[[include LogPlayerBottom]]%R%R====%R%R
&SHOW_LOG_PLAIN Logging Parent; LP=[setq(0,get(me/%0))][ansi(hx,%[[timefmt($H:$M:$S,first(%q0))]%])] [rest(%q0)]
&SHOW_LOG_WIKI Logging Parent; LP=[rest(get(me/%0))]%r%r*%r
&SORT_LOG Logging Parent; LP=comp(after(%0,`),after(%1,`),N)
-- END --
This is the master room: note the last command, set @VP to the dbref of the parent:
-- START --
@create Logging Commands; LC
@lock/Use Logging Commands; LC=IS_APPROVED/1
@lset Logging Commands; LC/Use=no_inherit
@set Logging Commands; LC = TRUST
@set Logging Commands; LC = WIZARD
&CMD-+LOG/CAPTURE Logging Commands; LC=$+log/capture *:@include me/DO_CHECK_BASIC;&scene`cast %q<logger>=[lvplayers(%l)];&scene`location %q<logger>=[name(%l)];&scene`locationdesc %q<logger>=[ifelse(hasflag(%l,temporary),get(%l/tempdesc),get(%l/desc))];&scene`date %q<logger>=[ictime()];@pemit %#=Captured.
&CMD-+LOG/CAST Logging Commands; LC=$+log/cast *=*:@include me/DO_CHECK_BASIC;@eval [setq(cast,iter(%1,pmatch(%i0)))];@break strmatch(%q<cast>,*#-1*)={@pemit %#=I can't find anyone named: [iter(%1,ifelse(t(pmatch(%i0)),,%i0))].};&SCENE`CAST %q<logger>=%q<cast>;@pemit %#=[ansi(hy,OOC)]: Cast set to: [itemize(iter(%q<cast>,name(%i0),%b,|),|)].
&CMD-+LOG/DATE Logging Commands; LC=$+log/date *=*:@include me/DO_CHECK_BASIC;&scene`summary %q<logger>=[ifelse(strmatch(lcstr(%1),today),ictime(),%1)];@pemit %#=[ansi(hy,OOC: Date set to: [ansi(hw,%1)].
&CMD-+LOG/LOCDESC Logging Commands; LC=$+log/location/desc *=*:@include me/DO_CHECK_BASIC;&SCENE`LOCATIONDESC %q<logger>=[switch(%1,here,objeval(%#,u(%l/desc)),%l)];@pemit %#=[ansi(hy,OOC)]: Location description set to: [get(%q<logger>/SCENE`LOCATIONDESC)].;
&CMD-+LOG/LOCNAME Logging Commands; LC=$+log/location/name *=*:@include me/DO_CHECK_BASIC;&SCENE`LOCATION %q<logger>=[switch(%1,here,name(%l),%1)];@pemit %#=[ansi(hy,OOC)]: Location name set to: [get(%q<logger>/SCENE`LOCATION)].;
&CMD-+LOG/MAKE Logging Commands; LC=$+log/make *:@eval [setq(logger,locate(%#,%0,Tn))];@break hastype(%q<logger>,PLAYER)={@pemit %#=You can't make a player a logger!};@assert t(%q<logger>)={@pemit %#=I can't find an object named [ansi(hw,%0)].};@break match(parent(%q<logger>),%vp)={@pemit %#=That object is already a scene logger.};@parent %q<logger>=%vp;&LOGGING %q<logger>=0;@lock/listen %q<logger>=logging/1;@listen %q<logger>=*;@pemit %#=You have made [ansi(hw,name(%q<logger>))] a Scene Logger.;
&CMD-+LOG/OFF Logging Commands; LC=$+log/off *:@include me/DO_CHECK_BASIC;@assert get(%q<logger>/logging)={@pemit %#=[ansi(hw,name(%q<logger>))] is not logging this scene.};@tri %q<logger>/DO-STOP-LOG=%q<logger>
&CMD-+LOG/ON Logging Commands; LC=$+log/on *:@include me/DO_CHECK_CONTROLS;@break get(%q<logger>/logging)={@pemit %#=[ansi(hw,name(%q<logger>))] is already logging this scene.};@tri %q<logger>/DO-START-LOG=%q<logger>
&CMD-+LOG/OOC Logging Commands; LC=$+log/ooc *:@include me/DO_CHECK_CONTROLS;@tri %q<logger>/DO-SET-LOG-OOC=%#
&CMD-+LOG/RECLAIM Logging Commands; LC=$+log/reclaim:@pemit %#=[ansi(hw,OOC)]: Reclaiming all loggers...;@dol children(%vp)={@assert strmatch(%#,owner(##));&logging ##=0;@pemit %#=... [ansi(hw,name(##))];@tel ##=%#}
&CMD-+LOG/RETURN Logging Commands; LC=$+log/return *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-STOP-LOG=%q<logger>;@tel %q<logger>=owner(%q<logger>);@mail [name(owner(%q<logger>))]=Logger Returned/[name(%#)] has returned your logger to you from [name(%l)];
&CMD-+LOG/SHOW Logging Commands; LC=$+log/show *:@break strmatch(%0,*=*);@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,plain
&CMD-+LOG/SHOW-LAST Logging Commands; LC=$+log/show *=*:@assert isint(%1)={@pemit %#=The second argument is expected to be a number, got [ansi(hw,%1)]};@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,plain,%1
&CMD-+LOG/SUMMARY Logging Commands; LC=$+log/summary *=*:@include me/DO_CHECK_BASIC;&SCENE`SUMMARY %q<logger>=%1;@pemit %#=[ansi(hy,OOC)]: Summary set to: [ansi(hw,%1)].
&CMD-+LOG/UNDO Logging Commands; LC=$+log/undo *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-UNDO-LOG=%q<logger>
&CMD-+LOG/WIKI Logging Commands; LC=$+LOG/wiki *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,wiki
&CMD-+LOG/WIPE Logging Commands; LC=$+log/wipe *:@include me/DO_CHECK_CONTROLS;@wipe %q<logger>/LOG`*;@wipe %q<logger>/SCENE`*;@pemit %#=[ansi(hw,name(%q<logger>))] has had its current log wiped.
&CMD-+LOG/POSE Logging Commands; LC=$+log/pose *=*:@include me/DO_CHECK_BASIC;@tri %q<logger>/ahear=%1;@pemit %#=[ansi(hw,OOC)]: Pose added.
&DESCRIBE Logging Commands; LC=
@set Logging Commands; LC/DESCRIBE=no_command visual prefixmatch public nearby
&DO_CHECK_BASIC Logging Commands; LC=@eval [setq(logger,locate(%#,%0,Tni))];@assert t(%q<logger>)={@pemit %#=I can't find an object named [ansi(hw,%0)].};@assert match(parent(%q<logger>),%vp)={@pemit %#=That object is not a Scene Logger.};
&DO_CHECK_CONTROLS Logging Commands; LC=@include me/DO_CHECK_BASIC;@assert controls(%#,%q<logger>)={@pemit %#=You do not control that scene logger.};
&IS_APPROVED Logging Commands; LC=not(strmatch(get(%#/status),NEW))
&UFAIL Logging Commands; LC=You must be approved to use the logging system.
@set Logging Commands; LC/UFAIL=no_command prefixmatch
@VP Logging Commands; LC=#396
-- END --
Here's the help file:
-- START --
The +log system is used for logging of scenes in such a way that it minimizes the amount of stuff you have to clean before posting, not to mention making sure you post the log in the correct format.
The scene revolves around Scene Loggers, which are plain objects that you own and re-use from one scene to the next. You never really need to have more then one. To create a <logger>, type: @create <logger> and then drop it. You can make this a scene <logger> then by typing: +log/make <logger>. Once you drop the <logger>, the following commands are available:
+log/on <logger> - activate logging
+log/off <logger> - deactivate logging
+log/ooc <logger> - toggle if OOC communication is logged. Default: off.
+log/show <logger>=X - show the current log or X lines of it. (=X is optional.).
+log/wipe <logger> - clear the current log.
+log/undo <logger> - remove the last entry in the log. Useful to repose a correction.
+log/pose <logger>=<pose> - add a pose directly to the logger
Before posting, you can store the scene information with:
+log/summary <logger>=description - set summary of current scene
+log/cast <logger>=person1 person2 .. personN - set participants in log
+log/location/name <logger>=name - name of place where log takes place. 'here' gets current room name.
+log/location/desc <logger>=text - description of place where log takes place. 'here' takes current room desc.
+log/capture <logger> - cast, location/name and location/desc all in one handy command
When you're ready to post your log, +log/wiki <logger> will show you the current log and wiki formatting.
When done, just 'get' your <logger> and take it with you. If you see someone's <logger> laying around, +log/return <logger> will return it to their inventory.
If you've lost your logger, +log/reclaim will teleport ALL of your loggers to your inventory whether they're in use or not.
-- END --
This is the Rhost version of the code. It probably would require very minimal tweaking to work on MUX but I don't know.
This is the Rhost version of the code, though it requires the penn_setq option to be set to on.
The logging parent:
--START--
@create Logging Parent; LP=10
@Ahear Logging Parent; LP=@include me/CHECK_INCLUDE_OOC[v(include_ooc)];@include me/CHECK_CONNECT;&log-[inc(after(last(sortby(sort_log,lattr(me/LOG-*))),-))] me=[secs()] %0
&CHECK_CONNECT Logging Parent; LP=@break strmatch(%0,* has connected.);@break strmatch(%0,* has disconnected.);@break strmatch(%0,* has reconnected.);@break strmatch(%0,* has partially disconnected)
&CHECK_INCLUDE_OOC0 Logging Parent; LP=@break strmatch(first(%0),*OOC*)
@Desc Logging Parent; LP=Status: [ifelse(v(logging),[ansi(hg,ON)],[ansi(hr,OFF)])]%ROOC Included? [ifelse(v(include_ooc),[ansi(hg,YES)],[ansi(hr,NO)])]%R%R[ansi(hw,Scene Information:)]%R%T[ansi(hw,Summary)]: [get(me/SCENE-SUMMARY)]%r%t[ansi(hw,Date)]: [get(me/SCENE-DATE)]%r%t[ansi(hw,Cast)]: [iter(get(me/SCENE-CAST),name(##))]%R%t[ansi(hw,Location Name)]: [get(me/SCENE-LOCATION)]%R%t[ansi(hw,Location Description)]: [get(me/SCENE-LOCATIONDESC)]%R%R[ansi(hw,Log entries recorded)]: [words(lattr(me/LOG-))]
&DO-SET-LOG-OOC Logging Parent; LP=&include_ooc me=[not(get(me/include_ooc))];@remit %l=[ansi(hy,OOC)]: [name(me)] is now set [ifelse(v(include_ooc),[ansi(hg,TO)] include OOC communication,[ansi(hr,TO NOT)] include OOC communication)].
&DO-SHOW-LOG Logging Parent; LP=@dol/inline HEADER [setq(0,sortby(sort_log,lattr(me/LOG-*)))][ifelse(t(%2),extractword(%q0,mul(%2,-1),%2),%q0)] FOOTER={@pemit %0=[switch(%d0,HEADER,u(SHOW_HEADER_%1),FOOTER,u(SHOW_FOOTER_%1),u(SHOW_LOG_%1,%d0))]}
&DO-START-LOG Logging Parent; LP=&logging me=1;@listen me=*;@remit loc(me)=[ansi(hy,OOC)]: This scene is now being logged by [ansi(hw,name(me))].
&DO-STOP-LOG Logging Parent; LP=&logging me=0;@remit loc(me)=[ansi(hy,OOC)]: This scene is no longer being logged by [ansi(hw,name(me))].
&DO-UNDO-LOG Logging Parent; LP=&log-[after(last(sortby(sort_log,lattr(me/LOG-*))),-)] me;@pemit/contents loc(me)=[ansi(hw,OOC)]: The last entry in the log has been undone.
&INCLUDE_OOC Logging Parent; LP=0
@Listen Logging Parent; LP=*
&LOGGING Logging Parent; LP=0
&MESSAGE_LOGGING0 Logging Parent; LP=[ansi(y,OFF)]
&MESSAGE_LOGGING1 Logging Parent; LP=[ansi(hg,ON)] [ansi(hr,- SCENE IS BEING LOGGED)]
&SHORTDESC Logging Parent; LP=is currently [u(message_logging[v(logging)])].
&SHOW_FOOTER_PLAIN Logging Parent; LP=[ui-footer([ansi(hw,end of log)])]
&SHOW_FOOTER_WIKI Logging Parent; LP=[ui-footer([ansi(hw,end of log)])]
&SHOW_HEADER_PLAIN Logging Parent; LP=[ui-header([ansi(hw,[name(me)]'s Log)])]
&SHOW_HEADER_WIKI Logging Parent; LP=[ui-header([ansi(hw,[name(me)]'s Log)])]%r[[include logheader%r|summary=[get(me/SCENE-SUMMARY)]%r|location=[get(me/SCENE-LOCATION)]%r|desc=[get(me/SCENE-LOCATIONDESC)]%R]]%r%r[[include logcastbegin]]%r[iter(get(me/SCENE-CAST),[[include logccon name=[lcstr(name(%i0))]]],%b,%r)]%r[[include logcastend]]%r%r[[include logstart]]%R%R====%R%R
&SHOW_LOG_PLAIN Logging Parent; LP=[setq(0,get(me/%0))][ansi(hx,%[[timefmt($02H:$02T:$02S $P,first(%q0))]%])] [rest(%q0)]
&SHOW_LOG_WIKI Logging Parent; LP=[rest(get(me/%0))]%r%r-----%r%r
&SORT_LOG Logging Parent; LP=ncomp(after(%0,-),after(%1,-))
@set Logging Parent; LP=NO_COMMAND
--STOP--
The master room commands: be sure to set @VP to the dbref of above:
--START--
@create Logging Commands; LC=10
&CMD-+LOG/CAPTURE Logging Commands; LC=$+log/capture *:@include me/DO_CHECK_BASIC;&scene-cast %q<logger>=[lcon(%l/player)];&scene-location %q<logger>=[name(%l)];&scene-locationdesc %q<logger>=[ifelse(hasflag(%l,temporary),get(%l/tempdesc),get(%l/desc))];&scene-date %q<logger>=[time()];@pemit %#=Captured.
&CMD-+LOG/CAST Logging Commands; LC=$+log/cast *=*:@include me/DO_CHECK_BASIC;@eval [setq(cast,iter(%1,pmatch(%i0)))];@break strmatch(%q<cast>,*#-1*)={@pemit %#=I can't find anyone named: [iter(%1,ifelse(t(pmatch(%i0)),,%i0))].};&SCENE-CAST %q<logger>=%q<cast>;@pemit %#=[ansi(hy,OOC)]: Cast set to: [itemize(iter(%q<cast>,name(%i0),%b,|),|)].
&CMD-+LOG/DATE Logging Commands; LC=$+log/date *=*:@include me/DO_CHECK_BASIC;&scene-summary %q<logger>=[ifelse(strmatch(lcstr(%1),today),time(),%1)];@pemit %#=[ansi(hy,OOC: Date set to: [ansi(hw,%1)].
&CMD-+LOG/LOCDESC Logging Commands; LC=$+log/location/desc *=*:@include me/DO_CHECK_BASIC;&SCENE-LOCATIONDESC %q<logger>=[switch(%1,here,objeval(%#,u(%l/desc)),%l)];@pemit %#=[ansi(hy,OOC)]: Location description set to: [get(%q<logger>/SCENE-LOCATIONDESC)].;
&CMD-+LOG/LOCNAME Logging Commands; LC=$+log/location/name *=*:@include me/DO_CHECK_BASIC;&SCENE-LOCATION %q<logger>=[switch(%1,here,name(%l),%1)];@pemit %#=[ansi(hy,OOC)]: Location name set to: [get(%q<logger>/SCENE`LOCATION)].;
&CMD-+LOG/MAKE Logging Commands; LC=$+log/make *:@eval [setq(logger,locate(%#,%0,Tn))];@break hastype(%q<logger>,PLAYER)={@pemit %#=You can't make a player a logger!};@assert t(%q<logger>)={@pemit %#=I can't find an object named [ansi(hw,%0)].};@break match(parent(%q<logger>),%vp)={@pemit %#=That object is already a scene logger.};@parent %q<logger>=%vp;&LOGGING %q<logger>=0;@lock/use %q<logger>=logging/1;@set %q<logger>=!no_command;@listen %q<logger>=*;@pemit %#=You have made [ansi(hw,name(%q<logger>))] a Scene Logger.;
&CMD-+LOG/OFF Logging Commands; LC=$+log/off *:@include me/DO_CHECK_BASIC;@assert get(%q<logger>/logging)={@pemit %#=[ansi(hw,name(%q<logger>))] is not logging this scene.};@tri %q<logger>/DO-STOP-LOG=%q<logger>
&CMD-+LOG/ON Logging Commands; LC=$+log/on *:@include me/DO_CHECK_CONTROLS;@break get(%q<logger>/logging)={@pemit %#=[ansi(hw,name(%q<logger>))] is already logging this scene.};@tri %q<logger>/DO-START-LOG=%q<logger>
&CMD-+LOG/OOC Logging Commands; LC=$+log/ooc *:@include me/DO_CHECK_CONTROLS;@tri %q<logger>/DO-SET-LOG-OOC=%#
&CMD-+LOG/RECLAIM Logging Commands; LC=$+log/reclaim:@pemit %#=[ansi(hw,OOC)]: Reclaiming all loggers...;@dol children(%vp)={@assert strmatch(%#,owner(##));&logging ##=0;@tel ##=%#}
&CMD-+LOG/RETURN Logging Commands; LC=$+log/return *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-STOP-LOG=%q<logger>;@tel %q<logger>=owner(%q<logger>);mail/send [name(owner(%q<logger>))]=Logger Returned//[name(%#)] has returned your logger to you from [name(%l)];
&CMD-+LOG/SHOW Logging Commands; LC=$+log/show *:@break strmatch(%0,*=*);@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,plain
&CMD-+LOG/SHOW-LAST Logging Commands; LC=$+log/last *=*:@assert isint(%1)={@pemit %#=The second argument is expected to be a number, got [ansi(hw,%1)]};@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,plain,%1
&CMD-+LOG/SUMMARY Logging Commands; LC=$+log/summary *=*:@include me/DO_CHECK_BASIC;&SCENE-SUMMARY %q<logger>=%1;@pemit %#=[ansi(hy,OOC)]: Summary set to: [ansi(hw,%1)].
&CMD-+LOG/UNDO Logging Commands; LC=$+log/undo *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-UNDO-LOG=%q<logger>
&CMD-+LOG/WIKI Logging Commands; LC=$+LOG/wiki *:@include me/DO_CHECK_BASIC;@tri %q<logger>/DO-SHOW-LOG=%#,wiki
&CMD-+LOG/WIPE Logging Commands; LC=$+log/wipe *:@include me/DO_CHECK_CONTROLS;@wipe %q<logger>/LOG-*;@wipe %q<logger>/SCENE-*;@pemit %#=[ansi(hw,name(%q<logger>))] has had its current log wiped.
&CMD-+LOG/POSE Logging Commands; LC=$+log/pose *=*:@include me/DO_CHECK_BASIC;@tri %q<logger>/ahear=%1;@pemit %#=[ansi(hw,OOC)]: Pose added.
&DO_CHECK_BASIC Logging Commands; LC=@eval [setq(logger,locate(%#,%0,Tni))];@assert t(%q<logger>)={@pemit %#=I can't find an object named [ansi(hw,%0)].};@assert match(parent(%q<logger>),%vp)={@pemit %#=That object is not a Scene Logger.};
&DO_CHECK_CONTROLS Logging Commands; LC=@include me/DO_CHECK_BASIC;@assert controls(%#,%q<logger>)={@pemit %#=You do not control that scene logger.};
&IS_APPROVED Logging Commands; LC=[!hasflag(%#,wanderer)]
@Ufail Logging Commands; LC=You must be approved to use the logging system.
@set Logging Commands; LC=SHOWFAILCMD INHERIT STOP
@VP Logging Commands; LC=#359
--STOP--
Help file is the same as Penn version.