<NME> achievement.cmvp
<BEF> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@
@if?!CheckAuthCode?AUTH_ACHIEVEMENTS=true@ @AddFile?/grinder/nopriv.cmvp@ @else@
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<html>
<head>
	<META CHARSET="utf-8"/>
    <link rel="grinder icon" href="/images/grinder.ico" >
    <title>Title Manager</title>
    <script language=JavaScript>
    <!--
        function NewTattoo()
        {
            var autotattooid=window.prompt('Enter a new unique TATTOO/ID for your Tattoo (no spaces):');
            if(autotattooid==null)
                return;
            if(autotattooid.length==0)
                return;
            if(autotattooid.indexOf(' ')>=0)
            {
                if(window.alert) window.alert('No spaces are allowed in your ID!');
                return;
            }
            document.RESOURCES.TATTOO.value=autotattooid;
            document.RESOURCES.FUNCTION.value='REACHIEVEMENT';
            document.RESOURCES.action='/grinder/achievementdo.cmvp';
            document.RESOURCES.submit();
        }
        function Delete()
        {
            if(confirm('Delete this achievement?! Confirm!'))
            {
                document.RESOURCES.action='achievementdo.cmvp';
                document.RESOURCES.FUNCTION.value='DELACHIEVEMENT';
                document.RESOURCES.submit();
            }
        }
        function EditDone()
        {
            @if?CheckReqParm?ACHIEVEMENT=@
                if(confirm('Create this new achievement?'))
            @else@
                if(confirm('Submit your changes to this achievement?'))
            @endif@
                {
                    document.RESOURCES.action='achievementdo.cmvp';
                    document.RESOURCES.FUNCTION.value='EDITACHIEVEMENT';
                    document.RESOURCES.submit();
                }
        }
        function ReShow()
        {
            document.RESOURCES.FUNCTION.value='';
            document.RESOURCES.action='/grinder/achievement.cmvp';
            document.RESOURCES.submit();
        }
        function Refresh()
        {
            document.RESOURCES.FUNCTION.value='';
            document.RESOURCES.action='/grinder/achievement.cmvp';
            document.RESOURCES.submit();
        }
        function ReTitle()
        {
            document.RESOURCES.FUNCTION.value='REACHIEVEMENT';
            document.RESOURCES.action='/grinder/achievementdo.cmvp';
            document.RESOURCES.submit();
        }
        function Cancel()
        {
            window.close();
        }
        function Clicked(action)
        {
            document.RESOURCES.action=action;
            document.RESOURCES.submit();
        }
    //-->
    </script>
</head>
<body BGCOLOR=BLACK>
<FORM  ACCEPT-CHARSET="UTF-8" NAME=RESOURCES TARGET=_top METHOD=POST ACTION="achievement.cmvp">
<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">
<INPUT TYPE=HIDDEN NAME=FUNCTION VALUE="">
<INPUT TYPE=HIDDEN NAME=ACHIEVEMENT VALUE="@RequestParameter?ACHIEVEMENT@">
<INPUT TYPE=HIDDEN NAME=AGENT VALUE="@RequestParameter?AGENT@">
<CENTER>
<TABLE WIDTH=100% BORDER=1 CELLSPACING=0 CELLPADDING=0>
    <TR>
        <TD WIDTH=25%>
            <FONT COLOR=YELLOW>Tattoo / ID: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=20 NAME=TATTOO VALUE="@AchievementData?TATTOO@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=TATTOONAME@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
        	<FONT COLOR=YELLOW>Event Type: </FONT>
        	<FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <SELECT NAME=EVENT ONCHANGE="Refresh();">
            @AchievementData?EVENTOPTIONS@
            </SELECT>
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=EVENT@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
            <FONT COLOR=YELLOW>Display Desc: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=40 NAME=DISPLAY VALUE="@AchievementData?DISPLAY@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=DISPLAY@</FONT>
        </TD>
    </TR>
    <TR>
        <TD WIDTH=25%>
            <FONT COLOR=YELLOW>Duration: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=20 NAME=DURATION VALUE="@AchievementData?DURATION@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=DURATION@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
            <FONT COLOR=YELLOW>Visibility Mask: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=60 NAME=DISPLAY VALUE="@AchievementData?VISIBLEMASK@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=VISIBLEMASK@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
            <FONT COLOR=YELLOW>Player Mask: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=60 NAME=DISPLAY VALUE="@AchievementData?PLAYERMASK@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=PLAYERMASK@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
            <FONT COLOR=YELLOW>Title Award: </FONT>
            <FONT COLOR=YELLOW>Title Award: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=40 NAME=TITLE VALUE="@AchievementData?TITLE@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=TITLE@</FONT>
        </TD>
    </TR>
    <TR>
        <TD>
            <FONT COLOR=YELLOW>Reward List: </FONT>
            <FONT COLOR=WHITE SIZE=-1></FONT>
        </TD>
        <TD>
            <INPUT TYPE=TEXT SIZE=60 NAME=REWARDS VALUE="@AchievementData?REWARDS@">
            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=REWARDS@</FONT>
        </TD>
    </TR>
    @AchievementData?OTHERPARMNEXT&RESET@
    @loop@
	    @AchievementData?OTHERPARMNEXT@
	    <TR>
	        <TD>
	            <FONT COLOR=YELLOW>@RequestParameter?OTHERPARMFIELD@: </FONT>
	            <FONT COLOR=WHITE SIZE=-1></FONT>
	        </TD>
	        <TD>
	            <INPUT TYPE=TEXT SIZE=60 NAME=@RequestParameter?OTHERPARM@ VALUE="@AchievementData?@@RequestParameter?OTHERPARM@@ @">
	            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=@@RequestParameter?OTHERPARM@@ @</FONT>
	        </TD>
	    </TR>
    @back@
</TABLE>
<BR>
<TABLE WIDTH=100% BORDER=0>
<TR>
    @if?CheckReqParm?ACHIEVEMENT=@
        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=FINISHED VALUE="Create" ONCLICK="EditDone();"></TD>
    @else@
        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=FINISHED VALUE="Modify" ONCLICK="EditDone();"></TD>
        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=DELETE VALUE="Delete" ONCLICK="Delete();"></TD>
    @endif@
    <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=CANCEL VALUE="Cancel" ONCLICK="Cancel();"></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
@endif@
@endif@

<MSG> remort achievement flag

git-svn-id: 0cdf8356e41b2d8ccbb41bb76c82068fe80b2514@20666 0d6f1817-ed0e-0410-87c9-987e46238f29

<DFF> @@ -148,6 +148,12 @@
             <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=PLAYERMASK@</FONT>
         </TD>
     </TR>
+    <TR>
+        <TD><FONT COLOR=YELLOW>Flags: </FONT></TD>
+        <TD>
+            <SELECT NAME=FLAGS MULTIPLE>@AchievementData?FLAGS@</SELECT>
+        </TD>
+    </TR>
     <TR>
         <TD>
             <FONT COLOR=YELLOW>Title Award: </FONT>

{'commit': 'diff --git a/CHANGES b/CHANGES\nindex e01dc3c318..0ff7a5f511 100644\n--- a/CHANGES\n+++ b/CHANGES\n@@ -13,7 +13,8 @@\n  12. STARTMANA, STARTMOVE, and STARTHP in ini file can append to class changes/level.\n  13. New INI entry: BONUSACT -- for global action bonus tweeking\n  14. Crafting skill INFO command now supports expertises and specific resources\n- 15. CLASSSYSTEM has new class limit boundary options, and new GAIN and SWITCH for train cost. \n+ 15. CLASSSYSTEM has new class limit boundary options, and new GAIN and SWITCH for train cost.\n+ 16. New achievement flag: REMORT, for forcing remorting players to re-acquire player achivements. \n   \n # Build 5.9.11.1 Release 02/26/2021\n   Bug Fix Release:\ndiff --git a/com/planet_ink/coffee_mud/Commands/Remort.java b/com/planet_ink/coffee_mud/Commands/Remort.java\nindex 59be601f06..ec58be7d85 100644\n--- a/com/planet_ink/coffee_mud/Commands/Remort.java\n+++ b/com/planet_ink/coffee_mud/Commands/Remort.java\n@@ -14,6 +14,7 @@ import com.planet_ink.coffee_mud.Exits.interfaces.*;\n import com.planet_ink.coffee_mud.Items.interfaces.*;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.*;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Achievement;\r\n+import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.AchievementFlag;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.AchievementLoadFlag;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Event;\r\n import com.planet_ink.coffee_mud.Locales.interfaces.*;\r\n@@ -473,12 +474,15 @@ public class Remort extends StdCommand\n \t\t\t\t\t\t{\r\n \t\t\t\t\t\t\tfinal Achievement A=CMLib.achievements().getAchievement(T.getTattooName());\r\n \t\t\t\t\t\t\tif((A != null) && (A.getAgent() == Agent.PLAYER))\r\n-\t\t\t\t\t\t\t\treAwardTattoos.add(A);\r\n+\t\t\t\t\t\t\t{\r\n+\t\t\t\t\t\t\t\tif(A.isFlag(AchievementFlag.REMORT))\r\n+\t\t\t\t\t\t\t\t\tdelTattoo.add(T);\r\n+\t\t\t\t\t\t\t\telse\r\n+\t\t\t\t\t\t\t\t\treAwardTattoos.add(A);\r\n+\t\t\t\t\t\t\t}\r\n \t\t\t\t\t\t\telse\r\n \t\t\t\t\t\t\t\tdelTattoo.add(T);\r\n \t\t\t\t\t\t}\r\n-\t\t\t\t\t\telse\r\n-\t\t\t\t\t\t\tdelTattoo.add(T);\r\n \t\t\t\t\t}\r\n \t\t\t\t\tfor(final Iterator<Tattoo> t=delTattoo.iterator();t.hasNext();)\r\n \t\t\t\t\t\tmob.delTattoo(t.next());\r\ndiff --git a/com/planet_ink/coffee_mud/Libraries/Achievements.java b/com/planet_ink/coffee_mud/Libraries/Achievements.java\nindex 74f2dcba5a..7b2ebcc4d9 100644\n--- a/com/planet_ink/coffee_mud/Libraries/Achievements.java\n+++ b/com/planet_ink/coffee_mud/Libraries/Achievements.java\n@@ -106,6 +106,28 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tfinal String rewardStr=CMStrings.deEscape(CMParms.getParmStr(params, "REWARDS", ""));\r\n \t\tfinal int duration=CMParms.getParmInt(params, "DURATION", 0);\r\n \t\tfinal String[] awardSet = CMParms.parse(rewardStr).toArray(new String[0]);\r\n+\t\tfinal Set<AchievementFlag> flags = Collections.synchronizedSet(new HashSet<AchievementFlag>());\r\n+\t\tfinal List<String> flagParts = CMParms.parse(CMParms.getParmStr(params, "FLAGS", ""));\r\n+\t\tfor(final String fp : flagParts)\r\n+\t\t{\r\n+\t\t\tfinal AchievementFlag f = (AchievementFlag)CMath.s_valueOf(AchievementFlag.class, fp.toUpperCase().trim());\r\n+\t\t\tif(f != null)\r\n+\t\t\t\tflags.add(f);\r\n+\t\t}\r\n+\t\tfinal CompiledZMask seenMask;\r\n+\t\tfinal String seenMaskStr=CMStrings.deEscape(CMParms.getParmStr(params, "VISIBLEMASK", ""));\r\n+\t\tif(seenMaskStr.trim().length()>0)\r\n+\t\t\tseenMask = CMLib.masking().getPreCompiledMask(seenMaskStr);\r\n+\t\telse\r\n+\t\t\tseenMask = null;\r\n+\r\n+\t\tfinal String playerMaskStr=CMStrings.deEscape(CMParms.getParmStr(params, "PLAYERMASK", ""));\r\n+\t\tfinal CompiledZMask playerMask;\r\n+\t\tif(playerMaskStr.trim().length()>0)\r\n+\t\t\tplayerMask = CMLib.masking().getPreCompiledMask(playerMaskStr);\r\n+\t\telse\r\n+\t\t\tplayerMask = null;\r\n+\r\n \t\tfinal List<Award> awardsList = new ArrayList<Award>();\r\n \t\tif(titleStr.length()>0)\r\n \t\t{\r\n@@ -791,8 +813,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -830,6 +850,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -927,23 +953,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()==0)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid ZAPPERMASK parameter: "+zapperMask+"!";\r\n \t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -952,8 +969,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tmaxTimePlayed\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -991,6 +1006,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1088,20 +1109,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tthis.maxTimePlayed=-1;\r\n \t\t\t\t\tfinal String maxTimePlayedStr=CMParms.getParmStr(parms, "TIMEOUT", "");\r\n \t\t\t\t\tif((maxTimePlayedStr.trim().length()>0)&&(CMath.isInteger(maxTimePlayedStr)))\r\n \t\t\t\t\t\tthis.maxTimePlayed = CMath.s_int(maxTimePlayedStr);\r\n \r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tif(zapperMask.trim().length()==0)\r\n-\t\t\t\t\t\treturn "Error: Missing or invalid PLAYERMASK parameter: "+zapperMask+"!";\r\n-\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n+\t\t\t\t\t// the only one that needs to s\r\n+\t\t\t\t\tif(playerMask == null)\r\n+\t\t\t\t\t\treturn "Error: Missing or invalid PLAYERMASK parameter!";\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -1109,11 +1124,9 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase STATVALUE:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate String\t\t\tstatName\t= "";\r\n \t\t\t\tprivate int\t\t\t\tvalue\t\t= 0;\r\n \t\t\t\tprivate int\t\t\t\tabelo\t\t= 0;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -1151,6 +1164,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1239,15 +1258,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal MOB mob = CMClass.getFactoryMOB();\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "VALUE", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n@@ -1268,11 +1278,9 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase FACTION:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate String\t\t\tfactionID\t= "";\r\n \t\t\t\tprivate int\t\t\t\tvalue\t\t= 0;\r\n \t\t\t\tprivate int\t\t\t\tabelo\t\t= 0;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -1322,6 +1330,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1409,15 +1423,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "VALUE", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid VALUE parameter: "+numStr+"!";\r\n@@ -1439,12 +1444,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase FACTIONS:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t= null;\r\n \t\t\t\tprivate final List<Faction>\tfactions\t= new LinkedList<Faction>();\r\n \t\t\t\tprivate int\t\t\t\t\tnumber\t\t= 0;\r\n \t\t\t\tprivate int\t\t\t\t\tvalue\t\t= 0;\r\n \t\t\t\tprivate int\t\t\t\t\tabelo\t\t= 0;\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -1494,6 +1497,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1580,15 +1589,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tString numStr=CMParms.getParmStr(parms, "VALUE", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid VALUE parameter: "+numStr+"!";\r\n@@ -1618,10 +1618,8 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase EXPLORE:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate String\t\t\tareaID\t\t= "";\r\n \t\t\t\tprivate int\t\t\t\tpct\t\t\t= 0;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -1665,6 +1663,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1768,15 +1772,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "PERCENT", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid PERCENT parameter: "+numStr+"!";\r\n@@ -1798,10 +1793,8 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase DECONSTRUCTING:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t= null;\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t= 0;\r\n \t\t\t\tprivate final Set<String>\tabilityIDs\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n \t\t\t\tprivate CompiledZMask\t\titemMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n@@ -1840,6 +1833,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -1955,15 +1954,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tthis.itemMask=null;\r\n \t\t\t\t\tfinal String itemMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ITEMMASK", ""));\r\n \t\t\t\t\tif(itemMask.trim().length()>0)\r\n@@ -2025,10 +2015,8 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase SKILLUSE:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t\t= null;\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t= 0;\r\n \t\t\t\tprivate final Set<String>\tabilityIDs\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -2084,6 +2072,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -2174,15 +2168,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -2233,12 +2218,9 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase SKILLPROF:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t= null;\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t= 0;\r\n \t\t\t\tprivate int\t\t\t\t\tprof\t\t= 100;\r\n \t\t\t\tprivate final Set<String>\tabilityIDs\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n-\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -2294,6 +2276,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -2386,15 +2374,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -2449,10 +2428,8 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase SOCIALUSE:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t= null;\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t= 0;\r\n \t\t\t\tprivate final Set<String>\tsocialIDs\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -2508,6 +2485,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -2598,15 +2581,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -2660,8 +2634,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t= 0;\r\n \t\t\t\tprivate final Set<String>\tcommandIDs\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -2717,6 +2689,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -2805,16 +2783,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\telse\r\n-\t\t\t\t\t\tthis.playerMask = null;\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -2851,9 +2819,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\t\t\tnum\t\t\t\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\t\t\tplayerMask\t\t= null;\r\n \t\t\t\tprivate java.util.regex.Pattern\tquestPattern\t= null;\r\n-\t\t\t\tprivate CompiledZMask\t\t\tseenMask\t\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -2903,6 +2869,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3003,20 +2975,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\telse\r\n-\t\t\t\t\t\tthis.playerMask = null;\r\n \t\t\t\t\tfinal String questMask=CMStrings.deEscape(CMParms.getParmStr(parms, "QUESTMASK", ""));\r\n \t\t\t\t\tthis.questPattern = null;\r\n \t\t\t\t\tif(questMask.trim().length()>0)\r\n@@ -3039,9 +3001,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase ACHIEVER:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t\t= null;\r\n \t\t\t\tfinal Set<String>\t\tachievementList\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -3085,6 +3045,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3184,15 +3150,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String list=CMStrings.deEscape(CMParms.getParmStr(parms, "ACHIEVEMENTLIST", ""));\r\n \t\t\t\t\tif(list.trim().length()==0)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid ACHIEVEMENTLIST parameter: "+list+"!";\r\n@@ -3212,9 +3169,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase ROOMENTER:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tfinal Set<String>\t\troomIDs\t\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -3258,6 +3213,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3348,15 +3309,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String list=CMStrings.deEscape(CMParms.getParmStr(parms, "ROOMID", ""));\r\n \t\t\t\t\tif(list.trim().length()==0)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid ROOMID parameter: "+list+"!";\r\n@@ -3390,8 +3342,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CharClass\t\tcharClass\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -3429,6 +3379,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3533,11 +3489,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -3548,10 +3499,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\t\tthis.charClass = CMClass.findCharClass(charClassID);\r\n \t\t\t\t\tif(this.charClass == null)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid CLASS parameter: "+charClassID+"!";\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask=null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -3562,8 +3509,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -3601,6 +3546,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3692,19 +3643,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask=null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -3712,9 +3654,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase GOTITEM:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate CompiledZMask\titemMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= 1;\r\n \r\n \t\t\t\t@Override\r\n@@ -3753,6 +3693,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -3860,11 +3806,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(numStr.trim().length()==0)\r\n \t\t\t\t\t\tnum=1;\r\n@@ -3878,10 +3819,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\t\tthis.itemMask = CMLib.masking().getPreCompiledMask(itemZapperMask);\r\n \t\t\t\t\telse\r\n \t\t\t\t\t\treturn "Error: Missing or invalid ITEMMASK parameter!";\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask=null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -3890,8 +3827,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tseconds\t\t= 0;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -3929,6 +3864,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4020,19 +3961,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "SECONDS", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid SECONDS parameter: "+numStr+"!";\r\n \t\t\t\t\tseconds=CMath.s_int(numStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask=null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4042,8 +3974,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -4081,6 +4011,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4175,23 +4111,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n \t\t\t\t\tthis.npcMask = null;\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()>=0)\r\n \t\t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4202,8 +4129,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -4241,6 +4166,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4335,23 +4266,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n \t\t\t\t\tthis.npcMask = null;\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()>=0)\r\n \t\t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4362,8 +4284,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -4401,6 +4321,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4495,23 +4421,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n \t\t\t\t\tthis.npcMask = null;\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()>=0)\r\n \t\t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4519,9 +4436,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase PLAYERBORN:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n-\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n \t\t\t\t{\r\n@@ -4558,6 +4472,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4649,15 +4569,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4668,8 +4579,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -4707,6 +4616,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4801,23 +4716,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n \t\t\t\t\tthis.npcMask = null;\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()>=0)\r\n \t\t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -4826,8 +4732,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -4865,6 +4769,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -4985,19 +4895,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -5007,8 +4908,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tnpcMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5046,6 +4945,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -5155,23 +5060,14 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tString zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n+\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "ZAPPERMASK", ""));\r\n \t\t\t\t\tif(zapperMask.trim().length()==0)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid ZAPPERMASK parameter: "+zapperMask+"!";\r\n \t\t\t\t\tthis.npcMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\t\t\t\t\tzapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -5180,8 +5076,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5219,6 +5113,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -5339,19 +5239,10 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n \t\t\t\t\tnum=CMath.s_int(numStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -5361,8 +5252,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tareaMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5400,6 +5289,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -5513,15 +5408,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -5539,8 +5425,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tshipMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5578,6 +5462,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -5672,11 +5562,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -5685,10 +5570,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\tfinal String shipMask=CMStrings.deEscape(CMParms.getParmStr(parms, "SHIPMASK", ""));\r\n \t\t\t\t\tif(shipMask.trim().length()>=0)\r\n \t\t\t\t\t\tthis.shipMask = CMLib.masking().getPreCompiledMask(shipMask);\r\n-\t\t\t\t\tfinal String playerMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(playerMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(playerMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -5698,8 +5579,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n \t\t\t\tprivate CompiledZMask\tareaMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5737,6 +5616,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -5850,15 +5735,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -5878,8 +5754,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\tprivate long\t\t\tminTime\t\t= 10L * 60L * 1000L;\r\n \t\t\t\tprivate CompiledZMask\tareaMask\t= null;\r\n \t\t\t\tprivate CompiledZMask\troomMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -5917,6 +5791,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -6034,11 +5914,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String minTimeStr=CMParms.getParmStr(parms, "TIME_MINS", "");\r\n \t\t\t\t\tif(CMath.isInteger(minTimeStr))\r\n \t\t\t\t\t\tthis.minTime = CMath.s_int(minTimeStr) * 60 * 1000;\r\n@@ -6055,10 +5930,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\tthis.roomMask = null;\r\n \t\t\t\t\tif(roomMaskStr.trim().length()>0)\r\n \t\t\t\t\t\tthis.roomMask = CMLib.masking().getPreCompiledMask(roomMaskStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\treturn "";\r\n \t\t\t\t}\r\n \t\t\t};\r\n@@ -6069,8 +5940,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t\t= -1;\r\n \t\t\t\tprivate long\t\t\tminTime\t\t\t= 10L * 60L * 1000L;\r\n \t\t\t\tprivate CompiledZMask\tareaMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tplayerMask\t\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t\t= null;\r\n \t\t\t\tprivate String\t\t\tvalExpression\t= null;\r\n \r\n \t\t\t\t@Override\r\n@@ -6109,6 +5978,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -6236,11 +6111,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\r\n \t\t\t\t\tfinal String minTimeStr=CMParms.getParmStr(parms, "TIME_MINS", "");\r\n \t\t\t\t\tif(CMath.isInteger(minTimeStr))\r\n \t\t\t\t\t\tthis.minTime = CMath.s_int(minTimeStr) * 60 * 1000;\r\n@@ -6253,10 +6123,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\tif(areaMaskStr.trim().length()==0)\r\n \t\t\t\t\t\treturn "Error: Missing or invalid AREAMASK parameter: "+numStr+"!";\r\n \t\t\t\t\tthis.areaMask = CMLib.masking().getPreCompiledMask(areaMaskStr);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n \t\t\t\t\tfinal String valExpStr = CMStrings.deEscape(CMParms.getParmStr(parms, "VALUEEXP", ""));\r\n \t\t\t\t\tthis.valExpression = null;\r\n \t\t\t\t\tif(valExpStr.trim().length()>0)\r\n@@ -6268,10 +6134,8 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase CLANDECLARE:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate CompiledZMask\t\tplayerMask\t\t= null;\r\n \t\t\t\tprivate int\t\t\t\t\tnum\t\t\t\t= -1;\r\n \t\t\t\tprivate final Set<String>\trelationList\t= new TreeSet<String>();\r\n-\t\t\t\tprivate CompiledZMask\t\tseenMask\t\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -6309,6 +6173,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -6421,15 +6291,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -6453,9 +6314,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n-\t\t\t\tprivate  CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate CompiledZMask\tareaMask\t= null;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -6493,6 +6352,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -6607,15 +6472,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -6631,9 +6487,7 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\tcase CLANLEVELSGAINED:\r\n \t\t\tA=new Achievement()\r\n \t\t\t{\r\n-\t\t\t\tprivate  CompiledZMask\tplayerMask\t= null;\r\n \t\t\t\tprivate int\t\t\t\tnum\t\t\t= -1;\r\n-\t\t\t\tprivate CompiledZMask\tseenMask\t= null;\r\n \r\n \t\t\t\t@Override\r\n \t\t\t\tpublic Event getEvent()\r\n@@ -6671,6 +6525,12 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t\treturn duration;\r\n \t\t\t\t}\r\n \r\n+\t\t\t\t@Override\r\n+\t\t\t\tpublic boolean isFlag(final AchievementFlag flag)\r\n+\t\t\t\t{\r\n+\t\t\t\t\treturn flags.contains(flag);\r\n+\t\t\t\t}\r\n+\r\n \t\t\t\t@Override\r\n \t\t\t\tpublic int getTargetCount()\r\n \t\t\t\t{\r\n@@ -6770,15 +6630,6 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\t@Override\r\n \t\t\t\tpublic String parseParms(final String parms)\r\n \t\t\t\t{\r\n-\t\t\t\t\tthis.seenMask=null;\r\n-\t\t\t\t\tfinal String seenMask=CMStrings.deEscape(CMParms.getParmStr(parms, "VISIBLEMASK", ""));\r\n-\t\t\t\t\tif(seenMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.seenMask = CMLib.masking().getPreCompiledMask(seenMask);\r\n-\t\t\t\t\tfinal String zapperMask=CMStrings.deEscape(CMParms.getParmStr(parms, "PLAYERMASK", ""));\r\n-\t\t\t\t\tthis.playerMask = null;\r\n-\t\t\t\t\tif(zapperMask.trim().length()>0)\r\n-\t\t\t\t\t\tthis.playerMask = CMLib.masking().getPreCompiledMask(zapperMask);\r\n-\r\n \t\t\t\t\tfinal String numStr=CMParms.getParmStr(parms, "NUM", "");\r\n \t\t\t\t\tif(!CMath.isInteger(numStr))\r\n \t\t\t\t\t\treturn "Error: Missing or invalid NUM parameter: "+numStr+"!";\r\n@@ -7983,6 +7834,9 @@ public class Achievements extends StdLibrary implements AchievementLibrary\n \t\t\t\thelp=getAchievementsHelpFromMap(helpMap,null,"PLAYERMASK");\r\n \t\t\t\tparmTree.put("PLAYERMASK",CMLib.genEd().prompt(mob, parmTree.get("PLAYERMASK"), ++showNumber, showFlag, L("Player Mask"), true, false, help, null, null));\r\n \r\n+\t\t\t\thelp=getAchievementsHelpFromMap(helpMap,null,"FLAGS");\r\n+\t\t\t\tparmTree.put("FLAGS",CMLib.genEd().prompt(mob, parmTree.get("FLAGS"), ++showNumber, showFlag, L("Flags"), true, false, help, null, null));\r\n+\r\n \t\t\t\tfor(final String parmName : E.getParameters())\r\n \t\t\t\t{\r\n \t\t\t\t\tif(!CMStrings.contains(BASE_ACHIEVEMENT_PARAMETERS, parmName))\r\ndiff --git a/com/planet_ink/coffee_mud/Libraries/interfaces/AchievementLibrary.java b/com/planet_ink/coffee_mud/Libraries/interfaces/AchievementLibrary.java\nindex fdb9cadb56..3fd7bd86f6 100644\n--- a/com/planet_ink/coffee_mud/Libraries/interfaces/AchievementLibrary.java\n+++ b/com/planet_ink/coffee_mud/Libraries/interfaces/AchievementLibrary.java\n@@ -55,7 +55,7 @@ public interface AchievementLibrary extends CMLibrary\n \t/**\r\n \t * The list of arguments/parameters common to all achievement event types\r\n \t */\r\n-\tpublic final String[] BASE_ACHIEVEMENT_PARAMETERS = new String[] { "EVENT", "DISPLAY", "TITLE", "REWARDS", "VISIBLEMASK", "DURATION", "PLAYERMASK" };\r\n+\tpublic final String[] BASE_ACHIEVEMENT_PARAMETERS = new String[] { "EVENT", "DISPLAY", "TITLE", "REWARDS", "VISIBLEMASK", "DURATION", "PLAYERMASK", "FLAGS" };\r\n \r\n \t/**\r\n \t * Events define the type of achievement, describing specific arguments that\r\n@@ -146,6 +146,16 @@ public interface AchievementLibrary extends CMLibrary\n \t\t}\r\n \t}\r\n \r\n+\t/**\r\n+\t * Legal values for the FLAGS field in an achievement.\r\n+\t *\r\n+\t * @author Bo Zimmerman\r\n+\t */\r\n+\tpublic enum AchievementFlag\r\n+\t{\r\n+\t\tREMORT // is reset on remort and can be re-attained\r\n+\t}\r\n+\r\n \t/**\r\n \t * The achievement interface provides basic information about the specific achievement,\r\n \t * as defined in the achievements.ini definition file.  It also allows a tracker to\r\n@@ -276,6 +286,14 @@ public interface AchievementLibrary extends CMLibrary\n \t\t * @return the duration, in ticks, of the achievement\r\n \t\t */\r\n \t\tpublic int getDuration();\r\n+\r\n+\t\t/**\r\n+\t\t * Returns whether the given achievment flag applies\r\n+\t\t * to this achievement.\r\n+\t\t * @param flag the flag\r\n+\t\t * @return true if it applies\r\n+\t\t */\r\n+\t\tpublic boolean isFlag(AchievementFlag flag);\r\n \t}\r\n \r\n \t/**\r\ndiff --git a/com/planet_ink/coffee_mud/WebMacros/AchievementData.java b/com/planet_ink/coffee_mud/WebMacros/AchievementData.java\nindex e8cb828ebc..499cb79767 100644\n--- a/com/planet_ink/coffee_mud/WebMacros/AchievementData.java\n+++ b/com/planet_ink/coffee_mud/WebMacros/AchievementData.java\n@@ -10,6 +10,7 @@ import com.planet_ink.coffee_mud.Behaviors.interfaces.*;\n import com.planet_ink.coffee_mud.CharClasses.interfaces.*;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.*;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Achievement;\r\n+import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.AchievementFlag;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Award;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.AwardType;\r\n import com.planet_ink.coffee_mud.Libraries.interfaces.AchievementLibrary.Event;\r\n@@ -139,6 +140,17 @@ public class AchievementData extends StdWebMacro\n \t\t\tif((newPlayMask != null)&&(newPlayMask.length()>0))\r\n \t\t\t\trow+="PLAYERMASK=\\""+CMStrings.escape(newPlayMask)+"\\" ";\r\n \r\n+\t\t\tif(httpReq.isUrlParameter("FLAGS"))\r\n+\t\t\t{\r\n+\t\t\t\tString id="";\r\n+\t\t\t\tint num=0;\r\n+\t\t\t\tfinal List<String> V=new ArrayList<String>();\r\n+\t\t\t\tfor(;httpReq.isUrlParameter("FLAGS"+id);id=""+(++num))\r\n+\t\t\t\t\tV.add(httpReq.getUrlParameter("FLAGS"+id));\r\n+\t\t\t\tif(V.size()>0)\r\n+\t\t\t\t\trow += "FLAGS=\\""+CMParms.combine(V)+"\\" ";\r\n+\t\t\t}\r\n+\r\n \t\t\tfor(final String s : E.getParameters())\r\n \t\t\t{\r\n \t\t\t\tif(!CMStrings.contains(AchievementLibrary.BASE_ACHIEVEMENT_PARAMETERS, s))\r\n@@ -276,6 +288,26 @@ public class AchievementData extends StdWebMacro\n \t\t\tif(value!=null)\r\n \t\t\t\tstr.append(CMStrings.replaceAll(value,"\\"","&quot;")+", ");\r\n \t\t}\r\n+\t\tif(parms.containsKey("FLAGS"))\r\n+\t\t{\r\n+\t\t\tfinal List<String> list=new ArrayList<String>();\r\n+\t\t\tif(httpReq.isUrlParameter("FLAGS"))\r\n+\t\t\t{\r\n+\t\t\t\tString id="";\r\n+\t\t\t\tint num=0;\r\n+\t\t\t\tfor(;httpReq.isUrlParameter("FLAGS"+id);id=""+(++num))\r\n+\t\t\t\t\tlist.add(httpReq.getUrlParameter("FLAGS"+id).toUpperCase().trim());\r\n+\t\t\t}\r\n+\t\t\telse\r\n+\t\t\t{\r\n+\t\t\t\tfor(final AchievementFlag f : AchievementFlag.values())\r\n+\t\t\t\t\tif(A.isFlag(f))\r\n+\t\t\t\t\t\tlist.add(f.name());\r\n+\t\t\t}\r\n+\t\t\tfor(final AchievementFlag f : AchievementFlag.values())\r\n+\t\t\t\tstr.append("<OPTION VALUE=\\""+f.name()+"\\""+(list.contains(f.name())?" SELECTED":"")+">"+f.name());\r\n+\t\t\tstr.append(", ");\r\n+\t\t}\r\n \t\tif(parms.containsKey("PLAYERMASK"))\r\n \t\t{\r\n \t\t\tString value=httpReq.getUrlParameter("PLAYERMASK");\r\ndiff --git a/resources/achievements.ini b/resources/achievements.ini\nindex 7ca05148b5..13af35bb6f 100644\n--- a/resources/achievements.ini\n+++ b/resources/achievements.ini\n@@ -55,6 +55,8 @@\n # [DISPLAY] is a friendly display name of this achievement.\r\n # [DURATION] is the number of ticks before the achievement expires. 0=forever.\r\n # [EVENT] is the type of achievement event.  Each type determines the other\r\n+# [FLAGS] is a space-delimited list of achievement flags, these include:\r\n+#    REMORT - the achievement is removed and becomes re-attainable after remorting. \r\n # parameters.  The format of each achievement event type is as follows:\r\n #\r\n # ... EVENT="KILLS" NUM=[NUMBER] ZAPPERMASK="[ZAPPERMASK]"  ...\r\ndiff --git a/web/admin/grinder/achievement.cmvp b/web/admin/grinder/achievement.cmvp\nindex 8a47ad56a6..b57aca6edc 100644\n--- a/web/admin/grinder/achievement.cmvp\n+++ b/web/admin/grinder/achievement.cmvp\n@@ -148,6 +148,12 @@\n             <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=PLAYERMASK@</FONT>\r\n         </TD>\r\n     </TR>\r\n+    <TR>\r\n+        <TD><FONT COLOR=YELLOW>Flags: </FONT></TD>\r\n+        <TD>\r\n+            <SELECT NAME=FLAGS MULTIPLE>@AchievementData?FLAGS@</SELECT>\r\n+        </TD>\r\n+    </TR>\r\n     <TR>\r\n         <TD>\r\n             <FONT COLOR=YELLOW>Title Award: </FONT>\r\n', 'commit_subject': 'remort achievement flag', 'repo_name': 'bozimmerman/CoffeeMud', 'committer': {'name': 'bozimmerman', 'email': 'dc45fe023482b3b890b5e574e53c1d051f45b1ef@zimmers.net', 'time_sec': '1616613967', 'tz_offset': '0', 'date': {'seconds': '1616613967'}}, 'commit_tree': '84ae94ad5862a53457748025b513c96ed74f26c0', 'commit_message': 'remort achievement flag\n\ngit-svn-id: 0cdf8356e41b2d8ccbb41bb76c82068fe80b2514@20666 0d6f1817-ed0e-0410-87c9-987e46238f29\n', 'language_name': 'Shell', 'license': 'apache-2.0', 'hunks': '@@ -148,6 +148,12 @@\n             <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=PLAYERMASK@</FONT>\r\n         </TD>\r\n     </TR>\r\n+    <TR>\r\n+        <TD><FONT COLOR=YELLOW>Flags: </FONT></TD>\r\n+        <TD>\r\n+            <SELECT NAME=FLAGS MULTIPLE>@AchievementData?FLAGS@</SELECT>\r\n+        </TD>\r\n+    </TR>\r\n     <TR>\r\n         <TD>\r\n             <FONT COLOR=YELLOW>Title Award: </FONT>\r\n', 'addition_count': 6, 'deletion_count': 0, 'src_file': 'a/web/admin/grinder/achievement.cmvp', 'tgt_file': 'b/web/admin/grinder/achievement.cmvp', 'file_extension': '.cmvp', 'before_file': '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\n@if?!Authenticate@ @AddFile?/grinder/failedlogin.cmvp@ @else@\n@if?!CheckAuthCode?AUTH_ACHIEVEMENTS=true@ @AddFile?/grinder/nopriv.cmvp@ @else@\n<META HTTP-EQUIV="Pragma" CONTENT="no-cache">\n<html>\n<head>\n\t<META CHARSET="utf-8"/>\n    <link rel="grinder icon" href="/images/grinder.ico" >\n    <title>Title Manager</title>\n    <script language=JavaScript>\n    <!--\n        function NewTattoo()\n        {\n            var autotattooid=window.prompt(\'Enter a new unique TATTOO/ID for your Tattoo (no spaces):\');\n            if(autotattooid==null)\n                return;\n            if(autotattooid.length==0)\n                return;\n            if(autotattooid.indexOf(\' \')>=0)\n            {\n                if(window.alert) window.alert(\'No spaces are allowed in your ID!\');\n                return;\n            }\n            document.RESOURCES.TATTOO.value=autotattooid;\n            document.RESOURCES.FUNCTION.value=\'REACHIEVEMENT\';\n            document.RESOURCES.action=\'/grinder/achievementdo.cmvp\';\n            document.RESOURCES.submit();\n        }\n        function Delete()\n        {\n            if(confirm(\'Delete this achievement?! Confirm!\'))\n            {\n                document.RESOURCES.action=\'achievementdo.cmvp\';\n                document.RESOURCES.FUNCTION.value=\'DELACHIEVEMENT\';\n                document.RESOURCES.submit();\n            }\n        }\n        function EditDone()\n        {\n            @if?CheckReqParm?ACHIEVEMENT=@\n                if(confirm(\'Create this new achievement?\'))\n            @else@\n                if(confirm(\'Submit your changes to this achievement?\'))\n            @endif@\n                {\n                    document.RESOURCES.action=\'achievementdo.cmvp\';\n                    document.RESOURCES.FUNCTION.value=\'EDITACHIEVEMENT\';\n                    document.RESOURCES.submit();\n                }\n        }\n        function ReShow()\n        {\n            document.RESOURCES.FUNCTION.value=\'\';\n            document.RESOURCES.action=\'/grinder/achievement.cmvp\';\n            document.RESOURCES.submit();\n        }\n        function Refresh()\n        {\n            document.RESOURCES.FUNCTION.value=\'\';\n            document.RESOURCES.action=\'/grinder/achievement.cmvp\';\n            document.RESOURCES.submit();\n        }\n        function ReTitle()\n        {\n            document.RESOURCES.FUNCTION.value=\'REACHIEVEMENT\';\n            document.RESOURCES.action=\'/grinder/achievementdo.cmvp\';\n            document.RESOURCES.submit();\n        }\n        function Cancel()\n        {\n            window.close();\n        }\n        function Clicked(action)\n        {\n            document.RESOURCES.action=action;\n            document.RESOURCES.submit();\n        }\n    //-->\n    </script>\n</head>\n<body BGCOLOR=BLACK>\n<FORM  ACCEPT-CHARSET="UTF-8" NAME=RESOURCES TARGET=_top METHOD=POST ACTION="achievement.cmvp">\n<INPUT TYPE=HIDDEN NAME=AUTH VALUE="@Authenticate?AUTH@">\n<INPUT TYPE=HIDDEN NAME=FUNCTION VALUE="">\n<INPUT TYPE=HIDDEN NAME=ACHIEVEMENT VALUE="@RequestParameter?ACHIEVEMENT@">\n<INPUT TYPE=HIDDEN NAME=AGENT VALUE="@RequestParameter?AGENT@">\n<CENTER>\n<TABLE WIDTH=100% BORDER=1 CELLSPACING=0 CELLPADDING=0>\n    <TR>\n        <TD WIDTH=25%>\n            <FONT COLOR=YELLOW>Tattoo / ID: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=20 NAME=TATTOO VALUE="@AchievementData?TATTOO@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=TATTOONAME@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD>\n        \t<FONT COLOR=YELLOW>Event Type: </FONT>\n        \t<FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <SELECT NAME=EVENT ONCHANGE="Refresh();">\n            @AchievementData?EVENTOPTIONS@\n            </SELECT>\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=EVENT@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD>\n            <FONT COLOR=YELLOW>Display Desc: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=40 NAME=DISPLAY VALUE="@AchievementData?DISPLAY@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=DISPLAY@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD WIDTH=25%>\n            <FONT COLOR=YELLOW>Duration: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=20 NAME=DURATION VALUE="@AchievementData?DURATION@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=DURATION@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD>\n            <FONT COLOR=YELLOW>Visibility Mask: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=60 NAME=DISPLAY VALUE="@AchievementData?VISIBLEMASK@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=VISIBLEMASK@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD>\n            <FONT COLOR=YELLOW>Player Mask: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=60 NAME=DISPLAY VALUE="@AchievementData?PLAYERMASK@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=PLAYERMASK@</FONT>\r\n        </TD>\r\n    </TR>\r\n    <TR>\r\n        <TD>\r\n            <FONT COLOR=YELLOW>Title Award: </FONT>\r\n            <FONT COLOR=YELLOW>Title Award: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=40 NAME=TITLE VALUE="@AchievementData?TITLE@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=TITLE@</FONT>\n        </TD>\n    </TR>\n    <TR>\n        <TD>\n            <FONT COLOR=YELLOW>Reward List: </FONT>\n            <FONT COLOR=WHITE SIZE=-1></FONT>\n        </TD>\n        <TD>\n            <INPUT TYPE=TEXT SIZE=60 NAME=REWARDS VALUE="@AchievementData?REWARDS@">\n            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=REWARDS@</FONT>\n        </TD>\n    </TR>\n    @AchievementData?OTHERPARMNEXT&RESET@\n    @loop@\n\t    @AchievementData?OTHERPARMNEXT@\n\t    <TR>\n\t        <TD>\n\t            <FONT COLOR=YELLOW>@RequestParameter?OTHERPARMFIELD@: </FONT>\n\t            <FONT COLOR=WHITE SIZE=-1></FONT>\n\t        </TD>\n\t        <TD>\n\t            <INPUT TYPE=TEXT SIZE=60 NAME=@RequestParameter?OTHERPARM@ VALUE="@AchievementData?@@RequestParameter?OTHERPARM@@ @">\n\t            <BR><FONT COLOR=WHITE SIZE=-1>@AchievementData?HELP&FIELD=@@RequestParameter?OTHERPARM@@ @</FONT>\n\t        </TD>\n\t    </TR>\n    @back@\n</TABLE>\n<BR>\n<TABLE WIDTH=100% BORDER=0>\n<TR>\n    @if?CheckReqParm?ACHIEVEMENT=@\n        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=FINISHED VALUE="Create" ONCLICK="EditDone();"></TD>\n    @else@\n        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=FINISHED VALUE="Modify" ONCLICK="EditDone();"></TD>\n        <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=DELETE VALUE="Delete" ONCLICK="Delete();"></TD>\n    @endif@\n    <TD ALIGN=CENTER><INPUT TYPE=BUTTON NAME=CANCEL VALUE="Cancel" ONCLICK="Cancel();"></TD>\n</TR>\n</TABLE>\n</FORM>\n</BODY>\n</HTML>\n@endif@\n@endif@\n', 'message': 'remort achievement flag\n\ngit-svn-id: 0cdf8356e41b2d8ccbb41bb76c82068fe80b2514@20666 0d6f1817-ed0e-0410-87c9-987e46238f29\n', 'author_name': 'bozimmerman', 'lang': 'cmvp'}