<NME> recovery.cmvp
<BEF> ADDFILE
<MSG> 

git-svn-id: svn://192.168.1.10/public/CoffeeMud@12400 0d6f1817-ed0e-0410-87c9-987e46238f29

<DFF> @@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@
+@if?!CheckAuthCode?SYSOP=true@ @AddFile?/grinder/nopriv.cmvp@ @else@
+<html>
+<head>
+	<link rel="coffeemud icon" href="images/coffeemud.ico" >
+	<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">
+	<title>Recovery Charts</title>
+	<Script language=JavaScript>
+	<!--
+		function reload()
+		{
+			document.POOPY.submit();
+		}
+	//-->
+	</SCRIPT>
+    <script language=JavaScript>
+    <!--
+        function Clicked(action)
+        {
+            document.POOPY.action=action;
+            document.POOPY.submit();
+        }
+        function Refresh()
+        {
+            document.POOPY.action='control.cmvp';
+            document.POOPY.submit();
+        }
+    //-->
+    </script>
+</head>
+
+<body BGCOLOR=BLACK>
+	<TABLE WIDTH=100% BORDER=0>
+	<TR>
+	<TD WIDTH=33% ALIGN=LEFT VALIGN=TOP></TD>
+	<TD WIDTH=33% ALIGN=CENTER VALIGN=TOP><IMG SRC="/grinder/images/grinder.gif" WIDTH=78 HEIGHT=122 ALT="" BORDER="0"></TD>
+	<TD WIDTH=33% ALIGN=RIGHT VALIGN=TOP>
+		<TABLE WIDTH=50% BORDER=1>
+			<TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>
+			<TR><TD><a href="javascript:Clicked('/grinder/loggedin.cmvp');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>
+			<TR><TD><A href="javascript:Clicked('/grinder/control.cmvp')"><FONT SIZE=-1 COLOR=WHITE><B>Control Panel</B></FONT></a></TD></TR>
+		</TABLE>
+	</TD>
+	</TR>
+	</TABLE>
+<FONT COLOR=WHITE>
+<h3>Stat Recovery Rates every 5 Ticks (20 seconds)</h3><P>
+<FORM  ACCEPT-CHARSET="UTF-8" NAME=POOPY TARGET=_top METHOD=POST ACTION="/grinder/recovery.cmvp">
+<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">
+<SELECT NAME=WHICH ONCHANGE="reload();">
+<OPTION VALUE=HP @if?CheckReqParm?WHICH=HP@SELECTED@endif@>Hit Points
+<OPTION VALUE=MN @if?CheckReqParm?WHICH=MN@SELECTED@endif@>Mana
+<OPTION VALUE=MV @if?CheckReqParm?WHICH=MV@SELECTED@endif@>Movement
+</SELECT>
+<TABLE WIDTH=100%>
+<TR>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SITTING=@CHECKED@endif@ NAME=SITTING ONCLICK="reload();">Sitting
+</TD>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SLEEPING=@CHECKED@endif@ NAME=SLEEPING ONCLICK="reload();">Sleeping
+</TD>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SWIMMING=@CHECKED@endif@ NAME=SWIMMING ONCLICK="reload();">Swimming
+</TD>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?FLYING=@CHECKED@endif@ NAME=FLYING ONCLICK="reload();">Flying
+</TD>
+</TR><TR>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?RIDING=@CHECKED@endif@ NAME=RIDING ONCLICK="reload();">Riding something
+</TD>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX NAME=HUNGRY @if?!CheckReqParm?HUNGRY=@CHECKED@endif@ ONCLICK="reload();">Hungry
+</TD>
+<TD WIDTH=25%><FONT COLOR=WHITE>
+<INPUT TYPE=CHECKBOX NAME=THIRSTY @if?!CheckReqParm?THIRSTY=@CHECKED@endif@ ONCLICK="reload();">Thirsty
+</TD>
+<TD WIDTH=25%>
+</TD>
+</TR></TABLE>
+<P>
+Chart below shows: [average pool amount] / [the gain] = [the number of 20 second periods to recover from 0] for each level and relevant stat amount.
+<BR>
+	@StatRejuvCharts@
+</FORM>
+</BODY>
+</HTML>
+@endif@
+@endif@

{'commit': 'diff --git a/CHANGES b/CHANGES\nindex f0d049fce1..401a17e1aa 100644\n--- a/CHANGES\n+++ b/CHANGES\n@@ -1,7 +1,7 @@\n # Build 5.8.4 Released 11/?/2014\n    *. Database Schema Updated for CMBKLG.  See the Installation Guide about running DBUpgrade.\n    1. Channels now save their back messages to the database for perpetual enjoyment. See DISABLE,CHANNELBACKLOG in coffeemud.ini.\n- \n+   2. Bit geeky, but exposed the Cross Class skill analysis and Recovery Rates analysis from MUDGrinder (char class and control panel respec)\n # Build 5.8.3 Release 10/27/2014\n    *. Database Schema Updated for CMCHAR.CMDESC and CMCHAR.CMCHID.  See the Installation Guide about running DBUpgrade.\n    1. (FakeDB): DBUpgrade is now application independent, and can handle big tables better.  See installation guide for new recommended usage.\ndiff --git a/coffeemud.ini b/coffeemud.ini\nindex 2501461406..21b3023689 100644\n--- a/coffeemud.ini\n+++ b/coffeemud.ini\n@@ -553,22 +553,22 @@ FORMULA_PVPDAMAGEWEAPONCRIT=(@x1 * (((@x2-10)/2.5)>0 * ((@x3-10)/2.5)>0 * ((@x3-\n # outside of combat and climbing.\n # @x1=constitution, @x2=level, @x3=hungry?1:0, @x4=thirsty?1:0, @x5=fatigued?0:1 \n # @x6=asleep?1:0, @x7=sitorride?1:0, @x8=flying?0:1, @x9=swimming?0:1\n-# Default is: 5+(((@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0))*@x2/9.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n-FORMULA_HITPOINTRECOVER=5+(((@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0))*@x2/9.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n+# Default is:           5+((@x2/2.0)+(@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n+FORMULA_HITPOINTRECOVER=5+((@x2/2.0)+(@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n \n # FORMULA_MANARECOVER is the formula applied every so-many ticks for recovery of mana\n # outside of combat and climbing.\n # @x1=int + wis, @x2=level, @x3=hungry?1:0, @x4=thirsty?1:0, @x5=fatigued?0:1 \n # @x6=asleep?1:0, @x7=sitorride?1:0, @x8=flying?0:1, @x9=swimming?0:1\n-# Default is: 25+(((@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0))*@x2/50.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n-FORMULA_MANARECOVER=25+((((@x1<44) - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0))*@x2/50.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n+# Default is:       25+((@x2/10)+((@x1/2.0) - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n+FORMULA_MANARECOVER=25+((@x2/10)+((@x1/2.0) - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) - (@xx/2.0*@x9))\n \n # FORMULA_MOVESRECOVER is the formula applied every so-many ticks for recovery of movement\n # outside of combat and climbing.\n # @x1=strength, @x2=level, @x3=hungry?1:0, @x4=thirsty?1:0, @x5=fatigued?0:1 \n # @x6=asleep?1:0, @x7=sitorride?1:0, @x8=flying?0:1, @x9=swimming?0:1\n-# Default is: 25+(((@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0))*@x2/10.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) + (@xx/4.0*@x8) - (@xx/2.0*@x9))\n-FORMULA_MOVESRECOVER=25+(((@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0))*@x2/10.0) + (@xx*@x6*.5) + (@xx/4.0*@x7) + (@xx/4.0*@x8) - (@xx/2.0*@x9))\n+# Default is:        25+((@x2/3.0)+(@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) + (@xx/4.0*@x8) - (@xx/2.0*@x9))\n+FORMULA_MOVESRECOVER=25+((@x2/3.0)+(@x1 - (@xx*@x3/2.0) - (@xx*@x4/2.0) - (@xx*@x5/2.0)) + (@xx*@x6*.7) + (@xx/4.0*@x7) + (@xx/4.0*@x8) - (@xx/2.0*@x9))\n \n ######################################################################\n # Miscellaneous Player related configuration variables\ndiff --git a/com/planet_ink/coffee_mud/WebMacros/CrossBaseClassAbilities.java b/com/planet_ink/coffee_mud/WebMacros/CrossBaseClassAbilities.java\nindex 47e58855ea..cdbd5328ed 100644\n--- a/com/planet_ink/coffee_mud/WebMacros/CrossBaseClassAbilities.java\n+++ b/com/planet_ink/coffee_mud/WebMacros/CrossBaseClassAbilities.java\n@@ -41,21 +41,11 @@ public class CrossBaseClassAbilities extends StdWebMacro\n \tpublic String runMacro(HTTPRequest httpReq, String parm)\r\n \t{\r\n \t\tfinal StringBuffer buf=new StringBuffer("");\r\n-\r\n-\t\tfinal Vector baseClasses=new Vector();\r\n-\t\tfor(final Enumeration c=CMClass.charClasses();c.hasMoreElements();)\r\n-\t\t{\r\n-\t\t\tfinal CharClass C=(CharClass)c.nextElement();\r\n-\t\t\tif(CMProps.isTheme(C.availabilityCode()))\r\n-\t\t\t{\r\n-\t\t\t\tif(!baseClasses.contains(C.baseClass()))\r\n-\t\t\t\t   baseClasses.addElement(C.baseClass());\r\n-\t\t\t}\r\n-\t\t}\r\n-\r\n-\t\tfor(int b=0;b<baseClasses.size();b++)\r\n+\t\tString baseClass=httpReq.getUrlParameter("BASECLASS");\r\n+\t\tif(baseClass==null) \r\n+\t\t\treturn " @break@";\r\n+\t\tif(baseClass.length()>0)\r\n \t\t{\r\n-\t\t\tfinal String baseClass=(String)baseClasses.elementAt(b);\r\n \t\t\tfinal Vector charClasses=new Vector();\r\n \t\t\tfor(final Enumeration c=CMClass.charClasses();c.hasMoreElements();)\r\n \t\t\t{\r\n@@ -124,23 +114,23 @@ public class CrossBaseClassAbilities extends StdWebMacro\n \t\t\tbuf.append("<BR><BR><BR><B><H3>"+baseClass+"</H3></B>\\n\\r");\r\n \t\t\tbuf.append("<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=1>\\n\\r");\r\n \t\t\tbuf.append("<TR>");\r\n-\t\t\tbuf.append("<TD><B>Skill</B></TD>");\r\n+\t\t\tbuf.append("<TD><B><FONT COLOR=WHITE>Skill</FONT></B></TD>");\r\n \t\t\tfor(int c=0;c<charClasses.size();c++)\r\n \t\t\t{\r\n \t\t\t\tfinal String charClass=(String)charClasses.elementAt(c);\r\n-\t\t\t\tbuf.append("<TD><B>"+charClass+"</B></TD>");\r\n+\t\t\t\tbuf.append("<TD><B><FONT COLOR=WHITE>"+charClass+"</FONT></B></TD>");\r\n \t\t\t}\r\n \t\t\tbuf.append("</TR>\\n\\r");\r\n \t\t\tfor(int a=0;a<sortedAbilities.size();a++)\r\n \t\t\t{\r\n \t\t\t\tfinal String able=(String)sortedAbilities.elementAt(a);\r\n-\t\t\t\tbuf.append("<TR><TD><B>"+able+"</B></TD>");\r\n+\t\t\t\tbuf.append("<TR><TD><B><FONT COLOR=WHITE>"+able+"</FONT></B></TD>");\r\n \t\t\t\tfor(int c=0;c<charClasses.size();c++)\r\n \t\t\t\t{\r\n \t\t\t\t\tfinal String charClass=(String)charClasses.elementAt(c);\r\n \t\t\t\t\tfinal int level=CMLib.ableMapper().getQualifyingLevel(charClass,true,able);\r\n \t\t\t\t\tif(level>=0)\r\n-\t\t\t\t\t\tbuf.append("<TD>"+level+"</TD>");\r\n+\t\t\t\t\t\tbuf.append("<TD><FONT COLOR=CYAN>"+level+"</FONT></TD>");\r\n \t\t\t\t\telse\r\n \t\t\t\t\t\tbuf.append("<TD><BR></TD>");\r\n \t\t\t\t}\r\ndiff --git a/com/planet_ink/coffee_mud/WebMacros/StatRejuvCharts.java b/com/planet_ink/coffee_mud/WebMacros/StatRejuvCharts.java\nindex 5c125c3196..608f00c3b9 100644\n--- a/com/planet_ink/coffee_mud/WebMacros/StatRejuvCharts.java\n+++ b/com/planet_ink/coffee_mud/WebMacros/StatRejuvCharts.java\n@@ -3,6 +3,7 @@ package com.planet_ink.coffee_mud.WebMacros;\n import com.planet_ink.coffee_web.interfaces.*;\r\n import com.planet_ink.coffee_mud.core.interfaces.*;\r\n import com.planet_ink.coffee_mud.core.*;\r\n+import com.planet_ink.coffee_mud.core.CMath.CompiledOperation;\r\n import com.planet_ink.coffee_mud.core.collections.*;\r\n import com.planet_ink.coffee_mud.Abilities.interfaces.*;\r\n import com.planet_ink.coffee_mud.Areas.interfaces.*;\r\n@@ -15,6 +16,7 @@ import com.planet_ink.coffee_mud.Items.interfaces.*;\n import com.planet_ink.coffee_mud.Locales.interfaces.*;\r\n import com.planet_ink.coffee_mud.MOBS.interfaces.*;\r\n import com.planet_ink.coffee_mud.Races.interfaces.*;\r\n+\r\n import java.util.*;\r\n \r\n /*\r\n@@ -43,6 +45,22 @@ public class StatRejuvCharts extends StdWebMacro\n \t\treturn s;\r\n \t}\r\n \r\n+\tpublic final int avgMath(final int stat, final int level, final int add, final LinkedList<CompiledOperation> formula)\r\n+\t{\r\n+\t\tfinal double[] variables={\r\n+\t\t\t\tlevel,\r\n+\t\t\t\tstat,\r\n+\t\t\t\t(double)stat+7,\r\n+\t\t\t\tstat,\r\n+\t\t\t\t(double)stat+7,\r\n+\t\t\t\tstat,\r\n+\t\t\t\t(double)stat+7,\r\n+\t\t\t\tstat,\r\n+\t\t\t\tstat\r\n+\t\t\t};\r\n+\t\treturn add+(level*(int)Math.round(CMath.parseMathExpression(formula, variables, 0.0)));\r\n+\t}\r\n+\t\r\n \t@Override\r\n \tpublic String runMacro(HTTPRequest httpReq, String parm)\r\n \t{\r\n@@ -86,16 +104,67 @@ public class StatRejuvCharts extends StdWebMacro\n \t\tmob.basePhyStats().setDisposition(disposition);\r\n \t\tmob.recoverPhyStats();\r\n \r\n+\t\tfinal int MAX_STAT=25;\r\n+\t\tfinal int MAX_LEVEL=90;\r\n+\t\tfinal int SKIP_STAT=2;\r\n+\t\tfinal int SKIP_LEVEL=5;\r\n+\t\t\r\n+\t\tfinal int[][] hitpointcharts=new int[MAX_LEVEL+1][MAX_STAT+1];\r\n+\t\tfinal int[][] manacharts=new int[MAX_LEVEL+1][MAX_STAT+1];\r\n+\t\tfinal int[][] movementcharts=new int[MAX_LEVEL+1][MAX_STAT+1];\r\n+\t\tfinal int sh=CMProps.getIntVar(CMProps.Int.STARTHP);\r\n+\t\tfinal int sm=CMProps.getIntVar(CMProps.Int.STARTMANA);\r\n+\t\tfinal int sv=CMProps.getIntVar(CMProps.Int.STARTMOVE);\r\n+\t\tfinal Map<CharClass,LinkedList<CompiledOperation>> hpformulas=new Hashtable<CharClass,LinkedList<CompiledOperation>>(); \r\n+\t\tfinal Map<CharClass,LinkedList<CompiledOperation>> mnformulas=new Hashtable<CharClass,LinkedList<CompiledOperation>>(); \r\n+\t\tfinal Map<CharClass,LinkedList<CompiledOperation>> mvformulas=new Hashtable<CharClass,LinkedList<CompiledOperation>>(); \r\n+\t\tfor(final Enumeration<CharClass> c=CMClass.charClasses();c.hasMoreElements();)\r\n+\t\t{\r\n+\t\t\tfinal CharClass C1=c.nextElement();\r\n+\t\t\thpformulas.put(C1, CMath.compileMathExpression(C1.getHitPointsFormula()));\r\n+\t\t\tmnformulas.put(C1, CMath.compileMathExpression(C1.getManaFormula()));\r\n+\t\t\tmvformulas.put(C1, CMath.compileMathExpression(C1.getMovementFormula()));\r\n+\t\t}\r\n+\t\t\r\n+\t\tfor(int l=1;l<=MAX_LEVEL;l+=SKIP_LEVEL)\r\n+\t\t\tfor(int s=4;s<=MAX_STAT;s+=SKIP_STAT)\r\n+\t\t\t{\r\n+\t\t\t\tint num=0;\r\n+\t\t\t\tfor(final Enumeration<CharClass> c=CMClass.charClasses();c.hasMoreElements();)\r\n+\t\t\t\t{\r\n+\t\t\t\t\tfinal CharClass C1=c.nextElement();\r\n+\t\t\t\t\tnum++;\r\n+\t\t\t\t\thitpointcharts[l][s]+=avgMath(s,l,sh,hpformulas.get(C1));\r\n+\t\t\t\t\tmanacharts[l][s]+=avgMath(s,l,sm,mnformulas.get(C1));\r\n+\t\t\t\t\tmovementcharts[l][s]+=avgMath(s,l,sv,mvformulas.get(C1));\r\n+\t\t\t\t}\r\n+\t\t\t\thitpointcharts[l][s]/=num;\r\n+\t\t\t\tmanacharts[l][s]/=num;\r\n+\t\t\t\tmovementcharts[l][s]/=num;\r\n+\t\t\t}\r\n+\t\t\r\n+\t\t\r\n \t\tbuf.append("<P><TABLE WIDTH=100% BORDER=1>");\r\n-\t\tbuf.append("<TR><TD><B>STATS:</B></TD>");\r\n-\t\tfor(int stats=4;stats<=25;stats++)\r\n-\t\t\tbuf.append("<TD><B>"+stats+"</B></TD>");\r\n+\t\tbuf.append("<TR><TD><B><FONT COLOR=WHITE>STATS:</FONT></B></TD>");\r\n+\t\tfor(int stats=4;stats<=MAX_STAT;stats+=SKIP_STAT)\r\n+\t\t\tbuf.append("<TD><B><FONT COLOR=WHITE>"+stats+"</FONT></B></TD>");\r\n \t\tbuf.append("</TR>");\r\n-\t\tfor(int level=1;level<=30;level++)\r\n+\t\t\r\n+\t\t\r\n+\t\tLinkedList<CMath.CompiledOperation> stateHitPointRecoverFormula = null;\r\n+\t\tLinkedList<CMath.CompiledOperation> stateManaRecoverFormula = null;\r\n+\t\tLinkedList<CMath.CompiledOperation> stateMovesRecoverFormula  = null;\r\n+\t\tstateHitPointRecoverFormula = CMath.compileMathExpression(CMProps.getVar(CMProps.Str.FORMULA_HITPOINTRECOVER));\r\n+\t\tstateManaRecoverFormula = CMath.compileMathExpression(CMProps.getVar(CMProps.Str.FORMULA_MANARECOVER));\r\n+\t\tstateMovesRecoverFormula = CMath.compileMathExpression(CMProps.getVar(CMProps.Str.FORMULA_MOVESRECOVER));\r\n+\r\n+\t\t\r\n+\t\t\r\n+\t\tfor(int level=1;level<=MAX_LEVEL;level+=SKIP_LEVEL)\r\n \t\t{\r\n \t\t\tbuf.append("<TR>");\r\n-\t\t\tbuf.append("<TD><B>LVL "+level+"</B></TD>");\r\n-\t\t\tfor(int stats=4;stats<=25;stats++)\r\n+\t\t\tbuf.append("<TD><B><FONT COLOR=WHITE>LVL "+level+"</FONT></B></TD>");\r\n+\t\t\tfor(int stats=4;stats<=MAX_STAT;stats+=SKIP_STAT)\r\n \t\t\t{\r\n \t\t\t\tfor(final int c: CharStats.CODES.BASECODES())\r\n \t\t\t\t\tmob.baseCharStats().setStat(c,stats);\r\n@@ -106,92 +175,49 @@ public class StatRejuvCharts extends StdWebMacro\n \t\t\t\tmob.curState().setMovement(0);\r\n \t\t\t\tmob.curState().setHitPoints(0);\r\n \r\n-\t\t\t\tdouble con=mob.charStats().getStat(CharStats.STAT_CONSTITUTION);\r\n-\t\t\t\tdouble man=mob.charStats().getStat(CharStats.STAT_INTELLIGENCE)+mob.charStats().getStat(CharStats.STAT_WISDOM);\r\n-\t\t\t\tdouble str=mob.charStats().getStat(CharStats.STAT_STRENGTH);\r\n-\t\t\t\tif(mob.curState().getHunger()<1)\r\n-\t\t\t\t{\r\n-\t\t\t\t\tcon=con*0.85;\r\n-\t\t\t\t\tman=man*0.75;\r\n-\t\t\t\t\tstr=str*0.85;\r\n-\t\t\t\t}\r\n-\t\t\t\tif(mob.curState().getThirst()<1)\r\n-\t\t\t\t{\r\n-\t\t\t\t\tcon=con*0.85;\r\n-\t\t\t\t\tman=man*0.75;\r\n-\t\t\t\t\tstr=str*0.85;\r\n-\t\t\t\t}\r\n-\t\t\t\tif(mob.curState().getFatigue()>CharState.FATIGUED_MILLIS)\r\n-\t\t\t\t\tman=man*.5;\r\n-\r\n-\t\t\t\tfinal double lvl=mob.phyStats().level();\r\n-\t\t\t\tfinal double lvlby1p5=CMath.div(lvl,1.5);\r\n-\t\t\t\t//double lvlby2=CMath.div(lvl,2.0);\r\n-\t\t\t\t//double lvlby3=CMath.div(lvl,3.0);\r\n+\t\t\t\tfinal CharStats charStats=mob.charStats();\r\n+\t\t\t\tfinal CharState curState=mob.curState();\r\n+\t\t\t\tfinal boolean isSleeping=(CMLib.flags().isSleeping(mob));\r\n+\t\t\t\tfinal boolean isSittingOrRiding=(!isSleeping) && ((CMLib.flags().isSitting(mob))||(mob.riding()!=null));\r\n+\t\t\t\tfinal boolean isFlying=(!isSleeping) && (!isSittingOrRiding) && CMLib.flags().isFlying(mob);\r\n+\t\t\t\tfinal boolean isSwimming=(!isSleeping) && (!isSittingOrRiding) && (!isFlying) && CMLib.flags().isSwimming(mob);\r\n+\t\t\t\tfinal double[] vals=new double[]{\r\n+\t\t\t\t\tcharStats.getStat(CharStats.STAT_CONSTITUTION),\r\n+\t\t\t\t\tmob.phyStats().level(),\r\n+\t\t\t\t\t(curState.getHunger()<1)?1.0:0.0,\r\n+\t\t\t\t\t(curState.getThirst()<1)?1.0:0.0,\r\n+\t\t\t\t\t(curState.getFatigue()>CharState.FATIGUED_MILLIS)?1.0:0.0,\r\n+\t\t\t\t\tisSleeping?1.0:0.0,\r\n+\t\t\t\t\tisSittingOrRiding?1.0:0.0,\r\n+\t\t\t\t\tisFlying?1.0:0.0,\r\n+\t\t\t\t\tisSwimming?1.0:0.0\r\n+\t\t\t\t};\r\n \r\n-\t\t\t\tdouble hpGain=(con>1.0)?((con/40.0)*lvlby1p5)+(con/4.5)+2.0:1.0;\r\n-\t\t\t\tdouble manaGain=(man>2.0)?((man/80.0)*lvl)+(man/4.5)+2.0:1.0;\r\n-\t\t\t\tdouble moveGain=(str>1.0)?((str/40.0)*lvl)+(str/3.0)+5.0:1.0;\r\n \r\n-\t\t\t\tif(CMLib.flags().isSleeping(mob))\r\n+\t\t\t\tif((which!=null)&&(which.equals("HP")))\r\n \t\t\t\t{\r\n-\t\t\t\t\thpGain+=(hpGain/2.0);\r\n-\t\t\t\t\tmanaGain+=(manaGain/2.0);\r\n-\t\t\t\t\tmoveGain+=(moveGain/2.0);\r\n-\t\t\t\t\tif((mob.riding()!=null)&&(mob.riding() instanceof Item))\r\n-\t\t\t\t\t{\r\n-\t\t\t\t\t\thpGain+=(hpGain/8.0);\r\n-\t\t\t\t\t\tmanaGain+=(manaGain/8.0);\r\n-\t\t\t\t\t\tmoveGain+=(moveGain/8.0);\r\n-\t\t\t\t\t}\r\n+\t\t\t\t\tfinal long hpGain = Math.round(CMath.parseMathExpression(stateHitPointRecoverFormula, vals, 0.0));\r\n+\t\t\t\t\tbuf.append("<TD><FONT COLOR=CYAN>"+hitpointcharts[level][stats]+"/"+hpGain+"="+(hitpointcharts[level][stats]/hpGain)+"</FONT></TD>");\r\n \t\t\t\t}\r\n \t\t\t\telse\r\n-\t\t\t\tif((CMLib.flags().isSitting(mob))||(mob.riding()!=null))\r\n+\t\t\t\tif((which!=null)&&(which.equals("MN")))\r\n \t\t\t\t{\r\n-\t\t\t\t\thpGain+=(hpGain/4.0);\r\n-\t\t\t\t\tmanaGain+=(manaGain/4.0);\r\n-\t\t\t\t\tmoveGain+=(moveGain/4.0);\r\n-\t\t\t\t\tif((mob.riding()!=null)&&(mob.riding() instanceof Item))\r\n-\t\t\t\t\t{\r\n-\t\t\t\t\t\thpGain+=(hpGain/8.0);\r\n-\t\t\t\t\t\tmanaGain+=(manaGain/8.0);\r\n-\t\t\t\t\t\tmoveGain+=(moveGain/8.0);\r\n-\t\t\t\t\t}\r\n+\t\t\t\t\tvals[0]=((charStats.getStat(CharStats.STAT_INTELLIGENCE)+charStats.getStat(CharStats.STAT_WISDOM)));\r\n+\t\t\t\t\tfinal long manaGain = Math.round(CMath.parseMathExpression(stateManaRecoverFormula, vals, 0.0));\r\n+\t\t\t\t\tbuf.append("<TD><FONT COLOR=PINK>"+manacharts[level][stats]+"/"+manaGain+"="+(manacharts[level][stats]/manaGain)+"</FONT></TD>");\r\n \t\t\t\t}\r\n \t\t\t\telse\r\n+\t\t\t\tif((which!=null)&&(which.equals("MV")))\r\n \t\t\t\t{\r\n-\t\t\t\t\tif(CMLib.flags().isFlying(mob))\r\n-\t\t\t\t\t\tmoveGain+=(moveGain/8.0);\r\n-\t\t\t\t\telse\r\n-\t\t\t\t\tif(CMLib.flags().isSwimming(mob))\r\n-\t\t\t\t\t{\r\n-\t\t\t\t\t\thpGain-=(hpGain/2.0);\r\n-\t\t\t\t\t\tmanaGain-=(manaGain/4.0);\r\n-\t\t\t\t\t\tmoveGain-=(moveGain/2.0);\r\n-\t\t\t\t\t}\r\n+\t\t\t\t\tvals[0]=charStats.getStat(CharStats.STAT_STRENGTH);\r\n+\t\t\t\t\tfinal long moveGain = Math.round(CMath.parseMathExpression(stateMovesRecoverFormula, vals, 0.0));\r\n+\t\t\t\t\tbuf.append("<TD><FONT COLOR=YELLOW>"+movementcharts[level][stats]+"/"+moveGain+"="+(movementcharts[level][stats]/moveGain)+"</FONT></TD>");\r\n \t\t\t\t}\r\n-\r\n-\t\t\t\tif((!mob.isInCombat())\r\n-\t\t\t\t&&(!CMLib.flags().isClimbing(mob)))\r\n+\t\t\t\telse\r\n \t\t\t\t{\r\n-\t\t\t\t\tif((hpGain>0)&&(!CMLib.flags().isGolem(mob)))\r\n-\t\t\t\t\t\tmob.curState().adjHitPoints((int)Math.round(hpGain),mob.maxState());\r\n-\t\t\t\t\tif(manaGain>0)\r\n-\t\t\t\t\t\tmob.curState().adjMana((int)Math.round(manaGain),mob.maxState());\r\n-\t\t\t\t\tif(moveGain>0)\r\n-\t\t\t\t\t\tmob.curState().adjMovement((int)Math.round(moveGain),mob.maxState());\r\n+\t\t\t\t\tfinal long hpGain = Math.round(CMath.parseMathExpression(stateHitPointRecoverFormula, vals, 0.0));\r\n+\t\t\t\t\tbuf.append("<TD><FONT COLOR=CYAN>"+hitpointcharts[level][stats]+"/"+hpGain+"="+(hitpointcharts[level][stats]/hpGain)+"</FONT></TD>");\r\n \t\t\t\t}\r\n-\r\n-\t\t\t\tif((which!=null)&&(which.equals("HP")))\r\n-\t\t\t\t\tbuf.append("<TD>"+mob.curState().getHitPoints()+"</TD>");\r\n-\t\t\t\telse\r\n-\t\t\t\tif((which!=null)&&(which.equals("MN")))\r\n-\t\t\t\t\tbuf.append("<TD>"+mob.curState().getMana()+"</TD>");\r\n-\t\t\t\telse\r\n-\t\t\t\tif((which!=null)&&(which.equals("MV")))\r\n-\t\t\t\t\tbuf.append("<TD>"+mob.curState().getMovement()+"</TD>");\r\n-\t\t\t\telse\r\n-\t\t\t\t\tbuf.append("<TD>"+mob.curState().getHitPoints()+"</TD>");\r\n \t\t\t}\r\n \t\t\tbuf.append("</TR>");\r\n \t\t}\r\ndiff --git a/web/admin/grinder/charclasses.cmvp b/web/admin/grinder/charclasses.cmvp\nindex 7d00158e28..7ed417d5a8 100644\n--- a/web/admin/grinder/charclasses.cmvp\n+++ b/web/admin/grinder/charclasses.cmvp\n@@ -41,6 +41,9 @@\n         <TABLE WIDTH=50% BORDER=1>\r\n         <TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>\r\n         <TR><TD><a href="javascript:Clicked(\'/grinder/loggedin.cmvp\');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>\r\n+        @if?CheckAuthCode?SYSOP=true@\r\n+        <TR><TD><A href="javascript:Clicked(\'/grinder/crossclass.cmvp\')"><FONT SIZE=-1 COLOR=WHITE><B>Cross Class Analysis</B></FONT></a></TD></TR>\r\n+        @endif@\r\n         <TR><TD><a href="javascript:Refresh();"><FONT COLOR=WHITE SIZE=-1><B>Refresh Page</B></FONT></A></TD></TR>\r\n         </TABLE>\r\n     </TD>\r\ndiff --git a/web/admin/grinder/control.cmvp b/web/admin/grinder/control.cmvp\nindex 2aa6e47ecf..89fa23043e 100644\n--- a/web/admin/grinder/control.cmvp\n+++ b/web/admin/grinder/control.cmvp\n@@ -114,6 +114,7 @@\n \t\t<TABLE WIDTH=50% BORDER=1>\r\n \t\t<TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>\r\n \t\t<TR><TD><a href="javascript:Clicked(\'/grinder/loggedin.cmvp\');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>\r\n+        <TR><TD><A href="javascript:Clicked(\'/grinder/recovery.cmvp\')"><FONT SIZE=-1 COLOR=WHITE><B>Recovery Analysis</B></FONT></a></TD></TR>\r\n \t\t</TABLE>\r\n \t</TD>\r\n \t</TR>\r\ndiff --git a/web/admin/grinder/crossclass.cmvp b/web/admin/grinder/crossclass.cmvp\nnew file mode 100644\nindex 0000000000..d9387ed027\n--- /dev/null\n+++ b/web/admin/grinder/crossclass.cmvp\n@@ -0,0 +1,182 @@\n+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r\n+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">\r\n+@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@\r\n+@if?!CheckAuthCode?SYSOP=true@ @AddFile?/grinder/nopriv.cmvp@ @else@\r\n+<html>\r\n+<head>\r\n+\t<link rel="coffeemud icon" href="images/coffeemud.ico" >\r\n+\t<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">\r\n+\t<title>Cross Class Skills</title>\r\n+    <script language=JavaScript>\r\n+    <!--\r\n+        function Clicked(action)\r\n+        {\r\n+            document.RESOURCES.action=action;\r\n+            document.RESOURCES.submit();\r\n+        }\r\n+        function Refresh()\r\n+        {\r\n+            document.RESOURCES.action=\'crossclass.cmvp\';\r\n+            document.RESOURCES.submit();\r\n+        }\r\n+    //-->\r\n+    </script>\r\n+</head>\r\n+\r\n+<body BGCOLOR=BLACK>\r\n+<FORM  ACCEPT-CHARSET="UTF-8" NAME=RESOURCES TARGET=_top METHOD=POST ACTION="/grinder/crossclass.cmvp">\r\n+<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">\r\n+\t<TABLE WIDTH=100% BORDER=0>\r\n+\t<TR>\r\n+\t<TD WIDTH=33% ALIGN=LEFT VALIGN=TOP></TD>\r\n+\t<TD WIDTH=33% ALIGN=CENTER VALIGN=TOP><IMG SRC="/grinder/images/grinder.gif" WIDTH=78 HEIGHT=122 ALT="" BORDER="0"></TD>\r\n+\t<TD WIDTH=33% ALIGN=RIGHT VALIGN=TOP>\r\n+\t\t<TABLE WIDTH=50% BORDER=1>\r\n+\t\t<TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>\r\n+\t\t<TR><TD><a href="javascript:Clicked(\'/grinder/loggedin.cmvp\');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>\r\n+        <TR><TD><A href="javascript:Clicked(\'/grinder/charclasses.cmvp\')"><FONT SIZE=-1 COLOR=WHITE><B>Character Classes</B></FONT></a></TD></TR>\r\n+\t\t</TABLE>\r\n+\t</TD>\r\n+\t</TR>\r\n+\t</TABLE>\r\n+\t<FONT COLOR=WHITE>\r\n+\t\r\n+<h1>Cross Class Information</h1><P>\r\n+<a href="#STAT">Stats Chart</a><P>\r\n+<a href="#CROSS">Skills Chart</a><P>\r\n+<a href="#BAL">Balance Chart</a><P>\r\n+<BR><FONT COLOR=WHITE>\r\n+<a name=STAT>Chart Key</a>: Under each stat TYPE are three groups () () ().  The first group is a 10th level\r\n+character, the second group is a 50th level char, and the last group is a 90th level char.  \r\n+Within each group are three stats (x/x/x).  The first stat is the character with an attribute\r\n+score of 10, the second stat is an attribute score of 18, and the last stat is an attribute score\r\n+of 25.<P><BR></FONT>\r\n+Base Class: \r\n+@AddRequestParameter?OLDBASECLASS=@@RequestParameter?BASECLASS@@ @\r\n+<SELECT NAME=BASECLASS ONCHANGE=\'Refresh()\'>\r\n+<OPTION VALUE="">\r\n+@BaseCharClassNext?RESET@\r\n+<OPTION VALUE="ALL" @if?CheckReqParm?ONCHANGE=ALL@SELECTED@endif@>All\r\n+@loop@\r\n+@BaseCharClassNext@\r\n+<OPTION VALUE="@BaseCharClassName@" @if?CheckReqParm?OLDBASECLASS=@@BaseCharClassName@@ @SELECTED@endif@>@BaseCharClassName@\r\n+@back@\r\n+</SELECT>\r\n+@AddRequestParameter?BASECLASS=@@RequestParameter?OLDBASECLASS@@ @\r\n+<TABLE WIDTH=100%>\r\n+<TR><TD><FONT COLOR=WHITE>BASECLASS</FONT></TD><TD><FONT COLOR=WHITE>HP</FONT></TD><TD><FONT COLOR=WHITE>MANA</FONT></TD><TD><FONT COLOR=WHITE>MV</FONT></TD></TR>\r\n+@if?CheckReqParm?OLDBASECLASS=ALL@\r\n+\t@BaseCharClassNext?RESET@\r\n+\t@loop@\r\n+\t@BaseCharClassNext@\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@loop@\r\n+\t\t\t@CharClassNext@\r\n+\t\t\t<TR>\r\n+\t\t\t<TD><FONT COLOR=RED>@CharClassName@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT@</FONT></TD>\r\n+\t\t\t</TR>\r\n+\t\t\t<P>\r\n+\t\t@back@\r\n+\t\t<TR><TD COLSPAN=4><HR></TD></TR>\r\n+\t@back@\r\n+@else@\r\n+@if?!CheckReqParm?OLDBASECLASS=@\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@loop@\r\n+\t\t\t@CharClassNext@\r\n+\t\t\t<TR>\r\n+\t\t\t<TD><FONT COLOR=RED>@CharClassName@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA@</FONT></TD>\r\n+\t\t\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT@</FONT></TD>\r\n+\t\t\t</TR>\r\n+\t\t\t<P>\r\n+\t\t@back@\r\n+\t\t<TR><TD COLSPAN=4><HR></TD></TR>\r\n+@endif@\r\n+@endif@\r\n+</TABLE>\r\n+<BR><FONT COLOR=WHITE><a name=STAT>Base Class Version of Above</a><BR></FONT>\r\n+<TABLE WIDTH=100% BORDER=1>\r\n+<TR><TD><FONT COLOR=WHITE>BASECLASS</FONT></TD><TD><FONT COLOR=WHITE>HP</FONT></TD><TD><FONT COLOR=WHITE>MANA</FONT></TD><TD><FONT COLOR=WHITE>MV</FONT></TD></TR>\r\n+@if?CheckReqParm?OLDBASECLASS=ALL@\r\n+\t@BaseCharClassNext?RESET@\r\n+\t@loop@\r\n+\t@BaseCharClassNext@\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@CharClassNext@\r\n+\t\t<TR>\r\n+\t\t<TD><FONT COLOR=RED>@BaseCharClassName@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS&AVGBASE@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA&AVGBASE@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT&AVGBASE@</FONT></TD>\r\n+\t\t</TR>\r\n+\t@back@\r\n+@else@\r\n+@if?!CheckReqParm?OLDBASECLASS=@\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@CharClassNext@\r\n+\t\t<TR>\r\n+\t\t<TD><FONT COLOR=RED>@BaseCharClassName@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS&AVGBASE@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA&AVGBASE@</FONT></TD>\r\n+\t\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT&AVGBASE@</FONT></TD>\r\n+\t\t</TR>\r\n+@endif@\r\n+@endif@\r\n+</TABLE>\r\n+<P><BR>\r\n+<HR>\r\n+<CENTER><a name=CROSS><H2>Cross Class Skills Chart</H2></a></CENTER><P>\r\n+<HR>\r\n+@if?CheckReqParm?OLDBASECLASS=ALL@\r\n+\t@BaseCharClassNext?RESET@\r\n+\t@loop@\r\n+\t@BaseCharClassNext@\r\n+\t\t@CrossBaseClassAbilities@\r\n+\t@back@\r\n+@else@\r\n+@if?!CheckReqParm?OLDBASECLASS=@\r\n+\t@CrossBaseClassAbilities@\r\n+@endif@\r\n+@endif@\r\n+<P>\r\n+<BR>\r\n+<BR>\r\n+<HR>\r\n+<CENTER><a name=BAL><H2>Cross Class Balance Chart</H2></a></CENTER><P>\r\n+<HR>\r\n+@if?CheckReqParm?OLDBASECLASS=ALL@\r\n+\t@BaseCharClassNext?RESET@\r\n+\t@loop@\r\n+\t@BaseCharClassNext@\r\n+\t\t<HR><CENTER><H3>@BaseCharClassName@</H3></CENTER>\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@loop@\r\n+\t\t\t@CharClassNext@\r\n+\t\t\t<A href="classes.cmvp?CLASS=@CharClassID@"><FONT COLOR=BLUE>@CharClassName@</FONT></A><BR>\r\n+\t\t\t@CharClassData?BALANCE@\r\n+\t\t\t<P>\r\n+\t\t@back@\r\n+\t@back@\r\n+@else@\r\n+@if?!CheckReqParm?OLDBASECLASS=@\r\n+\t\t<HR><CENTER><H3>@BaseCharClassName@</H3></CENTER>\r\n+\t\t@CharClassNext?RESET@\r\n+\t\t@loop@\r\n+\t\t\t@CharClassNext@\r\n+\t\t\t<A href="classes.cmvp?CLASS=@CharClassID@"><FONT COLOR=BLUE>@CharClassName@</FONT></A><BR>\r\n+\t\t\t@CharClassData?BALANCE@\r\n+\t\t\t<P>\r\n+\t\t@back@\r\n+@endif@\r\n+@endif@\r\n+@AddRequestParameter?BASECLASS=@@RequestParameter?OLDBASECLASS@@ @\r\n+</FORM>\r\n+</BODY>\r\n+</HTML>\r\n+@endif@\r\n+@endif@\n\\ No newline at end of file\ndiff --git a/web/admin/grinder/recovery.cmvp b/web/admin/grinder/recovery.cmvp\nnew file mode 100644\nindex 0000000000..825270fca6\n--- /dev/null\n+++ b/web/admin/grinder/recovery.cmvp\n@@ -0,0 +1,92 @@\n+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r\n+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">\r\n+@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@\r\n+@if?!CheckAuthCode?SYSOP=true@ @AddFile?/grinder/nopriv.cmvp@ @else@\r\n+<html>\r\n+<head>\r\n+\t<link rel="coffeemud icon" href="images/coffeemud.ico" >\r\n+\t<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">\r\n+\t<title>Recovery Charts</title>\r\n+\t<Script language=JavaScript>\r\n+\t<!--\r\n+\t\tfunction reload()\r\n+\t\t{\r\n+\t\t\tdocument.POOPY.submit();\r\n+\t\t}\r\n+\t//-->\r\n+\t</SCRIPT>\r\n+    <script language=JavaScript>\r\n+    <!--\r\n+        function Clicked(action)\r\n+        {\r\n+            document.POOPY.action=action;\r\n+            document.POOPY.submit();\r\n+        }\r\n+        function Refresh()\r\n+        {\r\n+            document.POOPY.action=\'control.cmvp\';\r\n+            document.POOPY.submit();\r\n+        }\r\n+    //-->\r\n+    </script>\r\n+</head>\r\n+\r\n+<body BGCOLOR=BLACK>\r\n+\t<TABLE WIDTH=100% BORDER=0>\r\n+\t<TR>\r\n+\t<TD WIDTH=33% ALIGN=LEFT VALIGN=TOP></TD>\r\n+\t<TD WIDTH=33% ALIGN=CENTER VALIGN=TOP><IMG SRC="/grinder/images/grinder.gif" WIDTH=78 HEIGHT=122 ALT="" BORDER="0"></TD>\r\n+\t<TD WIDTH=33% ALIGN=RIGHT VALIGN=TOP>\r\n+\t\t<TABLE WIDTH=50% BORDER=1>\r\n+\t\t\t<TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>\r\n+\t\t\t<TR><TD><a href="javascript:Clicked(\'/grinder/loggedin.cmvp\');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>\r\n+\t\t\t<TR><TD><A href="javascript:Clicked(\'/grinder/control.cmvp\')"><FONT SIZE=-1 COLOR=WHITE><B>Control Panel</B></FONT></a></TD></TR>\r\n+\t\t</TABLE>\r\n+\t</TD>\r\n+\t</TR>\r\n+\t</TABLE>\r\n+<FONT COLOR=WHITE>\r\n+<h3>Stat Recovery Rates every 5 Ticks (20 seconds)</h3><P>\r\n+<FORM  ACCEPT-CHARSET="UTF-8" NAME=POOPY TARGET=_top METHOD=POST ACTION="/grinder/recovery.cmvp">\r\n+<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">\r\n+<SELECT NAME=WHICH ONCHANGE="reload();">\r\n+<OPTION VALUE=HP @if?CheckReqParm?WHICH=HP@SELECTED@endif@>Hit Points\r\n+<OPTION VALUE=MN @if?CheckReqParm?WHICH=MN@SELECTED@endif@>Mana\r\n+<OPTION VALUE=MV @if?CheckReqParm?WHICH=MV@SELECTED@endif@>Movement\r\n+</SELECT>\r\n+<TABLE WIDTH=100%>\r\n+<TR>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SITTING=@CHECKED@endif@ NAME=SITTING ONCLICK="reload();">Sitting\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SLEEPING=@CHECKED@endif@ NAME=SLEEPING ONCLICK="reload();">Sleeping\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SWIMMING=@CHECKED@endif@ NAME=SWIMMING ONCLICK="reload();">Swimming\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?FLYING=@CHECKED@endif@ NAME=FLYING ONCLICK="reload();">Flying\r\n+</TD>\r\n+</TR><TR>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?RIDING=@CHECKED@endif@ NAME=RIDING ONCLICK="reload();">Riding something\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX NAME=HUNGRY @if?!CheckReqParm?HUNGRY=@CHECKED@endif@ ONCLICK="reload();">Hungry\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX NAME=THIRSTY @if?!CheckReqParm?THIRSTY=@CHECKED@endif@ ONCLICK="reload();">Thirsty\r\n+</TD>\r\n+<TD WIDTH=25%>\r\n+</TD>\r\n+</TR></TABLE>\r\n+<P>\r\n+Chart below shows: [average pool amount] / [the gain] = [the number of 20 second periods to recover from 0] for each level and relevant stat amount.\r\n+<BR>\r\n+\t@StatRejuvCharts@\r\n+</FORM>\r\n+</BODY>\r\n+</HTML>\r\n+@endif@\r\n+@endif@\r\ndiff --git a/web/pub/crossclass.cmvp b/web/pub/crossclass.cmvp\ndeleted file mode 100644\nindex 76ec553689..0000000000\n--- a/web/pub/crossclass.cmvp\n+++ /dev/null\n@@ -1,80 +0,0 @@\n-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r\n-\r\n-<html>\r\n-<head>\r\n-\t<link rel="coffeemud icon" href="images/coffeemud.ico" >\r\n-\t<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">\r\n-\t<title>Cross Class Skills</title>\r\n-</head>\r\n-\r\n-<body>\r\n-<h1>Cross Class Information</h1><P>\r\n-<a href="#STAT">Stats Chart</a><P>\r\n-<a href="#CROSS">Skills Chart</a><P>\r\n-<a href="#BAL">Balance Chart</a><P>\r\n-<BR><FONT COLOR=BLACK>\r\n-<a name=STAT>Chart Key</a>: Under each stat TYPE are three groups () () ().  The first group is a 10th level\r\n-character, the second group is a 50th level char, and the last group is a 90th level char.  \r\n-Within each group are three stats (x/x/x).  The first stat is the character with an attribute\r\n-score of 10, the second stat is an attribute score of 18, and the last stat is an attribute score\r\n-of 25.<P><BR></FONT>\r\n-<TABLE WIDTH=100%>\r\n-<TR><TD>CLASS</TD><TD>HP</TD><TD>MANA</TD><TD>MV</TD></TR>\r\n-@BaseCharClassNext?RESET@\r\n-@loop@\r\n-@BaseCharClassNext@\r\n-\t@CharClassNext?RESET@\r\n-\t@loop@\r\n-\t\t@CharClassNext@\r\n-\t\t<TR>\r\n-\t\t<TD><FONT COLOR=RED>@CharClassName@</FONT></TD>\r\n-\t\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS@</FONT></TD>\r\n-\t\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA@</FONT></TD>\r\n-\t\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT@</FONT></TD>\r\n-\t\t</TR>\r\n-\t\t<P>\r\n-\t@back@\r\n-\t<TR><TD COLSPAN=4><HR></TD></TR>\r\n-@back@\r\n-</TABLE>\r\n-<BR><FONT COLOR=BLACK><a name=STAT>Base Class Version of Above</a><BR></FONT>\r\n-<TABLE WIDTH=100% BORDER=1>\r\n-<TR><TD>BASECLASS</TD><TD>HP</TD><TD>MANA</TD><TD>MV</TD></TR>\r\n-@BaseCharClassNext?RESET@\r\n-@loop@\r\n-@BaseCharClassNext@\r\n-\t@CharClassNext?RESET@\r\n-\t@CharClassNext@\r\n-\t<TR>\r\n-\t<TD><FONT COLOR=RED>@BaseCharClassName@</FONT></TD>\r\n-\t<TD><FONT SIZE=-1 COLOR=GREEN>@CharClassData?AVGHITPOINTS&AVGBASE@</FONT></TD>\r\n-\t<TD><FONT SIZE=-1 COLOR=BLUE>@CharClassData?AVGMANA&AVGBASE@</FONT></TD>\r\n-\t<TD><FONT SIZE=-1 COLOR=PURPLE>@CharClassData?AVGMOVEMENT&AVGBASE@</FONT></TD>\r\n-\t</TR>\r\n-@back@\r\n-</TABLE>\r\n-<P><BR>\r\n-<HR>\r\n-<CENTER><a name=CROSS><H2>Cross Class Skills Chart</H2></a></CENTER><P>\r\n-<HR>\r\n-\t@CrossBaseClassAbilities@\r\n-<P>\r\n-<BR>\r\n-<BR>\r\n-<HR>\r\n-<CENTER><a name=BAL><H2>Cross Class Balance Chart</H2></a></CENTER><P>\r\n-<HR>\r\n-@BaseCharClassNext?RESET@\r\n-@loop@\r\n-@BaseCharClassNext@\r\n-\t<HR><CENTER><H3>@BaseCharClassName@</H3></CENTER>\r\n-\t@CharClassNext?RESET@\r\n-\t@loop@\r\n-\t\t@CharClassNext@\r\n-\t\t<A href="classes.cmvp?CLASS=@CharClassID@"><FONT COLOR=BLUE>@CharClassName@</FONT></A><BR>\r\n-\t\t@CharClassData?BALANCE@\r\n-\t\t<P>\r\n-\t@back@\r\n-@back@\r\n-</BODY>\r\n-</HTML>\r\ndiff --git a/web/pub/recovery.cmvp b/web/pub/recovery.cmvp\ndeleted file mode 100644\nindex 1d9de84a0d..0000000000\n--- a/web/pub/recovery.cmvp\n+++ /dev/null\n@@ -1,57 +0,0 @@\n-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r\n-\r\n-<html>\r\n-<head>\r\n-\t<link rel="coffeemud icon" href="images/coffeemud.ico" >\r\n-\t<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">\r\n-\t<title>Cross Class Skills</title>\r\n-\t<Script language=JavaScript>\r\n-\t<!--\r\n-\t\tfunction reload()\r\n-\t\t{\r\n-\t\t\tdocument.POOPY.submit();\r\n-\t\t}\r\n-\t//-->\r\n-\t</SCRIPT>\r\n-</head>\r\n-\r\n-<body>\r\n-<h3>Stat Recovery Rates/4 Ticks</h3><P>\r\n-<FORM  ACCEPT-CHARSET="UTF-8" NAME=POOPY TARGET=_top METHOD=POST ACTION="recovery.cmvp">\r\n-<SELECT NAME=WHICH ONCHANGE="reload();">\r\n-<OPTION VALUE=HP @if?CheckReqParm?WHICH=HP@SELECTED@endif@>Hit Points\r\n-<OPTION VALUE=MN @if?CheckReqParm?WHICH=MN@SELECTED@endif@>Mana\r\n-<OPTION VALUE=MV @if?CheckReqParm?WHICH=MV@SELECTED@endif@>Movement\r\n-</SELECT>\r\n-<TABLE WIDTH=100%>\r\n-<TR>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=SITTING ONCLICK="reload();">Sitting\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=SLEEPING ONCLICK="reload();">Sleeping\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=SWIMMING ONCLICK="reload();">Swimming\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=FLYING ONCLICK="reload();">Flying\r\n-</TD>\r\n-</TR><TR>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=RIDING ONCLICK="reload();">Riding something\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=HUNGRY @if?!CheckReqParm?HUNGRY=@CHECKED@endif@ ONCLICK="reload();">Hungry\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-<INPUT TYPE=CHECKBOX NAME=THIRSTY @if?!CheckReqParm?THIRSTY=@CHECKED@endif@ ONCLICK="reload();">Thirsty\r\n-</TD>\r\n-<TD WIDTH=25%>\r\n-</TD>\r\n-</TR></TABLE>\r\n-<P>\r\n-<BR>\r\n-\t@StatRejuvCharts@\r\n-</BODY>\r\n-</HTML>\r\n', 'commit_subject': '', 'repo_name': 'bozimmerman/CoffeeMud', 'committer': {'name': 'bozimmerman', 'email': 'dc45fe023482b3b890b5e574e53c1d051f45b1ef@zimmers.net', 'time_sec': '1414907530', 'tz_offset': '0', 'date': {'seconds': '1414907530'}}, 'commit_tree': 'e1eb979ec21159a07261c3d5296a4eb8f2be864b', 'commit_message': '\n\ngit-svn-id: svn://192.168.1.10/public/CoffeeMud@12400 0d6f1817-ed0e-0410-87c9-987e46238f29\n', 'language_name': 'Shell', 'license': 'apache-2.0', 'hunks': '@@ -0,0 +1,92 @@\n+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r\n+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">\r\n+@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@\r\n+@if?!CheckAuthCode?SYSOP=true@ @AddFile?/grinder/nopriv.cmvp@ @else@\r\n+<html>\r\n+<head>\r\n+\t<link rel="coffeemud icon" href="images/coffeemud.ico" >\r\n+\t<link rel="STYLESHEET" TYPE="TEXT/CSS" HREF="coffeemud.css">\r\n+\t<title>Recovery Charts</title>\r\n+\t<Script language=JavaScript>\r\n+\t<!--\r\n+\t\tfunction reload()\r\n+\t\t{\r\n+\t\t\tdocument.POOPY.submit();\r\n+\t\t}\r\n+\t//-->\r\n+\t</SCRIPT>\r\n+    <script language=JavaScript>\r\n+    <!--\r\n+        function Clicked(action)\r\n+        {\r\n+            document.POOPY.action=action;\r\n+            document.POOPY.submit();\r\n+        }\r\n+        function Refresh()\r\n+        {\r\n+            document.POOPY.action=\'control.cmvp\';\r\n+            document.POOPY.submit();\r\n+        }\r\n+    //-->\r\n+    </script>\r\n+</head>\r\n+\r\n+<body BGCOLOR=BLACK>\r\n+\t<TABLE WIDTH=100% BORDER=0>\r\n+\t<TR>\r\n+\t<TD WIDTH=33% ALIGN=LEFT VALIGN=TOP></TD>\r\n+\t<TD WIDTH=33% ALIGN=CENTER VALIGN=TOP><IMG SRC="/grinder/images/grinder.gif" WIDTH=78 HEIGHT=122 ALT="" BORDER="0"></TD>\r\n+\t<TD WIDTH=33% ALIGN=RIGHT VALIGN=TOP>\r\n+\t\t<TABLE WIDTH=50% BORDER=1>\r\n+\t\t\t<TR><TD BGCOLOR=WHITE ALIGN=CENTER><FONT COLOR=BLACK SIZE=-1><B>Menu</B></FONT></TD></TR>\r\n+\t\t\t<TR><TD><a href="javascript:Clicked(\'/grinder/loggedin.cmvp\');"><FONT COLOR=WHITE SIZE=-1><B>MUDGrinder Menu</B></FONT></A></TD></TR>\r\n+\t\t\t<TR><TD><A href="javascript:Clicked(\'/grinder/control.cmvp\')"><FONT SIZE=-1 COLOR=WHITE><B>Control Panel</B></FONT></a></TD></TR>\r\n+\t\t</TABLE>\r\n+\t</TD>\r\n+\t</TR>\r\n+\t</TABLE>\r\n+<FONT COLOR=WHITE>\r\n+<h3>Stat Recovery Rates every 5 Ticks (20 seconds)</h3><P>\r\n+<FORM  ACCEPT-CHARSET="UTF-8" NAME=POOPY TARGET=_top METHOD=POST ACTION="/grinder/recovery.cmvp">\r\n+<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">\r\n+<SELECT NAME=WHICH ONCHANGE="reload();">\r\n+<OPTION VALUE=HP @if?CheckReqParm?WHICH=HP@SELECTED@endif@>Hit Points\r\n+<OPTION VALUE=MN @if?CheckReqParm?WHICH=MN@SELECTED@endif@>Mana\r\n+<OPTION VALUE=MV @if?CheckReqParm?WHICH=MV@SELECTED@endif@>Movement\r\n+</SELECT>\r\n+<TABLE WIDTH=100%>\r\n+<TR>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SITTING=@CHECKED@endif@ NAME=SITTING ONCLICK="reload();">Sitting\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SLEEPING=@CHECKED@endif@ NAME=SLEEPING ONCLICK="reload();">Sleeping\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?SWIMMING=@CHECKED@endif@ NAME=SWIMMING ONCLICK="reload();">Swimming\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?FLYING=@CHECKED@endif@ NAME=FLYING ONCLICK="reload();">Flying\r\n+</TD>\r\n+</TR><TR>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX @if?!CheckReqParm?RIDING=@CHECKED@endif@ NAME=RIDING ONCLICK="reload();">Riding something\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX NAME=HUNGRY @if?!CheckReqParm?HUNGRY=@CHECKED@endif@ ONCLICK="reload();">Hungry\r\n+</TD>\r\n+<TD WIDTH=25%><FONT COLOR=WHITE>\r\n+<INPUT TYPE=CHECKBOX NAME=THIRSTY @if?!CheckReqParm?THIRSTY=@CHECKED@endif@ ONCLICK="reload();">Thirsty\r\n+</TD>\r\n+<TD WIDTH=25%>\r\n+</TD>\r\n+</TR></TABLE>\r\n+<P>\r\n+Chart below shows: [average pool amount] / [the gain] = [the number of 20 second periods to recover from 0] for each level and relevant stat amount.\r\n+<BR>\r\n+\t@StatRejuvCharts@\r\n+</FORM>\r\n+</BODY>\r\n+</HTML>\r\n+@endif@\r\n+@endif@\r\n', 'addition_count': 92, 'deletion_count': 0, 'src_file': '/dev/null', 'tgt_file': 'b/web/admin/grinder/recovery.cmvp', 'file_extension': '.cmvp', 'before_file': 'ADDFILE', 'message': '\n\ngit-svn-id: svn://192.168.1.10/public/CoffeeMud@12400 0d6f1817-ed0e-0410-87c9-987e46238f29\n', 'author_name': 'bozimmerman', 'lang': 'cmvp'}