anchor.diff:  
   % GURPS
   
  -gurps(#{reply:=RT, ping:=P, nick:=Nick, params:=Params, selector:=Selector}) ->
  -	case Params of
  -		[] ->
  -			Result = dice3("3d6", true),
  -			send_to_all(RT, P, Nick, nicks(Selector), "3d6", Result);
  -		_ ->
  -			T = list_to_integer(hd(Params)),
  -			Comment = case string:join(tl(Params), " ") of
  -				[] -> [];
  -				X -> [X,$:,$ ]
  -			end,
  -			Targets = if
  -				T >= 16 -> [6, 16,   17];
  -				T == 15 -> [5, 15,   16];
  -				T >=  7 -> [4,  T,   16];
  -				true    -> [4,  T, T+10]
  -			end,
  -			Formatter = fun
  -				([false,false,false]) -> [Comment, "\x036\x02Critical Failure!\x03\x02"];
  -				([false,false, true]) -> [Comment, "\x035\x02Failure!\x03\x02"];
  -				([false, true, true]) -> [Comment, "\x033\x02Success!\x03\x02"];
  -				([ true, true, true]) -> [Comment, "\x0310\x02Critical Success!\x03\x02"]
  -			end,
  -			Result = dice3(lists:flatten(io_lib:format("3d6<=~w", [Targets])), true, Formatter),
  -			send_to_all(RT, P, Nick, nicks(Selector), io_lib:format("a GURPS test at skill ~b", [T]), Result)
  -	end.
  +gurps(#{reply:=RT, ping:=P, nick:=Nick, params:=[T,RawComment], selector:=Selector}) ->
  +	Comment = case RawComment of
  +		[] -> [];
  +		X -> [X,$:,$ ]
  +	end,
  +	Targets = if
  +		T >= 16 -> [6, 16,   17];
  +		T == 15 -> [5, 15,   16];
  +		T >=  7 -> [4,  T,   16];
  +		true    -> [4,  T, T+10]
  +	end,
  +	Formatter = fun
  +		([false,false,false]) -> [Comment, "\x036\x02Critical Failure!\x03\x02"];
  +		([false,false, true]) -> [Comment, "\x035\x02Failure!\x03\x02"];
  +		([false, true, true]) -> [Comment, "\x033\x02Success!\x03\x02"];
  +		([ true, true, true]) -> [Comment, "\x0310\x02Critical Success!\x03\x02"]
  +	end,
  +	Result = dice3(lists:flatten(io_lib:format("3d6<=~w", [Targets])), true, Formatter),
  +	send_to_all(RT, P, Nick, nicks(Selector), io_lib:format("a GURPS test at skill ~b", [T]), Result).
   
   % SHADOWRUN
   
  -srun(#{reply:=RT,ping:=P,nick:=Nick,params:=Params,selector:=Selector}) ->
  -	T = list_to_integer(hd(Params)),
  +srun(#{reply:=RT,ping:=P,nick:=Nick,params:=[T],selector:=Selector}) ->
   	{_, Dice} = rollraw(T, 6),
   	{One,FivePlus} = lists:foldl(fun(1, {O,F}) -> {O+1,F}; (N, {O,F}) when N >= 5 -> {O, F+1}; (_, D) -> D end, {0,0}, Dice),
   	Summary = io_lib:format("~b failure~s, ~b hit~s", [One, util:s(One), FivePlus, util:s(FivePlus)]),
  
positive.code: 
  % RTD
  
  rtd(#{reply:=Reply, ping:=Ping, nick:=Nick, selector:=Selector, params:=Params}) ->
  	Comment = case string:join(Params, " ") of
  		[] -> [];
  		X -> [X,$:,$ ]
  	end,
  
negative.code: 		true -> Summary
  	end,
  	send_to_all(RT, P, Nick, nicks(Selector), io_lib:format("a Shadowrun test with ~b dice", [T]), Reply).
  sredge(#{reply:=RT,ping:=P,nick:=Nick,params:=[T], selector:=Selector}) ->
  	{ExtraDice, Dice} = get_sr_edge(T, 0, []),
  	{One,FivePlus} = lists:foldl(fun(1, {O,F}) -> {O+1,F}; (N, {O,F}) when N >= 5 -> {O, F+1}; (_, D) -> D end, {0,0}, Dice),
  	Summary = io_lib:format("~b failure~s, ~b hit~s (rolled ~b six~s)", [One, util:s(One), FivePlus, util:s(FivePlus), ExtraDice, util:s(ExtraDice, "es")]),
  